From f4d737bce1215e6e0c93b6e5159a4e4757cd3115 Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Thu, 16 Apr 2026 14:04:58 +0500 Subject: [PATCH 01/31] Fix: update tarpaulin notes and setup. --- server/.cargo/config.toml | 28 ++-------------------------- server/.gitignore | 8 +++----- 2 files changed, 5 insertions(+), 31 deletions(-) diff --git a/server/.cargo/config.toml b/server/.cargo/config.toml index 62c59ce9..7f3b9ce6 100644 --- a/server/.cargo/config.toml +++ b/server/.cargo/config.toml @@ -17,31 +17,7 @@ TS_RS_EXPORT_DIR = { value = "../client/src/rust-types", relative = true } # TypeScript's convention. TS_RS_IMPORT_EXTENSION = "ts" -# Code coverage, the manual way: -# -# 1. Run `cargo install rustfilt` per the -# [code coverage docs](https://doc.rust-lang.org/rustc/instrument-coverage.html#building-the-demangler). -# 2. You must manually run `rustup component add llvm-tools-preview` following -# the -# [coverge docs](https://doc.rust-lang.org/rustc/instrument-coverage.html#installing-llvm-coverage-tools). -# Per some searching, also run `cargo install cargo-binutils` to put these -# tools in the path. -# 3. In Powershell, `$Env:RUSTFLAGS = "-C instrument-coverage"` then `cargo -# test`. When the tests run, record the name of the test binary. -# 4. `rust-profdata merge -sparse default_*.profraw -o default.profdata`. -# 5. `rust-cov show --Xdemangler=rustfilt -# target\debug\deps\code_chat_editor-4dbe5c7815a53cd9.exe -# --instr-profile=default.profdata --ignore-filename-regex=\\.cargo\\registry -# --format=html --output-dir=coverage`, replacing the binary path with the -# one recorded in step 3. -# 6. Open the file `coverage\index.html`. -# -# Or, `cargo install cargo-tarpaulin` then `cargo tarpaulin --ignore-panics -# --out=html --skip-clean`. [build] -# Set these to match the output from `cargo tarpaulin --print-rust-flags` to -# avoid recompiles. -# -# This is commented out; for development, uncomment this. -##rustflags = ["-Cdebuginfo=2", "-Cstrip=none", "--cfg=tarpaulin", "-Cinstrument-coverage"] +# To check coverage, `cargo install cargo-tarpaulin` then `cargo tarpaulin +# --skip-clean --out=html --target-dir=tarpaulin`. \ No newline at end of file diff --git a/server/.gitignore b/server/.gitignore index 52b06b87..c935c389 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -23,14 +23,12 @@ target/ # Output from profiling. +tarpaulin/ *.profraw tarpaulin-report.html -# Copied files needed to `cargo publish`. -static/ +# Other files. hashLocations.json - -config.json *.log -.windows/ + # CodeChat Editor lexer: python. See TODO. From 8698a0a514bed37f91c8d789b7312c9fd76a9e4a Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Fri, 17 Apr 2026 11:04:40 +0500 Subject: [PATCH 02/31] Fix: improve Selenium test robustness. --- server/tests/overall_2.rs | 20 +++++++++++++++++++- server/tests/overall_common/mod.rs | 1 + 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/server/tests/overall_2.rs b/server/tests/overall_2.rs index 70a3d528..54a07d7d 100644 --- a/server/tests/overall_2.rs +++ b/server/tests/overall_2.rs @@ -374,7 +374,7 @@ async fn test_6_core( // Perform edits. body_content.send_keys("a").await.unwrap(); - let client_id = INITIAL_CLIENT_MESSAGE_ID; + let mut client_id = INITIAL_CLIENT_MESSAGE_ID; let msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); let client_version = get_version(&msg); assert_eq!( @@ -406,6 +406,24 @@ async fn test_6_core( ); let version = client_version; codechat_server.send_result(client_id, None).await.unwrap(); + client_id += MESSAGE_ID_INCREMENT; + + // Wait for a second update that's empty. Not sure why. + assert_eq!( + codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), + EditorMessage { + id: client_id, + message: EditorMessageContents::Update(UpdateMessageContents { + file_path: path_str.clone(), + cursor_position: None, + includes_marker: false, + scroll_position: None, + is_re_translation: false, + contents: None, + }) + } + ); + codechat_server.send_result(client_id, None).await.unwrap(); //client_id += MESSAGE_ID_INCREMENT; // Send new text, which turns into a diff. diff --git a/server/tests/overall_common/mod.rs b/server/tests/overall_common/mod.rs index 894a4e40..287a03d6 100644 --- a/server/tests/overall_common/mod.rs +++ b/server/tests/overall_common/mod.rs @@ -310,6 +310,7 @@ pub async fn goto_line( && update.contents.is_none() && update.cursor_position != Some(line) { + codechat_server.send_result(*client_id, None).await.unwrap(); *client_id += MESSAGE_ID_INCREMENT; msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); } From ed706f337801fb93e3bacf833af67de7e3a0faea Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Tue, 21 Apr 2026 16:37:12 +0500 Subject: [PATCH 03/31] Fix: correctly append final text from Markdown conversion to last doc block. Misc DRY. --- server/src/processing.rs | 44 ++++++++++++++++++++-------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/server/src/processing.rs b/server/src/processing.rs index dcb2ecc9..ebbf12b7 100644 --- a/server/src/processing.rs +++ b/server/src/processing.rs @@ -420,15 +420,14 @@ pub fn codechat_for_web_to_source( ) -> Result { let lexer_name = &codechat_for_web.metadata.mode; // Given the mode, find the lexer. - let lexer: &std::sync::Arc = - match LEXERS.map_mode_to_lexer.get(lexer_name) { - Some(v) => v, - None => { - return Err(CodechatForWebToSourceError::InvalidLexer( - lexer_name.clone(), - )); - } - }; + let lexer = match LEXERS.map_mode_to_lexer.get(lexer_name) { + Some(v) => v, + None => { + return Err(CodechatForWebToSourceError::InvalidLexer( + lexer_name.clone(), + )); + } + }; // Extract the plain (not diffed) CodeMirror contents. let CodeMirrorDiffable::Plain(ref code_mirror) = codechat_for_web.source else { @@ -577,7 +576,7 @@ impl HtmlToMarkdownWrapped { // ignored (by an // [ignoreFileDirective](https://dprint.dev/plugins/markdown/config/)). // Simply return the unchanged text in this case. - .unwrap_or_else(|| converted.to_string()), + .unwrap_or(converted), ) } @@ -585,11 +584,7 @@ impl HtmlToMarkdownWrapped { let converted = self.html_to_markdown.finalize_conversion(); Ok( format_text(&converted, &self.word_wrap_config, |_, _, _| Ok(None))? - // A return value of `None` means the text was unchanged or - // ignored (by an - // [ignoreFileDirective](https://dprint.dev/plugins/markdown/config/)). - // Simply return the unchanged text in this case. - .unwrap_or_else(|| converted.to_string()), + .unwrap_or(converted), ) } @@ -606,9 +601,11 @@ fn doc_block_html_to_markdown( mut code_doc_block_vec: Vec, ) -> Result, HtmlToMarkdownWrappedError> { let mut converter = HtmlToMarkdownWrapped::new(); - for code_doc_block in &mut code_doc_block_vec { + let mut last_doc_block_index = None; + for (index, code_doc_block) in &mut code_doc_block_vec.iter_mut().enumerate() { if let CodeDocBlock::DocBlock(doc_block) = code_doc_block { - let tree = html_to_tree(&doc_block.contents)?; + last_doc_block_index = Some(index); + let tree = html_to_tree(&doc_block.contents, dom_offsets)?; dehydrating_walk_node(&tree); // Compute a line wrap width based on the current indent. Set a @@ -629,12 +626,15 @@ fn doc_block_html_to_markdown( } } - // Output the finalized conversion. - if let Some(code_doc_block) = code_doc_block_vec.last_mut() - && let CodeDocBlock::DocBlock(doc_block) = code_doc_block - { + // Append the finalized conversion to the last doc block. + if let Some(last_doc_block_index) = last_doc_block_index { + let CodeDocBlock::DocBlock(ref mut last_doc_block) = + code_doc_block_vec[last_doc_block_index] + else { + unreachable!(); + }; let last = converter.last()?; - doc_block.contents.push_str(&last); + last_doc_block.contents.push_str(&last); } Ok(code_doc_block_vec) From 667b26bcccc74767939afd253930cf134095a533 Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Tue, 21 Apr 2026 16:35:41 +0500 Subject: [PATCH 04/31] wip: Locate cursor line within Client doc blocks. --- client/src/CodeChatEditor.mts | 20 ++++++++------ client/src/CodeChatEditorFramework.mts | 5 ++-- client/src/CodeMirror-integration.mts | 32 ++++++++++++++-------- extensions/VSCode/src/extension.ts | 24 +++++++++------- server/src/ide.rs | 8 +++--- server/src/processing.rs | 38 ++++++++++++++++++-------- server/src/processing/tests.rs | 2 +- server/src/translation.rs | 22 +++++++++++++++ server/src/webserver.rs | 24 +++++++++++++++- server/tests/overall_1.rs | 22 +++++++-------- server/tests/overall_2.rs | 17 ++++++------ server/tests/overall_common/mod.rs | 8 +++--- 12 files changed, 150 insertions(+), 72 deletions(-) diff --git a/client/src/CodeChatEditor.mts b/client/src/CodeChatEditor.mts index 59411f89..6e4947df 100644 --- a/client/src/CodeChatEditor.mts +++ b/client/src/CodeChatEditor.mts @@ -76,6 +76,7 @@ import { show_toast } from "./show_toast.mjs"; // ### CSS import "./css/CodeChatEditor.css"; +import { CursorPosition } from "./rust-types/CursorPosition.js"; // Data structures // --------------- @@ -103,12 +104,12 @@ declare global { open_lp: ( codechat_for_web: CodeChatForWeb, is_re_translation: boolean, - cursor_line?: number, + cursor_position?: CursorPosition, scroll_line?: number, ) => Promise; on_save: (_only_if_dirty: boolean) => Promise; scroll_to_line: ( - cursor_line?: number, + cursor_position?: CursorPosition, scroll_line?: number, ) => void; show_toast: (text: string) => void; @@ -172,7 +173,7 @@ const is_doc_only = () => { const open_lp = async ( codechat_for_web: CodeChatForWeb, is_re_translation: boolean, - cursor_line?: number, + cursor_line?: CursorPosition, scroll_line?: number, ) => // Wait for the DOM to load before opening the file. @@ -205,7 +206,7 @@ const _open_lp = async ( // associated metadata. See [`AllSource`](#AllSource). codechat_for_web: CodeChatForWeb, is_re_translation: boolean, - cursor_line?: number, + cursor_position?: CursorPosition, scroll_line?: number, ) => { // Note that globals, such as `is_dirty` and document contents, may change @@ -331,7 +332,7 @@ const _open_lp = async ( } } await mathJaxTypeset(codechat_body); - scroll_to_line(cursor_line, scroll_line); + scroll_to_line(cursor_position, scroll_line); } else { if (is_dirty && "Diff" in source) { // Send an `OutOfSync` response, so that the IDE will send the @@ -349,7 +350,7 @@ const _open_lp = async ( codechat_body, codechat_for_web, [], - cursor_line, + cursor_position, scroll_line, ); } @@ -656,11 +657,14 @@ const save_then_navigate = (codeChatEditorUrl: URL) => { // This can be called by the framework. Therefore, make no assumptions about // variables being valid; it be called before a file is loaded, etc. -const scroll_to_line = (cursor_line?: number, scroll_line?: number) => { +const scroll_to_line = ( + cursor_position?: CursorPosition, + scroll_line?: number, +) => { if (is_doc_only()) { // TODO. } else { - codemirror_scroll_to_line(cursor_line, scroll_line); + codemirror_scroll_to_line(cursor_position, scroll_line); } }; diff --git a/client/src/CodeChatEditorFramework.mts b/client/src/CodeChatEditorFramework.mts index f871a210..692617b1 100644 --- a/client/src/CodeChatEditorFramework.mts +++ b/client/src/CodeChatEditorFramework.mts @@ -47,6 +47,7 @@ import { on_dom_content_loaded, } from "./CodeChatEditor.mjs"; import { ResultErrTypes } from "./rust-types/ResultErrTypes.js"; +import { CursorPosition } from "./rust-types/CursorPosition.js"; // Websocket // --------- @@ -427,7 +428,7 @@ const get_client = () => root_iframe?.contentWindow?.CodeChatEditor; const set_content = async ( contents: CodeChatForWeb, is_re_translation: boolean, - cursor_line?: number, + cursor_position?: CursorPosition, scroll_line?: number, ) => { const client = get_client(); @@ -448,7 +449,7 @@ const set_content = async ( await root_iframe!.contentWindow!.CodeChatEditor.open_lp( contents, is_re_translation, - cursor_line, + cursor_position, scroll_line, ); } diff --git a/client/src/CodeMirror-integration.mts b/client/src/CodeMirror-integration.mts index fa076ab6..4a575bae 100644 --- a/client/src/CodeMirror-integration.mts +++ b/client/src/CodeMirror-integration.mts @@ -108,6 +108,7 @@ import { } from "./shared.mjs"; import { assert } from "./assert.mjs"; import { show_toast } from "./show_toast.mjs"; +import { CursorPosition } from "./rust-types/CursorPosition"; // Globals // ------- @@ -922,7 +923,7 @@ export const CodeMirror_load = async ( codechat_for_web: CodeChatForWeb, // Additional extensions. extensions: Array, - cursor_line?: number, + cursor_position?: CursorPosition, scroll_line?: number, ) => { if ("Plain" in codechat_for_web.source) { @@ -1135,12 +1136,15 @@ export const CodeMirror_load = async ( annotations: noAutosaveAnnotation.of(true), }); } - scroll_to_line(cursor_line, scroll_line); + scroll_to_line(cursor_position, scroll_line); }; // Scroll to the provided `scroll_line`; place the cursor at `cursor_line`. -export const scroll_to_line = (cursor_line?: number, scroll_line?: number) => { - if (cursor_line === undefined && scroll_line === undefined) { +export const scroll_to_line = ( + cursor_position?: CursorPosition, + scroll_line?: number, +) => { + if (cursor_position === undefined && scroll_line === undefined) { return; } @@ -1150,13 +1154,19 @@ export const scroll_to_line = (cursor_line?: number, scroll_line?: number) => { const dispatch_data: TransactionSpec = { annotations: noAutosaveAnnotation.of(true), }; - if (cursor_line !== undefined) { + if (cursor_position !== undefined) { // Translate the line numbers to a position. - const cursor_pos = current_view?.state.doc.line(cursor_line).from; - dispatch_data.selection = { - anchor: cursor_pos, - head: cursor_pos, - }; + if ("Line" in cursor_position) { + const cursor_pos = current_view?.state.doc.line( + cursor_position.Line, + ).from; + dispatch_data.selection = { + anchor: cursor_pos, + head: cursor_pos, + }; + } else { + report_error("Not supported."); + } // If a scroll position is provided, use it; otherwise, scroll the // cursor into the current view. if (scroll_line == undefined) { @@ -1222,7 +1232,7 @@ export const set_CodeMirror_positions = ( current_view.state.selection.main.from, ).number; } - update_message_contents.cursor_position = cursor_line; + update_message_contents.cursor_position = { Line: cursor_line }; // `current_view.viewport.from` isn't accurate, since it's not really the // top line, but a margin before it; see the diff --git a/extensions/VSCode/src/extension.ts b/extensions/VSCode/src/extension.ts index fe592075..843eeb35 100644 --- a/extensions/VSCode/src/extension.ts +++ b/extensions/VSCode/src/extension.ts @@ -437,19 +437,23 @@ export const activate = (context: vscode.ExtensionContext) => { ); } - const cursor_line = current_update.cursor_position; - if (cursor_line !== undefined && editor) { + const cursor_position = + current_update.cursor_position; + if (cursor_position !== undefined && editor) { + assert("Line" in cursor_position); + const cursor_line = cursor_position.Line; ignore_selection_change = true; - const cursor_position = new vscode.Position( - // The VSCode line is zero-based; the - // CodeMirror line is one-based. - cursor_line - 1, - 0, - ); + const vscode_cursor_position = + new vscode.Position( + // The VSCode line is zero-based; the + // CodeMirror line is one-based. + cursor_line - 1, + 0, + ); editor.selections = [ new vscode.Selection( - cursor_position, - cursor_position, + vscode_cursor_position, + vscode_cursor_position, ), ]; // I'd prefer to set `ignore_selection_change = diff --git a/server/src/ide.rs b/server/src/ide.rs index b609b441..67d139de 100644 --- a/server/src/ide.rs +++ b/server/src/ide.rs @@ -66,9 +66,9 @@ use crate::{ processing::{CodeChatForWeb, CodeMirror, CodeMirrorDiffable, SourceFileMetadata}, translation::{CreatedTranslationQueues, create_translation_queues}, webserver::{ - self, EditorMessage, EditorMessageContents, INITIAL_IDE_MESSAGE_ID, MESSAGE_ID_INCREMENT, - REPLY_TIMEOUT_MS, ResultErrTypes, ResultOkTypes, UpdateMessageContents, WebAppState, - setup_server, + self, CursorPosition, EditorMessage, EditorMessageContents, INITIAL_IDE_MESSAGE_ID, + MESSAGE_ID_INCREMENT, REPLY_TIMEOUT_MS, ResultErrTypes, ResultOkTypes, + UpdateMessageContents, WebAppState, setup_server, }, }; @@ -271,7 +271,7 @@ impl CodeChatEditorServer { ) -> std::io::Result { self.send_message_timeout(EditorMessageContents::Update(UpdateMessageContents { file_path, - cursor_position, + cursor_position: cursor_position.map(CursorPosition::Line), scroll_position: scroll_position.map(|x| x as f32), is_re_translation: false, contents: option_contents.map(|contents| CodeChatForWeb { diff --git a/server/src/processing.rs b/server/src/processing.rs index ebbf12b7..07f9dbf7 100644 --- a/server/src/processing.rs +++ b/server/src/processing.rs @@ -442,14 +442,14 @@ pub fn codechat_for_web_to_source( } // Translate the HTML document to Markdown. let converter = HtmlToMarkdownWrapped::new(); - let tree = html_to_tree(&code_mirror.doc)?; + let tree = html_to_tree(&code_mirror.doc, &None)?; dehydrating_walk_node(&tree); return converter .convert(&tree) .map_err(CodechatForWebToSourceError::HtmlToMarkdownFailed); } let code_doc_block_vec_html = code_mirror_to_code_doc_blocks(code_mirror); - let code_doc_block_vec = doc_block_html_to_markdown(code_doc_block_vec_html) + let code_doc_block_vec = doc_block_html_to_markdown(code_doc_block_vec_html, &None) .map_err(CodechatForWebToSourceError::HtmlToMarkdownFailed)?; code_doc_block_vec_to_source(&code_doc_block_vec, lexer) .map_err(CodechatForWebToSourceError::CannotTranslateCodeChat) @@ -599,6 +599,10 @@ impl HtmlToMarkdownWrapped { // Transform HTML in doc blocks to Markdown. fn doc_block_html_to_markdown( mut code_doc_block_vec: Vec, + // If provided, the index of each successive node in the DOM, ending with + // the offset within the last node (which must be a text node), at which a + // marker character will be inserted. + dom_offsets: &Option>, ) -> Result, HtmlToMarkdownWrappedError> { let mut converter = HtmlToMarkdownWrapped::new(); let mut last_doc_block_index = None; @@ -1033,8 +1037,17 @@ fn markdown_to_html(markdown: &str) -> String { html_output } -// Use html5ever to parse a string containing HTML to a DOM tree. -fn html_to_tree(html: &str) -> io::Result> { +// Mark the current cursor position with a +// [private use area code point](https://en.wikipedia.org/wiki/Private_Use_Areas), +// something that's unlike to appear in source code. +pub const UNICODE_CURSOR_MARKER: char = '\u{E83B}'; + +/// Use html5ever to parse a string containing HTML to a DOM tree. +fn html_to_tree( + html: &str, + // See the same parameter from `doc_block_html_to_markdown`. + dom_offsets: &Option>, +) -> io::Result> { let dom = parse_document( RcDom::default(), ParseOpts { @@ -1048,12 +1061,15 @@ fn html_to_tree(html: &str) -> io::Result> { .from_utf8() .read_from(&mut html.as_bytes())?; - // TODO: should we report parse errors? If so, how and where? - /*** - if let Some(err) = dom.errors.borrow().first() { - //return Err(io::Error::other(err.to_string())); - } - */ + if let Some(dom_offsets) = dom_offsets { + // TODO: each element in `dom_offsets` is the index of a node in the + // `dom`. Take the first index, then descend into the indicated node. + // Repeat this process until the last node, which should be a text node. + // The last index is the offset with the text contents to insert a + // `UNICODE_CURSOR_MARKER` character. Any failures (index exceeds number + // of nodes, etc.) should use an approximation where possible (use the + // last node). + } Ok(dom.document) } @@ -1061,7 +1077,7 @@ fn html_to_tree(html: &str) -> io::Result> { // A framework to transform HTML by parsing it to a DOM tree, walking the tree, // then serializing the tree back to an HTML string. pub fn transform_html)>(html: &str, transform: T) -> io::Result { - let tree = html_to_tree(html)?; + let tree = html_to_tree(html, &None)?; transform(tree.clone()); // Serialize the transformed DOM back to a string. diff --git a/server/src/processing/tests.rs b/server/src/processing/tests.rs index d54f3848..4369c82c 100644 --- a/server/src/processing/tests.rs +++ b/server/src/processing/tests.rs @@ -1326,7 +1326,7 @@ fn test_hydrate_html_1() { } fn dehydrate_html(html: &str) -> io::Result> { - let tree = html_to_tree(html)?; + let tree = html_to_tree(html, &None)?; dehydrating_walk_node(&tree); //println!("{:#?}", tree); Ok(tree) diff --git a/server/src/translation.rs b/server/src/translation.rs index 5bbf5908..a60c7398 100644 --- a/server/src/translation.rs +++ b/server/src/translation.rs @@ -1181,6 +1181,28 @@ impl TranslationTask { } }, }; + + // TODO: if the Client's `Update` message contains a + // `cursor_position.DomLocation`, translate it to a `Line` using + // the following process: + // + // 1. If this is a Markdown document, there are zero preceding + // newlines and the relevant HTML is in + // `self.code_mirror_doc`. Otherwise: + // 1. Locate the relevant doc block, identified by + // `self.code_mirror_doc_blocks.from == + // cursor_position.DomLocation.from`. + // 2. Count all newlines in `self.code_mirror_doc` which + // precede `cursor_position.DomLocation.from` + // 2. Create a temporary one-element `Vec`, + // containing only the doc block / HTML just identified. + // 3. InvokeΒ `processing::doc_block_html_to_markdown`Β on this + // vec, passing `cursor_position.DomLocation.dom_offsets` to + // insert a marker character. + // 4. Count the number of newlines before the marker. Add this + // to the number of preceding newlines for a final + // `cursor_position.Line` value. + debug!("Sending update id = {}", client_message.id); queue_send_func!(self.to_ide_tx.send(EditorMessage { id: client_message.id, diff --git a/server/src/webserver.rs b/server/src/webserver.rs index b4fb389e..6dc146f1 100644 --- a/server/src/webserver.rs +++ b/server/src/webserver.rs @@ -346,7 +346,7 @@ pub struct UpdateMessageContents { /// The line in the file where the cursor is located. TODO: Selections are /// not yet supported. #[serde(skip_serializing_if = "Option::is_none")] - pub cursor_position: Option, + pub cursor_position: Option, /// The line at the top of the screen. #[serde(skip_serializing_if = "Option::is_none")] pub scroll_position: Option, @@ -360,6 +360,28 @@ pub struct UpdateMessageContents { pub contents: Option, } +/// Store the location of the cursor (the selection, assuming it's a zero-length +/// selection, i.e. a standard cursor). +#[derive(Debug, Serialize, Deserialize, PartialEq, TS)] +#[ts(export)] +pub enum CursorPosition { + /// The line the cursor is on. + Line(u32), + /// The exact location of the cursor in the HTML DOM. Only the Client and + /// the Server may use this in messages to each other. The IDE will not + /// receive a message with this variant and must not generate a message with + /// this variant. + DomLocation { + // The `from` location (character offset) of the doc block the cursor is + // in. + from: usize, + // The index of each successive node in the DOM, ending with the offset + // within the last node (which must be a text node), of the current + // selection (cursor location). + dom_offsets: Vec, + }, +} + /// ### Data structures used by the webserver /// /// Define the [state](https://actix.rs/docs/application/#state) available to diff --git a/server/tests/overall_1.rs b/server/tests/overall_1.rs index 317931d6..88eb65cc 100644 --- a/server/tests/overall_1.rs +++ b/server/tests/overall_1.rs @@ -59,8 +59,8 @@ use code_chat_editor::{ CodeChatForWeb, CodeMirrorDiff, CodeMirrorDiffable, SourceFileMetadata, StringDiff, }, webserver::{ - EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, MESSAGE_ID_INCREMENT, - ResultOkTypes, UpdateMessageContents, set_root_path, + CursorPosition, EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, + MESSAGE_ID_INCREMENT, ResultOkTypes, UpdateMessageContents, set_root_path, }, }; use test_utils::{cast, prep_test_dir}; @@ -123,7 +123,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: None, @@ -150,7 +150,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -186,7 +186,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -226,7 +226,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(2), + cursor_position: Some(CursorPosition::Line(2)), scroll_position: Some(1.0), is_re_translation: false, contents: None, @@ -247,7 +247,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: None, @@ -269,7 +269,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(2), + cursor_position: Some(CursorPosition::Line(2)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -776,7 +776,7 @@ async fn test_client_updates_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: None, @@ -795,7 +795,7 @@ async fn test_client_updates_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -848,7 +848,7 @@ async fn test_client_updates_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(4), + cursor_position: Some(CursorPosition::Line(4)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { diff --git a/server/tests/overall_2.rs b/server/tests/overall_2.rs index 54a07d7d..1e6683da 100644 --- a/server/tests/overall_2.rs +++ b/server/tests/overall_2.rs @@ -58,8 +58,8 @@ use code_chat_editor::{ CodeChatForWeb, CodeMirrorDiff, CodeMirrorDiffable, SourceFileMetadata, StringDiff, }, webserver::{ - EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, MESSAGE_ID_INCREMENT, - ResultOkTypes, UpdateMessageContents, set_root_path, + CursorPosition, EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, + MESSAGE_ID_INCREMENT, ResultOkTypes, UpdateMessageContents, set_root_path, }, }; use test_utils::{cast, prep_test_dir}; @@ -112,7 +112,7 @@ async fn test_4_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: None, @@ -130,7 +130,7 @@ async fn test_4_core( &mut client_id, &mut client_version, "python", - Some(3), + Some(CursorPosition::Line(3)), Some(1.0), ) .await; @@ -142,7 +142,7 @@ async fn test_4_core( &mut client_id, &mut client_version, "python", - Some(5), + Some(CursorPosition::Line(5)), Some(1.0), ) .await; @@ -206,7 +206,7 @@ async fn test_5_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: None, @@ -232,7 +232,7 @@ async fn test_5_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -295,7 +295,7 @@ async fn test_5_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(1), + cursor_position: Some(CursorPosition::Line(1)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -416,7 +416,6 @@ async fn test_6_core( message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), cursor_position: None, - includes_marker: false, scroll_position: None, is_re_translation: false, contents: None, diff --git a/server/tests/overall_common/mod.rs b/server/tests/overall_common/mod.rs index 287a03d6..39b0eab8 100644 --- a/server/tests/overall_common/mod.rs +++ b/server/tests/overall_common/mod.rs @@ -50,7 +50,7 @@ use code_chat_editor::{ ide::CodeChatEditorServer, processing::{CodeChatForWeb, CodeMirrorDiff, CodeMirrorDiffable, SourceFileMetadata}, webserver::{ - EditorMessage, EditorMessageContents, MESSAGE_ID_INCREMENT, ResultOkTypes, + CursorPosition, EditorMessage, EditorMessageContents, MESSAGE_ID_INCREMENT, ResultOkTypes, UpdateMessageContents, }, }; @@ -308,7 +308,7 @@ pub async fn goto_line( && let EditorMessageContents::Update(update) = &msg.message && update.file_path == path_str && update.contents.is_none() - && update.cursor_position != Some(line) + && update.cursor_position != Some(CursorPosition::Line(line)) { codechat_server.send_result(*client_id, None).await.unwrap(); *client_id += MESSAGE_ID_INCREMENT; @@ -320,7 +320,7 @@ pub async fn goto_line( id: *client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.to_string(), - cursor_position: Some(line), + cursor_position: Some(CursorPosition::Line(line)), scroll_position: Some(1.0), is_re_translation: false, contents: None, @@ -433,7 +433,7 @@ pub async fn get_empty_client_update( client_id: &mut f64, client_version: &mut f64, mode: &str, - cursor_position: Option, + cursor_position: Option, scroll_position: Option, ) { let msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); From 9842d83717b233091836a41af5cd9d016d835897 Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Tue, 21 Apr 2026 16:57:57 +0500 Subject: [PATCH 05/31] wip: Claude, with comments manually restored. --- server/src/processing.rs | 36 +++++++++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/server/src/processing.rs b/server/src/processing.rs index 07f9dbf7..4f37de7c 100644 --- a/server/src/processing.rs +++ b/server/src/processing.rs @@ -1062,13 +1062,43 @@ fn html_to_tree( .read_from(&mut html.as_bytes())?; if let Some(dom_offsets) = dom_offsets { - // TODO: each element in `dom_offsets` is the index of a node in the + // Each element in `dom_offsets` is the index of a node in the // `dom`. Take the first index, then descend into the indicated node. // Repeat this process until the last node, which should be a text node. // The last index is the offset with the text contents to insert a // `UNICODE_CURSOR_MARKER` character. Any failures (index exceeds number - // of nodes, etc.) should use an approximation where possible (use the - // last node). + // of nodes, etc.) use an approximation where possible. + let mut current_node = dom.document.clone(); + let last_idx = dom_offsets.len().saturating_sub(1); + 'outer: for (i, &offset) in dom_offsets.iter().enumerate() { + if i == last_idx { + // Insert the cursor marker at the given character offset within + // the text node. + if let NodeData::Text { contents } = ¤t_node.data { + let mut text = contents.borrow().to_string(); + // Convert the character offset into a byte offset. + let byte_offset = text + .char_indices() + .nth(offset) + .map(|(b, _)| b) + .unwrap_or(text.len()); + text.insert(byte_offset, UNICODE_CURSOR_MARKER); + *contents.borrow_mut() = text.into(); + } + } else { + let next_node = { + let children = current_node.children.borrow(); + if offset < children.len() { + children[offset].clone() + } else if let Some(last) = children.last() { + last.clone() + } else { + break 'outer; + } + }; + current_node = next_node; + } + } } Ok(dom.document) From 7f0448b979192f7c01bb2ea8cf85d5304888c0e2 Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Tue, 21 Apr 2026 19:05:48 +0500 Subject: [PATCH 06/31] Fix: correct entry point (document body, not document). Refactor Add tests --- server/src/processing.rs | 31 +++++++++++++++++++++---------- server/src/processing/tests.rs | 34 ++++++++++++++++++++++++++++++---- 2 files changed, 51 insertions(+), 14 deletions(-) diff --git a/server/src/processing.rs b/server/src/processing.rs index 4f37de7c..54bd1ee1 100644 --- a/server/src/processing.rs +++ b/server/src/processing.rs @@ -602,6 +602,9 @@ fn doc_block_html_to_markdown( // If provided, the index of each successive node in the DOM, ending with // the offset within the last node (which must be a text node), at which a // marker character will be inserted. + // + // This will be applied to each doc block -- when this parameter is + // provided, it's typically called with a vec containing only one doc block. dom_offsets: &Option>, ) -> Result, HtmlToMarkdownWrappedError> { let mut converter = HtmlToMarkdownWrapped::new(); @@ -1062,13 +1065,13 @@ fn html_to_tree( .read_from(&mut html.as_bytes())?; if let Some(dom_offsets) = dom_offsets { - // Each element in `dom_offsets` is the index of a node in the - // `dom`. Take the first index, then descend into the indicated node. - // Repeat this process until the last node, which should be a text node. - // The last index is the offset with the text contents to insert a + // Each element in `dom_offsets` is the index of a node in the `dom`. + // Take the first index, then descend into the indicated node. Repeat + // this process until the last node, which should be a text node. The + // last index is the offset with the text contents to insert a // `UNICODE_CURSOR_MARKER` character. Any failures (index exceeds number // of nodes, etc.) use an approximation where possible. - let mut current_node = dom.document.clone(); + let mut current_node = get_dom_body(&dom.document); let last_idx = dom_offsets.len().saturating_sub(1); 'outer: for (i, &offset) in dom_offsets.iter().enumerate() { if i == last_idx { @@ -1117,6 +1120,18 @@ pub fn transform_html)>(html: &str, transform: T) -> io::Resu ..Default::default() }; let mut bytes = vec![]; + serialize( + &mut bytes, + &SerializableHandle::from(get_dom_body(&tree)), + so, + )?; + let html_out = String::from_utf8(bytes).map_err(io::Error::other)?; + + Ok(html_out) +} + +/// Get the body element from a top-level DOM. +fn get_dom_body(document: &Rc) -> Rc { // HTML is: // // ```html @@ -1125,11 +1140,7 @@ pub fn transform_html)>(html: &str, transform: T) -> io::Resu // ... <-- element 1 // // ``` - let body = tree.children.borrow()[0].children.borrow()[1].clone(); - serialize(&mut bytes, &SerializableHandle::from(body.clone()), so)?; - let html_out = String::from_utf8(bytes).map_err(io::Error::other)?; - - Ok(html_out) + document.children.borrow()[0].children.borrow()[1].clone() } // HTML produced from Markdown needs additional processing, termed hydration: diff --git a/server/src/processing/tests.rs b/server/src/processing/tests.rs index 4369c82c..de38fc10 100644 --- a/server/src/processing/tests.rs +++ b/server/src/processing/tests.rs @@ -24,7 +24,7 @@ use std::{io, path::PathBuf, rc::Rc, str::FromStr}; // ### Third-party -use indoc::indoc; +use indoc::{formatdoc, indoc}; use markup5ever_rcdom::Node; use predicates::prelude::predicate::str; use pretty_assertions::assert_eq; @@ -42,10 +42,10 @@ use crate::{ processing::{ CodeDocBlockVecToSourceError, CodeMirrorDiffable, CodeMirrorDocBlockDelete, CodeMirrorDocBlockTransaction, CodeMirrorDocBlockUpdate, CodechatForWebToSourceError, - HtmlToMarkdownWrapped, SourceToCodeChatForWebError, byte_index_of, + HtmlToMarkdownWrapped, SourceToCodeChatForWebError, UNICODE_CURSOR_MARKER, byte_index_of, code_doc_block_vec_to_source, code_mirror_to_code_doc_blocks, codechat_for_web_to_source, - dehydrating_walk_node, diff_code_mirror_doc_blocks, diff_str, html_to_tree, hydrate_html, - markdown_to_html, source_to_codechat_for_web, + dehydrating_walk_node, diff_code_mirror_doc_blocks, diff_str, doc_block_html_to_markdown, + html_to_tree, hydrate_html, markdown_to_html, source_to_codechat_for_web, }, }; use test_utils::{cast, prep_test_dir, test_utils::stringit}; @@ -1244,6 +1244,32 @@ fn test_diff_2() { ); } +#[test] +fn test_doc_block_html_to_markdown_1() { + assert_eq!( + doc_block_html_to_markdown( + vec![build_doc_block( + "", + "", + "

Index 0

Index 1.0Index 1.1012345

" + )], + &Some(vec![1, 2, 3]), + ) + .unwrap(), + vec![build_doc_block( + "", + "", + &formatdoc!( + " + Index 0 + + Index 1.0**Index 1.1**012{UNICODE_CURSOR_MARKER}345 + " + ) + )] + ); +} + #[test] fn test_hydrate_html_1() { // These tests check the translation from Markdown to "wet" HTML (what the user provides) instead of dry -> wet HTML. From df52361712250d5762475b7e9927fca9cba82c2f Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Wed, 22 Apr 2026 06:28:52 +0500 Subject: [PATCH 07/31] Fix: change Selenium testing to use generics instead of macros. --- server/tests/overall_1.rs | 87 ++++++------- server/tests/overall_2.rs | 52 +++----- server/tests/overall_common/mod.rs | 198 ++++++++++++++--------------- 3 files changed, 153 insertions(+), 184 deletions(-) diff --git a/server/tests/overall_1.rs b/server/tests/overall_1.rs index 88eb65cc..ea5b2c08 100644 --- a/server/tests/overall_1.rs +++ b/server/tests/overall_1.rs @@ -27,24 +27,13 @@ mod overall_common; // ------- // // ### Standard library -use std::{ - env, - error::Error, - panic::AssertUnwindSafe, - path::{Path, PathBuf}, - time::Duration, -}; +use std::{error::Error, path::PathBuf, time::Duration}; // ### Third-party -use assert_fs::TempDir; use dunce::canonicalize; -use futures::FutureExt; use indoc::indoc; use pretty_assertions::assert_eq; -use thirtyfour::{ - By, ChromiumLikeCapabilities, DesiredCapabilities, Key, WebDriver, error::WebDriverError, - start_webdriver_process, -}; +use thirtyfour::{By, Key, WebDriver, error::WebDriverError}; use tokio::time::sleep; // ### Local @@ -60,7 +49,7 @@ use code_chat_editor::{ }, webserver::{ CursorPosition, EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, - MESSAGE_ID_INCREMENT, ResultOkTypes, UpdateMessageContents, set_root_path, + MESSAGE_ID_INCREMENT, ResultOkTypes, UpdateMessageContents, }, }; use test_utils::{cast, prep_test_dir}; @@ -79,8 +68,8 @@ make_test!(test_server, test_server_core); #[allow(deprecated)] async fn test_server_core( codechat_server: CodeChatEditorServer, - driver_ref: &WebDriver, - test_dir: &Path, + driver: WebDriver, + test_dir: PathBuf, ) -> Result<(), WebDriverError> { let mut expected_messages = ExpectedMessages::new(); let path = canonicalize(test_dir.join("test.py")).unwrap(); @@ -88,7 +77,7 @@ async fn test_server_core( let mut version = 1.0; let mut server_id = perform_loadfile( &codechat_server, - test_dir, + &test_dir, "test.py", Some(("# Test\ncode()".to_string(), version)), true, @@ -101,12 +90,12 @@ async fn test_server_core( // #### Doc block tests // // Verify the first doc block. - let codechat_iframe = select_codechat_iframe(driver_ref).await; + let codechat_iframe = select_codechat_iframe(&driver).await; let indent_css = ".CodeChat-CodeMirror .CodeChat-doc-indent"; - let doc_block_indent = driver_ref.find(By::Css(indent_css)).await.unwrap(); + let doc_block_indent = driver.find(By::Css(indent_css)).await.unwrap(); assert_eq!(doc_block_indent.inner_html().await.unwrap(), ""); let contents_css = ".CodeChat-CodeMirror .CodeChat-doc-contents"; - let doc_block_contents = driver_ref.find(By::Css(contents_css)).await.unwrap(); + let doc_block_contents = driver.find(By::Css(contents_css)).await.unwrap(); assert_eq!( doc_block_contents.inner_html().await.unwrap(), "

Test

\n" @@ -134,7 +123,7 @@ async fn test_server_core( client_id += MESSAGE_ID_INCREMENT; // Refind it, since it's now switched with a TinyMCE editor. - let tinymce_contents = driver_ref.find(By::Id("TinyMCE-inst")).await.unwrap(); + let tinymce_contents = driver.find(By::Id("TinyMCE-inst")).await.unwrap(); // Make an edit. tinymce_contents.send_keys("foo").await.unwrap(); @@ -215,7 +204,7 @@ async fn test_server_core( // // Verify the first line of code. let code_line_css = ".CodeChat-CodeMirror .cm-line"; - let code_line = driver_ref.find(By::Css(code_line_css)).await.unwrap(); + let code_line = driver.find(By::Css(code_line_css)).await.unwrap(); assert_eq!(code_line.inner_html().await.unwrap(), "code()"); // A click will update the current position and focus the code block. @@ -315,14 +304,14 @@ async fn test_server_core( ); // Verify them. - let doc_block_indent = driver_ref.find(By::Css(indent_css)).await.unwrap(); + let doc_block_indent = driver.find(By::Css(indent_css)).await.unwrap(); assert_eq!(doc_block_indent.inner_html().await.unwrap(), " "); - let doc_block_contents = driver_ref.find(By::Css(contents_css)).await.unwrap(); + let doc_block_contents = driver.find(By::Css(contents_css)).await.unwrap(); assert_eq!( doc_block_contents.inner_html().await.unwrap(), "

Testfood

" ); - let code_line = driver_ref.find(By::Css(code_line_css)).await.unwrap(); + let code_line = driver.find(By::Css(code_line_css)).await.unwrap(); assert_eq!(code_line.inner_html().await.unwrap(), "code()bark"); /*x TODO: these tests fail, since the Client sends an unnecessary OutOfSync message. How to test sending a diff to the client? @@ -359,7 +348,7 @@ async fn test_server_core( let toc_path = canonicalize(test_dir.join("toc.md")).unwrap(); server_id = perform_loadfile( &codechat_server, - test_dir, + &test_dir, "test.md", Some(("A **markdown** file.".to_string(), version)), true, @@ -369,7 +358,7 @@ async fn test_server_core( // Check the content. let body_css = "#CodeChat-body .CodeChat-doc-contents"; - let body_content = driver_ref.find(By::Css(body_css)).await.unwrap(); + let body_content = driver.find(By::Css(body_css)).await.unwrap(); assert_eq!( body_content.inner_html().await.unwrap(), "

A markdown file.

" @@ -521,7 +510,7 @@ async fn test_server_core( server_id += MESSAGE_ID_INCREMENT; // Look at the content, which should be an iframe. - let plain_content = driver_ref + let plain_content = driver .find(By::Css("#CodeChat-contents")) .await .unwrap(); @@ -539,13 +528,13 @@ async fn test_server_core( // #### PDF viewer // // Click on the link for the PDF to test. - let toc_iframe = driver_ref.find(By::Css("#CodeChat-sidebar")).await.unwrap(); - driver_ref + let toc_iframe = driver.find(By::Css("#CodeChat-sidebar")).await.unwrap(); + driver .switch_to() .frame_element(&toc_iframe) .await .unwrap(); - let test_pdf = driver_ref.find(By::LinkText("test.pdf")).await.unwrap(); + let test_pdf = driver.find(By::LinkText("test.pdf")).await.unwrap(); test_pdf.click().await.unwrap(); // Respond to the current file, then load requests for the PDf and the TOC. @@ -601,12 +590,12 @@ async fn test_server_core( // Check that the PDF viewer was sent. // // Target the iframe containing the Client. - driver_ref + driver .switch_to() .frame_element(&codechat_iframe) .await .unwrap(); - let plain_content = driver_ref + let plain_content = driver .find(By::Css("#CodeChat-contents")) .await .unwrap(); @@ -634,25 +623,25 @@ make_test!(test_client, test_client_core); #[allow(deprecated)] async fn test_client_core( codechat_server: CodeChatEditorServer, - driver_ref: &WebDriver, - test_dir: &Path, + driver: WebDriver, + test_dir: PathBuf, ) -> Result<(), WebDriverError> { let mut server_id = - perform_loadfile(&codechat_server, test_dir, "test.py", None, true, 6.0).await; + perform_loadfile(&codechat_server, &test_dir, "test.py", None, true, 6.0).await; let path = canonicalize(test_dir.join("test.py")).unwrap(); let path_str = path.to_str().unwrap().to_string(); // Target the iframe containing the Client. - let codechat_iframe = select_codechat_iframe(driver_ref).await; + let codechat_iframe = select_codechat_iframe(&driver).await; // Click on the link for the PDF to test. - let toc_iframe = driver_ref.find(By::Css("#CodeChat-sidebar")).await.unwrap(); - driver_ref + let toc_iframe = driver.find(By::Css("#CodeChat-sidebar")).await.unwrap(); + driver .switch_to() .frame_element(&toc_iframe) .await .unwrap(); - let test_py = driver_ref.find(By::LinkText("test.py")).await.unwrap(); + let test_py = driver.find(By::LinkText("test.py")).await.unwrap(); test_py.click().await.unwrap(); // Respond to the current file, then load requests for the PDF and the TOC. @@ -694,12 +683,12 @@ async fn test_client_core( sleep(Duration::from_millis(3000)).await; // Look for the test results. - driver_ref + driver .switch_to() .frame_element(&codechat_iframe) .await .unwrap(); - let mocha_results = driver_ref + let mocha_results = driver .find(By::Css("#mocha-stats .result")) .await .unwrap(); @@ -724,8 +713,8 @@ make_test!(test_client_updates, test_client_updates_core); async fn test_client_updates_core( codechat_server: CodeChatEditorServer, - driver_ref: &WebDriver, - test_dir: &Path, + driver: WebDriver, + test_dir: PathBuf, ) -> Result<(), WebDriverError> { let ide_version = 0.0; let orig_text = indoc!( @@ -739,7 +728,7 @@ async fn test_client_updates_core( .to_string(); let mut server_id = perform_loadfile( &codechat_server, - test_dir, + &test_dir, "test.py", Some((orig_text.clone(), ide_version)), true, @@ -751,11 +740,11 @@ async fn test_client_updates_core( let path_str = path.to_str().unwrap().to_string(); // Target the iframe containing the Client. - select_codechat_iframe(driver_ref).await; + select_codechat_iframe(&driver).await; // Select the doc block and add to the line, causing a word wrap. let contents_css = ".CodeChat-CodeMirror .CodeChat-doc-contents"; - let doc_block_contents = driver_ref.find(By::Css(contents_css)).await.unwrap(); + let doc_block_contents = driver.find(By::Css(contents_css)).await.unwrap(); doc_block_contents .send_keys("" + Key::End + " testing") .await @@ -830,13 +819,13 @@ async fn test_client_updates_core( ); server_id += MESSAGE_ID_INCREMENT; - goto_line(&codechat_server, driver_ref, &mut client_id, &path_str, 4) + goto_line(&codechat_server, &driver, &mut client_id, &path_str, 4) .await .unwrap(); // Add an indented comment. let code_line_css = ".CodeChat-CodeMirror .cm-line"; - let code_line = driver_ref.find(By::Css(code_line_css)).await.unwrap(); + let code_line = driver.find(By::Css(code_line_css)).await.unwrap(); code_line.send_keys(Key::Home + "# ").await.unwrap(); // This should edit the (new) third line of the file after word wrap: `def // foo():`. diff --git a/server/tests/overall_2.rs b/server/tests/overall_2.rs index 1e6683da..4a764a27 100644 --- a/server/tests/overall_2.rs +++ b/server/tests/overall_2.rs @@ -27,25 +27,13 @@ mod overall_common; // ------- // // ### Standard library -use std::{ - env, - error::Error, - panic::AssertUnwindSafe, - path::{Path, PathBuf}, - time::Duration, -}; +use std::{error::Error, path::PathBuf}; // ### Third-party -use assert_fs::TempDir; use dunce::canonicalize; -use futures::FutureExt; use indoc::indoc; use pretty_assertions::assert_eq; -use thirtyfour::{ - By, ChromiumLikeCapabilities, DesiredCapabilities, WebDriver, error::WebDriverError, - start_webdriver_process, -}; -use tokio::time::sleep; +use thirtyfour::{By, WebDriver, error::WebDriverError}; // ### Local use crate::overall_common::{ @@ -59,10 +47,10 @@ use code_chat_editor::{ }, webserver::{ CursorPosition, EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, - MESSAGE_ID_INCREMENT, ResultOkTypes, UpdateMessageContents, set_root_path, + MESSAGE_ID_INCREMENT, ResultOkTypes, UpdateMessageContents, }, }; -use test_utils::{cast, prep_test_dir}; +use test_utils::prep_test_dir; make_test!(test_4, test_4_core); @@ -70,15 +58,15 @@ make_test!(test_4, test_4_core); // ----- async fn test_4_core( codechat_server: CodeChatEditorServer, - driver_ref: &WebDriver, - test_dir: &Path, + driver: WebDriver, + test_dir: PathBuf, ) -> Result<(), WebDriverError> { let path = canonicalize(test_dir.join("test.py")).unwrap(); let path_str = path.to_str().unwrap().to_string(); let ide_version = 0.0; perform_loadfile( &codechat_server, - test_dir, + &test_dir, "test.py", Some(( indoc!( @@ -99,12 +87,12 @@ async fn test_4_core( .await; // Target the iframe containing the Client. - select_codechat_iframe(driver_ref).await; + select_codechat_iframe(&driver).await; // Switch from one doc block to another. It should produce an update with // only cursor/scroll info (no contents). let mut client_id = INITIAL_CLIENT_MESSAGE_ID; - let doc_blocks = driver_ref.find_all(By::Css(".CodeChat-doc")).await.unwrap(); + let doc_blocks = driver.find_all(By::Css(".CodeChat-doc")).await.unwrap(); doc_blocks[0].click().await.unwrap(); assert_eq!( codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), @@ -157,8 +145,8 @@ make_test!(test_5, test_5_core); // Verify that newlines in Mermaid and Graphviz diagrams aren't removed. async fn test_5_core( codechat_server: CodeChatEditorServer, - driver_ref: &WebDriver, - test_dir: &Path, + driver: WebDriver, + test_dir: PathBuf, ) -> Result<(), WebDriverError> { let path = canonicalize(test_dir.join("test.py")).unwrap(); let path_str = path.to_str().unwrap().to_string(); @@ -182,7 +170,7 @@ async fn test_5_core( .to_string(); let mut server_id = perform_loadfile( &codechat_server, - test_dir, + &test_dir, "test.py", Some((orig_text.clone(), version)), false, @@ -191,11 +179,11 @@ async fn test_5_core( .await; // Target the iframe containing the Client. - select_codechat_iframe(driver_ref).await; + select_codechat_iframe(&driver).await; // Focus it. let contents_css = ".CodeChat-CodeMirror .CodeChat-doc-contents"; - let doc_block_contents = driver_ref.find(By::Css(contents_css)).await.unwrap(); + let doc_block_contents = driver.find(By::Css(contents_css)).await.unwrap(); doc_block_contents.click().await.unwrap(); // The click produces an updated cursor/scroll location after an autosave // delay. @@ -216,7 +204,7 @@ async fn test_5_core( client_id += MESSAGE_ID_INCREMENT; // Refind it, since it's now switched with a TinyMCE editor. - let tinymce_contents = driver_ref.find(By::Id("TinyMCE-inst")).await.unwrap(); + let tinymce_contents = driver.find(By::Id("TinyMCE-inst")).await.unwrap(); // Make an edit. tinymce_contents.send_keys("foo").await.unwrap(); @@ -341,8 +329,8 @@ make_test!(test_6, test_6_core); // Verify that edits in document-only mode don't result in data corruption. async fn test_6_core( codechat_server: CodeChatEditorServer, - driver_ref: &WebDriver, - test_dir: &Path, + driver: WebDriver, + test_dir: PathBuf, ) -> Result<(), WebDriverError> { let path = canonicalize(test_dir.join("test.md")).unwrap(); let path_str = path.to_str().unwrap().to_string(); @@ -357,7 +345,7 @@ async fn test_6_core( .to_string(); perform_loadfile( &codechat_server, - test_dir, + &test_dir, "test.md", Some((orig_text.clone(), version)), false, @@ -366,11 +354,11 @@ async fn test_6_core( .await; // Target the iframe containing the Client. - select_codechat_iframe(driver_ref).await; + select_codechat_iframe(&driver).await; // Check the content. let body_css = "#CodeChat-body .CodeChat-doc-contents"; - let body_content = driver_ref.find(By::Css(body_css)).await.unwrap(); + let body_content = driver.find(By::Css(body_css)).await.unwrap(); // Perform edits. body_content.send_keys("a").await.unwrap(); diff --git a/server/tests/overall_common/mod.rs b/server/tests/overall_common/mod.rs index 39b0eab8..caa0a31e 100644 --- a/server/tests/overall_common/mod.rs +++ b/server/tests/overall_common/mod.rs @@ -38,12 +38,24 @@ // ------- // // ### Standard library -use std::{collections::HashMap, error::Error, path::Path, time::Duration}; +use std::{ + collections::HashMap, + env, + error::Error, + panic::AssertUnwindSafe, + path::{Path, PathBuf}, + time::Duration, +}; +use assert_fs::TempDir; // ### Third-party use dunce::canonicalize; +use futures::FutureExt; use pretty_assertions::assert_eq; -use thirtyfour::{By, Key, WebDriver, WebElement}; +use thirtyfour::{ + By, ChromiumLikeCapabilities, DesiredCapabilities, Key, WebDriver, WebElement, + error::WebDriverError, start_webdriver_process, +}; // ### Local use code_chat_editor::{ @@ -51,10 +63,11 @@ use code_chat_editor::{ processing::{CodeChatForWeb, CodeMirrorDiff, CodeMirrorDiffable, SourceFileMetadata}, webserver::{ CursorPosition, EditorMessage, EditorMessageContents, MESSAGE_ID_INCREMENT, ResultOkTypes, - UpdateMessageContents, + UpdateMessageContents, set_root_path, }, }; use test_utils::cast; +use tokio::time::sleep; // Utilities // --------- @@ -135,125 +148,104 @@ pub const TIMEOUT: Duration = Duration::from_millis(2000); // The goal was to pass the harness a function which runs the tests. This // currently doesn't work, due to problems with lifetimes (see comments). So, // implement this as a macro instead (kludge!). -#[macro_export] -macro_rules! harness { - // The name of the test function to call inside the harness. - ($func: ident) => { - pub async fn harness< - 'a, - F: FnOnce(CodeChatEditorServer, &'a WebDriver, &'a Path) -> Fut, - Fut: Future>, - >( - // The function which performs tests using thirtyfour. TODO: not - // used. - _f: F, - // The output from calling `prep_test_dir!()`. - prep_test_dir: (TempDir, PathBuf), - ) -> Result<(), Box> { - let (temp_dir, test_dir) = prep_test_dir; - // The logger gets configured by (I think) - // `start_webdriver_process`, which delegates to `selenium-manager`. - // Set logging level here. - unsafe { env::set_var("RUST_LOG", "debug") }; - // Start the webdriver. - let server_url = "http://localhost:4444"; - let mut caps = DesiredCapabilities::chrome(); - // Ensure the screen is wide enough for an 80-character line, used - // to word wrapping test in `test_client_updates`. Otherwise, this - // test send the End key to go to the end of the line...but it's not - // the end of the full line on a narrow screen. - caps.add_arg("--window-size=1920,768")?; - caps.add_arg("--headless")?; - // On Ubuntu CI, avoid failures, probably due to running Chrome as - // root. - #[cfg(target_os = "linux")] - if env::var("CI") == Ok("true".to_string()) { - caps.add_arg("--disable-gpu")?; - caps.add_arg("--no-sandbox")?; - } - if let Err(err) = start_webdriver_process(server_url, &caps, true) { - // Often, the "failure" is that the webdriver is already - // running. - eprintln!("Failed to start the webdriver process: {err:#?}"); - } - // Wait for the driver to start up. - sleep(Duration::from_millis(500)).await; - let driver = WebDriver::new(server_url, caps).await?; - let driver_clone = driver.clone(); - let driver_ref = &driver_clone; +pub async fn harness< + F: FnOnce(CodeChatEditorServer, WebDriver, PathBuf) -> Fut, + Fut: Future>, +>( + f: F, + // The output from calling `prep_test_dir!()`. + prep_test_dir: (TempDir, PathBuf), +) -> Result<(), Box> { + let (temp_dir, test_dir) = prep_test_dir; + // The logger gets configured by (I think) + // `start_webdriver_process`, which delegates to `selenium-manager`. + // Set logging level here. + unsafe { env::set_var("RUST_LOG", "debug") }; + // Start the webdriver. + let server_url = "http://localhost:4444"; + let mut caps = DesiredCapabilities::chrome(); + // Ensure the screen is wide enough for an 80-character line, used + // to word wrapping test in `test_client_updates`. Otherwise, this + // test send the End key to go to the end of the line...but it's not + // the end of the full line on a narrow screen. + caps.add_arg("--window-size=1920,768")?; + caps.add_arg("--headless")?; + // On Ubuntu CI, avoid failures, probably due to running Chrome as + // root. + #[cfg(target_os = "linux")] + if env::var("CI") == Ok("true".to_string()) { + caps.add_arg("--disable-gpu")?; + caps.add_arg("--no-sandbox")?; + } + if let Err(err) = start_webdriver_process(server_url, &caps, true) { + // Often, the "failure" is that the webdriver is already + // running. + eprintln!("Failed to start the webdriver process: {err:#?}"); + } + // Wait for the driver to start up. + sleep(Duration::from_millis(500)).await; + let driver = WebDriver::new(server_url, caps).await?; + let driver_clone = driver.clone(); - // Run the test inside an async, so we can shut down the driver - // before returning an error. Mark the function as unwind safe. - // though I'm not certain this is correct. Hopefully, it's good - // enough for testing. - let ret = AssertUnwindSafe(async move { - // ### Setup - let p = env::current_exe().unwrap().parent().unwrap().join("../.."); - set_root_path(Some(&p)).unwrap(); - let codechat_server = CodeChatEditorServer::new().unwrap(); + // Run the test inside an async, so we can shut down the driver + // before returning an error. Mark the function as unwind safe. + // though I'm not certain this is correct. Hopefully, it's good + // enough for testing. + let ret = AssertUnwindSafe(async move { + // ### Setup + let p = env::current_exe().unwrap().parent().unwrap().join("../.."); + set_root_path(Some(&p)).unwrap(); + let codechat_server = CodeChatEditorServer::new().unwrap(); - // Get the resulting web page text. - let opened_id = codechat_server.send_message_opened(true).await.unwrap(); - pretty_assertions::assert_eq!( - codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), - EditorMessage { - id: opened_id, - message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)) - } - ); - let em_html = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); - codechat_server.send_result(em_html.id, None).await.unwrap(); + // Get the resulting web page text. + let opened_id = codechat_server.send_message_opened(true).await.unwrap(); + pretty_assertions::assert_eq!( + codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), + EditorMessage { + id: opened_id, + message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)) + } + ); + let em_html = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); + codechat_server.send_result(em_html.id, None).await.unwrap(); - // Parse out the address to use. - let client_html = cast!(&em_html.message, EditorMessageContents::ClientHtml); - let find_str = "", "

"); + normalized_html == raw_html } else { false } } -// Given vectors of two doc blocks, compare them, ignoring newlines. -fn doc_block_compare(a: &CodeMirrorDocBlockVec, b: &CodeMirrorDocBlockVec) -> bool { +/// Given vectors of two doc blocks, compare them, ignoring newlines. +fn doc_blocks_compare(a: &CodeMirrorDocBlockVec, b: &CodeMirrorDocBlockVec) -> bool { if a.len() != b.len() { return false; } @@ -1389,9 +1398,9 @@ fn debug_shorten(val: T) -> String { // ----- #[cfg(test)] mod tests { - use crate::{processing::CodeMirrorDocBlock, translation::doc_block_compare}; + use crate::{processing::CodeMirrorDocBlock, translation::doc_blocks_compare}; - #[test] + //#[test] fn test_x1() { let before = vec![CodeMirrorDocBlock { from: 0, @@ -1407,6 +1416,6 @@ mod tests { delimiter: "//".to_string(), contents: "

Copyright (C) 2025 Bryan A. Jones.

\n

This file is part of the CodeChat Editor. The CodeChat Editor is free\nsoftware: you can redistribute it and/or modify it under the terms of the GNU\nGeneral Public License as published by the Free Software Foundation, either\nversion 3 of the License, or (at your option) any later version.

\n

The CodeChat Editor is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\nFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more\ndetails.

\n

You should have received a copy of the GNU General Public License along with\nthe CodeChat Editor. If not, see\nhttp://www.gnu.org/licenses.

\n

debug_enable.mts -- Configure debug features

\n

True to enable additional debug logging.

\n".to_string(), }]; - assert!(doc_block_compare(&before, &after)); + assert!(doc_blocks_compare(&before, &after)); } } From 28e0811db7ad6556547fa868029c5c245f9c42fa Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Mon, 4 May 2026 22:13:19 +0500 Subject: [PATCH 16/31] Docs: typo. --- extensions/VSCode/src/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/VSCode/src/extension.ts b/extensions/VSCode/src/extension.ts index 843eeb35..7da97f73 100644 --- a/extensions/VSCode/src/extension.ts +++ b/extensions/VSCode/src/extension.ts @@ -233,7 +233,7 @@ export const activate = (context: vscode.ExtensionContext) => { // before this command was executed to retain // the focus and be immediately rendered. preserveFocus: true, - // Put this in the a column beside the current + // Put this in the column beside the current // column. viewColumn: vscode.ViewColumn.Beside, }, From b56d52848dc274c120c5587a32ec997893a090ca Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Mon, 4 May 2026 22:13:35 +0500 Subject: [PATCH 17/31] Clean: remove unnecessary parameter. --- builder/src/main.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/builder/src/main.rs b/builder/src/main.rs index 2a6b366d..b95add5e 100644 --- a/builder/src/main.rs +++ b/builder/src/main.rs @@ -464,16 +464,16 @@ fn run_format_and_lint(check_only: bool) -> io::Result<()> { }; run_cmd!( info "cargo clippy and fmt"; - cargo clippy --all-targets --all-features --tests -- $clippy_check_only; + cargo clippy --all-targets --all-features -- $clippy_check_only; cargo fmt --all $check; info "Builder: cargo clippy and fmt"; - cargo clippy --all-targets --all-features --tests --manifest-path=$BUILDER_PATH/Cargo.toml -- $clippy_check_only; + cargo clippy --all-targets --all-features --manifest-path=$BUILDER_PATH/Cargo.toml -- $clippy_check_only; cargo fmt --all $check --manifest-path=$BUILDER_PATH/Cargo.toml; info "VSCode extension: cargo clippy and fmt"; - cargo clippy --all-targets --all-features --tests --manifest-path=$VSCODE_PATH/Cargo.toml -- $clippy_check_only; + cargo clippy --all-targets --all-features --manifest-path=$VSCODE_PATH/Cargo.toml -- $clippy_check_only; cargo fmt --all $check --manifest-path=$VSCODE_PATH/Cargo.toml; info "test_utils: cargo clippy and fmt" - cargo clippy --all-targets --all-features --tests --manifest-path=$TEST_UTILS_PATH/Cargo.toml -- $clippy_check_only; + cargo clippy --all-targets --all-features --manifest-path=$TEST_UTILS_PATH/Cargo.toml -- $clippy_check_only; cargo fmt --all $check --manifest-path=$TEST_UTILS_PATH/Cargo.toml; info "cargo audit"; From 661606d70f5f03f4ac59033cb63ea4513d82cbb4 Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Tue, 5 May 2026 08:11:21 +0500 Subject: [PATCH 18/31] Fix: Correct errors in HTML comparison. --- server/src/processing.rs | 1 + server/src/processing/tests.rs | 2 +- server/src/translation.rs | 14 ++++---- server/tests/overall_2.rs | 59 ++-------------------------------- 4 files changed, 10 insertions(+), 66 deletions(-) diff --git a/server/src/processing.rs b/server/src/processing.rs index 4cbccf2d..05175b55 100644 --- a/server/src/processing.rs +++ b/server/src/processing.rs @@ -868,6 +868,7 @@ pub fn source_to_codechat_for_web( let dry_html = markdown_to_html(file_contents); let html = hydrate_html(&dry_html) .map_err(|e| SourceToCodeChatForWebError::ParseFailed(e.to_string()))?; + let html = minify(&html)?; CodeMirrorDiffable::Plain(CodeMirror { doc: html, doc_blocks: vec![], diff --git a/server/src/processing/tests.rs b/server/src/processing/tests.rs index ce2369ca..8e004d87 100644 --- a/server/src/processing/tests.rs +++ b/server/src/processing/tests.rs @@ -514,7 +514,7 @@ fn test_source_to_codechat_for_web_1() { ), Ok(TranslationResults::CodeChat(build_codechat_for_web( MARKDOWN_MODE, - &format!("

{lexer_spec}markdown

\n"), + &format!("

{lexer_spec}markdown

"), vec![] ))) ); diff --git a/server/src/translation.rs b/server/src/translation.rs index b5c17386..1c411d02 100644 --- a/server/src/translation.rs +++ b/server/src/translation.rs @@ -1342,8 +1342,6 @@ fn compare_html( let normalized_html = normalized_html // pulldown-cmark puts a newline after a `
`, which `minify` doesn't remove but TinyMCE does. .replace("
", "
") - // The html5ever encoder replaces the non-breaking space character with an entity, while the Markdown conversion process doesn't. Replace this to make comparison work. - .replace("\u{a0}", " ") // Fix differences between TinyMCE and the forward process. There are probably other cases out there... .replace( "", @@ -1400,22 +1398,22 @@ fn debug_shorten(val: T) -> String { mod tests { use crate::{processing::CodeMirrorDocBlock, translation::doc_blocks_compare}; - //#[test] + #[test] fn test_x1() { - let before = vec![CodeMirrorDocBlock { + let ide = vec![CodeMirrorDocBlock { from: 0, to: 20, indent: "".to_string(), delimiter: "//".to_string(), - contents: "

Copyright (C) 2025 Bryan A. Jones.

\n

This file is part of the CodeChat Editor. The CodeChat Editor is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

\n

The CodeChat Editor is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

\n

You should have received a copy of the GNU General Public License along with the CodeChat Editor. If not, see http://www.gnu.org/licenses.

\n

debug_enable.mts -- Configure debug features

\n

True to enable additional debug logging.

".to_string(), + contents: "
  • Task list

Line
break

Non-breaking\u{a0} space.

".to_string(), }]; - let after = vec![CodeMirrorDocBlock { + let client = vec![CodeMirrorDocBlock { from: 0, to: 20, indent: "".to_string(), delimiter: "//".to_string(), - contents: "

Copyright (C) 2025 Bryan A. Jones.

\n

This file is part of the CodeChat Editor. The CodeChat Editor is free\nsoftware: you can redistribute it and/or modify it under the terms of the GNU\nGeneral Public License as published by the Free Software Foundation, either\nversion 3 of the License, or (at your option) any later version.

\n

The CodeChat Editor is distributed in the hope that it will be useful, but\nWITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\nFITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more\ndetails.

\n

You should have received a copy of the GNU General Public License along with\nthe CodeChat Editor. If not, see\nhttp://www.gnu.org/licenses.

\n

debug_enable.mts -- Configure debug features

\n

True to enable additional debug logging.

\n".to_string(), + contents: "
  • Task list

Line
break

Non-breaking  space.

".to_string(), }]; - assert!(doc_blocks_compare(&before, &after)); + assert!(doc_blocks_compare(&ide, &client)); } } diff --git a/server/tests/overall_2.rs b/server/tests/overall_2.rs index 6aaef708..28161d0b 100644 --- a/server/tests/overall_2.rs +++ b/server/tests/overall_2.rs @@ -168,7 +168,7 @@ async fn test_5_core( " ) .to_string(); - let mut server_id = perform_loadfile( + let _server_id = perform_loadfile( &codechat_server, &test_dir, "test.py", @@ -247,17 +247,6 @@ async fn test_5_core( // ID: 10. client_id += MESSAGE_ID_INCREMENT; - // The Server sends the Client a wrapped version of the text; the Client - // replies with a Result(Ok). - assert_eq!( - codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), - EditorMessage { - id: server_id, - message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)) - } - ); - server_id += MESSAGE_ID_INCREMENT; - // Send new text, which turns into a diff. let ide_id = codechat_server .send_message_update_plain(path_str.clone(), Some((orig_text, version)), Some(1), None) @@ -308,33 +297,6 @@ async fn test_5_core( ); //let version = client_version; codechat_server.send_result(client_id, None).await.unwrap(); - client_id += MESSAGE_ID_INCREMENT; - - // The Server sends the Client a wrapped version of the text; the Client - // replies with a Result(Ok). - assert_eq!( - codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), - EditorMessage { - id: server_id, - message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)) - } - ); - //server_id += MESSAGE_ID_INCREMENT; - - // The Client sends an updated cursor located after the edit. - assert_eq!( - codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), - EditorMessage { - id: client_id, - message: EditorMessageContents::Update(UpdateMessageContents { - file_path: path_str.clone(), - cursor_position: Some(CursorPosition::Line(1)), - scroll_position: Some(1.0), - is_re_translation: false, - contents: None, - }) - } - ); //client_id += MESSAGE_ID_INCREMENT; assert_no_more_messages(&codechat_server).await; @@ -380,7 +342,7 @@ async fn test_6_core( // Perform edits. body_content.send_keys("a").await.unwrap(); - let mut client_id = INITIAL_CLIENT_MESSAGE_ID; + let client_id = INITIAL_CLIENT_MESSAGE_ID; let msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); let client_version = get_version(&msg); assert_eq!( @@ -412,23 +374,6 @@ async fn test_6_core( ); let version = client_version; codechat_server.send_result(client_id, None).await.unwrap(); - client_id += MESSAGE_ID_INCREMENT; - - // Wait for a second update that's empty. Not sure why. - assert_eq!( - codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), - EditorMessage { - id: client_id, - message: EditorMessageContents::Update(UpdateMessageContents { - file_path: path_str.clone(), - cursor_position: None, - scroll_position: None, - is_re_translation: false, - contents: None, - }) - } - ); - codechat_server.send_result(client_id, None).await.unwrap(); //client_id += MESSAGE_ID_INCREMENT; // Send new text, which turns into a diff. From 47c1dcd746fef00ca9d4b120a201787f14b05548 Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Tue, 5 May 2026 10:36:41 +0500 Subject: [PATCH 19/31] Freeze to fix security vulnerabilities. --- CHANGELOG.md | 6 +- builder/Cargo.lock | 24 +- client/package.json5 | 22 +- client/pnpm-lock.yaml | 587 ++++++------ extensions/VSCode/Cargo.lock | 1305 +++++++++++++++++++++++--- extensions/VSCode/package.json | 18 +- extensions/VSCode/pnpm-lock.yaml | 664 ++++++------- server/Cargo.lock | 1486 +++++++++++++++++++++++++----- 8 files changed, 3085 insertions(+), 1027 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b0bca9e1..32c647c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,7 +22,11 @@ Changelog [Github master](https://github.com/bjones1/CodeChat_Editor) ----------------------------------------------------------- -* No changes. +* Correct Markdown conversion of the last doc block -- properly append all + post-conversion text to it. +* Improve browser automated testing framework. +* Add the ability for the IDE cursor to follow the line when the Client cursor + is in a doc block. Version 0.1.54 -- 2026-Apr-16 ----------------------------- diff --git a/builder/Cargo.lock b/builder/Cargo.lock index 20cb2340..a0e6d496 100644 --- a/builder/Cargo.lock +++ b/builder/Cargo.lock @@ -81,9 +81,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -103,9 +103,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", @@ -210,9 +210,9 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] name = "jiff" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +checksum = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d" dependencies = [ "jiff-static", "log", @@ -223,9 +223,9 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +checksum = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7" dependencies = [ "proc-macro2", "quote", @@ -234,9 +234,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.185" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "log" @@ -280,9 +280,9 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] diff --git a/client/package.json5 b/client/package.json5 index 35cdc1b3..d7440150 100644 --- a/client/package.json5 +++ b/client/package.json5 @@ -64,13 +64,13 @@ '@codemirror/legacy-modes': '^6.5.2', '@codemirror/state': '^6.6.0', '@codemirror/view': '6.38.8', - '@hpcc-js/wasm-graphviz': '^1.21.2', - '@mathjax/mathjax-newcm-font': '^4.1.1', + '@hpcc-js/wasm-graphviz': '^1.21.5', + '@mathjax/mathjax-newcm-font': '^4.1.2', codemirror: '^6.0.2', - mathjax: '^4.1.1', + mathjax: '^4.1.2', mermaid: '^11.14.0', 'pdfjs-dist': '5.4.624', - tinymce: '^8.4.0', + tinymce: '^8.5.0', 'toastify-js': '^1.12.0', }, devDependencies: { @@ -81,20 +81,20 @@ '@types/mocha': '^10.0.10', '@types/node': '^24.12.2', '@types/toastify-js': '^1.12.4', - '@typescript-eslint/eslint-plugin': '^8.58.2', - '@typescript-eslint/parser': '^8.58.2', + '@typescript-eslint/eslint-plugin': '^8.59.2', + '@typescript-eslint/parser': '^8.59.2', chai: '^6.2.2', esbuild: '^0.28.0', - eslint: '^10.2.0', + eslint: '^10.3.0', 'eslint-config-prettier': '^10.1.8', 'eslint-plugin-import': '^2.32.0', 'eslint-plugin-prettier': '^5.5.5', - globals: '^17.5.0', + globals: '^17.6.0', mocha: '^11.7.5', - 'npm-check-updates': '^21.0.0', + 'npm-check-updates': '^22.1.0', prettier: '^3.8.3', - typescript: '^6.0.2', - 'typescript-eslint': '^8.58.2', + typescript: '^6.0.3', + 'typescript-eslint': '^8.59.2', }, scripts: { test: 'echo "Error: no test specified" && exit 1', diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index a74d330b..2a6f5d64 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -66,17 +66,17 @@ importers: specifier: 6.38.8 version: 6.38.8 '@hpcc-js/wasm-graphviz': - specifier: ^1.21.2 - version: 1.21.2 + specifier: ^1.21.5 + version: 1.21.5 '@mathjax/mathjax-newcm-font': - specifier: ^4.1.1 - version: 4.1.1 + specifier: ^4.1.2 + version: 4.1.2 codemirror: specifier: ^6.0.2 version: 6.0.2 mathjax: - specifier: ^4.1.1 - version: 4.1.1 + specifier: ^4.1.2 + version: 4.1.2 mermaid: specifier: ^11.14.0 version: 11.14.0 @@ -84,15 +84,15 @@ importers: specifier: 5.4.624 version: 5.4.624 tinymce: - specifier: ^8.4.0 - version: 8.4.0 + specifier: ^8.5.0 + version: 8.5.0 toastify-js: specifier: ^1.12.0 version: 1.12.0 devDependencies: '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.2.0) + version: 10.0.1(eslint@10.3.0) '@types/chai': specifier: ^5.2.3 version: 5.2.3 @@ -112,11 +112,11 @@ importers: specifier: ^1.12.4 version: 1.12.4 '@typescript-eslint/eslint-plugin': - specifier: ^8.58.2 - version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2) + specifier: ^8.59.2 + version: 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) '@typescript-eslint/parser': - specifier: ^8.58.2 - version: 8.58.2(eslint@10.2.0)(typescript@6.0.2) + specifier: ^8.59.2 + version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) chai: specifier: ^6.2.2 version: 6.2.2 @@ -124,35 +124,35 @@ importers: specifier: ^0.28.0 version: 0.28.0 eslint: - specifier: ^10.2.0 - version: 10.2.0 + specifier: ^10.3.0 + version: 10.3.0 eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.2.0) + version: 10.1.8(eslint@10.3.0) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0) + version: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0) eslint-plugin-prettier: specifier: ^5.5.5 - version: 5.5.5(eslint-config-prettier@10.1.8(eslint@10.2.0))(eslint@10.2.0)(prettier@3.8.3) + version: 5.5.5(eslint-config-prettier@10.1.8(eslint@10.3.0))(eslint@10.3.0)(prettier@3.8.3) globals: - specifier: ^17.5.0 - version: 17.5.0 + specifier: ^17.6.0 + version: 17.6.0 mocha: specifier: ^11.7.5 version: 11.7.5 npm-check-updates: - specifier: ^21.0.0 - version: 21.0.0 + specifier: ^22.1.0 + version: 22.1.0 prettier: specifier: ^3.8.3 version: 3.8.3 typescript: - specifier: ^6.0.2 - version: 6.0.2 + specifier: ^6.0.3 + version: 6.0.3 typescript-eslint: - specifier: ^8.58.2 - version: 8.58.2(eslint@10.2.0)(typescript@6.0.2) + specifier: ^8.59.2 + version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) packages: @@ -234,8 +234,8 @@ packages: '@codemirror/lint@6.9.5': resolution: {integrity: sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==} - '@codemirror/search@6.6.0': - resolution: {integrity: sha512-koFuNXcDvyyotWcgOnZGmY7LZqEOXZaaxD/j6n18TCLx2/9HieZJ5H6hs1g8FiRxBD0DNfs0nXn17g872RmYdw==} + '@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==} @@ -438,15 +438,19 @@ packages: resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@hpcc-js/wasm-graphviz@1.21.2': - resolution: {integrity: sha512-UKvY3MSI1CfkOsVL6Wgg9m8S0x/28u27NgFX5UG+myTYfxU0Sl6jYKXQkcEQLZfulHKQjgHjz5/Rpw5R0CC3/g==} + '@hpcc-js/wasm-graphviz@1.21.5': + resolution: {integrity: sha512-rgFx1A5gd1BdMrLkrKg44cdOjTvEQVWODf1PDTwgiKDfmJioD+tyoMBvmEJdH6OC7rh1JaeqFJ2+r92F1Ip/sA==} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -460,8 +464,8 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.0': - resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + '@iconify/utils@3.1.1': + resolution: {integrity: sha512-MwzoDtw9rO1x+qfgLTV/IVXsHDBqeYZoMIQC8SfxfYSlaSUG+oWiAcoiB1yajAda6mqblm4/1/w2E8tRu7a7Tw==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -494,8 +498,8 @@ packages: '@lezer/json@1.0.3': resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==} - '@lezer/lr@1.4.8': - resolution: {integrity: sha512-bPWa0Pgx69ylNlMlPvBPryqeLYQjyJjqPx+Aupm5zydLIF3NE+6MMLT8Yi23Bd9cif9VS00aUebn+6fDIGBcDA==} + '@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==} @@ -518,85 +522,85 @@ packages: '@marijn/find-cluster-break@1.0.2': resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==} - '@mathjax/mathjax-newcm-font@4.1.1': - resolution: {integrity: sha512-LeV5AWzoR7k/k2tg5mW0Ad3Jr9oK9guW/zBUIP8aoiIZcZIhvAV9dlbtUSqSe1wgEBUP1KOcJXcrE/NxOqkxlQ==} + '@mathjax/mathjax-newcm-font@4.1.2': + resolution: {integrity: sha512-lZHMjNP2XbABHA3kVn40rbse5ERUeMEmrGH03qLkCwxq4/5Z/eNLr0akw1MmQcqTwCbvkx1BFcmJ7RCfbRlw3Q==} '@mermaid-js/parser@1.1.0': resolution: {integrity: sha512-gxK9ZX2+Fex5zu8LhRQoMeMPEHbc73UKZ0FQ54YrQtUxE1VVhMwzeNtKRPAu5aXks4FasbMe4xB4bWrmq6Jlxw==} - '@napi-rs/canvas-android-arm64@0.1.98': - resolution: {integrity: sha512-O45Ifr0WZJUrSyg0QgB+67TiC0zYBRkBK+d43ZV4JtlwH3XttiVxLvlxEeULiH5y1MSELruspF0bjF6xXwJNPQ==} + '@napi-rs/canvas-android-arm64@0.1.100': + resolution: {integrity: sha512-hjhCKhntPv9+t4ckHymdx0phYNcVW+GKQR6Lzw2zE+pOVjOplSmtx9nNNknTjbEDLcuLZqA1y8ufKg1XfgftzQ==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@napi-rs/canvas-darwin-arm64@0.1.98': - resolution: {integrity: sha512-1b/nQhw6Isdv14JokUqat+i5wrAYD+ce3egiotedBGRUjVxYSj4s2uQCh2bFsyX5/9A5iTKVGsWoQhFft+j7Lg==} + '@napi-rs/canvas-darwin-arm64@0.1.100': + resolution: {integrity: sha512-2PcswRaC7Ly645DGt88///zuFDhJxJYdKAs1uU3mfk1atYkXufgcgLfBpk6Tm12nCQBaNt1wpybuPZ4qOhTo8A==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@napi-rs/canvas-darwin-x64@0.1.98': - resolution: {integrity: sha512-oefzfBM8mwnyYp6S+yNXwjCoLdkOalFG24mssHgvrJDS0FulOryyI35Q7GdJGmrzuL4oo1XW3ZTOcTBLdJ8Zkg==} + '@napi-rs/canvas-darwin-x64@0.1.100': + resolution: {integrity: sha512-ePNZtj7pNIva/siZMg+HmbeozkIjqUIYdoymH8HaA3qK7LfzFN4WMBM8G6HQ9ZC+H3+Dnn5pqtiXpgLykaPOhw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.98': - resolution: {integrity: sha512-NDH5QXGmf8wlo5yhijCNGVFiJk7an5GvHwb2LHyfLQWY/6/S48i5+YtY6FPqPVVCUckNGudYOfXEJnb3/FiJGQ==} + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': + resolution: {integrity: sha512-d5cDB48oWFGU8/XPhUOFAlySgb/VAu7D+s8fi55K1Pcfg8aPplHWqMgibhVLU8ky7Pyg/fuiVLz4Nf3JrSTuUA==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@napi-rs/canvas-linux-arm64-gnu@0.1.98': - resolution: {integrity: sha512-KBLLM6tu1xs80LSAqdSLBKkgct0S23MCEf/aq8yxzg5imAceqp1ulKeELgWaYm27MgpUhm3Q7jmegX12FfphwA==} + '@napi-rs/canvas-linux-arm64-gnu@0.1.100': + resolution: {integrity: sha512-rDxgxRu69RvDlX/bh9o22DxLsGr8EqsNgotL9+RwQE1S0b0cqeatqsw6aW45mukm0B42DIAaAacKaYQ8cqS1nw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@napi-rs/canvas-linux-arm64-musl@0.1.98': - resolution: {integrity: sha512-mfMNhjN5zDcJafqQ6sHj4Tc3YMTRxP5UA3MHtp/ssytBR/k6XO0x+1IIPtscnUKwha+ql1++WjDCGEgqu8OfWQ==} + '@napi-rs/canvas-linux-arm64-musl@0.1.100': + resolution: {integrity: sha512-K3mDW66N+xT2/V439u1alFANiBUjdEx2gLiNYnCmUsva5jZMxWTjafBYwTzYK+EMFMHrUoabuU+T1BIP5CgbYQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@napi-rs/canvas-linux-riscv64-gnu@0.1.98': - resolution: {integrity: sha512-nfW8esrcaeuhrO3qGA5cwuyk4Ak6cn2eB0LtEYtqROIl+fz06CNGNCU0M95+Tspw5ZgfSbc98SaigT5r5B3LVQ==} + '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': + resolution: {integrity: sha512-mooqUBTIsccZpnoQC4NgrC1v6C1vof39etLNMnBwCY+p0gajWJvAHLGQ6g/gGyS5YrpDW+GefSN4+Cvcr08UWw==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] libc: [glibc] - '@napi-rs/canvas-linux-x64-gnu@0.1.98': - resolution: {integrity: sha512-318UT8j6Gro2bTjtutjQXHWp9SLTNw+WRS4wQ6XIRPAyzBGnGHg7x2ndD+oqkPrrSRIbYLA5WoBcCasaF7lSTQ==} + '@napi-rs/canvas-linux-x64-gnu@0.1.100': + resolution: {integrity: sha512-1eCvkDCazm7FFhsT7DfGOdSaHgZVK3bt/dSBl5EWHOWmnz+I7j8tPseJqqD81NF+MH21jKUK4wQSDjN0mdhnTg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@napi-rs/canvas-linux-x64-musl@0.1.98': - resolution: {integrity: sha512-0vZhI74UxnA4VqlW4UvM0dFRrjE1RLEe/OXSBjzytGIxV+yOG4exlrhGoIpAQaIpQQQXMCdb1EmbvPC1k9vEqQ==} + '@napi-rs/canvas-linux-x64-musl@0.1.100': + resolution: {integrity: sha512-20arT6lnI19S68qNlii73TSEDbECNgzMz2EpldC1V3mZFuRkeujXkcebRk0LRJe9SEUAooYiLokfMViY8IX7yA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@napi-rs/canvas-win32-arm64-msvc@0.1.98': - resolution: {integrity: sha512-oiC/IxgFEEVcZ7VH7JXXlmgsqRvmFb57PIQ4gQck35IKFZCNUvdNCcN3OeoLP7Hpf5160MWJf9jj/+E5V0bSvw==} + '@napi-rs/canvas-win32-arm64-msvc@0.1.100': + resolution: {integrity: sha512-DZFFT1wIAg37LJw37yhMRFfjATd3vTQzjZ1Yki8u2vhO6Hi5VE6BVaGQ1aaDu7xb4iMErz+9EOwjpS7xcxFeBw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@napi-rs/canvas-win32-x64-msvc@0.1.98': - resolution: {integrity: sha512-ZqstKAJBSyZetU8udUvBQWPlGN9buawFvjuo9mgCAxzbOoJAgXX39ihec/nn42T5Vb6/qyn45eTimx5ND9kMEw==} + '@napi-rs/canvas-win32-x64-msvc@0.1.100': + resolution: {integrity: sha512-MyT1j3mHC2+Lu4pBi9mKyMJhtP6U7k7EldY7sj/uS5gJA65gTXt8MefJQXLJo5d/vZbuWmfxzkEUNc/urV3pHA==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@napi-rs/canvas@0.1.98': - resolution: {integrity: sha512-WDg3lxYMqlrg49sDVUlrHVfIEPsd5AjYDRuGD6Fu82K5agJx0UnWA+l5qd53GNLRiMN2WhOw7FLR+Er5QB/0SA==} + '@napi-rs/canvas@0.1.100': + resolution: {integrity: sha512-xglYA6q3XO5P3BNJYxVZ1IV7DLVjp1Py6nwag88YntrS+3vKHyYcMqXVS4ZztJmwz2uGvz1FWhI/4LgbR5uQDA==} engines: {node: '>= 10'} '@pkgjs/parseargs@0.11.0': @@ -742,63 +746,63 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@typescript-eslint/eslint-plugin@8.58.2': - resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} + '@typescript-eslint/eslint-plugin@8.59.2': + resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.2 + '@typescript-eslint/parser': ^8.59.2 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.58.2': - resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} + '@typescript-eslint/parser@8.59.2': + resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.58.2': - resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} + '@typescript-eslint/project-service@8.59.2': + resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.58.2': - resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} + '@typescript-eslint/scope-manager@8.59.2': + resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.58.2': - resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} + '@typescript-eslint/tsconfig-utils@8.59.2': + resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.58.2': - resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} + '@typescript-eslint/type-utils@8.59.2': + resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.58.2': - resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} + '@typescript-eslint/types@8.59.2': + resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.58.2': - resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} + '@typescript-eslint/typescript-estree@8.59.2': + resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.58.2': - resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} + '@typescript-eslint/utils@8.59.2': + resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.58.2': - resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} + '@typescript-eslint/visitor-keys@8.59.2': + resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@upsetjs/venn.js@2.0.0': @@ -814,8 +818,8 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -916,8 +920,8 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chevrotain-allstar@0.4.1: - resolution: {integrity: sha512-PvVJm3oGqrveUVW2Vt/eZGeiAIsJszYweUcYwcskg9e+IubNYKKD+rHHem7A6XVO22eDAL+inxNIGAzZ/VIWlA==} + chevrotain-allstar@0.4.3: + resolution: {integrity: sha512-2X4mkroolSMKqW+H22pyPMUVDqYZzPhephTmg/NODKb1IGYPHfxfhcW0EjS7wcPJNbze2i4vBWT7zT5FKF2lrQ==} peerDependencies: chevrotain: ^12.0.0 @@ -980,8 +984,8 @@ packages: peerDependencies: cytoscape: ^3.2.0 - cytoscape@3.33.2: - resolution: {integrity: sha512-sj4HXd3DokGhzZAdjDejGvTPLqlt84vNFN8m7bGsOzDY5DyVcxIb2ejIXat2Iy7HxWhdT/N1oKyheJ5YdpsGuw==} + cytoscape@3.33.3: + resolution: {integrity: sha512-Gej7U+OKR+LZ8kvX7rb2HhCYJ0IhvEFsnkud4SB1PR+BUY/TsSO0dmOW59WEVLu51b1Rm+gQRKoz4bLYxGSZ2g==} engines: {node: '>=0.10'} d3-array@2.12.1: @@ -1184,8 +1188,8 @@ packages: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dompurify@3.4.0: - resolution: {integrity: sha512-nolgK9JcaUXMSmW+j1yaSvaEaoXYHwWyGJlkoCTghc97KgGDDSnpoU/PlEnw63Ah+TGKFOyY+X5LnxaWbCSfXg==} + dompurify@3.4.2: + resolution: {integrity: sha512-lHeS9SA/IKeIFFyYciHBr2n0v1VMPlSj843HdLOwjb2OxNwdq9Xykxqhk+FE42MzAdHvInbAolSE4mhahPpjXA==} dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} @@ -1307,8 +1311,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.0: - resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} + eslint@10.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1424,8 +1428,8 @@ packages: deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true - globals@17.5.0: - resolution: {integrity: sha512-qoV+HK2yFl/366t2/Cb3+xxPUo5BuMynomoDmiaZBIdbs+0pYbjfZU+twLhGKp4uCZ/+NbtpVepH5bGCxRyy2g==} + globals@17.6.0: + resolution: {integrity: sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==} engines: {node: '>=18'} globalthis@1.0.4: @@ -1462,8 +1466,8 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} he@1.2.0: @@ -1645,8 +1649,8 @@ packages: khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - langium@4.2.2: - resolution: {integrity: sha512-JUshTRAfHI4/MF9dH2WupvjSXyn8JBuUEWazB8ZVJUtXutT0doDlAv1XKbZ1Pb5sMexa8FF4CFBc0iiul7gbUQ==} + langium@4.2.3: + resolution: {integrity: sha512-sOPIi4hISFnY7twwV97ca1TsxpBtXq0URu/LL1AvxwccPG/RIBBlKS7a/f/EL6w8lTNaS0EFs/F+IdSOaqYpng==} engines: {node: '>=20.10.0', npm: '>=10.2.3'} layout-base@1.0.2: @@ -1682,8 +1686,8 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - mathjax@4.1.1: - resolution: {integrity: sha512-NyvA8c39LUUM/m+oCg7sfA13hmw7yGkre5kiRWN9qzChCyhce39lecnbjgMA/oEUgq9Vyetk6u78apwcIXpW/A==} + mathjax@4.1.2: + resolution: {integrity: sha512-EQDS8xBpVg179BXoLeZ9JlwUFftOC5qylw20UlAMDhrTuooENigOocY79aNkkFSyvj/AST/89ZAo12+r5bPI4w==} mermaid@11.14.0: resolution: {integrity: sha512-GSGloRsBs+JINmmhl0JDwjpuezCsHB4WGI4NASHxL3fHo3o/BRXTxhDLKnln8/Q0lRFRyDdEjmk1/d5Sn1Xz8g==} @@ -1727,8 +1731,8 @@ packages: node-readable-to-web-readable-stream@0.4.2: resolution: {integrity: sha512-/cMZNI34v//jUTrI+UIo4ieHAB5EZRY/+7OmXZgBxaWBMcW2tGdceIw06RFxWxrKZ5Jp3sI2i5TsRo+CBhtVLQ==} - npm-check-updates@21.0.0: - resolution: {integrity: sha512-iGFLoW1QWsEDLR6Cnklyk+iHTf20hS84o79idR6AKhjSwk0whMdCd5FS0bTgEe6gMrRnJ0fGr2P6BEZ2zOelYg==} + npm-check-updates@22.1.0: + resolution: {integrity: sha512-zKjYAa205S6UyHkNJGmiLFmm6M31175cvUA3OdHvVlCdtyTfkyQbPWoov/GJEc6PWVbCV5e+60c7S2eVp0ybOA==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: '>=10.0.0'} hasBin: true @@ -1877,8 +1881,8 @@ packages: rw@1.3.3: resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} safe-buffer@5.2.1: @@ -1990,8 +1994,8 @@ packages: style-mod@4.1.3: resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} - stylis@4.3.6: - resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} + stylis@4.4.0: + resolution: {integrity: sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==} supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -2009,16 +2013,16 @@ packages: resolution: {integrity: sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==} engines: {node: ^14.18.0 || >=16.0.0} - tinyexec@1.1.1: - resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} + tinyexec@1.1.2: + resolution: {integrity: sha512-dAqSqE/RabpBKI8+h26GfLq6Vb3JVXs30XYQjdMjaj/c2tS8IYYMbIzP599KtRj7c57/wYApb3QjgRgXmrCukA==} engines: {node: '>=18'} tinyglobby@0.2.16: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} - tinymce@8.4.0: - resolution: {integrity: sha512-Q/0/iLycB7hgSkOBoRqfceOz/7Obs9zIo0DwTRuvrReLxb6qdz/1vI7aVJMcW2BAuW80QqZiTyYdVM2amBkqIg==} + tinymce@8.5.0: + resolution: {integrity: sha512-DnKEfPNQnOJc8Ca1roZBs/GSbkAZyIIbC4p8eHZyZQi85OSAXtiVNYMaRxo4mzsGKpa0sA4/Us4KXQkX8q7w2A==} toastify-js@1.12.0: resolution: {integrity: sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==} @@ -2056,20 +2060,20 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.58.2: - resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==} + typescript-eslint@8.59.2: + resolution: {integrity: sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - typescript@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true - ufo@1.6.3: - resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==} + ufo@1.6.4: + resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} @@ -2081,8 +2085,8 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} + uuid@11.1.1: + resolution: {integrity: sha512-vIYxrBCC/N/K+Js3qSN88go7kIfNPssr/hHCesKCQNAjmgvYS2oqr69kIufEG+O4+PfezOH4EbIeHCfFov8ZgQ==} hasBin: true vscode-jsonrpc@8.2.0: @@ -2169,7 +2173,7 @@ snapshots: '@antfu/install-pkg@1.1.0': dependencies: package-manager-detector: 1.6.0 - tinyexec: 1.1.1 + tinyexec: 1.1.2 '@braintree/sanitize-url@7.1.2': {} @@ -2293,7 +2297,7 @@ snapshots: '@codemirror/state': 6.6.0 '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@codemirror/lang-xml@6.1.0': dependencies: @@ -2311,7 +2315,7 @@ snapshots: '@codemirror/state': 6.6.0 '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 '@lezer/yaml': 1.0.4 '@codemirror/language@6.12.3': @@ -2320,7 +2324,7 @@ snapshots: '@codemirror/view': 6.38.8 '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@lezer/lr': 1.4.10 style-mod: 4.1.3 '@codemirror/legacy-modes@6.5.2': @@ -2333,7 +2337,7 @@ snapshots: '@codemirror/view': 6.38.8 crelt: 1.0.6 - '@codemirror/search@6.6.0': + '@codemirror/search@6.7.0': dependencies: '@codemirror/state': 6.6.0 '@codemirror/view': 6.38.8 @@ -2428,9 +2432,9 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': dependencies: - eslint: 10.2.0 + eslint: 10.3.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -2451,9 +2455,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.2.0)': + '@eslint/js@10.0.1(eslint@10.3.0)': optionalDependencies: - eslint: 10.2.0 + eslint: 10.3.0 '@eslint/object-schema@3.0.5': {} @@ -2462,22 +2466,27 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 - '@hpcc-js/wasm-graphviz@1.21.2': {} + '@hpcc-js/wasm-graphviz@1.21.5': {} - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.0': + '@iconify/utils@3.1.1': dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/types': 2.0.0 @@ -2498,19 +2507,19 @@ snapshots: dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@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.8 + '@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.8 + '@lezer/lr': 1.4.10 '@lezer/highlight@1.2.3': dependencies: @@ -2520,27 +2529,27 @@ snapshots: dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@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.8 + '@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.8 + '@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.8 + '@lezer/lr': 1.4.10 - '@lezer/lr@1.4.8': + '@lezer/lr@1.4.10': dependencies: '@lezer/common': 1.5.2 @@ -2553,86 +2562,86 @@ snapshots: dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/lr': 1.4.8 + '@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.8 + '@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.8 + '@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.8 + '@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.8 + '@lezer/lr': 1.4.10 '@marijn/find-cluster-break@1.0.2': {} - '@mathjax/mathjax-newcm-font@4.1.1': {} + '@mathjax/mathjax-newcm-font@4.1.2': {} '@mermaid-js/parser@1.1.0': dependencies: - langium: 4.2.2 + langium: 4.2.3 - '@napi-rs/canvas-android-arm64@0.1.98': + '@napi-rs/canvas-android-arm64@0.1.100': optional: true - '@napi-rs/canvas-darwin-arm64@0.1.98': + '@napi-rs/canvas-darwin-arm64@0.1.100': optional: true - '@napi-rs/canvas-darwin-x64@0.1.98': + '@napi-rs/canvas-darwin-x64@0.1.100': optional: true - '@napi-rs/canvas-linux-arm-gnueabihf@0.1.98': + '@napi-rs/canvas-linux-arm-gnueabihf@0.1.100': optional: true - '@napi-rs/canvas-linux-arm64-gnu@0.1.98': + '@napi-rs/canvas-linux-arm64-gnu@0.1.100': optional: true - '@napi-rs/canvas-linux-arm64-musl@0.1.98': + '@napi-rs/canvas-linux-arm64-musl@0.1.100': optional: true - '@napi-rs/canvas-linux-riscv64-gnu@0.1.98': + '@napi-rs/canvas-linux-riscv64-gnu@0.1.100': optional: true - '@napi-rs/canvas-linux-x64-gnu@0.1.98': + '@napi-rs/canvas-linux-x64-gnu@0.1.100': optional: true - '@napi-rs/canvas-linux-x64-musl@0.1.98': + '@napi-rs/canvas-linux-x64-musl@0.1.100': optional: true - '@napi-rs/canvas-win32-arm64-msvc@0.1.98': + '@napi-rs/canvas-win32-arm64-msvc@0.1.100': optional: true - '@napi-rs/canvas-win32-x64-msvc@0.1.98': + '@napi-rs/canvas-win32-x64-msvc@0.1.100': optional: true - '@napi-rs/canvas@0.1.98': + '@napi-rs/canvas@0.1.100': optionalDependencies: - '@napi-rs/canvas-android-arm64': 0.1.98 - '@napi-rs/canvas-darwin-arm64': 0.1.98 - '@napi-rs/canvas-darwin-x64': 0.1.98 - '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.98 - '@napi-rs/canvas-linux-arm64-gnu': 0.1.98 - '@napi-rs/canvas-linux-arm64-musl': 0.1.98 - '@napi-rs/canvas-linux-riscv64-gnu': 0.1.98 - '@napi-rs/canvas-linux-x64-gnu': 0.1.98 - '@napi-rs/canvas-linux-x64-musl': 0.1.98 - '@napi-rs/canvas-win32-arm64-msvc': 0.1.98 - '@napi-rs/canvas-win32-x64-msvc': 0.1.98 + '@napi-rs/canvas-android-arm64': 0.1.100 + '@napi-rs/canvas-darwin-arm64': 0.1.100 + '@napi-rs/canvas-darwin-x64': 0.1.100 + '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.100 + '@napi-rs/canvas-linux-arm64-gnu': 0.1.100 + '@napi-rs/canvas-linux-arm64-musl': 0.1.100 + '@napi-rs/canvas-linux-riscv64-gnu': 0.1.100 + '@napi-rs/canvas-linux-x64-gnu': 0.1.100 + '@napi-rs/canvas-linux-x64-musl': 0.1.100 + '@napi-rs/canvas-win32-arm64-msvc': 0.1.100 + '@napi-rs/canvas-win32-x64-msvc': 0.1.100 optional: true '@pkgjs/parseargs@0.11.0': @@ -2791,95 +2800,95 @@ snapshots: '@types/trusted-types@2.0.7': optional: true - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2)': + '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.2 - eslint: 10.2.0 + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 + eslint: 10.3.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2)': + '@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3(supports-color@8.1.1) - eslint: 10.2.0 - typescript: 6.0.2 + eslint: 10.3.0 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.2(typescript@6.0.2)': + '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 debug: 4.4.3(supports-color@8.1.1) - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.2': + '@typescript-eslint/scope-manager@8.59.2': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': dependencies: - typescript: 6.0.2 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)': + '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) debug: 4.4.3(supports-color@8.1.1) - eslint: 10.2.0 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + eslint: 10.3.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.58.2': {} + '@typescript-eslint/types@8.59.2': {} - '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)': + '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.58.2(typescript@6.0.2) - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)': + '@typescript-eslint/utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - eslint: 10.2.0 - typescript: 6.0.2 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + eslint: 10.3.0 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.58.2': + '@typescript-eslint/visitor-keys@8.59.2': dependencies: - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.59.2 eslint-visitor-keys: 5.0.1 '@upsetjs/venn.js@2.0.0': @@ -2893,7 +2902,7 @@ snapshots: acorn@8.16.0: {} - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -3015,7 +3024,7 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 - chevrotain-allstar@0.4.1(chevrotain@12.0.0): + chevrotain-allstar@0.4.3(chevrotain@12.0.0): dependencies: chevrotain: 12.0.0 lodash-es: 4.18.1 @@ -3044,7 +3053,7 @@ snapshots: '@codemirror/commands': 6.10.3 '@codemirror/language': 6.12.3 '@codemirror/lint': 6.9.5 - '@codemirror/search': 6.6.0 + '@codemirror/search': 6.7.0 '@codemirror/state': 6.6.0 '@codemirror/view': 6.38.8 @@ -3078,17 +3087,17 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.2): + cytoscape-cose-bilkent@4.1.0(cytoscape@3.33.3): dependencies: cose-base: 1.0.3 - cytoscape: 3.33.2 + cytoscape: 3.33.3 - cytoscape-fcose@2.2.0(cytoscape@3.33.2): + cytoscape-fcose@2.2.0(cytoscape@3.33.3): dependencies: cose-base: 2.2.0 - cytoscape: 3.33.2 + cytoscape: 3.33.3 - cytoscape@3.33.2: {} + cytoscape@3.33.3: {} d3-array@2.12.1: dependencies: @@ -3318,7 +3327,7 @@ snapshots: dependencies: esutils: 2.0.3 - dompurify@3.4.0: + dompurify@3.4.2: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -3358,7 +3367,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -3376,7 +3385,7 @@ snapshots: object.assign: 4.1.7 own-keys: 1.0.1 regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 + safe-array-concat: 1.1.4 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 @@ -3404,11 +3413,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 es-to-primitive@1.3.0: dependencies: @@ -3449,9 +3458,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.2.0): + eslint-config-prettier@10.1.8(eslint@10.3.0): dependencies: - eslint: 10.2.0 + eslint: 10.3.0 eslint-import-resolver-node@0.3.10: dependencies: @@ -3461,17 +3470,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.2.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - eslint: 10.2.0 + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + eslint: 10.3.0 eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -3480,10 +3489,10 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 10.2.0 + eslint: 10.3.0 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.2.0) - hasown: 2.0.2 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0) + hasown: 2.0.3 is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.5 @@ -3494,20 +3503,20 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@10.2.0))(eslint@10.2.0)(prettier@3.8.3): + eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@10.3.0))(eslint@10.3.0)(prettier@3.8.3): dependencies: - eslint: 10.2.0 + eslint: 10.3.0 prettier: 3.8.3 prettier-linter-helpers: 1.0.1 synckit: 0.11.12 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@10.2.0) + eslint-config-prettier: 10.1.8(eslint@10.3.0) eslint-scope@9.1.2: dependencies: @@ -3520,19 +3529,19 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.0: + eslint@10.3.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.5.5 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 6.14.0 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3(supports-color@8.1.1) escape-string-regexp: 4.0.0 @@ -3620,7 +3629,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 - hasown: 2.0.2 + hasown: 2.0.3 is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -3639,7 +3648,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 math-intrinsics: 1.1.0 get-proto@1.0.1: @@ -3666,7 +3675,7 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 - globals@17.5.0: {} + globals@17.6.0: {} globalthis@1.0.4: dependencies: @@ -3695,7 +3704,7 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.2: + hasown@2.0.3: dependencies: function-bind: 1.1.2 @@ -3714,7 +3723,7 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.2 + hasown: 2.0.3 side-channel: 1.1.0 internmap@1.0.1: {} @@ -3748,7 +3757,7 @@ snapshots: is-core-module@2.16.1: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 is-data-view@1.0.2: dependencies: @@ -3799,7 +3808,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 is-set@2.0.3: {} @@ -3869,11 +3878,11 @@ snapshots: khroma@2.1.0: {} - langium@4.2.2: + langium@4.2.3: dependencies: '@chevrotain/regexp-to-ast': 12.0.0 chevrotain: 12.0.0 - chevrotain-allstar: 0.4.1(chevrotain@12.0.0) + chevrotain-allstar: 0.4.3(chevrotain@12.0.0) vscode-languageserver: 9.0.1 vscode-languageserver-textdocument: 1.0.12 vscode-uri: 3.1.0 @@ -3904,33 +3913,33 @@ snapshots: math-intrinsics@1.1.0: {} - mathjax@4.1.1: + mathjax@4.1.2: dependencies: - '@mathjax/mathjax-newcm-font': 4.1.1 + '@mathjax/mathjax-newcm-font': 4.1.2 mermaid@11.14.0: dependencies: '@braintree/sanitize-url': 7.1.2 - '@iconify/utils': 3.1.0 + '@iconify/utils': 3.1.1 '@mermaid-js/parser': 1.1.0 '@types/d3': 7.4.3 '@upsetjs/venn.js': 2.0.0 - cytoscape: 3.33.2 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.2) - cytoscape-fcose: 2.2.0(cytoscape@3.33.2) + cytoscape: 3.33.3 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.33.3) + cytoscape-fcose: 2.2.0(cytoscape@3.33.3) d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.14 dayjs: 1.11.20 - dompurify: 3.4.0 + dompurify: 3.4.2 katex: 0.16.45 khroma: 2.1.0 lodash-es: 4.18.1 marked: 16.4.2 roughjs: 4.6.6 - stylis: 4.3.6 + stylis: 4.4.0 ts-dedent: 2.2.0 - uuid: 11.1.0 + uuid: 11.1.1 minimatch@10.2.5: dependencies: @@ -3953,7 +3962,7 @@ snapshots: acorn: 8.16.0 pathe: 2.0.3 pkg-types: 1.3.1 - ufo: 1.6.3 + ufo: 1.6.4 mocha@11.7.5: dependencies: @@ -3993,7 +4002,7 @@ snapshots: node-readable-to-web-readable-stream@0.4.2: optional: true - npm-check-updates@21.0.0: {} + npm-check-updates@22.1.0: {} object-inspect@1.13.4: {} @@ -4079,7 +4088,7 @@ snapshots: pdfjs-dist@5.4.624: optionalDependencies: - '@napi-rs/canvas': 0.1.98 + '@napi-rs/canvas': 0.1.100 node-readable-to-web-readable-stream: 0.4.2 picocolors@1.1.1: {} @@ -4159,7 +4168,7 @@ snapshots: rw@1.3.3: {} - safe-array-concat@1.1.3: + safe-array-concat@1.1.4: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -4302,7 +4311,7 @@ snapshots: style-mod@4.1.3: {} - stylis@4.3.6: {} + stylis@4.4.0: {} supports-color@7.2.0: dependencies: @@ -4318,20 +4327,20 @@ snapshots: dependencies: '@pkgr/core': 0.2.9 - tinyexec@1.1.1: {} + tinyexec@1.1.2: {} tinyglobby@0.2.16: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 - tinymce@8.4.0: {} + tinymce@8.5.0: {} toastify-js@1.12.0: {} - ts-api-utils@2.5.0(typescript@6.0.2): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 6.0.2 + typescript: 6.0.3 ts-dedent@2.2.0: {} @@ -4379,20 +4388,20 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.58.2(eslint@10.2.0)(typescript@6.0.2): + typescript-eslint@8.59.2(eslint@10.3.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - eslint: 10.2.0 - typescript: 6.0.2 + '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + eslint: 10.3.0 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - typescript@6.0.2: {} + typescript@6.0.3: {} - ufo@1.6.3: {} + ufo@1.6.4: {} unbox-primitive@1.1.0: dependencies: @@ -4407,7 +4416,7 @@ snapshots: dependencies: punycode: 2.3.1 - uuid@11.1.0: {} + uuid@11.1.1: {} vscode-jsonrpc@8.2.0: {} diff --git a/extensions/VSCode/Cargo.lock b/extensions/VSCode/Cargo.lock index f72e0ce7..e066075d 100644 --- a/extensions/VSCode/Cargo.lock +++ b/extensions/VSCode/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.11.1", + "bitflags", "bytes", "futures-core", "futures-sink", @@ -29,7 +29,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web", - "bitflags 2.11.1", + "bitflags", "bytes", "derive_more", "futures-core", @@ -44,16 +44,16 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.12.0" +version = "3.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f860ee6746d0c5b682147b2f7f8ef036d4f92fe518251a3a35ffa3650eafdf0e" +checksum = "93acb4a42f64936f9b8cae4a433b237599dd6eb6ed06124eb67132ef8cc90662" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", "base64", - "bitflags 2.11.1", + "bitflags", "brotli", "bytes", "bytestring", @@ -72,7 +72,7 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.9.4", + "rand 0.10.1", "sha1", "smallvec", "tokio", @@ -246,6 +246,30 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.4" @@ -399,10 +423,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "bitflags" -version = "1.3.2" +name = "base64-simd" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] + +[[package]] +name = "base64-simd" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref 0.5.2", + "vsimd", +] [[package]] name = "bitflags" @@ -410,6 +447,18 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "block-buffer" version = "0.10.4" @@ -468,6 +517,28 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -485,18 +556,27 @@ dependencies = [ [[package]] name = "bytestring" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" +checksum = "86566c496f2f47d9b8147a4c8b02ffdb69c919fe0c2b2e7195d22cbba0e635c9" dependencies = [ "bytes", ] +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + [[package]] name = "cc" -version = "1.2.60" +version = "1.2.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" dependencies = [ "find-msvc-tools", "jobserver", @@ -536,9 +616,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -558,9 +638,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", @@ -580,6 +660,15 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f88a43d011fc4a6876cb7344703e297c71dda42494fee094d5f7c76bf13f746" +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror", +] + [[package]] name = "codechat-editor-server" version = "0.1.54" @@ -610,13 +699,14 @@ dependencies = [ "markup5ever_rcdom", "mime", "mime_guess", + "minify-html", "minreq", "normalize-line-endings", "notify-debouncer-full", "path-slash", "pest", "pest_derive", - "phf", + "phf 0.13.1", "pulldown-cmark 0.13.3", "rand 0.10.1", "regex", @@ -661,12 +751,55 @@ dependencies = [ "memchr", ] +[[package]] +name = "compact_str" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", +] + [[package]] name = "const-oid" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" +[[package]] +name = "const-str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +dependencies = [ + "const-str-proc-macro", +] + +[[package]] +name = "const-str-proc-macro" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "convert_case" version = "0.10.0" @@ -712,6 +845,12 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cow-utils" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417bef24afe1460300965a25ff4a24b8b45ad011948302ec221e8a0a81eb2c79" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -784,20 +923,42 @@ dependencies = [ ] [[package]] -name = "ctor" -version = "0.10.0" +name = "cssparser" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.11.3", + "smallvec", +] + +[[package]] +name = "cssparser-color" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +dependencies = [ + "cssparser", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95d0d11eb38e7642efca359c3cf6eb7b2e528182d09110165de70192b0352775" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ - "ctor-proc-macro", - "dtor", + "quote", + "syn 2.0.117", ] [[package]] -name = "ctor-proc-macro" -version = "0.0.12" +name = "ctor" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ab264ea985f1bd27887d7b21ea2bb046728e05d11909ca138d700c494730db" +checksum = "400a21f1014a968ec518c7ccdf9b4a4ed0cac8c56ccb6d604f8b91f00110501e" [[package]] name = "ctutils" @@ -808,6 +969,34 @@ dependencies = [ "cmov", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + +[[package]] +name = "data-encoding" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] + [[package]] name = "deranged" version = "0.5.8" @@ -864,9 +1053,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.0", "const-oid", @@ -931,19 +1120,25 @@ dependencies = [ ] [[package]] -name = "dtor" -version = "0.7.0" +name = "dragonbox_ecma" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f72721db8027a4e96dd6fb50d2a1d32259c9d3da1b63dee612ccd981e14293" -dependencies = [ - "dtor-proc-macro", -] +checksum = "fd8e701084c37e7ef62d3f9e453b618130cbc0ef3573847785952a3ac3f746bf" + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" [[package]] -name = "dtor-proc-macro" -version = "0.0.12" +name = "dtoa-short" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c98b077c7463d01d22dde8a24378ddf1ca7263dc687cffbed38819ea6c21131" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] [[package]] name = "dunce" @@ -951,6 +1146,24 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -1043,6 +1256,12 @@ dependencies = [ "libc", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.32" @@ -1141,6 +1360,17 @@ dependencies = [ "version_check", ] +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + [[package]] name = "getrandom" version = "0.3.4" @@ -1186,7 +1416,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 2.11.1", + "bitflags", "ignore", "walkdir", ] @@ -1210,6 +1440,21 @@ dependencies = [ "tracing", ] +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + [[package]] name = "hashbrown" version = "0.15.5" @@ -1226,6 +1471,9 @@ name = "hashbrown" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +dependencies = [ + "allocator-api2", +] [[package]] name = "heck" @@ -1239,7 +1487,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" dependencies = [ - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -1249,7 +1497,7 @@ source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#68b5d9cfa dependencies = [ "html5ever", "markup5ever_rcdom", - "phf", + "phf 0.13.1", ] [[package]] @@ -1309,9 +1557,9 @@ checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hybrid-array" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +checksum = "08d46837a0ed51fe95bd3b05de33cd64a1ee88fc797477ca48446872504507c5" dependencies = [ "typenum", ] @@ -1441,9 +1689,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -1508,7 +1756,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ - "bitflags 2.11.1", + "bitflags", "inotify-sys", "libc", ] @@ -1528,6 +1776,24 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" @@ -1595,14 +1861,22 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.95" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" +checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" dependencies = [ + "cfg-if", + "futures-util", "once_cell", "wasm-bindgen", ] +[[package]] +name = "json-escape-simd" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e770254dd7802184595b1d30da2a15cb72569e2aca2b177aef8d22eac8a693" + [[package]] name = "kqueue" version = "1.1.1" @@ -1615,11 +1889,11 @@ dependencies = [ [[package]] name = "kqueue-sys" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +checksum = "a7b65860415f949f23fa882e669f2dbd4a0f0eeb1acdd56790b30494afd7da2f" dependencies = [ - "bitflags 1.3.2", + "bitflags", "libc", ] @@ -1643,9 +1917,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libc" -version = "0.2.185" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libloading" @@ -1666,6 +1940,46 @@ dependencies = [ "libc", ] +[[package]] +name = "lightningcss" +version = "1.0.0-alpha.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6314c2f0590ac93c86099b98bb7ba8abcf759bfd89604ffca906472bb54937" +dependencies = [ + "ahash 0.8.12", + "bitflags", + "const-str", + "cssparser", + "cssparser-color", + "dashmap", + "data-encoding", + "getrandom 0.3.4", + "indexmap", + "itertools 0.10.5", + "lazy_static", + "lightningcss-derive", + "parcel_selectors", + "parcel_sourcemap", + "pastey", + "pathdiff", + "rayon", + "serde", + "serde-content", + "smallvec", +] + +[[package]] +name = "lightningcss-derive" +version = "1.0.0-alpha.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" +dependencies = [ + "convert_case 0.6.0", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -1771,6 +2085,12 @@ dependencies = [ "xml5ever", ] +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + [[package]] name = "md-5" version = "0.11.0" @@ -1778,7 +2098,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ "cfg-if", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -1803,6 +2123,38 @@ dependencies = [ "unicase", ] +[[package]] +name = "minify-html" +version = "0.18.1" +source = "git+https://github.com/bjones1/minify-html.git?branch=dev#3eada4dbef725de3ea4ca5075ec9c12618ea4ece" +dependencies = [ + "ahash 0.8.12", + "aho-corasick", + "lightningcss", + "memchr", + "minify-html-common", + "once_cell", + "oxc_allocator", + "oxc_codegen", + "oxc_minifier", + "oxc_parser", + "oxc_span", +] + +[[package]] +name = "minify-html-common" +version = "0.0.3" +source = "git+https://github.com/bjones1/minify-html.git?branch=dev#3eada4dbef725de3ea4ca5075ec9c12618ea4ece" +dependencies = [ + "ahash 0.8.12", + "aho-corasick", + "itertools 0.14.0", + "memchr", + "once_cell", + "serde", + "serde_json", +] + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -1839,11 +2191,11 @@ checksum = "dce6dd36094cac388f119d2e9dc82dc730ef91c32a6222170d630e5414b956e6" [[package]] name = "napi" -version = "3.8.5" +version = "3.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa73b028610e2b26e9e40bd2c8ff8a98e6d7ed5d67d89ebf4bfd2f992616b024" +checksum = "8e55037284865448ecf329baa86a4d05401f647ebde99f5747b640d32c2c5226" dependencies = [ - "bitflags 2.11.1", + "bitflags", "ctor", "futures", "napi-build", @@ -1861,9 +2213,9 @@ checksum = "d376940fd5b723c6893cd1ee3f33abbfd86acb1cd1ec079f3ab04a2a3bc4d3b1" [[package]] name = "napi-derive" -version = "3.5.4" +version = "3.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7430702d3cc05cf55f0a2c9e41d991c3b7a53f91e6146a8f282b1bfc7f3fd133" +checksum = "a4ba740fe4c9524d86fd90798fd8ccdb23402b3eef7e7c30897a8a369b529fcf" dependencies = [ "convert_case 0.11.0", "ctor", @@ -1875,9 +2227,9 @@ dependencies = [ [[package]] name = "napi-derive-backend" -version = "5.0.3" +version = "5.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca5a083f2c9b49a0c7d33ec75c083498849c6fcc46f5497317faa39ea77f5d5" +checksum = "0d5af30503edf933ce7377cf6d4c877a62b0f1107ea05585f1b5e430e88d5baf" dependencies = [ "convert_case 0.11.0", "proc-macro2", @@ -1913,6 +2265,12 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" +[[package]] +name = "nonmax" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" + [[package]] name = "normalize-line-endings" version = "0.3.0" @@ -1925,7 +2283,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.1", + "bitflags", "fsevent-sys", "inotify", "kqueue", @@ -1956,7 +2314,17 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.11.1", + "bitflags", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", ] [[package]] @@ -1966,12 +2334,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" [[package]] -name = "num-traits" -version = "0.2.19" +name = "num-integer" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", ] [[package]] @@ -1989,7 +2366,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.1", + "bitflags", ] [[package]] @@ -2004,7 +2381,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.1", + "bitflags", "objc2", ] @@ -2038,6 +2415,415 @@ dependencies = [ "num-traits", ] +[[package]] +name = "outref" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "owo-colors" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" + +[[package]] +name = "oxc-browserslist" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be1f075e9100260ff5ecb2b375fb24d6c5f2c97a23e6a86367720831e9faa8e" +dependencies = [ + "flate2", + "postcard", + "rustc-hash", + "serde", + "thiserror", +] + +[[package]] +name = "oxc-miette" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4356a61f2ed4c9b3610245215fbf48970eb277126919f87db9d0efa93a74245c" +dependencies = [ + "cfg-if", + "owo-colors", + "oxc-miette-derive", + "textwrap", + "thiserror", + "unicode-segmentation", + "unicode-width", +] + +[[package]] +name = "oxc-miette-derive" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b237422b014f8f8fff75bb9379e697d13f8d57551a22c88bebb39f073c1bf696" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "oxc_allocator" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd3b8bfef454857d3d9ca08fb84c8955da8591b5a82a21bb34a7ebbf94da7b0f" +dependencies = [ + "allocator-api2", + "hashbrown 0.17.0", + "oxc_data_structures", + "rustc-hash", +] + +[[package]] +name = "oxc_ast" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381ae8356082431bd7e217dd78c7179bfc379dbbe7a32494e28be4fc678812c7" +dependencies = [ + "bitflags", + "oxc_allocator", + "oxc_ast_macros", + "oxc_data_structures", + "oxc_diagnostics", + "oxc_estree", + "oxc_regular_expression", + "oxc_span", + "oxc_str", + "oxc_syntax", +] + +[[package]] +name = "oxc_ast_macros" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50246449a5fa669debd2debeb90be4c30f0a3a2e954f852ec40e5ef49701285" +dependencies = [ + "phf 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "oxc_ast_visit" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82466fd1885834078becf1385380c40624bf511723b695104b21f293c7dc5271" +dependencies = [ + "oxc_allocator", + "oxc_ast", + "oxc_span", + "oxc_syntax", +] + +[[package]] +name = "oxc_codegen" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b69f394fa01810f99943a9191dde9d5757bdccd5c06347af62663eea671a5153" +dependencies = [ + "bitflags", + "cow-utils", + "dragonbox_ecma", + "itoa", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_index", + "oxc_semantic", + "oxc_sourcemap", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", +] + +[[package]] +name = "oxc_compat" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20b656d726e4dafe2341759dc2f1fefa39fc736773f382885714f139d4dc69cc" +dependencies = [ + "cow-utils", + "oxc-browserslist", + "oxc_syntax", + "rustc-hash", + "serde", +] + +[[package]] +name = "oxc_data_structures" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1defc2fd17ee94f2c8511b0c4a4756d5868fbee891478953f2354ef444b1962f" + +[[package]] +name = "oxc_diagnostics" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7ccb0e8e7c9f1fb75e0700b2c75d9d854e534a7a356b13d2936893651f2b98" +dependencies = [ + "cow-utils", + "oxc-miette", + "percent-encoding", +] + +[[package]] +name = "oxc_ecmascript" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1904566c4e725c1511c88166ec203ae97bebb62887441b4a29b1e7757ec39859" +dependencies = [ + "cow-utils", + "num-bigint", + "num-traits", + "oxc_allocator", + "oxc_ast", + "oxc_regular_expression", + "oxc_span", + "oxc_syntax", +] + +[[package]] +name = "oxc_estree" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87cd0e290bab4cb5d81377bbc1ebd414f01a7af72d7f8e5ccbb4a9a157d71df" + +[[package]] +name = "oxc_index" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3e6120999627ec9703025eab7c9f410ebb7e95557632a8902ca48210416c2b" +dependencies = [ + "nonmax", + "serde", +] + +[[package]] +name = "oxc_mangler" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc7dcb6b22f8e7aa9a8d2afa8f29e62a7892a02de780dab976aa42eb09e977a9" +dependencies = [ + "itertools 0.14.0", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_index", + "oxc_semantic", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", +] + +[[package]] +name = "oxc_minifier" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59700b3cd4906c9e1878ac925bd86a284a1efd0a69353516f65ffc3ebb08a8ff" +dependencies = [ + "cow-utils", + "itoa", + "oxc_allocator", + "oxc_ast", + "oxc_ast_visit", + "oxc_compat", + "oxc_data_structures", + "oxc_ecmascript", + "oxc_index", + "oxc_mangler", + "oxc_parser", + "oxc_regular_expression", + "oxc_semantic", + "oxc_span", + "oxc_str", + "oxc_syntax", + "oxc_traverse", + "rustc-hash", +] + +[[package]] +name = "oxc_parser" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71acdb67749ff68bfbbd346da7dd2fe4947964be49ac9ec34d73d10a2396dcd" +dependencies = [ + "bitflags", + "cow-utils", + "memchr", + "num-bigint", + "num-traits", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_diagnostics", + "oxc_ecmascript", + "oxc_regular_expression", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", + "seq-macro", +] + +[[package]] +name = "oxc_regular_expression" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a1273168ec6d8083e161565d264847249b9aad51c430d92d344303ede058b2" +dependencies = [ + "bitflags", + "oxc_allocator", + "oxc_ast_macros", + "oxc_diagnostics", + "oxc_span", + "oxc_str", + "phf 0.13.1", + "rustc-hash", + "unicode-id-start", +] + +[[package]] +name = "oxc_semantic" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63d4f8a0d3eb4e8e03aa413f54300235cb0314dc26649d2ff19f609b7b478272" +dependencies = [ + "itertools 0.14.0", + "memchr", + "oxc_allocator", + "oxc_ast", + "oxc_ast_visit", + "oxc_diagnostics", + "oxc_ecmascript", + "oxc_index", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", + "self_cell", +] + +[[package]] +name = "oxc_sourcemap" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d378eb8bad20e89d66276aebab51f6a5408571092cac94abdd3eabb773713d6" +dependencies = [ + "base64-simd 0.8.0", + "json-escape-simd", + "rustc-hash", + "serde", + "serde_json", +] + +[[package]] +name = "oxc_span" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af84474452c3caa7aca1bcaca04b6e16552fe29472059b7921ae7a69790dccf" +dependencies = [ + "compact_str", + "oxc-miette", + "oxc_allocator", + "oxc_ast_macros", + "oxc_estree", + "oxc_str", +] + +[[package]] +name = "oxc_str" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136bcc6bed1182df0b9c529e478da55a490b38ba5f1189abf2e7a9b13f46f0b1" +dependencies = [ + "compact_str", + "hashbrown 0.17.0", + "oxc_allocator", + "oxc_estree", +] + +[[package]] +name = "oxc_syntax" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b448a086623714675f66b79271e25fa2b51708255fa6af7dad83be88cc6e8726" +dependencies = [ + "bitflags", + "cow-utils", + "dragonbox_ecma", + "nonmax", + "oxc_allocator", + "oxc_ast_macros", + "oxc_estree", + "oxc_index", + "oxc_span", + "oxc_str", + "phf 0.13.1", + "unicode-id-start", +] + +[[package]] +name = "oxc_traverse" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "648c4e7c8ee0a8d2ff28751cc9dc8d5502a7d3b2b96d4fa73de7fb31b46d54c6" +dependencies = [ + "itoa", + "oxc_allocator", + "oxc_ast", + "oxc_ast_visit", + "oxc_data_structures", + "oxc_ecmascript", + "oxc_semantic", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", +] + +[[package]] +name = "parcel_selectors" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54fd03f1ad26cb6b3ec1b7414fa78a3bd639e7dbb421b1a60513c96ce886a196" +dependencies = [ + "bitflags", + "cssparser", + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "precomputed-hash", + "rustc-hash", + "smallvec", +] + +[[package]] +name = "parcel_sourcemap" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" +dependencies = [ + "base64-simd 0.7.0", + "data-url", + "rkyv", + "serde", + "serde_json", + "vlq", +] + [[package]] name = "parking_lot" version = "0.12.5" @@ -2073,6 +2859,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "percent-encoding" version = "2.3.2" @@ -2122,25 +2914,55 @@ dependencies = [ "sha2 0.10.9", ] +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + [[package]] name = "phf" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ - "phf_macros", - "phf_shared", + "phf_macros 0.13.1", + "phf_shared 0.13.1", "serde", ] +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + [[package]] name = "phf_codegen" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.6", ] [[package]] @@ -2150,7 +2972,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ "fastrand", - "phf_shared", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -2159,13 +2994,22 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", "proc-macro2", "quote", "syn 2.0.117", ] +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "phf_shared" version = "0.13.1" @@ -2187,6 +3031,18 @@ version = "0.3.33" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + [[package]] name = "postgres-protocol" version = "0.6.11" @@ -2293,13 +3149,33 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "pulldown-cmark" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "679341d22c78c6c649893cbd6c3278dcbe9fc4faa62fea3a9296ae2b50c14625" dependencies = [ - "bitflags 2.11.1", + "bitflags", "memchr", "unicase", ] @@ -2310,7 +3186,7 @@ version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" dependencies = [ - "bitflags 2.11.1", + "bitflags", "memchr", "pulldown-cmark-escape", "unicase", @@ -2343,6 +3219,21 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "rand_core 0.6.4", +] + [[package]] name = "rand" version = "0.9.4" @@ -2374,6 +3265,12 @@ dependencies = [ "rand_core 0.9.5", ] +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" + [[package]] name = "rand_core" version = "0.9.5" @@ -2389,13 +3286,33 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.1", + "bitflags", ] [[package]] @@ -2433,6 +3350,44 @@ version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rustc-hash" version = "2.1.2" @@ -2454,7 +3409,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.1", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -2488,12 +3443,30 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + [[package]] name = "semver" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + [[package]] name = "serde" version = "1.0.228" @@ -2504,6 +3477,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-content" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3753ca04f350fa92d00b6146a3555e63c55388c9ef2e11e09bce2ff1c0b509c6" +dependencies = [ + "serde", +] + [[package]] name = "serde-value" version = "0.7.0" @@ -2574,13 +3556,13 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", + "cpufeatures 0.3.0", + "digest 0.11.3", ] [[package]] @@ -2602,7 +3584,7 @@ checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", "cpufeatures 0.3.0", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -2621,6 +3603,15 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref 0.1.0", +] + [[package]] name = "simd-adler32" version = "0.3.9" @@ -2645,9 +3636,9 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "siphasher" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "slab" @@ -2661,6 +3652,12 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "smawk" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" + [[package]] name = "socket2" version = "0.5.10" @@ -2687,6 +3684,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "string_cache" version = "0.9.0" @@ -2695,7 +3698,7 @@ checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" dependencies = [ "new_debug_unreachable", "parking_lot", - "phf_shared", + "phf_shared 0.13.1", "precomputed-hash", "serde", ] @@ -2706,8 +3709,8 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", "proc-macro2", "quote", ] @@ -2762,6 +3765,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" version = "3.27.0" @@ -2809,6 +3818,17 @@ dependencies = [ "log", ] +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", + "unicode-linebreak", + "unicode-width", +] + [[package]] name = "thiserror" version = "2.0.18" @@ -2897,9 +3917,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.0" +version = "1.52.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91135f59b1cbf38c91e73cf3386fca9bb77915c45ce2771460c9d92f0f3d776" +checksum = "110a78583f19d5cdb2c5ccf321d1290344e71313c6c37d43520d386027d18386" dependencies = [ "bytes", "libc", @@ -2938,7 +3958,7 @@ dependencies = [ "log", "parking_lot", "percent-encoding", - "phf", + "phf 0.13.1", "pin-project-lite", "postgres-protocol", "postgres-types", @@ -3028,9 +4048,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "ucd-trie" @@ -3050,12 +4070,24 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" +[[package]] +name = "unicode-id-start" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b79ad29b5e19de4260020f8919b443b2ef0277d242ce532ec7b7a2cc8b6007" + [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + [[package]] name = "unicode-normalization" version = "0.1.25" @@ -3140,6 +4172,16 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +[[package]] +name = "uuid" +version = "1.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "v_htmlescape" version = "0.15.8" @@ -3152,6 +4194,18 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vlq" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + [[package]] name = "walkdir" version = "2.5.0" @@ -3179,11 +4233,11 @@ dependencies = [ [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -3192,7 +4246,7 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] @@ -3206,9 +4260,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" +checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" dependencies = [ "cfg-if", "once_cell", @@ -3219,9 +4273,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" +checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3229,9 +4283,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" +checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" dependencies = [ "bumpalo", "proc-macro2", @@ -3242,9 +4296,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" +checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" dependencies = [ "unicode-ident", ] @@ -3277,7 +4331,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.1", + "bitflags", "hashbrown 0.15.5", "indexmap", "semver", @@ -3285,9 +4339,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.95" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" +checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" dependencies = [ "js-sys", "wasm-bindgen", @@ -3295,21 +4349,21 @@ dependencies = [ [[package]] name = "web_atoms" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576" +checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538" dependencies = [ - "phf", - "phf_codegen", + "phf 0.13.1", + "phf_codegen 0.13.1", "string_cache", "string_cache_codegen", ] [[package]] name = "webbrowser" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe985f41e291eecef5e5c0770a18d28390addb03331c043964d9e916453d6f16" +checksum = "0fc95580916af1e68ff6a7be07446fc5db73ebf71cf092de939bbf5f7e189f72" dependencies = [ "core-foundation", "jni", @@ -3323,9 +4377,9 @@ dependencies = [ [[package]] name = "whoami" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6a5b12f9df4f978d2cfdb1bd3bac52433f44393342d7ee9c25f5a1c14c0f45d" +checksum = "998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d" dependencies = [ "libc", "libredox", @@ -3640,6 +4694,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -3689,7 +4749,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.1", + "bitflags", "indexmap", "log", "serde", @@ -3725,6 +4785,15 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "xml5ever" version = "0.38.0" diff --git a/extensions/VSCode/package.json b/extensions/VSCode/package.json index 4d1805d9..5de4e3ca 100644 --- a/extensions/VSCode/package.json +++ b/extensions/VSCode/package.json @@ -80,20 +80,20 @@ "escape-html": "^1.0.3" }, "devDependencies": { - "@emnapi/core": "^1.9.2", - "@emnapi/runtime": "^1.9.2", + "@emnapi/core": "^1.10.0", + "@emnapi/runtime": "^1.10.0", "@eslint/js": "^10.0.1", "@napi-rs/cli": "^3.6.2", - "@tybys/wasm-util": "^0.10.1", + "@tybys/wasm-util": "^0.10.2", "@types/escape-html": "^1.0.4", "@types/node": "^24.12.2", "@types/vscode": "1.61.0", - "@typescript-eslint/eslint-plugin": "^8.58.2", - "@typescript-eslint/parser": "^8.58.2", - "@vscode/vsce": "^3.8.1", + "@typescript-eslint/eslint-plugin": "^8.59.2", + "@typescript-eslint/parser": "^8.59.2", + "@vscode/vsce": "^3.9.1", "chalk": "^5.6.2", "esbuild": "^0.28.0", - "eslint": "^10.2.0", + "eslint": "^10.3.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", "eslint-plugin-node": "^11.1.0", @@ -101,8 +101,8 @@ "npm-run-all2": "^8.0.4", "ovsx": "^0.10.11", "prettier": "^3.8.3", - "typescript": "^6.0.2", - "typescript-eslint": "^8.58.2" + "typescript": "^6.0.3", + "typescript-eslint": "^8.59.2" }, "optionalDependencies": { "bufferutil": "^4.1.0" diff --git a/extensions/VSCode/pnpm-lock.yaml b/extensions/VSCode/pnpm-lock.yaml index 35b2ff6c..35f20b58 100644 --- a/extensions/VSCode/pnpm-lock.yaml +++ b/extensions/VSCode/pnpm-lock.yaml @@ -13,20 +13,20 @@ importers: version: 1.0.3 devDependencies: '@emnapi/core': - specifier: ^1.9.2 - version: 1.9.2 + specifier: ^1.10.0 + version: 1.10.0 '@emnapi/runtime': - specifier: ^1.9.2 - version: 1.9.2 + specifier: ^1.10.0 + version: 1.10.0 '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.2.0) + version: 10.0.1(eslint@10.3.0) '@napi-rs/cli': specifier: ^3.6.2 - version: 3.6.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@24.12.2) + version: 3.6.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@24.12.2) '@tybys/wasm-util': - specifier: ^0.10.1 - version: 0.10.1 + specifier: ^0.10.2 + version: 0.10.2 '@types/escape-html': specifier: ^1.0.4 version: 1.0.4 @@ -37,14 +37,14 @@ importers: specifier: 1.61.0 version: 1.61.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.58.2 - version: 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2) + specifier: ^8.59.2 + version: 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) '@typescript-eslint/parser': - specifier: ^8.58.2 - version: 8.58.2(eslint@10.2.0)(typescript@6.0.2) + specifier: ^8.59.2 + version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) '@vscode/vsce': - specifier: ^3.8.1 - version: 3.8.1 + specifier: ^3.9.1 + version: 3.9.1 chalk: specifier: ^5.6.2 version: 5.6.2 @@ -52,20 +52,20 @@ importers: specifier: ^0.28.0 version: 0.28.0 eslint: - specifier: ^10.2.0 - version: 10.2.0 + specifier: ^10.3.0 + version: 10.3.0 eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.2.0) + version: 10.1.8(eslint@10.3.0) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0) + version: 2.32.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0) eslint-plugin-node: specifier: ^11.1.0 - version: 11.1.0(eslint@10.2.0) + version: 11.1.0(eslint@10.3.0) eslint-plugin-prettier: specifier: ^5.5.5 - version: 5.5.5(eslint-config-prettier@10.1.8(eslint@10.2.0))(eslint@10.2.0)(prettier@3.8.3) + version: 5.5.5(eslint-config-prettier@10.1.8(eslint@10.3.0))(eslint@10.3.0)(prettier@3.8.3) npm-run-all2: specifier: ^8.0.4 version: 8.0.4 @@ -76,11 +76,11 @@ importers: specifier: ^3.8.3 version: 3.8.3 typescript: - specifier: ^6.0.2 - version: 6.0.2 + specifier: ^6.0.3 + version: 6.0.3 typescript-eslint: - specifier: ^8.58.2 - version: 8.58.2(eslint@10.2.0)(typescript@6.0.2) + specifier: ^8.59.2 + version: 8.59.2(eslint@10.3.0)(typescript@6.0.3) optionalDependencies: bufferutil: specifier: ^4.1.0 @@ -126,16 +126,16 @@ packages: resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==} engines: {node: '>=20.0.0'} - '@azure/msal-browser@5.6.3': - resolution: {integrity: sha512-sTjMtUm+bJpENU/1WlRzHEsgEHppZDZ1EtNyaOODg/sQBtMxxJzGB+MOCM+T2Q5Qe1fKBrdxUmjyRxm0r7Ez9w==} + '@azure/msal-browser@5.9.0': + resolution: {integrity: sha512-CzE+4PefDSJWj26zU7G1bKchlGRRHMBFreG4tAlGuzyI8hAPiYGobaJvZBgZBf6L63iphX7VH+ityL8VgEQz9Q==} engines: {node: '>=0.8.0'} - '@azure/msal-common@16.4.1': - resolution: {integrity: sha512-Bl8f+w37xkXsYh7QRkAKCFGYtWMYuOVO7Lv+BxILrvGz3HbIEF22Pt0ugyj0QPOl6NLrHcnNUQ9yeew98P/5iw==} + '@azure/msal-common@16.5.2': + resolution: {integrity: sha512-GkDEL6TYo3HgT3UuqakdgE9PZfc1hMki6+Hwgy1uddb/EauvAKfu85vVhuofRSo22D1xTnWt8Ucwfg4vSCVwvA==} engines: {node: '>=0.8.0'} - '@azure/msal-node@5.1.2': - resolution: {integrity: sha512-DoeSJ9U5KPAIZoHsPywvfEj2MhBniQe0+FSpjLUTdWoIkI999GB5USkW6nNEHnIaLVxROHXvprWA1KzdS1VQ4A==} + '@azure/msal-node@5.1.5': + resolution: {integrity: sha512-ObTeMoNPmq19X3z40et9Xvs4ZoWVeJg43PZMRLG5iwVL+2nCtAerG3YTDItqPp1CfXNwmCXBbg8jn1DOx65c3g==} engines: {node: '>=20'} '@babel/code-frame@7.29.0': @@ -146,11 +146,11 @@ packages: resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} - '@emnapi/core@1.9.2': - resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@emnapi/runtime@1.9.2': - resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -350,12 +350,16 @@ packages: resolution: {integrity: sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@humanfs/core@0.19.1': - resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + '@humanfs/core@0.19.2': + resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} engines: {node: '>=18.18.0'} - '@humanfs/node@0.16.7': - resolution: {integrity: sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==} + '@humanfs/node@0.16.8': + resolution: {integrity: sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==} + engines: {node: '>=18.18.0'} + + '@humanfs/types@0.15.0': + resolution: {integrity: sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==} engines: {node: '>=18.18.0'} '@humanwhocodes/module-importer@1.0.1': @@ -370,8 +374,8 @@ packages: resolution: {integrity: sha512-doc2sWgJpbFQ64UflSVd17ibMGDuxO1yKgOgLMwavzESnXjFWJqUeG8saYosqKpHp4kWiM5x1nXvEjbpx90gzw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/checkbox@5.1.3': - resolution: {integrity: sha512-+G7I8CT+EHv/hasNfUl3P37DVoMoZfpA+2FXmM54dA8MxYle1YqucxbacxHalw1iAFSdKNEDTGNV7F+j1Ldqcg==} + '@inquirer/checkbox@5.1.4': + resolution: {integrity: sha512-w6KF8ZYRvqHhROkOTHXYC3qIV/KYEu5o12oLqQySvch61vrYtRxNSHTONSdJqWiFJPlCUQAHT5OgOIyuTr+MHQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -379,8 +383,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@6.0.11': - resolution: {integrity: sha512-pTpHjg0iEIRMYV/7oCZUMf27/383E6Wyhfc/MY+AVQGEoUobffIYWOK9YLP2XFRGz/9i6WlTQh1CkFVIo2Y7XA==} + '@inquirer/confirm@6.0.12': + resolution: {integrity: sha512-h9FgGun3QwVYNj5TWIZZ+slii73bMoBFjPfVIGtnFuL4t8gBiNDV9PcSfIzkuxvgquJKt9nr1QzszpBzTbH8Og==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -388,8 +392,8 @@ packages: '@types/node': optional: true - '@inquirer/core@11.1.8': - resolution: {integrity: sha512-/u+yJk2pOKNDOh1ZgdUH2RQaRx6OOH4I0uwL95qPvTFTIL38YBsuSC4r1yXBB3Q6JvNqFFc202gk0Ew79rrcjA==} + '@inquirer/core@11.1.9': + resolution: {integrity: sha512-BDE4fG22uYh1bGSifcj7JSx119TVYNViMhMu85usp4Fswrzh6M0DV3yld64jA98uOAa2GSQ4Bg4bZRm2d2cwSg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -397,8 +401,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@5.1.0': - resolution: {integrity: sha512-6wlkYl65Qfayy48gPCfU4D7li6KCAGN79mLXa/tYHZH99OfZ820yY+HA+DgE88r8YwwgeuY6PQgNqMeK6LuMmw==} + '@inquirer/editor@5.1.1': + resolution: {integrity: sha512-6y11LgmNpmn5D2aB5FgnCfBUBK8ZstwLCalyJmORcJZ/WrhOjm16mu6eSqIx8DnErxDqSLr+Jkp+GP8/Nwd5tA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -406,8 +410,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@5.0.12': - resolution: {integrity: sha512-vOfrB33b7YIZfDauXS8vNNz2Z86FozTZLIt7e+7/dCaPJ1RXZsHCuI9TlcERzEUq57vkM+UdnBgxP0rFd23JYQ==} + '@inquirer/expand@5.0.13': + resolution: {integrity: sha512-dF2zvrFo9LshkcB23/O1il13kBkBltWIXzut1evfbuBLXMiGIuC45c+ZQ0uukjCDsvI8OWqun4FRYMnzFCQa3g==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -428,8 +432,8 @@ packages: resolution: {integrity: sha512-NsSs4kzfm12lNetHwAn3GEuH317IzpwrMCbOuMIVytpjnJ90YYHNwdRgYGuKmVxwuIqSgqk3M5qqQt1cDk0tGQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} - '@inquirer/input@5.0.11': - resolution: {integrity: sha512-twUWidn4ocPO8qi6fRM7tNWt7W1FOnOZqQ+/+PsfLUacMR5rFLDPK9ql0nBPwxi0oELbo8T5NhRs8B2+qQEqFQ==} + '@inquirer/input@5.0.12': + resolution: {integrity: sha512-uiMFBl4LqFzJClh80Q3f9hbOFJ6kgkDWI4LjAeBuyO6EanVVMF69AgOvpi1qdqjDSjDN6578B6nky9ceEpI+1Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -437,8 +441,8 @@ packages: '@types/node': optional: true - '@inquirer/number@4.0.11': - resolution: {integrity: sha512-Vscmim9TCksQsfjPtka/JwPUcbLhqWYrgfPf1cHrCm24X/F2joFwnageD50yMKsaX14oNGOyKf/RNXAFkNjWpA==} + '@inquirer/number@4.0.12': + resolution: {integrity: sha512-/vrwhEf7Xsuh+YlHF4IjSy3g1cyrQuPaSiHIxCEbLu8qnfvrcvJyCkoktOOF+xV9gSb77/G0n3h04RbMDW2sIg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -446,8 +450,8 @@ packages: '@types/node': optional: true - '@inquirer/password@5.0.11': - resolution: {integrity: sha512-9KZFeRaNHIcejtPb0wN4ddFc7EvobVoAFa049eS3LrDZFxI8O7xUXiITEOinBzkZFAIwY5V4yzQae/QfO9cbbg==} + '@inquirer/password@5.0.12': + resolution: {integrity: sha512-CBh7YHju623lxJRcAOo498ZUwIuMy63bqW/vVq0tQAZVv+lkWlHkP9ealYE1utWSisEShY5VMdzIXRmyEODzcQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -455,8 +459,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@8.4.1': - resolution: {integrity: sha512-AH5xPQ997K7e0F0vulPlteIHke2awMkFi8F0dBemrDfmvtPmHJo82mdHbONC4F/t8d1NHwrbI5cGVI+RbLWdoQ==} + '@inquirer/prompts@8.4.2': + resolution: {integrity: sha512-XJmn/wY4AX56l1BRU+ZjDrFtg9+2uBEi4JvJQj82kwJDQKiPgSn4CEsbfGGygS4Gw6rkL4W18oATjfVfaqub2Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -464,8 +468,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@5.2.7': - resolution: {integrity: sha512-AqRMiD9+uE1lskDPrdqHwrV/EUmxKEBLX44SR7uxK3vD2413AmVfE5EQaPeNzYf5Pq5SitHJDYUFVF0poIr09w==} + '@inquirer/rawlist@5.2.8': + resolution: {integrity: sha512-Su7FQvp5buZmCymN3PPoYv31ZQQX4ve2j02k7piGgKAWgE+AQRB5YoYVveGXcl3TZ9ldgRMSxj56YfDFmmaqLg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -473,8 +477,8 @@ packages: '@types/node': optional: true - '@inquirer/search@4.1.7': - resolution: {integrity: sha512-1y7+0N65AWk5RdlXH/Kn13txf3IjIQ7OEfhCEkDTU+h5wKMLq8DUF3P6z+/kLSxDGDtQT1dRBWEUC3o/VvImsQ==} + '@inquirer/search@4.1.8': + resolution: {integrity: sha512-fGiHKGD6DyPIYUWxoXnQTeXeyYqSOUrasDMABBmMHUalH/LxkuzY0xVRtimXAt1sUeeyYkVuKQx1bebMuN11Kw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -482,8 +486,8 @@ packages: '@types/node': optional: true - '@inquirer/select@5.1.3': - resolution: {integrity: sha512-zYyqWgGQi3NhBcNq4Isc5rB3oEdQEh1Q/EcAnOW0FK4MpnXWkvSBYgA4cYrTM4A9UB573omouZbnL9JJ74Mq3A==} + '@inquirer/select@5.1.4': + resolution: {integrity: sha512-2kWcGKPMLAXAWRp1AH1SLsQmX+j0QjeljyXMUji9WMZC8nRDO0b7qquIGr6143E7KMLt3VAIGNXzwa/6PXQs4Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} peerDependencies: '@types/node': '>=18' @@ -1071,23 +1075,23 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} - '@textlint/ast-node-types@15.5.4': - resolution: {integrity: sha512-bVtB6VEy9U9DpW8cTt25k5T+lz86zV5w6ImePZqY1AXzSuPhqQNT77lkMPxonXzUducEIlSvUu3o7sKw3y9+Sw==} + '@textlint/ast-node-types@15.6.0': + resolution: {integrity: sha512-CxZHFbYAU7J0A4izz31wV2ZZfySR6aVj2OSR6/3tppZm7VV6hM7nA7sutsLwIiBL/v4lsB1RM79l4Dc/VrH4qw==} - '@textlint/linter-formatter@15.5.4': - resolution: {integrity: sha512-D9qJedKBLmAo+kiudop4UKgSxXMi4O8U86KrCidVXZ9RsK0NSVIw6+r2rlMUOExq79iEY81FRENyzmNVRxDBsg==} + '@textlint/linter-formatter@15.6.0': + resolution: {integrity: sha512-IwHRhjwxs0a5t1eNAoKAdV224CDca38LyopPofXpwO/d0J75wBvzf/cBHXNl4TMsLKhYGtR83UprcLEKj/gZsA==} - '@textlint/module-interop@15.5.4': - resolution: {integrity: sha512-JyAUd26ll3IFF87LP0uGoa8Tzw5ZKiYvGs6v8jLlzyND1lUYCI4+2oIAslrODLkf0qwoCaJrBQWM3wsw+asVGQ==} + '@textlint/module-interop@15.6.0': + resolution: {integrity: sha512-MHY6pJx9i5kOlrvUSK51887tYZjHAV2qnr6unBm7LtBLGDFo93utdYqHyWep8r9QLsilQdeijWtufJI46z4v4w==} - '@textlint/resolver@15.5.4': - resolution: {integrity: sha512-5GUagtpQuYcmhlOzBGdmVBvDu5lKgVTjwbxtdfoidN4OIqblIxThJHHjazU+ic+/bCIIzI2JcOjHGSaRmE8Gcg==} + '@textlint/resolver@15.6.0': + resolution: {integrity: sha512-T1l2Gd3455pwtm0cTewhX/LLy3bL9z6/Fu/am+jj+jjGfXVoknYkjfkZEKrjHlA7xzay0EfUKnu//teYemLeZw==} - '@textlint/types@15.5.4': - resolution: {integrity: sha512-mY28j2U7nrWmZbxyKnRvB8vJxJab4AxqOobLfb6iozrLelJbqxcOTvBQednadWPfAk9XWaZVMqUr9Nird3mutg==} + '@textlint/types@15.6.0': + resolution: {integrity: sha512-CvgYb1PiqF4BGyoZebGWzAJCZ4ChJAZ9gtWjpQIMKE4Xe2KlSwDA8m8MsiZIV321f5Ibx38BMjC1Z/2ZYP2GQg==} - '@tybys/wasm-util@0.10.1': - resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@types/escape-html@1.0.4': resolution: {integrity: sha512-qZ72SFTgUAZ5a7Tj6kf2SHLetiH5S6f8G5frB2SPQ3EyF02kxdyBFf4Tz4banE3xCgGnKgWLt//a6VuYHKYJTg==} @@ -1116,63 +1120,63 @@ packages: '@types/vscode@1.61.0': resolution: {integrity: sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg==} - '@typescript-eslint/eslint-plugin@8.58.2': - resolution: {integrity: sha512-aC2qc5thQahutKjP+cl8cgN9DWe3ZUqVko30CMSZHnFEHyhOYoZSzkGtAI2mcwZ38xeImDucI4dnqsHiOYuuCw==} + '@typescript-eslint/eslint-plugin@8.59.2': + resolution: {integrity: sha512-j/bwmkBvHUtPNxzuWe5z6BEk3q54YRyGlBXkSsmfoih7zNrBvl5A9A98anlp/7JbyZcWIJ8KXo/3Tq/DjFLtuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.58.2 + '@typescript-eslint/parser': ^8.59.2 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.58.2': - resolution: {integrity: sha512-/Zb/xaIDfxeJnvishjGdcR4jmr7S+bda8PKNhRGdljDM+elXhlvN0FyPSsMnLmJUrVG9aPO6dof80wjMawsASg==} + '@typescript-eslint/parser@8.59.2': + resolution: {integrity: sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/project-service@8.58.2': - resolution: {integrity: sha512-Cq6UfpZZk15+r87BkIh5rDpi38W4b+Sjnb8wQCPPDDweS/LRCFjCyViEbzHk5Ck3f2QDfgmlxqSa7S7clDtlfg==} + '@typescript-eslint/project-service@8.59.2': + resolution: {integrity: sha512-+2hqvEkeyf/0FBor67duF0Ll7Ot8jyKzDQOSrxazF/danillRq2DwR9dLptsXpoZQqxE1UisSmoZewrlPas9Vw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.58.2': - resolution: {integrity: sha512-SgmyvDPexWETQek+qzZnrG6844IaO02UVyOLhI4wpo82dpZJY9+6YZCKAMFzXb7qhx37mFK1QcPQ18tud+vo6Q==} + '@typescript-eslint/scope-manager@8.59.2': + resolution: {integrity: sha512-JzfyEpEtOU89CcFSwyNS3mu4MLvLSXqnmX05+aKBDM+TdR5jzcGOEBwxwGNxrEQ7p/z6kK2WyioCGBf2zZBnvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.58.2': - resolution: {integrity: sha512-3SR+RukipDvkkKp/d0jP0dyzuls3DbGmwDpVEc5wqk5f38KFThakqAAO0XMirWAE+kT00oTauTbzMFGPoAzB0A==} + '@typescript-eslint/tsconfig-utils@8.59.2': + resolution: {integrity: sha512-BKK4alN7oi4C/zv4VqHQ+uRU+lTa6JGIZ7s1juw7b3RHo9OfKB+bKX3u0iVZetdsUCBBkSbdWbarJbmN0fTeSw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.58.2': - resolution: {integrity: sha512-Z7EloNR/B389FvabdGeTo2XMs4W9TjtPiO9DAsmT0yom0bwlPyRjkJ1uCdW1DvrrrYP50AJZ9Xc3sByZA9+dcg==} + '@typescript-eslint/type-utils@8.59.2': + resolution: {integrity: sha512-nhqaj1nmTdVVl/BP5omXNRGO38jn5iosis2vbdmupF2txCf8ylWT8lx+JlvMYYVqzGVKtjojUFoQ3JRWK+mfzQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/types@8.58.2': - resolution: {integrity: sha512-9TukXyATBQf/Jq9AMQXfvurk+G5R2MwfqQGDR2GzGz28HvY/lXNKGhkY+6IOubwcquikWk5cjlgPvD2uAA7htQ==} + '@typescript-eslint/types@8.59.2': + resolution: {integrity: sha512-e82GVOE8Ps3E++Egvb6Y3Dw0S10u8NkQ9KXmtRhCWJJ8kDhOJTvtMAWnFL16kB1583goCWXsr0NieKCZMs2/0Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.58.2': - resolution: {integrity: sha512-ELGuoofuhhoCvNbQjFFiobFcGgcDCEm0ThWdmO4Z0UzLqPXS3KFvnEZ+SHewwOYHjM09tkzOWXNTv9u6Gqtyuw==} + '@typescript-eslint/typescript-estree@8.59.2': + resolution: {integrity: sha512-o0XPGNwcWw+FIwStOWn+BwBuEmL6QXP0rsvAFg7ET1dey1Nr6Wb1ac8p5HEsK0ygO/6mUxlk+YWQD9xcb/nnXg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.58.2': - resolution: {integrity: sha512-QZfjHNEzPY8+l0+fIXMvuQ2sJlplB4zgDZvA+NmvZsZv3EQwOcc1DuIU1VJUTWZ/RKouBMhDyNaBMx4sWvrzRA==} + '@typescript-eslint/utils@8.59.2': + resolution: {integrity: sha512-Juw3EinkXqjaffxz6roowvV7GZT/kET5vSKKZT6upl5TXdWkLkYmNPXwDDL2Vkt2DPn0nODIS4egC/0AGxKo/Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/visitor-keys@8.58.2': - resolution: {integrity: sha512-f1WO2Lx8a9t8DARmcWAUPJbu0G20bJlj8L4z72K00TMeJAoyLr/tHhI/pzYBLrR4dXWkcxO1cWYZEOX8DKHTqA==} + '@typescript-eslint/visitor-keys@8.59.2': + resolution: {integrity: sha512-NwjLUnGy8/Zfx23fl50tRC8rYaYnM52xNRYFAXvmiil9yh1+K6aRVQMnzW6gQB/1DLgWt977lYQn7C+wtgXZiA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typespec/ts-http-runtime@0.3.5': @@ -1227,9 +1231,9 @@ packages: '@vscode/vsce-sign@2.0.9': resolution: {integrity: sha512-8IvaRvtFyzUnGGl3f5+1Cnor3LqaUWvhaUjAYO8Y39OUYlOf3cRd+dowuQYLpZcP3uwSG+mURwjEBOSq4SOJ0g==} - '@vscode/vsce@3.8.1': - resolution: {integrity: sha512-Ij1i53rvR2Z/BR8tdESNqb5l5GNvOLQIWSbE1NnRnXQrvJu/xhK8nVfe6vXKdI6L7/fUwzlqqB1gOjt901mTmg==} - engines: {node: '>= 22'} + '@vscode/vsce@3.9.1': + resolution: {integrity: sha512-MPn5p+DoudI+3GfJSpAZZraE1lgLv0LcwbH3+xy7RgEhty3UIkmUMUA+5jPTDaxXae00AnX5u77FxGM8FhfKKA==} + engines: {node: '>= 20'} hasBin: true acorn-jsx@5.3.2: @@ -1246,11 +1250,11 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - ajv@6.14.0: - resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} + ajv@6.15.0: + resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ajv@8.18.0: - resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} ansi-escapes@7.3.0: resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==} @@ -1552,8 +1556,8 @@ packages: resolution: {integrity: sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==} engines: {ecmascript: '>= es5', node: '>=4'} - emnapi@1.9.2: - resolution: {integrity: sha512-OdUoQe/8so7FvubnE/DNV9sNNSFwDYQiK4ZCAz4agMnD1s6faLuDn2gzxfJrmMoKfxZhhsckqGNwqPnS5K140A==} + emnapi@1.10.0: + resolution: {integrity: sha512-swoyZjupDvLoe/KC3HZ4SY1JUN+tviT6eOZ3Px28TZAYdBHtRIiMWWrIUUH+2/9CYY4fNTID1YhYZ+kdFHszHg==} peerDependencies: node-addon-api: '>= 6.1.0' peerDependenciesMeta: @@ -1613,8 +1617,8 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - es-toolkit@1.45.1: - resolution: {integrity: sha512-/jhoOj/Fx+A+IIyDNOvO3TItGmlMKhtX8ISAHKE90c4b/k1tqaqEZ+uUqfpU8DMnW5cgNJv606zS55jGvza0Xw==} + es-toolkit@1.46.1: + resolution: {integrity: sha512-5eNtXOs3tbfxXOj04tjjseeWkRWaoCjdEI+96DgwzZoe6c9juL49pXlzAFTI72aWC9Y8p7168g6XIKjh7k6pyQ==} esbuild@0.28.0: resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} @@ -1714,8 +1718,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.2.0: - resolution: {integrity: sha512-+L0vBFYGIpSNIt/KWTpFonPrqYvgKw1eUI5Vn7mEogrQcWtWYtNQ7dNqC+px/J0idT3BAkiWrhfS7k+Tum8TUA==} + eslint@10.3.0: + resolution: {integrity: sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1773,8 +1777,8 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.0: - resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fast-uri@3.1.1: + resolution: {integrity: sha512-h2r7rcm6Ee/J8o0LD5djLuFVcfbZxhvho4vvsbeV0aMvXjUgqv4YpxpkEx0d68l6+IleVfLAdVEfhR7QNMkGHQ==} fast-wrap-ansi@0.2.0: resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} @@ -1919,8 +1923,8 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} hosted-git-info@4.1.0: @@ -2161,8 +2165,8 @@ packages: jsonc-parser@3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} - jsonfile@6.2.0: - resolution: {integrity: sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==} + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} jsonwebtoken@9.0.3: resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} @@ -2225,8 +2229,8 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@11.3.5: - resolution: {integrity: sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==} + lru-cache@11.3.6: + resolution: {integrity: sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==} engines: {node: 20 || >=22} lru-cache@6.0.0: @@ -2306,8 +2310,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-abi@3.89.0: - resolution: {integrity: sha512-6u9UwL0HlAl21+agMN3YAMXcKByMqwGx+pq+P76vii5f7hTPtKDp08/H9py6DY+cfDw7kQNTGEj/rly3IgbNQA==} + node-abi@3.90.0: + resolution: {integrity: sha512-pZNQT7UnYlMwMBy5N1lV5X/YLTbZM5ncytN3xL7CHEzhDN8uVe0u55yaPUJICIJjaCW8NrM5BFdqr7HLweStNA==} engines: {node: '>=10'} node-addon-api@4.3.0: @@ -2569,8 +2573,8 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - safe-array-concat@1.1.3: - resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==} + safe-array-concat@1.1.4: + resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} safe-buffer@5.2.1: @@ -2824,15 +2828,15 @@ packages: typed-rest-client@1.8.11: resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} - typescript-eslint@8.58.2: - resolution: {integrity: sha512-V8iSng9mRbdZjl54VJ9NKr6ZB+dW0J3TzRXRGcSbLIej9jV86ZRtlYeTKDR/QLxXykocJ5icNzbsl2+5TzIvcQ==} + typescript-eslint@8.59.2: + resolution: {integrity: sha512-pJw051uomb3ZeCzGTpRb8RbEqB5Y4WWet8gl/GcTlU35BSx0PVdZ86/bqkQCyKKuraVQEK7r6kBHQXF+fBhkoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - typescript@6.0.2: - resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + typescript@6.0.3: + resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==} engines: {node: '>=14.17'} hasBin: true @@ -2877,10 +2881,6 @@ packages: util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -3025,8 +3025,8 @@ snapshots: '@azure/core-tracing': 1.3.1 '@azure/core-util': 1.13.1 '@azure/logger': 1.3.0 - '@azure/msal-browser': 5.6.3 - '@azure/msal-node': 5.1.2 + '@azure/msal-browser': 5.9.0 + '@azure/msal-node': 5.1.5 open: 10.2.0 tslib: 2.8.1 transitivePeerDependencies: @@ -3039,17 +3039,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/msal-browser@5.6.3': + '@azure/msal-browser@5.9.0': dependencies: - '@azure/msal-common': 16.4.1 + '@azure/msal-common': 16.5.2 - '@azure/msal-common@16.4.1': {} + '@azure/msal-common@16.5.2': {} - '@azure/msal-node@5.1.2': + '@azure/msal-node@5.1.5': dependencies: - '@azure/msal-common': 16.4.1 + '@azure/msal-common': 16.5.2 jsonwebtoken: 9.0.3 - uuid: 8.3.2 '@babel/code-frame@7.29.0': dependencies: @@ -3059,12 +3058,12 @@ snapshots: '@babel/helper-validator-identifier@7.28.5': {} - '@emnapi/core@1.9.2': + '@emnapi/core@1.10.0': dependencies: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 - '@emnapi/runtime@1.9.2': + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 @@ -3150,9 +3149,9 @@ snapshots: '@esbuild/win32-x64@0.28.0': optional: true - '@eslint-community/eslint-utils@4.9.1(eslint@10.2.0)': + '@eslint-community/eslint-utils@4.9.1(eslint@10.3.0)': dependencies: - eslint: 10.2.0 + eslint: 10.3.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -3173,9 +3172,9 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.2.0)': + '@eslint/js@10.0.1(eslint@10.3.0)': optionalDependencies: - eslint: 10.2.0 + eslint: 10.3.0 '@eslint/object-schema@3.0.5': {} @@ -3184,36 +3183,41 @@ snapshots: '@eslint/core': 1.2.1 levn: 0.4.1 - '@humanfs/core@0.19.1': {} + '@humanfs/core@0.19.2': + dependencies: + '@humanfs/types': 0.15.0 - '@humanfs/node@0.16.7': + '@humanfs/node@0.16.8': dependencies: - '@humanfs/core': 0.19.1 + '@humanfs/core': 0.19.2 + '@humanfs/types': 0.15.0 '@humanwhocodes/retry': 0.4.3 + '@humanfs/types@0.15.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.4.3': {} '@inquirer/ansi@2.0.5': {} - '@inquirer/checkbox@5.1.3(@types/node@24.12.2)': + '@inquirer/checkbox@5.1.4(@types/node@24.12.2)': dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/figures': 2.0.5 '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/confirm@6.0.11(@types/node@24.12.2)': + '@inquirer/confirm@6.0.12(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/core@11.1.8(@types/node@24.12.2)': + '@inquirer/core@11.1.9(@types/node@24.12.2)': dependencies: '@inquirer/ansi': 2.0.5 '@inquirer/figures': 2.0.5 @@ -3225,17 +3229,17 @@ snapshots: optionalDependencies: '@types/node': 24.12.2 - '@inquirer/editor@5.1.0(@types/node@24.12.2)': + '@inquirer/editor@5.1.1(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/external-editor': 3.0.0(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/expand@5.0.12(@types/node@24.12.2)': + '@inquirer/expand@5.0.13(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 @@ -3249,62 +3253,62 @@ snapshots: '@inquirer/figures@2.0.5': {} - '@inquirer/input@5.0.11(@types/node@24.12.2)': + '@inquirer/input@5.0.12(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/number@4.0.11(@types/node@24.12.2)': + '@inquirer/number@4.0.12(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/password@5.0.11(@types/node@24.12.2)': + '@inquirer/password@5.0.12(@types/node@24.12.2)': dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/prompts@8.4.1(@types/node@24.12.2)': - dependencies: - '@inquirer/checkbox': 5.1.3(@types/node@24.12.2) - '@inquirer/confirm': 6.0.11(@types/node@24.12.2) - '@inquirer/editor': 5.1.0(@types/node@24.12.2) - '@inquirer/expand': 5.0.12(@types/node@24.12.2) - '@inquirer/input': 5.0.11(@types/node@24.12.2) - '@inquirer/number': 4.0.11(@types/node@24.12.2) - '@inquirer/password': 5.0.11(@types/node@24.12.2) - '@inquirer/rawlist': 5.2.7(@types/node@24.12.2) - '@inquirer/search': 4.1.7(@types/node@24.12.2) - '@inquirer/select': 5.1.3(@types/node@24.12.2) + '@inquirer/prompts@8.4.2(@types/node@24.12.2)': + dependencies: + '@inquirer/checkbox': 5.1.4(@types/node@24.12.2) + '@inquirer/confirm': 6.0.12(@types/node@24.12.2) + '@inquirer/editor': 5.1.1(@types/node@24.12.2) + '@inquirer/expand': 5.0.13(@types/node@24.12.2) + '@inquirer/input': 5.0.12(@types/node@24.12.2) + '@inquirer/number': 4.0.12(@types/node@24.12.2) + '@inquirer/password': 5.0.12(@types/node@24.12.2) + '@inquirer/rawlist': 5.2.8(@types/node@24.12.2) + '@inquirer/search': 4.1.8(@types/node@24.12.2) + '@inquirer/select': 5.1.4(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/rawlist@5.2.7(@types/node@24.12.2)': + '@inquirer/rawlist@5.2.8(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/search@4.1.7(@types/node@24.12.2)': + '@inquirer/search@4.1.8(@types/node@24.12.2)': dependencies: - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/figures': 2.0.5 '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: '@types/node': 24.12.2 - '@inquirer/select@5.1.3(@types/node@24.12.2)': + '@inquirer/select@5.1.4(@types/node@24.12.2)': dependencies: '@inquirer/ansi': 2.0.5 - '@inquirer/core': 11.1.8(@types/node@24.12.2) + '@inquirer/core': 11.1.9(@types/node@24.12.2) '@inquirer/figures': 2.0.5 '@inquirer/type': 4.0.5(@types/node@24.12.2) optionalDependencies: @@ -3316,22 +3320,22 @@ snapshots: '@isaacs/cliui@9.0.0': {} - '@napi-rs/cli@3.6.2(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)(@types/node@24.12.2)': + '@napi-rs/cli@3.6.2(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(@types/node@24.12.2)': dependencies: - '@inquirer/prompts': 8.4.1(@types/node@24.12.2) - '@napi-rs/cross-toolchain': 1.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - '@napi-rs/wasm-tools': 1.0.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@inquirer/prompts': 8.4.2(@types/node@24.12.2) + '@napi-rs/cross-toolchain': 1.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/wasm-tools': 1.0.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@octokit/rest': 22.0.1 clipanion: 4.0.0-rc.4(typanion@3.14.0) colorette: 2.0.20 - emnapi: 1.9.2 - es-toolkit: 1.45.1 + emnapi: 1.10.0 + es-toolkit: 1.46.1 js-yaml: 4.1.1 obug: 2.1.1 semver: 7.7.4 typanion: 3.14.0 optionalDependencies: - '@emnapi/runtime': 1.9.2 + '@emnapi/runtime': 1.10.0 transitivePeerDependencies: - '@emnapi/core' - '@napi-rs/cross-toolchain-arm64-target-aarch64' @@ -3348,10 +3352,10 @@ snapshots: - node-addon-api - supports-color - '@napi-rs/cross-toolchain@1.0.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/cross-toolchain@1.0.3(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/lzma': 1.4.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - '@napi-rs/tar': 1.1.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/lzma': 1.4.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@napi-rs/tar': 1.1.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) debug: 4.4.3 transitivePeerDependencies: - '@emnapi/core' @@ -3397,9 +3401,9 @@ snapshots: '@napi-rs/lzma-linux-x64-musl@1.4.5': optional: true - '@napi-rs/lzma-wasm32-wasi@1.4.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/lzma-wasm32-wasi@1.4.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -3414,7 +3418,7 @@ snapshots: '@napi-rs/lzma-win32-x64-msvc@1.4.5': optional: true - '@napi-rs/lzma@1.4.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/lzma@1.4.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': optionalDependencies: '@napi-rs/lzma-android-arm-eabi': 1.4.5 '@napi-rs/lzma-android-arm64': 1.4.5 @@ -3429,7 +3433,7 @@ snapshots: '@napi-rs/lzma-linux-s390x-gnu': 1.4.5 '@napi-rs/lzma-linux-x64-gnu': 1.4.5 '@napi-rs/lzma-linux-x64-musl': 1.4.5 - '@napi-rs/lzma-wasm32-wasi': 1.4.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/lzma-wasm32-wasi': 1.4.5(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@napi-rs/lzma-win32-arm64-msvc': 1.4.5 '@napi-rs/lzma-win32-ia32-msvc': 1.4.5 '@napi-rs/lzma-win32-x64-msvc': 1.4.5 @@ -3473,9 +3477,9 @@ snapshots: '@napi-rs/tar-linux-x64-musl@1.1.0': optional: true - '@napi-rs/tar-wasm32-wasi@1.1.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/tar-wasm32-wasi@1.1.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -3490,7 +3494,7 @@ snapshots: '@napi-rs/tar-win32-x64-msvc@1.1.0': optional: true - '@napi-rs/tar@1.1.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/tar@1.1.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': optionalDependencies: '@napi-rs/tar-android-arm-eabi': 1.1.0 '@napi-rs/tar-android-arm64': 1.1.0 @@ -3504,7 +3508,7 @@ snapshots: '@napi-rs/tar-linux-s390x-gnu': 1.1.0 '@napi-rs/tar-linux-x64-gnu': 1.1.0 '@napi-rs/tar-linux-x64-musl': 1.1.0 - '@napi-rs/tar-wasm32-wasi': 1.1.0(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/tar-wasm32-wasi': 1.1.0(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@napi-rs/tar-win32-arm64-msvc': 1.1.0 '@napi-rs/tar-win32-ia32-msvc': 1.1.0 '@napi-rs/tar-win32-x64-msvc': 1.1.0 @@ -3514,16 +3518,16 @@ snapshots: '@napi-rs/wasm-runtime@0.2.12': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@emnapi/core': 1.9.2 - '@emnapi/runtime': 1.9.2 - '@tybys/wasm-util': 0.10.1 + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 optional: true '@napi-rs/wasm-tools-android-arm-eabi@1.0.1': @@ -3553,9 +3557,9 @@ snapshots: '@napi-rs/wasm-tools-linux-x64-musl@1.0.1': optional: true - '@napi-rs/wasm-tools-wasm32-wasi@1.0.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-tools-wasm32-wasi@1.0.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -3570,7 +3574,7 @@ snapshots: '@napi-rs/wasm-tools-win32-x64-msvc@1.0.1': optional: true - '@napi-rs/wasm-tools@1.0.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)': + '@napi-rs/wasm-tools@1.0.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': optionalDependencies: '@napi-rs/wasm-tools-android-arm-eabi': 1.0.1 '@napi-rs/wasm-tools-android-arm64': 1.0.1 @@ -3581,7 +3585,7 @@ snapshots: '@napi-rs/wasm-tools-linux-arm64-musl': 1.0.1 '@napi-rs/wasm-tools-linux-x64-gnu': 1.0.1 '@napi-rs/wasm-tools-linux-x64-musl': 1.0.1 - '@napi-rs/wasm-tools-wasm32-wasi': 1.0.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) + '@napi-rs/wasm-tools-wasm32-wasi': 1.0.1(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) '@napi-rs/wasm-tools-win32-arm64-msvc': 1.0.1 '@napi-rs/wasm-tools-win32-ia32-msvc': 1.0.1 '@napi-rs/wasm-tools-win32-x64-msvc': 1.0.1 @@ -3738,7 +3742,7 @@ snapshots: '@secretlint/profiler': 10.2.2 '@secretlint/resolver': 10.2.2 '@secretlint/types': 10.2.2 - ajv: 8.18.0 + ajv: 8.20.0 debug: 4.4.3 rc-config-loader: 4.1.4 transitivePeerDependencies: @@ -3757,9 +3761,9 @@ snapshots: dependencies: '@secretlint/resolver': 10.2.2 '@secretlint/types': 10.2.2 - '@textlint/linter-formatter': 15.5.4 - '@textlint/module-interop': 15.5.4 - '@textlint/types': 15.5.4 + '@textlint/linter-formatter': 15.6.0 + '@textlint/module-interop': 15.6.0 + '@textlint/types': 15.6.0 chalk: 5.6.2 debug: 4.4.3 pluralize: 8.0.0 @@ -3805,15 +3809,15 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} - '@textlint/ast-node-types@15.5.4': {} + '@textlint/ast-node-types@15.6.0': {} - '@textlint/linter-formatter@15.5.4': + '@textlint/linter-formatter@15.6.0': dependencies: '@azu/format-text': 1.0.2 '@azu/style-format': 1.0.1 - '@textlint/module-interop': 15.5.4 - '@textlint/resolver': 15.5.4 - '@textlint/types': 15.5.4 + '@textlint/module-interop': 15.6.0 + '@textlint/resolver': 15.6.0 + '@textlint/types': 15.6.0 chalk: 4.1.2 debug: 4.4.3 js-yaml: 4.1.1 @@ -3826,15 +3830,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@textlint/module-interop@15.5.4': {} + '@textlint/module-interop@15.6.0': {} - '@textlint/resolver@15.5.4': {} + '@textlint/resolver@15.6.0': {} - '@textlint/types@15.5.4': + '@textlint/types@15.6.0': dependencies: - '@textlint/ast-node-types': 15.5.4 + '@textlint/ast-node-types': 15.6.0 - '@tybys/wasm-util@0.10.1': + '@tybys/wasm-util@0.10.2': dependencies: tslib: 2.8.1 @@ -3858,95 +3862,95 @@ snapshots: '@types/vscode@1.61.0': {} - '@typescript-eslint/eslint-plugin@8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2)': + '@typescript-eslint/eslint-plugin@8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/type-utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.2 - eslint: 10.2.0 + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/type-utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 + eslint: 10.3.0 ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2)': + '@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3 - eslint: 10.2.0 - typescript: 6.0.2 + eslint: 10.3.0 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.58.2(typescript@6.0.2)': + '@typescript-eslint/project-service@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 debug: 4.4.3 - typescript: 6.0.2 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.58.2': + '@typescript-eslint/scope-manager@8.59.2': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 - '@typescript-eslint/tsconfig-utils@8.58.2(typescript@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.59.2(typescript@6.0.3)': dependencies: - typescript: 6.0.2 + typescript: 6.0.3 - '@typescript-eslint/type-utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)': + '@typescript-eslint/type-utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) debug: 4.4.3 - eslint: 10.2.0 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + eslint: 10.3.0 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.58.2': {} + '@typescript-eslint/types@8.59.2': {} - '@typescript-eslint/typescript-estree@8.58.2(typescript@6.0.2)': + '@typescript-eslint/typescript-estree@8.59.2(typescript@6.0.3)': dependencies: - '@typescript-eslint/project-service': 8.58.2(typescript@6.0.2) - '@typescript-eslint/tsconfig-utils': 8.58.2(typescript@6.0.2) - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/visitor-keys': 8.58.2 + '@typescript-eslint/project-service': 8.59.2(typescript@6.0.3) + '@typescript-eslint/tsconfig-utils': 8.59.2(typescript@6.0.3) + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/visitor-keys': 8.59.2 debug: 4.4.3 minimatch: 10.2.5 semver: 7.7.4 tinyglobby: 0.2.16 - ts-api-utils: 2.5.0(typescript@6.0.2) - typescript: 6.0.2 + ts-api-utils: 2.5.0(typescript@6.0.3) + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.58.2(eslint@10.2.0)(typescript@6.0.2)': + '@typescript-eslint/utils@8.59.2(eslint@10.3.0)(typescript@6.0.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) - '@typescript-eslint/scope-manager': 8.58.2 - '@typescript-eslint/types': 8.58.2 - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - eslint: 10.2.0 - typescript: 6.0.2 + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) + '@typescript-eslint/scope-manager': 8.59.2 + '@typescript-eslint/types': 8.59.2 + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + eslint: 10.3.0 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.58.2': + '@typescript-eslint/visitor-keys@8.59.2': dependencies: - '@typescript-eslint/types': 8.58.2 + '@typescript-eslint/types': 8.59.2 eslint-visitor-keys: 5.0.1 '@typespec/ts-http-runtime@0.3.5': @@ -3996,7 +4000,7 @@ snapshots: '@vscode/vsce-sign-win32-arm64': 2.0.6 '@vscode/vsce-sign-win32-x64': 2.0.6 - '@vscode/vsce@3.8.1': + '@vscode/vsce@3.9.1': dependencies: '@azure/identity': 4.13.1 '@secretlint/node': 10.2.2 @@ -4040,17 +4044,17 @@ snapshots: agent-base@7.1.4: {} - ajv@6.14.0: + ajv@6.15.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ajv@8.18.0: + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.1 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -4385,7 +4389,7 @@ snapshots: dependencies: version-range: 4.15.0 - emnapi@1.9.2: {} + emnapi@1.10.0: {} emoji-regex@8.0.0: {} @@ -4431,7 +4435,7 @@ snapshots: has-property-descriptors: 1.0.2 has-proto: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 internal-slot: 1.1.0 is-array-buffer: 3.0.5 is-callable: 1.2.7 @@ -4449,7 +4453,7 @@ snapshots: object.assign: 4.1.7 own-keys: 1.0.1 regexp.prototype.flags: 1.5.4 - safe-array-concat: 1.1.3 + safe-array-concat: 1.1.4 safe-push-apply: 1.0.0 safe-regex-test: 1.1.0 set-proto: 1.0.0 @@ -4477,11 +4481,11 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 es-shim-unscopables@1.1.0: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 es-to-primitive@1.3.0: dependencies: @@ -4489,7 +4493,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.45.1: {} + es-toolkit@1.46.1: {} esbuild@0.28.0: optionalDependencies: @@ -4524,9 +4528,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.2.0): + eslint-config-prettier@10.1.8(eslint@10.3.0): dependencies: - eslint: 10.2.0 + eslint: 10.3.0 eslint-import-resolver-node@0.3.10: dependencies: @@ -4536,23 +4540,23 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.2.0): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - eslint: 10.2.0 + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + eslint: 10.3.0 eslint-import-resolver-node: 0.3.10 transitivePeerDependencies: - supports-color - eslint-plugin-es@3.0.1(eslint@10.2.0): + eslint-plugin-es@3.0.1(eslint@10.3.0): dependencies: - eslint: 10.2.0 + eslint: 10.3.0 eslint-utils: 2.1.0 regexpp: 3.2.0 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -4561,10 +4565,10 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 10.2.0 + eslint: 10.3.0 eslint-import-resolver-node: 0.3.10 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint-import-resolver-node@0.3.10)(eslint@10.2.0) - hasown: 2.0.2 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0) + hasown: 2.0.3 is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.5 @@ -4575,30 +4579,30 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-node@11.1.0(eslint@10.2.0): + eslint-plugin-node@11.1.0(eslint@10.3.0): dependencies: - eslint: 10.2.0 - eslint-plugin-es: 3.0.1(eslint@10.2.0) + eslint: 10.3.0 + eslint-plugin-es: 3.0.1(eslint@10.3.0) eslint-utils: 2.1.0 ignore: 5.3.2 minimatch: 3.1.5 resolve: 1.22.12 semver: 6.3.1 - eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@10.2.0))(eslint@10.2.0)(prettier@3.8.3): + eslint-plugin-prettier@5.5.5(eslint-config-prettier@10.1.8(eslint@10.3.0))(eslint@10.3.0)(prettier@3.8.3): dependencies: - eslint: 10.2.0 + eslint: 10.3.0 prettier: 3.8.3 prettier-linter-helpers: 1.0.1 synckit: 0.11.12 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@10.2.0) + eslint-config-prettier: 10.1.8(eslint@10.3.0) eslint-scope@9.1.2: dependencies: @@ -4617,19 +4621,19 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.2.0: + eslint@10.3.0: dependencies: - '@eslint-community/eslint-utils': 4.9.1(eslint@10.2.0) + '@eslint-community/eslint-utils': 4.9.1(eslint@10.3.0) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5 '@eslint/config-helpers': 0.5.5 '@eslint/core': 1.2.1 '@eslint/plugin-kit': 0.7.1 - '@humanfs/node': 0.16.7 + '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 '@types/estree': 1.0.8 - ajv: 6.14.0 + ajv: 6.15.0 cross-spawn: 7.0.6 debug: 4.4.3 escape-string-regexp: 4.0.0 @@ -4697,7 +4701,7 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.0: {} + fast-uri@3.1.1: {} fast-wrap-ansi@0.2.0: dependencies: @@ -4747,7 +4751,7 @@ snapshots: asynckit: 0.4.0 combined-stream: 1.0.8 es-set-tostringtag: 2.1.0 - hasown: 2.0.2 + hasown: 2.0.3 mime-types: 2.1.35 fs-constants@1.0.0: @@ -4756,7 +4760,7 @@ snapshots: fs-extra@11.3.4: dependencies: graceful-fs: 4.2.11 - jsonfile: 6.2.0 + jsonfile: 6.2.1 universalify: 2.0.1 function-bind@1.1.2: {} @@ -4767,7 +4771,7 @@ snapshots: call-bound: 1.0.4 define-properties: 1.2.1 functions-have-names: 1.2.3 - hasown: 2.0.2 + hasown: 2.0.3 is-callable: 1.2.7 functions-have-names@1.2.3: {} @@ -4784,7 +4788,7 @@ snapshots: get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.3 math-intrinsics: 1.1.0 get-proto@1.0.1: @@ -4854,7 +4858,7 @@ snapshots: dependencies: has-symbols: 1.1.0 - hasown@2.0.2: + hasown@2.0.3: dependencies: function-bind: 1.1.2 @@ -4915,7 +4919,7 @@ snapshots: internal-slot@1.1.0: dependencies: es-errors: 1.3.0 - hasown: 2.0.2 + hasown: 2.0.3 side-channel: 1.1.0 is-array-buffer@3.0.5: @@ -4949,7 +4953,7 @@ snapshots: is-core-module@2.16.1: dependencies: - hasown: 2.0.2 + hasown: 2.0.3 is-data-view@1.0.2: dependencies: @@ -5008,7 +5012,7 @@ snapshots: call-bound: 1.0.4 gopd: 1.2.0 has-tostringtag: 1.0.2 - hasown: 2.0.2 + hasown: 2.0.3 is-set@2.0.3: {} @@ -5088,7 +5092,7 @@ snapshots: jsonc-parser@3.3.1: {} - jsonfile@6.2.0: + jsonfile@6.2.1: dependencies: universalify: 2.0.1 optionalDependencies: @@ -5163,7 +5167,7 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@11.3.5: {} + lru-cache@11.3.6: {} lru-cache@6.0.0: dependencies: @@ -5228,7 +5232,7 @@ snapshots: natural-compare@1.4.0: {} - node-abi@3.89.0: + node-abi@3.90.0: dependencies: semver: 7.7.4 optional: true @@ -5339,7 +5343,7 @@ snapshots: ovsx@0.10.11: dependencies: - '@vscode/vsce': 3.8.1 + '@vscode/vsce': 3.9.1 commander: 6.2.1 follow-redirects: 1.16.0 is-ci: 2.0.0 @@ -5400,7 +5404,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.3.5 + lru-cache: 11.3.6 minipass: 7.1.3 path-type@6.0.0: {} @@ -5429,7 +5433,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.89.0 + node-abi: 3.90.0 pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1 @@ -5550,7 +5554,7 @@ snapshots: dependencies: queue-microtask: 1.2.3 - safe-array-concat@1.1.3: + safe-array-concat@1.1.4: dependencies: call-bind: 1.0.9 call-bound: 1.0.4 @@ -5760,7 +5764,7 @@ snapshots: table@6.9.0: dependencies: - ajv: 8.18.0 + ajv: 8.20.0 lodash.truncate: 4.4.2 slice-ansi: 4.0.0 string-width: 4.2.3 @@ -5805,9 +5809,9 @@ snapshots: dependencies: is-number: 7.0.0 - ts-api-utils@2.5.0(typescript@6.0.2): + ts-api-utils@2.5.0(typescript@6.0.3): dependencies: - typescript: 6.0.2 + typescript: 6.0.3 tsconfig-paths@3.15.0: dependencies: @@ -5872,18 +5876,18 @@ snapshots: tunnel: 0.0.6 underscore: 1.13.8 - typescript-eslint@8.58.2(eslint@10.2.0)(typescript@6.0.2): + typescript-eslint@8.59.2(eslint@10.3.0)(typescript@6.0.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.58.2(@typescript-eslint/parser@8.58.2(eslint@10.2.0)(typescript@6.0.2))(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/parser': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - '@typescript-eslint/typescript-estree': 8.58.2(typescript@6.0.2) - '@typescript-eslint/utils': 8.58.2(eslint@10.2.0)(typescript@6.0.2) - eslint: 10.2.0 - typescript: 6.0.2 + '@typescript-eslint/eslint-plugin': 8.59.2(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/parser': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + '@typescript-eslint/typescript-estree': 8.59.2(typescript@6.0.3) + '@typescript-eslint/utils': 8.59.2(eslint@10.3.0)(typescript@6.0.3) + eslint: 10.3.0 + typescript: 6.0.3 transitivePeerDependencies: - supports-color - typescript@6.0.2: {} + typescript@6.0.3: {} uc.micro@2.1.0: {} @@ -5917,8 +5921,6 @@ snapshots: util-deprecate@1.0.2: optional: true - uuid@8.3.2: {} - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 diff --git a/server/Cargo.lock b/server/Cargo.lock index f93653c3..3c9d4fd0 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.11.1", + "bitflags", "bytes", "futures-core", "futures-sink", @@ -29,7 +29,7 @@ dependencies = [ "actix-service", "actix-utils", "actix-web", - "bitflags 2.11.1", + "bitflags", "bytes", "derive_more", "futures-core", @@ -44,16 +44,16 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.12.0" +version = "3.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f860ee6746d0c5b682147b2f7f8ef036d4f92fe518251a3a35ffa3650eafdf0e" +checksum = "93acb4a42f64936f9b8cae4a433b237599dd6eb6ed06124eb67132ef8cc90662" dependencies = [ "actix-codec", "actix-rt", "actix-service", "actix-utils", "base64", - "bitflags 2.11.1", + "bitflags", "brotli", "bytes", "bytestring", @@ -72,8 +72,8 @@ dependencies = [ "mime", "percent-encoding", "pin-project-lite", - "rand 0.9.4", - "sha1", + "rand 0.10.1", + "sha1 0.11.0", "smallvec", "tokio", "tokio-util", @@ -246,6 +246,30 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "getrandom 0.3.4", + "once_cell", + "version_check", + "zerocopy", +] + [[package]] name = "aho-corasick" version = "1.1.4" @@ -371,12 +395,12 @@ dependencies = [ "flate2", "log", "md-5 0.10.6", - "rand 0.8.5", + "rand 0.8.6", "reqwest 0.12.28", "scroll", "serde", "serde-xml-rs", - "sha1", + "sha1 0.10.6", "sha2 0.10.9", "signature", "thiserror 2.0.18", @@ -418,9 +442,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "assert_cmd" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a686bbee5efb88a82df0621b236e74d925f470e5445d3220a5648b892ec99c9" +checksum = "39bae1d3fa576f7c6519514180a72559268dd7d1fe104070956cb687bc6673bd" dependencies = [ "anstyle", "bstr", @@ -481,9 +505,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.16.2" +version = "1.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" +checksum = "0ec6fb3fe69024a75fa7e1bfb48aa6cf59706a101658ea01bfd33b2b248a038f" dependencies = [ "aws-lc-sys", "zeroize", @@ -491,9 +515,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.39.1" +version = "0.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399" +checksum = "f50037ee5e1e41e7b8f9d161680a725bd1626cb6f8c7e901f91f942850852fe7" dependencies = [ "cc", "cmake", @@ -507,6 +531,25 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64-simd" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "781dd20c3aff0bd194fe7d2a977dd92f21c173891f3a03b677359e5fa457e5d5" +dependencies = [ + "simd-abstraction", +] + +[[package]] +name = "base64-simd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "339abbe78e73178762e23bea9dfd08e697eb3f3301cd4be981c0f78ba5859195" +dependencies = [ + "outref 0.5.2", + "vsimd", +] + [[package]] name = "base64ct" version = "1.8.3" @@ -540,15 +583,21 @@ checksum = "d2c54ff287cfc0a34f38a6b832ea1bd8e448a330b3e40a50859e6488bee07f22" [[package]] name = "bitflags" -version = "1.3.2" +version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" [[package]] -name = "bitflags" -version = "2.11.1" +name = "bitvec" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] [[package]] name = "block-buffer" @@ -609,6 +658,28 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "byteorder" version = "1.5.0" @@ -626,9 +697,9 @@ dependencies = [ [[package]] name = "bytestring" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" +checksum = "86566c496f2f47d9b8147a4c8b02ffdb69c919fe0c2b2e7195d22cbba0e635c9" dependencies = [ "bytes", ] @@ -662,11 +733,20 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "castaway" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dec551ab6e7578819132c713a93c022a05d60159dc86e7a7050223577484c55a" +dependencies = [ + "rustversion", +] + [[package]] name = "cc" -version = "1.2.60" +version = "1.2.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" dependencies = [ "find-msvc-tools", "jobserver", @@ -674,12 +754,6 @@ dependencies = [ "shlex", ] -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - [[package]] name = "cfb" version = "0.7.3" @@ -730,9 +804,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -752,9 +826,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", @@ -783,6 +857,15 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f88a43d011fc4a6876cb7344703e297c71dda42494fee094d5f7c76bf13f746" +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + [[package]] name = "codechat-editor-server" version = "0.1.54" @@ -817,13 +900,14 @@ dependencies = [ "markup5ever_rcdom", "mime", "mime_guess", + "minify-html", "minreq", "normalize-line-endings", "notify-debouncer-full", "path-slash", "pest", "pest_derive", - "phf", + "phf 0.13.1", "predicates", "pretty_assertions", "pulldown-cmark 0.13.3", @@ -860,6 +944,20 @@ dependencies = [ "memchr", ] +[[package]] +name = "compact_str" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb1325a1cece981e8a296ab8f0f9b63ae357bd0784a9faaf548cc7b480707a" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "rustversion", + "ryu", + "static_assertions", +] + [[package]] name = "const-oid" version = "0.9.6" @@ -872,13 +970,34 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" +[[package]] +name = "const-str" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21077772762a1002bb421c3af42ac1725fa56066bfc53d9a55bb79905df2aaf3" +dependencies = [ + "const-str-proc-macro", +] + +[[package]] +name = "const-str-proc-macro" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1e0fdd2e5d3041e530e1b21158aeeef8b5d0e306bc5c1e3d6cf0930d10e25a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "const_format" -version = "0.2.35" +version = "0.2.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" +checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" dependencies = [ "const_format_proc_macros", + "konst", ] [[package]] @@ -892,6 +1011,15 @@ dependencies = [ "unicode-xid", ] +[[package]] +name = "convert_case" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "convert_case" version = "0.10.0" @@ -928,6 +1056,12 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "cow-utils" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417bef24afe1460300965a25ff4a24b8b45ad011948302ec221e8a0a81eb2c79" + [[package]] name = "cpio-archive" version = "0.10.0" @@ -969,9 +1103,9 @@ dependencies = [ [[package]] name = "crc-catalog" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" +checksum = "217698eaf96b4a3f0bc4f3662aaa55bdf913cd54d7204591faa790070c6d0853" [[package]] name = "crc32fast" @@ -1043,6 +1177,38 @@ dependencies = [ "x509-certificate", ] +[[package]] +name = "cssparser" +version = "0.33.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9be934d936a0fbed5bcdc01042b770de1398bf79d0e192f49fa7faea0e99281e" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "phf 0.11.3", + "smallvec", +] + +[[package]] +name = "cssparser-color" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556c099a61d85989d7af52b692e35a8d68a57e7df8c6d07563dc0778b3960c9f" +dependencies = [ + "cssparser", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.117", +] + [[package]] name = "ctutils" version = "0.4.2" @@ -1052,11 +1218,33 @@ dependencies = [ "cmov", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown 0.14.5", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "data-encoding" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +checksum = "a4ae5f15dda3c708c0ade84bfee31ccab44a3da4f88015ed22f63732abe300c8" + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] [[package]] name = "debpkg" @@ -1121,7 +1309,7 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" dependencies = [ - "convert_case", + "convert_case 0.10.0", "proc-macro2", "quote", "rustc_version", @@ -1159,9 +1347,9 @@ dependencies = [ [[package]] name = "digest" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4850db49bf08e663084f7fb5c87d202ef91a3907271aff24a94eb97ff039153c" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" dependencies = [ "block-buffer 0.12.0", "const-oid 0.10.2", @@ -1246,12 +1434,51 @@ dependencies = [ "unicode-width", ] +[[package]] +name = "dragonbox_ecma" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd8e701084c37e7ef62d3f9e453b618130cbc0ef3573847785952a3ac3f746bf" + +[[package]] +name = "dtoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" + +[[package]] +name = "dtoa-short" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87" +dependencies = [ + "dtoa", +] + [[package]] name = "dunce" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" + [[package]] name = "encoding_rs" version = "0.8.35" @@ -1421,6 +1648,12 @@ dependencies = [ "libc", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.3.32" @@ -1579,7 +1812,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 2.11.1", + "bitflags", "ignore", "walkdir", ] @@ -1608,6 +1841,15 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.8", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "hashbrown" @@ -1625,6 +1867,9 @@ name = "hashbrown" version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +dependencies = [ + "allocator-api2", +] [[package]] name = "heck" @@ -1644,7 +1889,7 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6303bc9732ae41b04cb554b844a762b4115a61bfaa81e3e83050991eeb56863f" dependencies = [ - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -1654,7 +1899,7 @@ source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#68b5d9cfa dependencies = [ "html5ever", "markup5ever_rcdom", - "phf", + "phf 0.13.1", ] [[package]] @@ -1747,9 +1992,9 @@ checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hybrid-array" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3944cf8cf766b40e2a1a333ee5e9b563f854d5fa49d6a8ca2764e97c6eddb214" +checksum = "08d46837a0ed51fe95bd3b05de33cd64a1ee88fc797477ca48446872504507c5" dependencies = [ "typenum", ] @@ -1938,9 +2183,9 @@ dependencies = [ [[package]] name = "idna_adapter" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ "icu_normalizer", "icu_properties", @@ -2033,7 +2278,7 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd5b3eaf1a28b758ac0faa5a4254e8ab2705605496f1b1f3fbbc3988ad73d199" dependencies = [ - "bitflags 2.11.1", + "bitflags", "inotify-sys", "libc", ] @@ -2078,6 +2323,24 @@ version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" @@ -2086,9 +2349,9 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jiff" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a3546dc96b6d42c5f24902af9e2538e82e39ad350b0c766eb3fbf2d8f3d8359" +checksum = "f00b5dbd620d61dfdcb6007c9c1f6054ebd75319f163d886a9055cec1155073d" dependencies = [ "jiff-static", "log", @@ -2099,31 +2362,15 @@ dependencies = [ [[package]] name = "jiff-static" -version = "0.2.23" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a8c8b344124222efd714b73bb41f8b5120b27a7cc1c75593a6ff768d9d05aa4" +checksum = "e000de030ff8022ea1da3f466fbb0f3a809f5e51ed31f6dd931c35181ad8e6d7" dependencies = [ "proc-macro2", "quote", "syn 2.0.117", ] -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys 0.3.1", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - [[package]] name = "jni" version = "0.22.4" @@ -2133,7 +2380,7 @@ dependencies = [ "cfg-if", "combine", "jni-macros", - "jni-sys 0.4.1", + "jni-sys", "log", "simd_cesu8", "thiserror 2.0.18", @@ -2154,15 +2401,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "jni-sys" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" -dependencies = [ - "jni-sys 0.4.1", -] - [[package]] name = "jni-sys" version = "0.4.1" @@ -2194,9 +2432,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.95" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2964e92d1d9dc3364cae4d718d93f227e3abb088e747d92e0395bfdedf1c12ca" +checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" dependencies = [ "cfg-if", "futures-util", @@ -2204,6 +2442,27 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json-escape-simd" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e770254dd7802184595b1d30da2a15cb72569e2aca2b177aef8d22eac8a693" + +[[package]] +name = "konst" +version = "0.2.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" +dependencies = [ + "konst_macro_rules", +] + +[[package]] +name = "konst_macro_rules" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" + [[package]] name = "kqueue" version = "1.1.1" @@ -2216,11 +2475,11 @@ dependencies = [ [[package]] name = "kqueue-sys" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" +checksum = "a7b65860415f949f23fa882e669f2dbd4a0f0eeb1acdd56790b30494afd7da2f" dependencies = [ - "bitflags 1.3.2", + "bitflags", "libc", ] @@ -2244,15 +2503,15 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] name = "libbz2-rs-sys" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c4a545a15244c7d945065b5d392b2d2d7f21526fba56ce51467b06ed445e8f7" +checksum = "b3a6a8c165077efc8f3a971534c50ea6a1a18b329ef4a66e897a7e3a1494565f" [[package]] name = "libc" -version = "0.2.185" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "libredox" @@ -2260,10 +2519,50 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" dependencies = [ - "bitflags 2.11.1", + "bitflags", "libc", "plain", - "redox_syscall 0.7.4", + "redox_syscall 0.7.5", +] + +[[package]] +name = "lightningcss" +version = "1.0.0-alpha.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb6314c2f0590ac93c86099b98bb7ba8abcf759bfd89604ffca906472bb54937" +dependencies = [ + "ahash 0.8.12", + "bitflags", + "const-str", + "cssparser", + "cssparser-color", + "dashmap", + "data-encoding", + "getrandom 0.3.4", + "indexmap 2.14.0", + "itertools 0.10.5", + "lazy_static", + "lightningcss-derive", + "parcel_selectors", + "parcel_sourcemap", + "pastey 0.1.1", + "pathdiff", + "rayon", + "serde", + "serde-content", + "smallvec", +] + +[[package]] +name = "lightningcss-derive" +version = "1.0.0-alpha.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c12744d1279367caed41739ef094c325d53fb0ffcd4f9b84a368796f870252" +dependencies = [ + "convert_case 0.6.0", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -2397,6 +2696,12 @@ dependencies = [ "xml5ever", ] +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + [[package]] name = "md-5" version = "0.10.6" @@ -2414,7 +2719,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69b6441f590336821bb897fb28fc622898ccceb1d6cea3fde5ea86b090c4de98" dependencies = [ "cfg-if", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -2439,6 +2744,38 @@ dependencies = [ "unicase", ] +[[package]] +name = "minify-html" +version = "0.18.1" +source = "git+https://github.com/bjones1/minify-html.git?branch=dev#3eada4dbef725de3ea4ca5075ec9c12618ea4ece" +dependencies = [ + "ahash 0.8.12", + "aho-corasick", + "lightningcss", + "memchr", + "minify-html-common", + "once_cell", + "oxc_allocator", + "oxc_codegen", + "oxc_minifier", + "oxc_parser", + "oxc_span", +] + +[[package]] +name = "minify-html-common" +version = "0.0.3" +source = "git+https://github.com/bjones1/minify-html.git?branch=dev#3eada4dbef725de3ea4ca5075ec9c12618ea4ece" +dependencies = [ + "ahash 0.8.12", + "aho-corasick", + "itertools 0.14.0", + "memchr", + "once_cell", + "serde", + "serde_json", +] + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -2485,6 +2822,12 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nonmax" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "610a5acd306ec67f907abe5567859a3c693fb9886eb1f012ab8f2a47bef3db51" + [[package]] name = "normalize-line-endings" version = "0.3.0" @@ -2497,7 +2840,7 @@ version = "8.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" dependencies = [ - "bitflags 2.11.1", + "bitflags", "fsevent-sys", "inotify", "kqueue", @@ -2528,7 +2871,7 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" dependencies = [ - "bitflags 2.11.1", + "bitflags", ] [[package]] @@ -2541,12 +2884,31 @@ dependencies = [ "time", ] +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-conv" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2571,7 +2933,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.1", + "bitflags", ] [[package]] @@ -2586,7 +2948,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.1", + "bitflags", "objc2", ] @@ -2621,15 +2983,424 @@ checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" name = "option-ext" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-float" +version = "2.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +dependencies = [ + "num-traits", +] + +[[package]] +name = "outref" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f222829ae9293e33a9f5e9f440c6760a3d450a64affe1846486b140db81c1f4" + +[[package]] +name = "outref" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" + +[[package]] +name = "owo-colors" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" + +[[package]] +name = "oxc-browserslist" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3be1f075e9100260ff5ecb2b375fb24d6c5f2c97a23e6a86367720831e9faa8e" +dependencies = [ + "flate2", + "postcard", + "rustc-hash", + "serde", + "thiserror 2.0.18", +] + +[[package]] +name = "oxc-miette" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4356a61f2ed4c9b3610245215fbf48970eb277126919f87db9d0efa93a74245c" +dependencies = [ + "cfg-if", + "owo-colors", + "oxc-miette-derive", + "textwrap", + "thiserror 2.0.18", + "unicode-segmentation", + "unicode-width", +] + +[[package]] +name = "oxc-miette-derive" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b237422b014f8f8fff75bb9379e697d13f8d57551a22c88bebb39f073c1bf696" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "oxc_allocator" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd3b8bfef454857d3d9ca08fb84c8955da8591b5a82a21bb34a7ebbf94da7b0f" +dependencies = [ + "allocator-api2", + "hashbrown 0.17.0", + "oxc_data_structures", + "rustc-hash", +] + +[[package]] +name = "oxc_ast" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "381ae8356082431bd7e217dd78c7179bfc379dbbe7a32494e28be4fc678812c7" +dependencies = [ + "bitflags", + "oxc_allocator", + "oxc_ast_macros", + "oxc_data_structures", + "oxc_diagnostics", + "oxc_estree", + "oxc_regular_expression", + "oxc_span", + "oxc_str", + "oxc_syntax", +] + +[[package]] +name = "oxc_ast_macros" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c50246449a5fa669debd2debeb90be4c30f0a3a2e954f852ec40e5ef49701285" +dependencies = [ + "phf 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "oxc_ast_visit" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82466fd1885834078becf1385380c40624bf511723b695104b21f293c7dc5271" +dependencies = [ + "oxc_allocator", + "oxc_ast", + "oxc_span", + "oxc_syntax", +] + +[[package]] +name = "oxc_codegen" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b69f394fa01810f99943a9191dde9d5757bdccd5c06347af62663eea671a5153" +dependencies = [ + "bitflags", + "cow-utils", + "dragonbox_ecma", + "itoa", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_index", + "oxc_semantic", + "oxc_sourcemap", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", +] + +[[package]] +name = "oxc_compat" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20b656d726e4dafe2341759dc2f1fefa39fc736773f382885714f139d4dc69cc" +dependencies = [ + "cow-utils", + "oxc-browserslist", + "oxc_syntax", + "rustc-hash", + "serde", +] + +[[package]] +name = "oxc_data_structures" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1defc2fd17ee94f2c8511b0c4a4756d5868fbee891478953f2354ef444b1962f" + +[[package]] +name = "oxc_diagnostics" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7ccb0e8e7c9f1fb75e0700b2c75d9d854e534a7a356b13d2936893651f2b98" +dependencies = [ + "cow-utils", + "oxc-miette", + "percent-encoding", +] + +[[package]] +name = "oxc_ecmascript" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1904566c4e725c1511c88166ec203ae97bebb62887441b4a29b1e7757ec39859" +dependencies = [ + "cow-utils", + "num-bigint", + "num-traits", + "oxc_allocator", + "oxc_ast", + "oxc_regular_expression", + "oxc_span", + "oxc_syntax", +] + +[[package]] +name = "oxc_estree" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87cd0e290bab4cb5d81377bbc1ebd414f01a7af72d7f8e5ccbb4a9a157d71df" + +[[package]] +name = "oxc_index" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3e6120999627ec9703025eab7c9f410ebb7e95557632a8902ca48210416c2b" +dependencies = [ + "nonmax", + "serde", +] + +[[package]] +name = "oxc_mangler" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc7dcb6b22f8e7aa9a8d2afa8f29e62a7892a02de780dab976aa42eb09e977a9" +dependencies = [ + "itertools 0.14.0", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_index", + "oxc_semantic", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", +] + +[[package]] +name = "oxc_minifier" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59700b3cd4906c9e1878ac925bd86a284a1efd0a69353516f65ffc3ebb08a8ff" +dependencies = [ + "cow-utils", + "itoa", + "oxc_allocator", + "oxc_ast", + "oxc_ast_visit", + "oxc_compat", + "oxc_data_structures", + "oxc_ecmascript", + "oxc_index", + "oxc_mangler", + "oxc_parser", + "oxc_regular_expression", + "oxc_semantic", + "oxc_span", + "oxc_str", + "oxc_syntax", + "oxc_traverse", + "rustc-hash", +] + +[[package]] +name = "oxc_parser" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71acdb67749ff68bfbbd346da7dd2fe4947964be49ac9ec34d73d10a2396dcd" +dependencies = [ + "bitflags", + "cow-utils", + "memchr", + "num-bigint", + "num-traits", + "oxc_allocator", + "oxc_ast", + "oxc_data_structures", + "oxc_diagnostics", + "oxc_ecmascript", + "oxc_regular_expression", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", + "seq-macro", +] + +[[package]] +name = "oxc_regular_expression" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08a1273168ec6d8083e161565d264847249b9aad51c430d92d344303ede058b2" +dependencies = [ + "bitflags", + "oxc_allocator", + "oxc_ast_macros", + "oxc_diagnostics", + "oxc_span", + "oxc_str", + "phf 0.13.1", + "rustc-hash", + "unicode-id-start", +] + +[[package]] +name = "oxc_semantic" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63d4f8a0d3eb4e8e03aa413f54300235cb0314dc26649d2ff19f609b7b478272" +dependencies = [ + "itertools 0.14.0", + "memchr", + "oxc_allocator", + "oxc_ast", + "oxc_ast_visit", + "oxc_diagnostics", + "oxc_ecmascript", + "oxc_index", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", + "self_cell", +] + +[[package]] +name = "oxc_sourcemap" +version = "6.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d378eb8bad20e89d66276aebab51f6a5408571092cac94abdd3eabb773713d6" +dependencies = [ + "base64-simd 0.8.0", + "json-escape-simd", + "rustc-hash", + "serde", + "serde_json", +] + +[[package]] +name = "oxc_span" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af84474452c3caa7aca1bcaca04b6e16552fe29472059b7921ae7a69790dccf" +dependencies = [ + "compact_str", + "oxc-miette", + "oxc_allocator", + "oxc_ast_macros", + "oxc_estree", + "oxc_str", +] + +[[package]] +name = "oxc_str" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136bcc6bed1182df0b9c529e478da55a490b38ba5f1189abf2e7a9b13f46f0b1" +dependencies = [ + "compact_str", + "hashbrown 0.17.0", + "oxc_allocator", + "oxc_estree", +] + +[[package]] +name = "oxc_syntax" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b448a086623714675f66b79271e25fa2b51708255fa6af7dad83be88cc6e8726" +dependencies = [ + "bitflags", + "cow-utils", + "dragonbox_ecma", + "nonmax", + "oxc_allocator", + "oxc_ast_macros", + "oxc_estree", + "oxc_index", + "oxc_span", + "oxc_str", + "phf 0.13.1", + "unicode-id-start", +] + +[[package]] +name = "oxc_traverse" +version = "0.127.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "648c4e7c8ee0a8d2ff28751cc9dc8d5502a7d3b2b96d4fa73de7fb31b46d54c6" +dependencies = [ + "itoa", + "oxc_allocator", + "oxc_ast", + "oxc_ast_visit", + "oxc_data_structures", + "oxc_ecmascript", + "oxc_semantic", + "oxc_span", + "oxc_str", + "oxc_syntax", + "rustc-hash", +] + +[[package]] +name = "parcel_selectors" +version = "0.28.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54fd03f1ad26cb6b3ec1b7414fa78a3bd639e7dbb421b1a60513c96ce886a196" +dependencies = [ + "bitflags", + "cssparser", + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "precomputed-hash", + "rustc-hash", + "smallvec", +] [[package]] -name = "ordered-float" -version = "2.10.1" +name = "parcel_sourcemap" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" +checksum = "485b74d7218068b2b7c0e3ff12fbc61ae11d57cb5d8224f525bd304c6be05bbb" dependencies = [ - "num-traits", + "base64-simd 0.7.0", + "data-url", + "rkyv", + "serde", + "serde_json", + "vlq", ] [[package]] @@ -2663,9 +3434,9 @@ checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" [[package]] name = "pastey" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b867cad97c0791bbd3aaa6472142568c6c9e8f71937e98379f584cfb0cf35bec" +checksum = "c5a797f0e07bdf071d15742978fc3128ec6c22891c31a3a931513263904c982a" [[package]] name = "path-slash" @@ -2673,6 +3444,12 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "pem" version = "3.0.6" @@ -2732,25 +3509,55 @@ dependencies = [ "sha2 0.10.9", ] +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros 0.11.3", + "phf_shared 0.11.3", +] + [[package]] name = "phf" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" dependencies = [ - "phf_macros", - "phf_shared", + "phf_macros 0.13.1", + "phf_shared 0.13.1", "serde", ] +[[package]] +name = "phf_codegen" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", +] + [[package]] name = "phf_codegen" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared 0.11.3", + "rand 0.8.6", ] [[package]] @@ -2760,7 +3567,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" dependencies = [ "fastrand", - "phf_shared", + "phf_shared 0.13.1", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator 0.11.3", + "phf_shared 0.11.3", + "proc-macro2", + "quote", + "syn 2.0.117", ] [[package]] @@ -2769,13 +3589,22 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", "proc-macro2", "quote", "syn 2.0.117", ] +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + [[package]] name = "phf_shared" version = "0.13.1" @@ -2811,13 +3640,25 @@ checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" [[package]] name = "portable-atomic-util" -version = "0.2.6" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "091397be61a01d4be58e7841595bd4bfedb15f1cd54977d79b8271e94ed799a3" +checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" dependencies = [ "portable-atomic", ] +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "serde", +] + [[package]] name = "postgres-protocol" version = "0.6.11" @@ -2937,13 +3778,33 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "pulldown-cmark" version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "679341d22c78c6c649893cbd6c3278dcbe9fc4faa62fea3a9296ae2b50c14625" dependencies = [ - "bitflags 2.11.1", + "bitflags", "memchr", "unicase", ] @@ -2954,7 +3815,7 @@ version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" dependencies = [ - "bitflags 2.11.1", + "bitflags", "memchr", "pulldown-cmark-escape", "unicase", @@ -3043,11 +3904,17 @@ version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ "libc", "rand_chacha 0.3.1", @@ -3119,22 +3986,42 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redox_syscall" version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.1", + "bitflags", ] [[package]] name = "redox_syscall" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f450ad9c3b1da563fb6948a8e0fb0fb9269711c9c73d9ea1de5058c79c8d643a" +checksum = "4666a1a60d8412eab19d94f6d13dcc9cea0a5ef4fdf6a5db306537413c661b1b" dependencies = [ - "bitflags 2.11.1", + "bitflags", ] [[package]] @@ -3183,6 +4070,15 @@ version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + [[package]] name = "reqwest" version = "0.12.28" @@ -3225,9 +4121,9 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.13.2" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" +checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" dependencies = [ "base64", "bytes", @@ -3274,6 +4170,35 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "rkyv" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2297bf9c81a3f0dc96bc9521370b88f054168c29826a75e89c55ff196e7ed6a1" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84d7b42d4b8d06048d3ac8db0eb31bcb942cbeb709f0b5f2b2ebde398d3038f5" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rustc-hash" version = "2.1.2" @@ -3295,7 +4220,7 @@ version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.1", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -3304,9 +4229,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.38" +version = "0.23.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69f9466fb2c14ea04357e91413efb882e2a6d4a406e625449bc0a5d360d53a21" +checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" dependencies = [ "aws-lc-rs", "once_cell", @@ -3331,9 +4256,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.0" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" +checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" dependencies = [ "web-time", "zeroize", @@ -3341,13 +4266,13 @@ dependencies = [ [[package]] name = "rustls-platform-verifier" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" +checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0" dependencies = [ "core-foundation", "core-foundation-sys", - "jni 0.21.1", + "jni", "log", "once_cell", "rustls", @@ -3368,9 +4293,9 @@ checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f" [[package]] name = "rustls-webpki" -version = "0.103.12" +version = "0.103.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8279bb85272c9f10811ae6a6c547ff594d6a7f3c6c6b02ee9726d1d0dcfcdd06" +checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" dependencies = [ "aws-lc-rs", "ring", @@ -3434,13 +4359,19 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "security-framework" version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.1", + "bitflags", "core-foundation", "core-foundation-sys", "libc", @@ -3460,7 +4391,7 @@ dependencies = [ [[package]] name = "selenium-manager" version = "0.4.41" -source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#fd15160c17fde42df55df1c30b77321a16d55312" +source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#58b929e8700d7187fb7c0e9a8e543d0d49bb5345" dependencies = [ "anyhow", "apple-flat-package", @@ -3491,12 +4422,24 @@ dependencies = [ "zip", ] +[[package]] +name = "self_cell" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b12e76d157a900eb52e81bc6e9f3069344290341720e9178cde2407113ac8d89" + [[package]] name = "semver" version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" +[[package]] +name = "seq-macro" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc711410fbe7399f390ca1c3b60ad0f53f80e95c5eb935e52268a0e2cd49acc" + [[package]] name = "serde" version = "1.0.228" @@ -3507,6 +4450,15 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-content" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3753ca04f350fa92d00b6146a3555e63c55388c9ef2e11e09bce2ff1c0b509c6" +dependencies = [ + "serde", +] + [[package]] name = "serde-value" version = "0.7.0" @@ -3636,6 +4588,17 @@ dependencies = [ "digest 0.10.7", ] +[[package]] +name = "sha1" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aacc4cc499359472b4abe1bf11d0b12e688af9a805fa5e3016f9a386dc2d0214" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.0", + "digest 0.11.3", +] + [[package]] name = "sha2" version = "0.10.9" @@ -3655,7 +4618,7 @@ checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" dependencies = [ "cfg-if", "cpufeatures 0.3.0", - "digest 0.11.2", + "digest 0.11.3", ] [[package]] @@ -3683,6 +4646,15 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simd-abstraction" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cadb29c57caadc51ff8346233b5cec1d240b68ce55cf1afc764818791876987" +dependencies = [ + "outref 0.1.0", +] + [[package]] name = "simd-adler32" version = "0.3.9" @@ -3713,9 +4685,9 @@ checksum = "5dd19be0257552dd56d1bb6946f89f193c6e5b9f13cc9327c4bc84a357507c74" [[package]] name = "siphasher" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "slab" @@ -3729,6 +4701,12 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "smawk" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" + [[package]] name = "socket2" version = "0.5.10" @@ -3765,6 +4743,12 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "string_cache" version = "0.9.0" @@ -3773,7 +4757,7 @@ checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" dependencies = [ "new_debug_unreachable", "parking_lot", - "phf_shared", + "phf_shared 0.13.1", "precomputed-hash", "serde", ] @@ -3784,8 +4768,8 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" dependencies = [ - "phf_generator", - "phf_shared", + "phf_generator 0.13.1", + "phf_shared 0.13.1", "proc-macro2", "quote", ] @@ -3864,6 +4848,12 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tar" version = "0.4.45" @@ -3922,10 +4912,21 @@ dependencies = [ "log", ] +[[package]] +name = "textwrap" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +dependencies = [ + "smawk", + "unicode-linebreak", + "unicode-width", +] + [[package]] name = "thirtyfour" -version = "0.36.1" -source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#fd15160c17fde42df55df1c30b77321a16d55312" +version = "0.36.2" +source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#58b929e8700d7187fb7c0e9a8e543d0d49bb5345" dependencies = [ "arc-swap", "async-trait", @@ -3937,8 +4938,8 @@ dependencies = [ "http 1.4.0", "indexmap 2.14.0", "libc", - "pastey 0.2.1", - "reqwest 0.13.2", + "pastey 0.2.2", + "reqwest 0.13.3", "selenium-manager", "serde", "serde_json", @@ -3954,7 +4955,7 @@ dependencies = [ [[package]] name = "thirtyfour-macros" version = "0.2.0" -source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#fd15160c17fde42df55df1c30b77321a16d55312" +source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#58b929e8700d7187fb7c0e9a8e543d0d49bb5345" dependencies = [ "proc-macro2", "quote", @@ -4069,9 +5070,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.52.0" +version = "1.52.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91135f59b1cbf38c91e73cf3386fca9bb77915c45ce2771460c9d92f0f3d776" +checksum = "110a78583f19d5cdb2c5ccf321d1290344e71313c6c37d43520d386027d18386" dependencies = [ "bytes", "libc", @@ -4110,7 +5111,7 @@ dependencies = [ "log", "parking_lot", "percent-encoding", - "phf", + "phf 0.13.1", "pin-project-lite", "postgres-protocol", "postgres-types", @@ -4187,7 +5188,7 @@ version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" dependencies = [ - "winnow 1.0.1", + "winnow 1.0.2", ] [[package]] @@ -4217,7 +5218,7 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags 2.11.1", + "bitflags", "bytes", "futures-util", "http 1.4.0", @@ -4313,7 +5314,7 @@ dependencies = [ "httparse", "log", "rand 0.9.4", - "sha1", + "sha1 0.10.6", "thiserror 2.0.18", ] @@ -4328,9 +5329,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] name = "ucd-trie" @@ -4350,12 +5351,24 @@ version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" +[[package]] +name = "unicode-id-start" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81b79ad29b5e19de4260020f8919b443b2ef0277d242ce532ec7b7a2cc8b6007" + [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + [[package]] name = "unicode-normalization" version = "0.1.25" @@ -4448,9 +5461,9 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" [[package]] name = "uuid" -version = "1.23.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ac8b6f42ead25368cf5b098aeb3dc8a1a2c05a3eee8a9a1a68c640edbfc79d9" +checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76" dependencies = [ "js-sys", "wasm-bindgen", @@ -4468,6 +5481,18 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "vlq" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65dd7eed29412da847b0f78bcec0ac98588165988a8cfe41d4ea1d429f8ccfff" + +[[package]] +name = "vsimd" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" + [[package]] name = "wait-timeout" version = "0.2.1" @@ -4513,11 +5538,11 @@ dependencies = [ [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -4526,7 +5551,7 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] @@ -4540,9 +5565,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf938a0bacb0469e83c1e148908bd7d5a6010354cf4fb73279b7447422e3a89" +checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" dependencies = [ "cfg-if", "once_cell", @@ -4553,9 +5578,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.68" +version = "0.4.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f371d383f2fb139252e0bfac3b81b265689bf45b6874af544ffa4c975ac1ebf8" +checksum = "af934872acec734c2d80e6617bbb5ff4f12b052dd8e6332b0817bce889516084" dependencies = [ "js-sys", "wasm-bindgen", @@ -4563,9 +5588,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeff24f84126c0ec2db7a449f0c2ec963c6a49efe0698c4242929da037ca28ed" +checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4573,9 +5598,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d08065faf983b2b80a79fd87d8254c409281cf7de75fc4b773019824196c904" +checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" dependencies = [ "bumpalo", "proc-macro2", @@ -4586,9 +5611,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-shared" -version = "0.2.118" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd04d9e306f1907bd13c6361b5c6bfc7b3b3c095ed3f8a9246390f8dbdee129" +checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" dependencies = [ "unicode-ident", ] @@ -4621,7 +5646,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.1", + "bitflags", "hashbrown 0.15.5", "indexmap 2.14.0", "semver", @@ -4629,9 +5654,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.95" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f2dfbb17949fa2088e5d39408c48368947b86f7834484e87b73de55bc14d97d" +checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" dependencies = [ "js-sys", "wasm-bindgen", @@ -4649,24 +5674,24 @@ dependencies = [ [[package]] name = "web_atoms" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a9779e9f04d2ac1ce317aee707aa2f6b773afba7b931222bff6983843b1576" +checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538" dependencies = [ - "phf", - "phf_codegen", + "phf 0.13.1", + "phf_codegen 0.13.1", "string_cache", "string_cache_codegen", ] [[package]] name = "webbrowser" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe985f41e291eecef5e5c0770a18d28390addb03331c043964d9e916453d6f16" +checksum = "0fc95580916af1e68ff6a7be07446fc5db73ebf71cf092de939bbf5f7e189f72" dependencies = [ "core-foundation", - "jni 0.22.4", + "jni", "log", "ndk-context", "objc2", @@ -4677,18 +5702,18 @@ dependencies = [ [[package]] name = "webpki-root-certs" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "804f18a4ac2676ffb4e8b5b5fa9ae38af06df08162314f96a68d2a363e21a8ca" +checksum = "f31141ce3fc3e300ae89b78c0dd67f9708061d1d2eda54b8209346fd6be9a92c" dependencies = [ "rustls-pki-types", ] [[package]] name = "webpki-roots" -version = "1.0.6" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfaf3c063993ff62e73cb4311efde4db1efb31ab78a3e5c457939ad5cc0bed" +checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" dependencies = [ "rustls-pki-types", ] @@ -4704,9 +5729,9 @@ dependencies = [ [[package]] name = "whoami" -version = "2.1.1" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6a5b12f9df4f978d2cfdb1bd3bac52433f44393342d7ee9c25f5a1c14c0f45d" +checksum = "998767ef88740d1f5b0682a9c53c24431453923962269c2db68ee43788c5a40d" dependencies = [ "libc", "libredox", @@ -4847,15 +5872,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - [[package]] name = "windows-sys" version = "0.52.0" @@ -4883,21 +5899,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - [[package]] name = "windows-targets" version = "0.52.6" @@ -4940,12 +5941,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -4958,12 +5953,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -4976,12 +5965,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -5006,12 +5989,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -5024,12 +6001,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -5042,12 +6013,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -5060,12 +6025,6 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -5086,9 +6045,9 @@ checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" [[package]] name = "winnow" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" [[package]] name = "wit-bindgen" @@ -5099,6 +6058,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -5148,7 +6113,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.1", + "bitflags", "indexmap 2.14.0", "log", "serde", @@ -5184,6 +6149,15 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "x509-certificate" version = "0.24.0" From 849f7a76d1215af22eb821d53dcd44b539512e3e Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Tue, 5 May 2026 12:03:31 +0500 Subject: [PATCH 20/31] Add: rearrange dist to support pre-release versions. --- .github/workflows/release.yml | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e3dc42b4..aa983299 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -182,17 +182,11 @@ jobs: env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} BUILD_MANIFEST_NAME: target/distrib/global-dist-manifest.json - VSCE_PAT: ${{ secrets.VSCE_PAT }} - APP_VERSION: ${{ fromJson(needs.plan.outputs.val).releases[0].app_version }} - VSCE_ARGS: --changelog-path docs/changelog.md steps: - uses: actions/checkout@v6 with: persist-credentials: false submodules: recursive - - uses: actions/setup-node@v6 - with: - node-version: 24 - name: Install cached dist uses: actions/download-artifact@v7 with: @@ -209,11 +203,6 @@ jobs: - id: cargo-dist shell: bash run: | - npm install -g @vscode/vsce - npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-win32-x64-${APP_VERSION}.vsix $VSCE_ARGS - npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-linux-x64-${APP_VERSION}.vsix $VSCE_ARGS - npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-darwin-x64-${APP_VERSION}.vsix $VSCE_ARGS - npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-darwin-arm64-${APP_VERSION}.vsix $VSCE_ARGS dist build ${{ needs.plan.outputs.tag-flag }} --output-format=json "--artifacts=global" > dist-manifest.json echo "dist ran successfully" @@ -248,6 +237,9 @@ jobs: with: persist-credentials: false submodules: recursive + - uses: actions/setup-node@v6 + with: + node-version: 24 - name: Install cached dist uses: actions/download-artifact@v7 with: @@ -291,7 +283,17 @@ jobs: ANNOUNCEMENT_TITLE: "${{ fromJson(steps.host.outputs.manifest).announcement_title }}" ANNOUNCEMENT_BODY: "${{ fromJson(steps.host.outputs.manifest).announcement_github_body }}" RELEASE_COMMIT: "${{ github.sha }}" + APP_VERSION: ${{ fromJson(needs.plan.outputs.val).releases[0].app_version }} + VSCE_PAT: ${{ secrets.VSCE_PAT }} + VSCE_PRERELEASE_FLAG: "${{ fromJson(steps.host.outputs.manifest).announcement_is_prerelease && '--pre-release' || '' }}" + VSCE_ARGS: --changelog-path docs/changelog.md $VSCE_PRERELEASE_FLAG run: | + npm install -g @vscode/vsce + npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-win32-x64-${APP_VERSION}.vsix $VSCE_ARGS + npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-linux-x64-${APP_VERSION}.vsix $VSCE_ARGS + npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-darwin-x64-${APP_VERSION}.vsix $VSCE_ARGS + npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-darwin-arm64-${APP_VERSION}.vsix $VSCE_ARGS + # Write and read notes from a file to avoid quoting breaking things echo "$ANNOUNCEMENT_BODY" > $RUNNER_TEMP/notes.txt From 8c05b544f6c54aabacc1c5a68497435ca7610256 Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Tue, 5 May 2026 13:00:28 +0500 Subject: [PATCH 21/31] Add: selection tracking for doc-only mode. --- client/src/CodeChatEditor.mts | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/client/src/CodeChatEditor.mts b/client/src/CodeChatEditor.mts index b9ad54de..8e6addb3 100644 --- a/client/src/CodeChatEditor.mts +++ b/client/src/CodeChatEditor.mts @@ -313,6 +313,17 @@ const _open_lp = async ( startAutosaveTimer(); }, ); + // Send updates on cursor movement. + editor.on( + "SelectionChange", + ( + _event: EditorEvent< + Events.EditorEventMap["SelectionChange"] + >, + ) => { + startAutosaveTimer(); + }, + ); }, }); tinymce.activeEditor!.focus(); @@ -384,7 +395,18 @@ const save_lp = async ( is_re_translation: false, }; if (is_doc_only()) { - // TODO: set cursor/scroll position. + const location = saveSelection(); + // If there's a selection (cursor location), send it to the server, + // which will locate the corresponding line. + if (location.selection_offset !== undefined) { + update.cursor_position = { + DomLocation: { + dom_path: location.selection_path, + dom_offset: location.selection_offset, + from: 0, + }, + }; + } } else { set_CodeMirror_positions(update); } From d39f916205fcce4524e0a85535886de448f853f9 Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Tue, 5 May 2026 13:00:54 +0500 Subject: [PATCH 22/31] Add: explanation of selection tracking approach. --- docs/implementation.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/implementation.md b/docs/implementation.md index 445d7776..427831c9 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -358,6 +358,41 @@ removed them. This means that some HTML tags won't be properly closed, since the closing tags are removed from the HTML. This is fixed by later HTML processing steps (currently, by TinyMCE), which properly closes tags. +### Cursor tracking + +Ideally, both the scroll location and the cursor position/current selection +would be synced between the IDE and the Client. However, it's difficult to +maintain the selection through a number of transformations which occur between +the IDE and Client. + +#### Client to IDE selection sync + +One approach to maintaining the selection through these transformations is to +insert a marker character in the Client, transform this to the IDE, then recover +the line number of the marker, removing it after the transformations. However, +this requires sending updated text each time the cursor moves; for a Markdown +document, this means sending the entire document. Therefore, this approach is +impractical. + +A second approach is to store the selection as offsets with the HTML DOM in the +Client; the server then re-parses the DOM, inserts a marker, performs +transformations, then recovers the line number and removes the marker. This is +the approach taken. + +However, this leads to several challenges: whitespace differences in HTML are +often not rendered, but produce different DOMs. TinyMCE minifies incoming HTML, +adds additional nodes and attributes for editing, then removes these and +de-minifies when retrieving the HTML from the editor. Again, this produces +dissimilar DOMs. + +To overcome this, the Server uses a minifier that produces similar results to +TinyMCE's minifier, so that the HTML DOM before edits will be very similar.Β  +HTML from TinyMCE is taken in raw form, preserving the DOM; the Server then +removes TinyMCE attributes and tags as an initial transformation step. The few +differences not corrected by this process are fixed via (kludgy) string +replacements when comparing HTML between a re-translation from the Server and +the Client's updated text. + Future work ----------- From d51eb9f1d680e1357d112f6be6c2b2da82e43dab Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Tue, 5 May 2026 15:41:04 +0500 Subject: [PATCH 23/31] Claude review fixes. --- .github/workflows/release.yml | 10 ++-- client/src/CodeChatEditor.mts | 80 ++++++++++++++------------ client/src/CodeChatEditorFramework.mts | 2 +- client/src/CodeMirror-integration.mts | 28 +++++---- client/src/shared.mts | 2 +- extensions/VSCode/src/extension.ts | 6 +- server/src/processing.rs | 33 +++++++---- server/src/translation.rs | 25 +++++--- server/src/webserver.rs | 17 +++--- server/tests/overall_1.rs | 57 ++++++++++++++---- server/tests/overall_2.rs | 30 ++++++++-- server/tests/overall_common/mod.rs | 6 +- 12 files changed, 186 insertions(+), 110 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index aa983299..fae0bf0d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -286,13 +286,13 @@ jobs: APP_VERSION: ${{ fromJson(needs.plan.outputs.val).releases[0].app_version }} VSCE_PAT: ${{ secrets.VSCE_PAT }} VSCE_PRERELEASE_FLAG: "${{ fromJson(steps.host.outputs.manifest).announcement_is_prerelease && '--pre-release' || '' }}" - VSCE_ARGS: --changelog-path docs/changelog.md $VSCE_PRERELEASE_FLAG + VSCE_ARGS: --changelog-path docs/changelog.md run: | npm install -g @vscode/vsce - npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-win32-x64-${APP_VERSION}.vsix $VSCE_ARGS - npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-linux-x64-${APP_VERSION}.vsix $VSCE_ARGS - npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-darwin-x64-${APP_VERSION}.vsix $VSCE_ARGS - npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-darwin-arm64-${APP_VERSION}.vsix $VSCE_ARGS + npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-win32-x64-${APP_VERSION}.vsix $VSCE_ARGS $VSCE_PRERELEASE_FLAG + npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-linux-x64-${APP_VERSION}.vsix $VSCE_ARGS $VSCE_PRERELEASE_FLAG + npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-darwin-x64-${APP_VERSION}.vsix $VSCE_ARGS $VSCE_PRERELEASE_FLAG + npx vsce publish --packagePath target/distrib/extensions/VSCode/codechat-editor-client-darwin-arm64-${APP_VERSION}.vsix $VSCE_ARGS $VSCE_PRERELEASE_FLAG # Write and read notes from a file to avoid quoting breaking things echo "$ANNOUNCEMENT_BODY" > $RUNNER_TEMP/notes.txt diff --git a/client/src/CodeChatEditor.mts b/client/src/CodeChatEditor.mts index 8e6addb3..2f4b6f4a 100644 --- a/client/src/CodeChatEditor.mts +++ b/client/src/CodeChatEditor.mts @@ -69,7 +69,7 @@ import { CodeMirrorDiffable, UpdateMessageContents, CodeMirror, - autosave_timeout_ms, + auto_update_timeout_ms, rand, } from "./shared.mjs"; import { show_toast } from "./show_toast.mjs"; @@ -107,7 +107,7 @@ declare global { cursor_position?: CursorPosition, scroll_line?: number, ) => Promise; - on_save: (_only_if_dirty: boolean) => Promise; + send_update: (_only_if_dirty: boolean) => Promise; scroll_to_line: ( cursor_position?: CursorPosition, scroll_line?: number, @@ -122,9 +122,9 @@ declare global { // Globals // ------- // -// The ID of the autosave timer; when this timer expires, the document will be -// autosaved. -let autosaveTimeoutId: null | number = null; +// The ID of the auto update timer; when this timer expires, the document will +// be updated. +let autoUpdateTimeoutId: null | number = null; // Store the lexer info for the currently-loaded language. // @@ -173,7 +173,7 @@ const is_doc_only = () => { const open_lp = async ( codechat_for_web: CodeChatForWeb, is_re_translation: boolean, - cursor_line?: CursorPosition, + cursor_position?: CursorPosition, scroll_line?: number, ) => // Wait for the DOM to load before opening the file. @@ -182,7 +182,7 @@ const open_lp = async ( await _open_lp( codechat_for_web, is_re_translation, - cursor_line, + cursor_position, scroll_line, ); resolve(); @@ -219,7 +219,7 @@ const _open_lp = async ( // Process any pending events before proceeding. Sometimes, TinyMCE has a // pending edit that hasn't been processed yet, meaning the `is_dirty` flag - // is incorrect. + // is incorrect. Use the raw format; see the implementation notes. tinymce.activeEditor?.save({ format: "raw" }); await new Promise((resolve) => setTimeout(resolve, 0)); @@ -290,11 +290,11 @@ const _open_lp = async ( codechat_body.innerHTML = `
${doc_content}
`; await init({ selector: ".CodeChat-doc-contents", - // In the doc-only mode, add autosave functionality. While - // there is an + // In the doc-only mode, add auto update functionality. + // While there is an // [autosave plugin](https://www.tiny.cloud/docs/tinymce/6/autosave/), // this autosave functionality is completely different from - // the autosave provided here. Per + // the auto update provided here. Per // [handling editor events](https://www.tiny.cloud/docs/tinymce/6/events/#handling-editor-events), // this is how to create a TinyMCE event handler. setup: (editor: Editor) => { @@ -310,7 +310,7 @@ const _open_lp = async ( // `event` data instead. event.target.setDirty(false); is_dirty = true; - startAutosaveTimer(); + startAutoUpdateTimer(); }, ); // Send updates on cursor movement. @@ -321,7 +321,7 @@ const _open_lp = async ( Events.EditorEventMap["SelectionChange"] >, ) => { - startAutosaveTimer(); + startAutoUpdateTimer(); }, ); }, @@ -371,8 +371,8 @@ const _open_lp = async ( // // Per the discussion at the beginning of this function, the dirty // contents have been overwritten by contents from the IDE. By the same - // reasoning, restart the autosave timer. - clearAutosaveTimer(); + // reasoning, restart the auto update timer. + clearAutoUpdateTimer(); is_dirty = false; // If tests should be run, then the @@ -403,6 +403,8 @@ const save_lp = async ( DomLocation: { dom_path: location.selection_path, dom_offset: location.selection_offset, + // Use this since it's a Markdown-only file; the server will + // ignore this value. from: 0, }, }; @@ -427,7 +429,7 @@ const save_lp = async ( // To save a document only, simply get the HTML from the only // Tiny MCE div. Update the `doc_contents` to stay in sync with // the Server. - doc_content = tinymce.activeEditor!.save(); + doc_content = tinymce.activeEditor!.save({ format: "raw" }); ( code_mirror_diffable as { Plain: CodeMirror; @@ -495,7 +497,7 @@ export const saveSelection = () => { if (p === null) { return { selection_path: [], - selection_offset: 0, + selection_offset: undefined, }; } selection_path.unshift( @@ -550,12 +552,13 @@ export const restoreSelection = ({ } }; -// Save CodeChat Editor contents. -const on_save = async (only_if_dirty: boolean = false) => { +// Save CodeChat Editor contents if dirty; send the current selection and scroll +// position. +const send_update = async (only_if_dirty: boolean = false) => { if (only_if_dirty && !is_dirty) { return; } - clearAutosaveTimer(); + clearAutoUpdateTimer(); // Save the provided contents back to the filesystem, by // sending an update message over the websocket. @@ -567,25 +570,26 @@ const on_save = async (only_if_dirty: boolean = false) => { is_dirty = false; }; -// ### Autosave feature +// ### Auto update feature // -// Schedule an autosave; call this whenever the document is modified. -export const startAutosaveTimer = () => { - // When the document is changed, perform an autosave after no changes have - // occurred for a little while. To do this, first cancel any current - // timeout... - clearAutosaveTimer(); - // ...then start another timeout which saves the document when it expires. - autosaveTimeoutId = window.setTimeout(() => { - console_log("CodeChat Editor Client: autosaving."); - on_save(); - }, autosave_timeout_ms); +// Schedule an autosave and/or a selection/scroll update; call this whenever the +// document is modified or the selection/scroll offset changes. +export const startAutoUpdateTimer = () => { + // When the document/selection/scroll position is changed, perform an auto + // update after no changes have occurred for a little while. To do this, + // first cancel any current timeout... + clearAutoUpdateTimer(); + // ...then start another timeout which updates the document when it expires. + autoUpdateTimeoutId = window.setTimeout(() => { + console_log("CodeChat Editor Client: auto updating."); + send_update(); + }, auto_update_timeout_ms); }; -const clearAutosaveTimer = () => { - if (autosaveTimeoutId !== null) { - clearTimeout(autosaveTimeoutId); - autosaveTimeoutId = null; +const clearAutoUpdateTimer = () => { + if (autoUpdateTimeoutId !== null) { + clearTimeout(autoUpdateTimeoutId); + autoUpdateTimeoutId = null; } }; @@ -668,7 +672,7 @@ const on_click = (event: MouseEvent) => { // Save the current document, then navigate to the provided URL, which must be a // reference to another CodeChat Editor document. const save_then_navigate = (codeChatEditorUrl: URL) => { - on_save(true).then((_value) => { + send_update(true).then((_value) => { // Avoid recursion! window.navigation.removeEventListener("navigate", on_navigate); parent.window.CodeChatEditorFramework.webSocketComm.current_file( @@ -728,7 +732,7 @@ on_dom_content_loaded(async () => { window.CodeChatEditor = { open_lp, - on_save, + send_update, scroll_to_line, show_toast, allow_navigation: false, diff --git a/client/src/CodeChatEditorFramework.mts b/client/src/CodeChatEditorFramework.mts index 692617b1..b25354e5 100644 --- a/client/src/CodeChatEditorFramework.mts +++ b/client/src/CodeChatEditorFramework.mts @@ -263,7 +263,7 @@ class WebSocketComm { // If the page is still loading, then don't save. // Otherwise, save the editor contents if necessary. const cce = get_client(); - await cce?.on_save(true); + await cce?.send_update(true); // Now, it's safe to load a new file. Tell the client to // allow this navigation -- the document it contains has // already been saved. diff --git a/client/src/CodeMirror-integration.mts b/client/src/CodeMirror-integration.mts index 4f0adb4d..5af4318f 100644 --- a/client/src/CodeMirror-integration.mts +++ b/client/src/CodeMirror-integration.mts @@ -94,7 +94,7 @@ import { Editor, EditorEvent, Events } from "tinymce"; // ### Local import { set_is_dirty, - startAutosaveTimer, + startAutoUpdateTimer, saveSelection, restoreSelection, } from "./CodeChatEditor.mjs"; @@ -658,6 +658,7 @@ const on_dirty = ( // I'd like to extract this string, then untypeset only that string, not // the actual div. But I don't know how. mathJaxUnTypeset(contents_div); + // Use the raw format; see the implementation notes. const contents = is_tinymce ? tinymce.activeEditor!.save({ format: "raw" }) : contents_div.innerHTML; @@ -781,7 +782,7 @@ export const DocBlockPlugin = ViewPlugin.fromClass( const [contents_div, is_tinymce] = get_contents(target); // Send updated cursor/scroll info. - startAutosaveTimer(); + startAutoUpdateTimer(); // See if this is already a TinyMCE instance; if not, move it // here. @@ -907,10 +908,10 @@ const autosaveExtension = EditorView.updateListener.of( } if (isChanged) { set_is_dirty(); - startAutosaveTimer(); + startAutoUpdateTimer(); } else if (v.selectionSet) { // Send an update if only the selection changed. - startAutosaveTimer(); + startAutoUpdateTimer(); } }, ); @@ -1100,7 +1101,7 @@ export const CodeMirror_load = async ( Events.EditorEventMap["SelectionChange"] >, ) => { - startAutosaveTimer(); + startAutoUpdateTimer(); }, ); }, @@ -1235,31 +1236,34 @@ export const set_CodeMirror_positions = ( // If a doc block has focus, then the CodeMirror selection reports line 1. // Use the starting line number of the doc block instead. const doc_block = document.activeElement?.closest(".CodeChat-doc"); - let cp; + let cursor_position; if (doc_block) { const from = current_view.posAtDOM(doc_block); const location = saveSelection(); - // If there's a selection in the doc block, pass the DOM location; otherwise, pass the line where the doc block starts. + // If there's a selection in the doc block, pass the DOM location; + // otherwise, pass the line where the doc block starts. if (location.selection_offset === undefined) { - cp = { Line: current_view.state.doc.lineAt(from).number }; + cursor_position = { + Line: current_view.state.doc.lineAt(from).number, + }; } else { - cp = { + cursor_position = { DomLocation: { dom_path: location.selection_path, dom_offset: location.selection_offset, - from: current_view.posAtDOM(doc_block), + from, }, }; } } else { // For a code block, we can simply retrieve the line number. - cp = { + cursor_position = { Line: current_view.state.doc.lineAt( current_view.state.selection.main.from, ).number, }; } - update_message_contents.cursor_position = cp; + update_message_contents.cursor_position = cursor_position; // `current_view.viewport.from` isn't accurate, since it's not really the // top line, but a margin before it; see the diff --git a/client/src/shared.mts b/client/src/shared.mts index 334fc344..d3550b0f 100644 --- a/client/src/shared.mts +++ b/client/src/shared.mts @@ -19,7 +19,7 @@ // // The time, in ms, to wait between the last user edit and sending updated data // to the Server. -export const autosave_timeout_ms = 300; +export const auto_update_timeout_ms = 300; // Produce a whole random number. Fractional numbers aren't consistently // converted to the same number across JavaScript and Rust. Note that the mantissa of a JavaScript `Number` diff --git a/extensions/VSCode/src/extension.ts b/extensions/VSCode/src/extension.ts index 7da97f73..9e003ea8 100644 --- a/extensions/VSCode/src/extension.ts +++ b/extensions/VSCode/src/extension.ts @@ -39,7 +39,7 @@ import { CodeChatEditorServer, initServer } from "./index.js"; // ### Local packages import { - autosave_timeout_ms, + auto_update_timeout_ms, EditorMessage, EditorMessageContents, KeysOfRustEnum, @@ -662,7 +662,7 @@ const send_update = (this_is_dirty: boolean) => { if (idle_timer !== undefined) { clearTimeout(idle_timer); } - // ... schedule a render after an autosave timeout. + // ... schedule a render after an auto update timeout. idle_timer = setTimeout(async () => { if (can_render()) { const ate = vscode.window.activeTextEditor; @@ -716,7 +716,7 @@ const send_update = (this_is_dirty: boolean) => { scroll_position, ); } - }, autosave_timeout_ms); + }, auto_update_timeout_ms); } }; diff --git a/server/src/processing.rs b/server/src/processing.rs index 05175b55..37cc7604 100644 --- a/server/src/processing.rs +++ b/server/src/processing.rs @@ -607,12 +607,14 @@ pub fn doc_block_html_to_markdown( // the offset within the last node (which must be a text node), at which a // marker character will be inserted. // - // This will be applied to each doc block -- when this parameter is - // provided, it's typically called with a vec containing only one doc block. + // For this reason, when provided, this function must called with a vec + // containing only one doc block. dom_location: &Option<(Vec, usize)>, ) -> Result, HtmlToMarkdownWrappedError> { let mut converter = HtmlToMarkdownWrapped::new(); let mut last_doc_block_index = None; + // Only perform marker insertions to a length 1 vec. + assert!(dom_location.is_none() || code_doc_block_vec.len() == 1); for (index, code_doc_block) in &mut code_doc_block_vec.iter_mut().enumerate() { if let CodeDocBlock::DocBlock(doc_block) = code_doc_block { last_doc_block_index = Some(index); @@ -1115,8 +1117,8 @@ fn html_to_tree( }; current_node = next_node; } - // Insert the cursor marker at the given character offset within - // the text node. + // Insert the cursor marker at the given character offset within the + // text node. if let NodeData::Text { contents } = ¤t_node.data { let mut text = contents.borrow().to_string(); // Convert the character offset into a byte offset. @@ -1327,7 +1329,8 @@ pub fn remove_tinymce_data( .iter() .any(|attr| attr.name.local == *"class" && attr.value.starts_with("mce")) { - // Replace this element with its children. First, update the children with the new parent. + // Replace this element with its children. First, update the + // children with the new parent. let new_parent = node .parent .take() @@ -1337,17 +1340,21 @@ pub fn remove_tinymce_data( } // Insert the children in place of the node. - let children: Vec<_> = node.children.borrow_mut().to_vec(); + let children: Vec<_> = node.children.borrow().to_vec(); let no_children = children.is_empty(); parent.children.borrow_mut().splice(index..=index, children); - // Process the first child which replaced the current node, since it hasn't been processed yet, then return it as the updated node. + // Process the first child which replaced the current node, since it + // hasn't been processed yet, then return it as the updated node. return if no_children { None } else { + // Important: all previous borrows of `parent` must be dropped, + // since this will re-borrow it. remove_tinymce_data(parent, index) }; } else { - // If we didn't remove this element, then filter out unwanted attributes. + // If we didn't remove this element, then filter out unwanted + // attributes. attrs.borrow_mut().retain(|attr| { !(attr.name.local.starts_with("data-mce-") || (attr.name.local == *"class" && attr.value.starts_with("mce-"))) @@ -1357,13 +1364,17 @@ pub fn remove_tinymce_data( Some(node.clone()) } -/// Walk a node, dehydrating it by removing TineMCE temporary attributes, changing math to pulldown-cmark's output, and changing graphviz/Mermaid to fenced code blocks. +/// Walk a node, dehydrating it by removing TineMCE temporary attributes, +/// changing math to pulldown-cmark's output, and changing graphviz/Mermaid to +/// fenced code blocks. fn dehydrating_walk_node(node: &Rc) { let mut index = 0; - // Avoid a `while` loop, since accessing `node.children` requires a borrow held for the body of the loop. + // Avoid a `while` loop, since accessing `node.children` requires a borrow + // held for the body of the loop. while index < node.children.borrow().len() { // Remove TinyMCE data from the child at `index`; if the child was - // spliced away (no replacement), the slot is gone re-process this index. + // spliced away (no replacement), the slot is gone; leave \`index\`\` + // unchanged to process what is now at this position. if remove_tinymce_data(node, index).is_none() { continue; } diff --git a/server/src/translation.rs b/server/src/translation.rs index 1c411d02..f1d9b489 100644 --- a/server/src/translation.rs +++ b/server/src/translation.rs @@ -1201,7 +1201,9 @@ impl TranslationTask { // list; CodeChat documents have non-empty doc blocks. // We can't rely on the lexer name in // `CodeChatForWeb::SourceFileMetaData`, since the - // message `contents` may be None. + // message `contents` may be None. This won't confuse a + // CodeChat document with no doc blocks, since the + // Client won't send a `DomLocation` in this case. let is_markdown = self .code_mirror_doc_blocks .as_ref() @@ -1209,8 +1211,8 @@ impl TranslationTask { // 1. Find the HTML (for a Markdown document) or the doc // block the cursor is in. Create a temporary - // one-element `Vec` from this. - // containing only the doc block identified above. + // one-element `Vec` from this + // containing only the relevant doc block. let (preceding_newlines, doc_block) = if is_markdown { // 1. For Markdown, there are zero preceding // newlines and the relevant HTML is in @@ -1320,7 +1322,7 @@ fn compare_html_walker(node: &Rc) { compare_html_walker(&child); index += 1; } - // If remove_tinymce_data returned None, the node was removed with no + // If remove\_tinymce\_data returned None, the node was removed with no // replacement; the next child is now at the same index. } } @@ -1335,19 +1337,26 @@ fn compare_html( // processing by TinyMCE. raw_html: &str, ) -> bool { - // Remove TinyMCE temp data before comparison; this also normalizes the characters via html5ever. Order here in very important: the `source_to_codechat_for_web()` function transforms, then minifies, since both transform and minify tend to rearrange attributes in their own preferred order. Use the same order to make comparisons work. + // Remove TinyMCE temp data before comparison; this also normalizes the + // characters via html5ever. Order here in very important: the + // `source_to_codechat_for_web()` function transforms, then minifies, since + // both transform and minify tend to rearrange attributes in their own + // preferred order. Use the same order to make comparisons work. if let Ok(raw_html) = transform_html(raw_html, compare_html_walker) && let Ok(raw_html) = minify(&raw_html) { let normalized_html = normalized_html - // pulldown-cmark puts a newline after a `
`, which `minify` doesn't remove but TinyMCE does. + // pulldown-cmark puts a newline after a `
`, which `minify` + // doesn't remove but TinyMCE does. .replace("
", "
") - // Fix differences between TinyMCE and the forward process. There are probably other cases out there... + // Fix differences between TinyMCE and the forward process. There + // are probably other cases out there... .replace( "", "", ) - // TinyMCE wraps an `", "

"); normalized_html == raw_html diff --git a/server/src/webserver.rs b/server/src/webserver.rs index d6e6dc84..59df0f54 100644 --- a/server/src/webserver.rs +++ b/server/src/webserver.rs @@ -343,8 +343,8 @@ pub struct UpdateMessageContents { /// transition times when the IDE and Client have different files loaded, /// guaranteeing to updates are still applied to the correct file. pub file_path: String, - /// The line in the file where the cursor is located. TODO: Selections are - /// not yet supported. + /// The line in the file where the cursor is located or the DOM location of + /// the cursor. TODO: Selections are not yet supported. #[serde(skip_serializing_if = "Option::is_none")] pub cursor_position: Option, /// The line at the top of the screen. @@ -372,15 +372,14 @@ pub enum CursorPosition { /// receive a message with this variant and must not generate a message with /// this variant. DomLocation { - // The `from` location (character offset) of the doc block the cursor is - // in. + /// The `from` location (character offset) of the doc block the cursor + /// is in. from: usize, - // The index of each successive node in the DOM of the current - // selection (cursor location). + /// The index of each successive node in the DOM of the current + /// selection (cursor location). dom_path: Vec, - // The offset - // within the last node (which must be a text node) of the current - // selection (cursor location). + /// The offset within the last node (which must be a text node) of the + /// current selection (cursor location). dom_offset: usize, }, } diff --git a/server/tests/overall_1.rs b/server/tests/overall_1.rs index 4b54e647..b8218e4e 100644 --- a/server/tests/overall_1.rs +++ b/server/tests/overall_1.rs @@ -314,6 +314,22 @@ async fn test_server_core( let code_line = driver.find(By::Css(code_line_css)).await.unwrap(); assert_eq!(code_line.inner_html().await.unwrap(), "code()bark"); + assert_eq!( + codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), + EditorMessage { + id: client_id, + message: EditorMessageContents::Update(UpdateMessageContents { + file_path: path_str.clone(), + cursor_position: Some(CursorPosition::Line(1)), + scroll_position: Some(1.0), + is_re_translation: false, + contents: None + }) + } + ); + codechat_server.send_result(client_id, None).await.unwrap(); + client_id += MESSAGE_ID_INCREMENT; + /*x TODO: these tests fail, since the Client sends an unnecessary OutOfSync message. How to test sending a diff to the client? // Perform a second edit and verification, to produce a diff sent to the // Client. @@ -334,14 +350,14 @@ async fn test_server_core( message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)) } ); - let doc_block_indent = driver_ref.find(By::Css(indent_css)).await.unwrap(); + let doc_block_indent = driver.find(By::Css(indent_css)).await.unwrap(); assert_eq!(doc_block_indent.inner_html().await.unwrap(), " "); - let doc_block_contents = driver_ref.find(By::Css(contents_css)).await.unwrap(); + let doc_block_contents = driver.find(By::Css(contents_css)).await.unwrap(); assert_eq!( doc_block_contents.inner_html().await.unwrap(), "

food

" ); - let code_line = driver_ref.find(By::Css(code_line_css)).await.unwrap(); + let code_line = driver.find(By::Css(code_line_css)).await.unwrap(); assert_eq!(code_line.inner_html().await.unwrap(), "bark"); */ // ### Document-only tests @@ -376,7 +392,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: md_path_str.clone(), - cursor_position: None, + cursor_position: Some(CursorPosition::Line(1)), scroll_position: None, is_re_translation: false, contents: Some(CodeChatForWeb { @@ -411,7 +427,7 @@ async fn test_server_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: md_path_str.clone(), - cursor_position: None, + cursor_position: Some(CursorPosition::Line(1)), scroll_position: None, is_re_translation: false, contents: None, @@ -756,6 +772,7 @@ async fn test_client_updates_core( } ); client_id += MESSAGE_ID_INCREMENT; + assert_eq!(client_id, 7.0); msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); } @@ -790,6 +807,7 @@ async fn test_client_updates_core( ); codechat_server.send_result(client_id, None).await.unwrap(); client_id += MESSAGE_ID_INCREMENT; + assert!(client_id == 10.0 || client_id == 7.0); // The Server sends the Client a wrapped version of the text; the Client // replies with a Result(Ok). @@ -802,6 +820,7 @@ async fn test_client_updates_core( ); server_id += MESSAGE_ID_INCREMENT; + // After this, ID is 13. goto_line(&codechat_server, &driver, &mut client_id, &path_str, 4) .await .unwrap(); @@ -842,7 +861,7 @@ async fn test_client_updates_core( } ); codechat_server.send_result(client_id, None).await.unwrap(); - //client_id += MESSAGE_ID_INCREMENT; + client_id += MESSAGE_ID_INCREMENT; // The Server sends the Client a re-translated version of the text with the // new doc block; the Client replies with a Result(Ok). @@ -853,7 +872,23 @@ async fn test_client_updates_core( message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)) } ); - //server_id += MESSAGE_ID_INCREMENT; + + // The Client sends an cursor position update. + assert_eq!( + codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), + EditorMessage { + id: client_id, + message: EditorMessageContents::Update(UpdateMessageContents { + file_path: path_str.clone(), + cursor_position: Some(CursorPosition::Line(4)), + scroll_position: Some(1.0), + is_re_translation: false, + contents: None, + }) + } + ); + codechat_server.send_result(client_id, None).await.unwrap(); + //client_id += MESSAGE_ID_INCREMENT; /*x TODO broken by OutOfSync due to unnecessary save after re-translate. // Send the original text back, to ensure the re-translation correctly updated the Client. @@ -875,7 +910,7 @@ async fn test_client_updates_core( } ); // Trigger a client edit to send the Client contents back. - let code_line = driver_ref.find(By::Css(code_line_css)).await.unwrap(); + let code_line = driver.find(By::Css(code_line_css)).await.unwrap(); code_line.send_keys(" ").await.unwrap(); let msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); @@ -886,7 +921,7 @@ async fn test_client_updates_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: Some(2), + cursor_position: Some(CursorPosition::Line(2)), scroll_position: Some(1.0), is_re_translation: false, contents: Some(CodeChatForWeb { @@ -908,9 +943,9 @@ async fn test_client_updates_core( } ); codechat_server.send_result(client_id, None).await.unwrap(); - - assert_no_more_messages(&codechat_server).await; */ + assert_no_more_messages(&codechat_server).await; + Ok(()) } diff --git a/server/tests/overall_2.rs b/server/tests/overall_2.rs index 28161d0b..52a78138 100644 --- a/server/tests/overall_2.rs +++ b/server/tests/overall_2.rs @@ -186,7 +186,7 @@ async fn test_5_core( let doc_block_contents = driver.find(By::Css(contents_css)).await.unwrap(); doc_block_contents.click().await.unwrap(); // The click produces an updated cursor/scroll location after an autosave - // delay. Initial ID: 4. + // delay. let mut client_id = INITIAL_CLIENT_MESSAGE_ID; assert_eq!( codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), @@ -201,8 +201,9 @@ async fn test_5_core( }) } ); - // ID is 7. + codechat_server.send_result(client_id, None).await.unwrap(); client_id += MESSAGE_ID_INCREMENT; + assert_eq!(client_id, 7.0); // Refind it, since it's now switched with a TinyMCE editor. let tinymce_contents = driver.find(By::Id("TinyMCE-inst")).await.unwrap(); @@ -244,8 +245,8 @@ async fn test_5_core( ); let version = client_version; codechat_server.send_result(client_id, None).await.unwrap(); - // ID: 10. client_id += MESSAGE_ID_INCREMENT; + assert_eq!(client_id, 10.0); // Send new text, which turns into a diff. let ide_id = codechat_server @@ -342,7 +343,7 @@ async fn test_6_core( // Perform edits. body_content.send_keys("a").await.unwrap(); - let client_id = INITIAL_CLIENT_MESSAGE_ID; + let mut client_id = INITIAL_CLIENT_MESSAGE_ID; let msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); let client_version = get_version(&msg); assert_eq!( @@ -351,7 +352,7 @@ async fn test_6_core( id: client_id, message: EditorMessageContents::Update(UpdateMessageContents { file_path: path_str.clone(), - cursor_position: None, + cursor_position: Some(CursorPosition::Line(1)), scroll_position: None, is_re_translation: false, contents: Some(CodeChatForWeb { @@ -374,7 +375,7 @@ async fn test_6_core( ); let version = client_version; codechat_server.send_result(client_id, None).await.unwrap(); - //client_id += MESSAGE_ID_INCREMENT; + client_id += MESSAGE_ID_INCREMENT; // Send new text, which turns into a diff. let ide_id = codechat_server @@ -411,6 +412,23 @@ async fn test_6_core( "
  • aaa

b

" ); + // Get a final cursor update. + assert_eq!( + codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), + EditorMessage { + id: client_id, + message: EditorMessageContents::Update(UpdateMessageContents { + file_path: path_str.clone(), + cursor_position: Some(CursorPosition::Line(1)), + scroll_position: None, + is_re_translation: false, + contents: None, + }) + } + ); + codechat_server.send_result(client_id, None).await.unwrap(); + //client_id += MESSAGE_ID_INCREMENT; + assert_no_more_messages(&codechat_server).await; Ok(()) diff --git a/server/tests/overall_common/mod.rs b/server/tests/overall_common/mod.rs index caa0a31e..5aee3124 100644 --- a/server/tests/overall_common/mod.rs +++ b/server/tests/overall_common/mod.rs @@ -144,10 +144,6 @@ pub const TIMEOUT: Duration = Duration::from_millis(2000); // A test harness. It runs the webdriver, the Server, opens the Client, then // runs provided tests. After testing finishes, it cleans up (handling panics // properly). -// -// The goal was to pass the harness a function which runs the tests. This -// currently doesn't work, due to problems with lifetimes (see comments). So, -// implement this as a macro instead (kludge!). pub async fn harness< F: FnOnce(CodeChatEditorServer, WebDriver, PathBuf) -> Fut, Fut: Future>, @@ -199,7 +195,7 @@ pub async fn harness< // Get the resulting web page text. let opened_id = codechat_server.send_message_opened(true).await.unwrap(); - pretty_assertions::assert_eq!( + assert_eq!( codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), EditorMessage { id: opened_id, From dee0fe4e89e84076daa29831d4a92db51679e46e Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Tue, 5 May 2026 16:54:10 +0500 Subject: [PATCH 24/31] Fix: look for and fix occasional test failures. --- server/run_until_fail.ps1 | 11 +++++++++++ server/tests/overall_2.rs | 23 ++++++++++++++++++++++- 2 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 server/run_until_fail.ps1 diff --git a/server/run_until_fail.ps1 b/server/run_until_fail.ps1 new file mode 100644 index 00000000..bba4489f --- /dev/null +++ b/server/run_until_fail.ps1 @@ -0,0 +1,11 @@ +$iteration = 0 +while ($true) { + $iteration++ + clear + Write-Host "--- Iteration $iteration ---" + cargo test --test overall_2 + if ($LASTEXITCODE -ne 0) { + Write-Host "Test failed on iteration $iteration. Exiting." + exit $LASTEXITCODE + } +} diff --git a/server/tests/overall_2.rs b/server/tests/overall_2.rs index 52a78138..07c0dc51 100644 --- a/server/tests/overall_2.rs +++ b/server/tests/overall_2.rs @@ -344,7 +344,28 @@ async fn test_6_core( // Perform edits. body_content.send_keys("a").await.unwrap(); let mut client_id = INITIAL_CLIENT_MESSAGE_ID; - let msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); + let mut msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); + // Sometimes, a cursor update gets sent before the edit. + if let EditorMessageContents::Update(update) = &msg.message + && update.contents.is_none() + { + assert_eq!( + msg, + EditorMessage { + id: client_id, + message: EditorMessageContents::Update(UpdateMessageContents { + file_path: path_str.clone(), + cursor_position: Some(CursorPosition::Line(1)), + scroll_position: None, + is_re_translation: false, + contents: None + }) + } + ); + codechat_server.send_result(client_id, None).await.unwrap(); + client_id += MESSAGE_ID_INCREMENT; + msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); + } let client_version = get_version(&msg); assert_eq!( msg, From 4feb5c533bc7234146a3c4ac73ecf4f78b18a126 Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Tue, 5 May 2026 18:55:08 +0500 Subject: [PATCH 25/31] Docs: update changelog. --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 32c647c6..c29b2593 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ Changelog * Improve browser automated testing framework. * Add the ability for the IDE cursor to follow the line when the Client cursor is in a doc block. +* Add the ability to create pre-releases for testing. Version 0.1.54 -- 2026-Apr-16 ----------------------------- From 78087ebff82b7352b53c426359d42df69d45738a Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Wed, 6 May 2026 12:42:09 +0500 Subject: [PATCH 26/31] Fix: refactor into optional_message, fix occasional test failure. --- server/tests/overall_1.rs | 34 ++++++++++++++-- server/tests/overall_2.rs | 37 +++++++---------- server/tests/overall_common/mod.rs | 65 +++++++++++++++++++++--------- 3 files changed, 91 insertions(+), 45 deletions(-) diff --git a/server/tests/overall_1.rs b/server/tests/overall_1.rs index b8218e4e..0c4b527a 100644 --- a/server/tests/overall_1.rs +++ b/server/tests/overall_1.rs @@ -38,8 +38,7 @@ use tokio::time::sleep; // ### Local use crate::overall_common::{ - ExpectedMessages, TIMEOUT, assert_no_more_messages, get_version, goto_line, perform_loadfile, - select_codechat_iframe, + ExpectedMessages, TIMEOUT, assert_no_more_messages, get_version, goto_line, optional_message, perform_loadfile, select_codechat_iframe }; use code_chat_editor::{ ide::CodeChatEditorServer, @@ -384,7 +383,19 @@ async fn test_server_core( body_content.send_keys("foo ").await.unwrap(); let md_path = canonicalize(test_dir.join("test.md")).unwrap(); let md_path_str = md_path.to_str().unwrap().to_string(); - let msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); + // Sometimes, a cursor update gets sent before the edit. + let msg = optional_message( + &codechat_server, + &mut client_id, + EditorMessageContents::Update(UpdateMessageContents { + file_path: path_str.clone(), + cursor_position: Some(CursorPosition::Line(1)), + scroll_position: None, + is_re_translation: false, + contents: None, + }), + ) + .await; let client_version = get_version(&msg); assert_eq!( msg, @@ -460,6 +471,23 @@ async fn test_server_core( "

food A markdown file.

" ); + // Wait for a cursor update produced by the edit. + assert_eq!( + codechat_server.get_message_timeout(TIMEOUT).await.unwrap(), + EditorMessage { + id: client_id, + message: EditorMessageContents::Update(UpdateMessageContents { + file_path: md_path_str.clone(), + cursor_position: Some(CursorPosition::Line(1)), + scroll_position: None, + is_re_translation: false, + contents: None, + }) + } + ); + codechat_server.send_result(client_id, None).await.unwrap(); + client_id += MESSAGE_ID_INCREMENT; + // ### Unsupported document let txt_path = canonicalize(test_dir.join("test.txt")).unwrap(); let txt_path_str = txt_path.to_str().unwrap().to_string(); diff --git a/server/tests/overall_2.rs b/server/tests/overall_2.rs index 07c0dc51..db5cab73 100644 --- a/server/tests/overall_2.rs +++ b/server/tests/overall_2.rs @@ -37,8 +37,8 @@ use thirtyfour::{By, WebDriver, error::WebDriverError}; // ### Local use crate::overall_common::{ - TIMEOUT, assert_no_more_messages, get_empty_client_update, get_version, perform_loadfile, - select_codechat_iframe, + TIMEOUT, assert_no_more_messages, get_empty_client_update, get_version, optional_message, + perform_loadfile, select_codechat_iframe, }; use code_chat_editor::{ ide::CodeChatEditorServer, @@ -344,28 +344,19 @@ async fn test_6_core( // Perform edits. body_content.send_keys("a").await.unwrap(); let mut client_id = INITIAL_CLIENT_MESSAGE_ID; - let mut msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); // Sometimes, a cursor update gets sent before the edit. - if let EditorMessageContents::Update(update) = &msg.message - && update.contents.is_none() - { - assert_eq!( - msg, - EditorMessage { - id: client_id, - message: EditorMessageContents::Update(UpdateMessageContents { - file_path: path_str.clone(), - cursor_position: Some(CursorPosition::Line(1)), - scroll_position: None, - is_re_translation: false, - contents: None - }) - } - ); - codechat_server.send_result(client_id, None).await.unwrap(); - client_id += MESSAGE_ID_INCREMENT; - msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); - } + let msg = optional_message( + &codechat_server, + &mut client_id, + EditorMessageContents::Update(UpdateMessageContents { + file_path: path_str.clone(), + cursor_position: Some(CursorPosition::Line(1)), + scroll_position: None, + is_re_translation: false, + contents: None, + }), + ) + .await; let client_version = get_version(&msg); assert_eq!( msg, diff --git a/server/tests/overall_common/mod.rs b/server/tests/overall_common/mod.rs index 5aee3124..3cd1f06e 100644 --- a/server/tests/overall_common/mod.rs +++ b/server/tests/overall_common/mod.rs @@ -82,7 +82,14 @@ impl ExpectedMessages { ExpectedMessages(HashMap::new()) } - pub fn insert(&mut self, editor_message: EditorMessage, is_dynamic: bool) { + pub fn insert( + &mut self, + editor_message: EditorMessage, + // For this message, copy the version from the received + // EditorMessage.contents.version to the same field in the message to + // check against. + is_dynamic: bool, + ) { assert!( self.0 .insert( @@ -153,29 +160,26 @@ pub async fn harness< prep_test_dir: (TempDir, PathBuf), ) -> Result<(), Box> { let (temp_dir, test_dir) = prep_test_dir; - // The logger gets configured by (I think) - // `start_webdriver_process`, which delegates to `selenium-manager`. - // Set logging level here. + // The logger gets configured by (I think) `start_webdriver_process`, which + // delegates to `selenium-manager`. Set logging level here. unsafe { env::set_var("RUST_LOG", "debug") }; // Start the webdriver. let server_url = "http://localhost:4444"; let mut caps = DesiredCapabilities::chrome(); - // Ensure the screen is wide enough for an 80-character line, used - // to word wrapping test in `test_client_updates`. Otherwise, this - // test send the End key to go to the end of the line...but it's not - // the end of the full line on a narrow screen. + // Ensure the screen is wide enough for an 80-character line, used to word + // wrapping test in `test_client_updates`. Otherwise, this test send the End + // key to go to the end of the line...but it's not the end of the full line + // on a narrow screen. caps.add_arg("--window-size=1920,768")?; caps.add_arg("--headless")?; - // On Ubuntu CI, avoid failures, probably due to running Chrome as - // root. + // On Ubuntu CI, avoid failures, probably due to running Chrome as root. #[cfg(target_os = "linux")] if env::var("CI") == Ok("true".to_string()) { caps.add_arg("--disable-gpu")?; caps.add_arg("--no-sandbox")?; } if let Err(err) = start_webdriver_process(server_url, &caps, true) { - // Often, the "failure" is that the webdriver is already - // running. + // Often, the "failure" is that the webdriver is already running. eprintln!("Failed to start the webdriver process: {err:#?}"); } // Wait for the driver to start up. @@ -183,10 +187,9 @@ pub async fn harness< let driver = WebDriver::new(server_url, caps).await?; let driver_clone = driver.clone(); - // Run the test inside an async, so we can shut down the driver - // before returning an error. Mark the function as unwind safe. - // though I'm not certain this is correct. Hopefully, it's good - // enough for testing. + // Run the test inside an async, so we can shut down the driver before + // returning an error. Mark the function as unwind safe. though I'm not + // certain this is correct. Hopefully, it's good enough for testing. let ret = AssertUnwindSafe(async move { // ### Setup let p = env::current_exe().unwrap().parent().unwrap().join("../.."); @@ -218,8 +221,8 @@ pub async fn harness< Ok(()) }) - // Catch any panics/assertions, again to ensure the driver shuts - // down cleanly. + // Catch any panics/assertions, again to ensure the driver shuts down + // cleanly. .catch_unwind() .await; @@ -290,7 +293,8 @@ pub async fn goto_line( .await .unwrap(); // The cursor movement produces a cursor/scroll position update after an - // autosave delay. Sometimes, we get an update just before the movement; ignore that. + // autosave delay. Sometimes, we get an update just before the movement; + // ignore that. let mut msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); if msg.id == *client_id && let EditorMessageContents::Update(update) = &msg.message @@ -462,3 +466,26 @@ pub async fn assert_no_more_messages(codechat_server: &CodeChatEditorServer) { panic!("Unprocessed messages: {:#?}", msg); } } + +/// Wait for a message. If it matches the provided optional message, acknowledge +/// it and update the client ID, then wait for another message. Return the most +/// recently received message. +pub async fn optional_message( + codechat_server: &CodeChatEditorServer, + client_id: &mut f64, + optional_message: EditorMessageContents, +) -> EditorMessage { + let msg = codechat_server.get_message_timeout(TIMEOUT).await.unwrap(); + if msg + == (EditorMessage { + id: *client_id, + message: optional_message, + }) + { + codechat_server.send_result(*client_id, None).await.unwrap(); + *client_id += MESSAGE_ID_INCREMENT; + codechat_server.get_message_timeout(TIMEOUT).await.unwrap() + } else { + msg + } +} From c44204232ebf39da7e775197346da20b2633e34e Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Wed, 6 May 2026 16:09:09 +0500 Subject: [PATCH 27/31] Update: html5ever version. --- server/Cargo.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/Cargo.toml b/server/Cargo.toml index 01a060bf..1cdfa772 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -67,14 +67,14 @@ dunce = "1.0.5" futures-util = "0.3.29" htmd = { git = "https://github.com/bjones1/htmd.git", branch = "dom-interface", version = "0.5" } # This must match the version of `markup5ever_rcdom`. -html5ever = "0.38" +html5ever = "0.39" htmlize = "1.0.6" imara-diff = { version = "0.2", features = [] } indoc = "2.0.5" lazy_static = "1" log = "0.4" log4rs = "1.3" -markup5ever_rcdom = "0.38" +markup5ever_rcdom = "0.39" mime = "0.3.17" mime_guess = "2.0.5" minify-html = { git = "https://github.com/bjones1/minify-html.git", branch = "dev", version = "0.18.1" } From 96b3210ce598d626602eb606014b71715364d8fa Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Wed, 6 May 2026 16:10:36 +0500 Subject: [PATCH 28/31] Fix: Improve restoreSeletion logic. --- client/src/CodeChatEditor.mts | 51 +++++++++++++---------------------- server/tests/overall_1.rs | 9 ++++--- 2 files changed, 24 insertions(+), 36 deletions(-) diff --git a/client/src/CodeChatEditor.mts b/client/src/CodeChatEditor.mts index 2f4b6f4a..672b8b6c 100644 --- a/client/src/CodeChatEditor.mts +++ b/client/src/CodeChatEditor.mts @@ -470,7 +470,7 @@ export const saveSelection = () => { if (sel?.anchorNode) { // Find a path from the selection back to the containing div. for ( - let current_node = sel.anchorNode, is_first = true; + let current_node = sel.anchorNode; // Continue until we find the div which contains the doc block // contents: either it's not an element (such as a div), ... current_node.nodeType !== Node.ELEMENT_NODE || @@ -482,15 +482,10 @@ export const saveSelection = () => { // the TinyMCE div and returns the overall div. I don't know // why. !(current_node as Element).classList.contains("CodeChat-doc")); - current_node = current_node.parentNode!, is_first = false + current_node = current_node.parentNode! ) { // Store the index of this node in its' parent list of child - // nodes/children. Use `childNodes` on the first iteration, since - // the selection is often in a text node, which isn't in the - // `parents` list. However, using `childNodes` all the time causes - // trouble when reversing the selection -- sometimes, the - // `childNodes` change based on whether text nodes (such as a - // newline) are included are not after tinyMCE parses the content. + // nodes/children. const p = current_node.parentNode; // In case we go off the rails, give up if there are no more // parents. @@ -501,10 +496,7 @@ export const saveSelection = () => { }; } selection_path.unshift( - Array.prototype.indexOf.call( - is_first ? p.childNodes : p.children, - current_node, - ), + Array.prototype.indexOf.call(p.childNodes, current_node), ); } } @@ -524,30 +516,25 @@ export const restoreSelection = ({ // the selected node. if (selection_path.length && typeof selection_offset === "number") { let selection_node = tinymce.activeEditor!.getContentAreaContainer(); - for ( - ; - selection_path.length && - // If something goes wrong, bail out instead of producing - // exceptions. - selection_node !== undefined; - selection_node = - // As before, use the more-consistent `children` except for the - // last element, where we might be selecting a `text` node. - ( - selection_path.length > 1 - ? selection_node.children - : selection_node.childNodes - )[selection_path.shift()!]! as HTMLElement - ); - // Exit on failure. - if (selection_node === undefined) { - return; + while (selection_path.length) { + const new_selection_node = selection_node.childNodes[ + selection_path.shift()! + ] as HTMLElement; + // If we get lost during the descent, then stop just before that. + if (new_selection_node === undefined) { + break; + } + selection_node = new_selection_node; } + // In case of edits, avoid an offset past the end of the node. + const final_selection_offset = Math.min( + selection_offset, + (selection_node.nodeValue?.length ?? 1) - 1, + ); // Use that to set the selection. tinymce.activeEditor!.selection.setCursorLocation( selection_node, - // In case of edits, avoid an offset past the end of the node. - Math.min(selection_offset, selection_node.nodeValue?.length ?? 0), + final_selection_offset, ); } }; diff --git a/server/tests/overall_1.rs b/server/tests/overall_1.rs index 0c4b527a..208601c7 100644 --- a/server/tests/overall_1.rs +++ b/server/tests/overall_1.rs @@ -38,7 +38,8 @@ use tokio::time::sleep; // ### Local use crate::overall_common::{ - ExpectedMessages, TIMEOUT, assert_no_more_messages, get_version, goto_line, optional_message, perform_loadfile, select_codechat_iframe + ExpectedMessages, TIMEOUT, assert_no_more_messages, get_version, goto_line, optional_message, + perform_loadfile, select_codechat_iframe, }; use code_chat_editor::{ ide::CodeChatEditorServer, @@ -149,7 +150,7 @@ async fn test_server_core( doc: vec![StringDiff { from: 0, to: Some(7), - insert: "# Testfoo\n".to_string() + insert: "# Tesfoot\n".to_string() }], doc_blocks: vec![], version, @@ -185,7 +186,7 @@ async fn test_server_core( doc: vec![StringDiff { from: 0, to: Some(10), - insert: " # Testfoo\n".to_string(), + insert: " # Tesfoot\n".to_string(), }], doc_blocks: vec![], version, @@ -388,7 +389,7 @@ async fn test_server_core( &codechat_server, &mut client_id, EditorMessageContents::Update(UpdateMessageContents { - file_path: path_str.clone(), + file_path: md_path_str.clone(), cursor_position: Some(CursorPosition::Line(1)), scroll_position: None, is_re_translation: false, From 85f24c7a318784a6dac35e8e29770b16924b4c66 Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Wed, 6 May 2026 21:13:37 +0500 Subject: [PATCH 29/31] Fix: change minify to be better at removing whitespace. Correct indexing and wrapping for marker placement. --- server/src/ide/vscode/tests.rs | 43 +++++++++++++++++++++++---------- server/src/processing.rs | 29 ++++++++++++---------- server/src/processing/tests.rs | 20 ++++++++-------- server/src/translation.rs | 44 ++++++++++++++++++++++------------ 4 files changed, 85 insertions(+), 51 deletions(-) diff --git a/server/src/ide/vscode/tests.rs b/server/src/ide/vscode/tests.rs index 5aa79dfa..509cff9e 100644 --- a/server/src/ide/vscode/tests.rs +++ b/server/src/ide/vscode/tests.rs @@ -47,9 +47,12 @@ use tokio_tungstenite::{ tungstenite::{http::StatusCode, protocol::Message}, }; -use crate::webserver::{ - EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, INITIAL_IDE_MESSAGE_ID, - INITIAL_MESSAGE_ID, IdeType, MESSAGE_ID_INCREMENT, ResultErrTypes, +use crate::{ + processing::CodeMirrorDocBlockUpdate, + webserver::{ + EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID, INITIAL_IDE_MESSAGE_ID, + INITIAL_MESSAGE_ID, IdeType, MESSAGE_ID_INCREMENT, ResultErrTypes, + }, }; use crate::{ processing::{ @@ -557,7 +560,7 @@ async fn test_vscode_ide_websocket8() { to: 1, indent: "".to_string(), delimiter: "#".to_string(), - contents: "

testing

".to_string() + contents: "

testing".to_string() }], }), version: 0.0, @@ -689,7 +692,7 @@ async fn test_vscode_ide_websocket7() { to: 1, indent: "".to_string(), delimiter: "#".to_string(), - contents: "

more

".to_string() + contents: "

more".to_string() }] }), version: 0.0, @@ -764,13 +767,27 @@ async fn test_vscode_ide_websocket7() { to: None, insert: "code\n\n".to_string() }], - doc_blocks: vec![CodeMirrorDocBlockTransaction::Add(CodeMirrorDocBlock { - from: 6, - to: 7, - indent: "".to_string(), - delimiter: "#".to_string(), - contents: "

most

".to_string() - })], + doc_blocks: vec![ + CodeMirrorDocBlockTransaction::Update(CodeMirrorDocBlockUpdate { + from: 0, + from_new: None, + to: None, + indent: None, + delimiter: None, + contents: vec![StringDiff { + from: 0, + to: Some(7,), + insert: "

more

".to_string(), + },], + }), + CodeMirrorDocBlockTransaction::Add(CodeMirrorDocBlock { + from: 6, + to: 7, + indent: "".to_string(), + delimiter: "#".to_string(), + contents: "

most".to_string(), + },), + ], version: 0.0, }), version: 1.0, @@ -996,7 +1013,7 @@ async fn test_vscode_ide_websocket4() { to: 1, indent: "".to_string(), delimiter: "#".to_string(), - contents: "

test.py

".to_string() + contents: "

test.py".to_string() }], }), version: cast!(&msg.message, EditorMessageContents::Update) diff --git a/server/src/processing.rs b/server/src/processing.rs index 37cc7604..858b3fe3 100644 --- a/server/src/processing.rs +++ b/server/src/processing.rs @@ -604,8 +604,8 @@ impl HtmlToMarkdownWrapped { pub fn doc_block_html_to_markdown( mut code_doc_block_vec: Vec, // If provided, the index of each successive node in the DOM, ending with - // the offset within the last node (which must be a text node), at which a - // marker character will be inserted. + // the offset in UTF-16 characters within the last node (which must be a + // text node) at which a marker character will be inserted. // // For this reason, when provided, this function must called with a vec // containing only one doc block. @@ -621,17 +621,25 @@ pub fn doc_block_html_to_markdown( let tree = html_to_tree(&doc_block.contents, dom_location)?; dehydrating_walk_node(&tree); + // Calculate the total delimiter width: the delimiter width plus the + // extra space after it. Special case: an empty delimiter means + // we're wrapping a Markdown document to insert a marker, so don't + // add the extra space. + let delimiter_width = doc_block.delimiter.chars().count(); + let total_delimiter_width = if delimiter_width > 0 { + delimiter_width + 1 + } else { + 0 + }; // Compute a line wrap width based on the current indent. Set a // minimum of half the line wrap width, to prevent ridiculous // wrapping with large indents. converter.set_line_width(max( WORD_WRAP_MIN_WIDTH, - // The +1 factor is for the space separating the delimiter and - // the comment text. Use `min` to avoid overflow with unsigned - // subtraction. + // Use `min` to avoid overflow with unsigned subtraction. WORD_WRAP_COLUMN - min( - doc_block.delimiter.chars().count() + 1 + doc_block.indent.chars().count(), + total_delimiter_width + doc_block.indent.chars().count(), WORD_WRAP_COLUMN, ), )); @@ -974,7 +982,6 @@ static MINIFY_OPTIONS: LazyLock = LazyLock::new(|| { cfg.allow_noncompliant_unquoted_attribute_values = false; cfg.allow_optimal_entities = false; cfg.allow_removing_spaces_between_attributes = false; - cfg.keep_closing_tags = true; cfg.keep_comments = true; cfg.keep_html_and_head_opening_tags = true; cfg.minify_doctype = false; @@ -1100,7 +1107,7 @@ fn html_to_tree( // Each element in `dom_offsets` is the index of a node in the `dom`. // Take the first index, then descend into the indicated node. Repeat // this process until the last node, which should be a text node. The - // last index is the offset with the text contents to insert a + // last index is the UTF-16 offset with the text contents to insert a // `UNICODE_CURSOR_MARKER` character. Any failures (index exceeds number // of nodes, etc.) use an approximation where possible. let mut current_node = get_dom_body(&dom.document); @@ -1122,11 +1129,7 @@ fn html_to_tree( if let NodeData::Text { contents } = ¤t_node.data { let mut text = contents.borrow().to_string(); // Convert the character offset into a byte offset. - let byte_offset = text - .char_indices() - .nth(*dom_offset) - .map(|(b, _)| b) - .unwrap_or(text.len()); + let byte_offset = byte_index_of(&text, *dom_offset); text.insert(byte_offset, UNICODE_CURSOR_MARKER); *contents.borrow_mut() = text.into(); } diff --git a/server/src/processing/tests.rs b/server/src/processing/tests.rs index 8e004d87..0bd403cf 100644 --- a/server/src/processing/tests.rs +++ b/server/src/processing/tests.rs @@ -514,7 +514,7 @@ fn test_source_to_codechat_for_web_1() { ), Ok(TranslationResults::CodeChat(build_codechat_for_web( MARKDOWN_MODE, - &format!("

{lexer_spec}markdown

"), + &format!("

{lexer_spec}markdown"), vec![] ))) ); @@ -545,7 +545,7 @@ fn test_source_to_codechat_for_web_1() { Ok(TranslationResults::CodeChat(build_codechat_for_web( "javascript", "\n", - vec![build_codemirror_doc_block(0, 1, "", "//", "

Test

")] + vec![build_codemirror_doc_block(0, 1, "", "//", "

Test")] ))) ); assert_eq!( @@ -553,7 +553,7 @@ fn test_source_to_codechat_for_web_1() { Ok(TranslationResults::CodeChat(build_codechat_for_web( "javascript", "let a = 1;\n\n", - vec![build_codemirror_doc_block(11, 12, "", "//", "

Test

")] + vec![build_codemirror_doc_block(11, 12, "", "//", "

Test")] ))) ); assert_eq!( @@ -561,7 +561,7 @@ fn test_source_to_codechat_for_web_1() { Ok(TranslationResults::CodeChat(build_codechat_for_web( "javascript", "\nlet a = 1;", - vec![build_codemirror_doc_block(0, 1, "", "//", "

Test

")] + vec![build_codemirror_doc_block(0, 1, "", "//", "

Test")] ))) ); @@ -584,7 +584,7 @@ fn test_source_to_codechat_for_web_1() { 1, "", "//", - "

Link

" + "

Link

" ), build_codemirror_doc_block(12, 13, "", "/*", "") ] @@ -661,7 +661,7 @@ fn test_source_to_codechat_for_web_1() { 1, "", "//", - "

ΟƒπŸ˜„πŸ‘‰πŸΏπŸ‘¨β€πŸ‘¦πŸ‡ΊπŸ‡³

" + "

ΟƒπŸ˜„πŸ‘‰πŸΏπŸ‘¨β€πŸ‘¦πŸ‡ΊπŸ‡³" ),] ))) ); @@ -685,9 +685,9 @@ fn test_source_to_codechat_for_web_1() { 2, "", "/*", - "

\n\n
" + "
\n\n
" ), - build_codemirror_doc_block(2, 3, "", "//", "

Test

"), + build_codemirror_doc_block(2, 3, "", "//", "

Test"), ] ))) ); @@ -709,9 +709,9 @@ fn test_source_to_codechat_for_web_1() { 2, "", "/*", - "

\n\n
" + "
\n\n
" ), - build_codemirror_doc_block(2, 3, "", "//", "

Test

"), + build_codemirror_doc_block(2, 3, "", "//", "

Test"), ] ))) ); diff --git a/server/src/translation.rs b/server/src/translation.rs index f1d9b489..e87cf978 100644 --- a/server/src/translation.rs +++ b/server/src/translation.rs @@ -1345,20 +1345,15 @@ fn compare_html( if let Ok(raw_html) = transform_html(raw_html, compare_html_walker) && let Ok(raw_html) = minify(&raw_html) { - let normalized_html = normalized_html - // pulldown-cmark puts a newline after a `
`, which `minify` - // doesn't remove but TinyMCE does. - .replace("
", "
") - // Fix differences between TinyMCE and the forward process. There - // are probably other cases out there... - .replace( - "", - "", - ) - // TinyMCE wraps an `", "

"); + // pulldown-cmark puts a newline after a `
`, which `minify` + // doesn't remove but TinyMCE does. + let normalized_html = normalized_html.replace("
", "
"); + // TinyMCE wraps an `

`, which minifies to `

Previous paragraph

`. The IDE doesn't wrap the ``, which minifies to `

Previous paragraph

`. Fix up this difference. + let raw_html = raw_html.replace("

".to_string(), + contents: "

  • Task list

Line
break

Non-breaking\u{a0} space.

".to_string(), }]; let client = vec![CodeMirrorDocBlock { from: 0, @@ -1425,4 +1420,23 @@ mod tests { }]; assert!(doc_blocks_compare(&ide, &client)); } + + #[test] + fn test_x2() { + let ide = vec![CodeMirrorDocBlock { + from: 0, + to: 20, + indent: "".to_string(), + delimiter: "//".to_string(), + contents: "
    1. 1
".to_string(), + }]; + let client = vec![CodeMirrorDocBlock { + from: 0, + to: 20, + indent: "".to_string(), + delimiter: "//".to_string(), + contents: "
    1. 1
".to_string(), + }]; + assert!(doc_blocks_compare(&ide, &client)); + } } From c9ca9c60e276055fe8889af63af74ba6682d6be0 Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Wed, 6 May 2026 21:18:57 +0500 Subject: [PATCH 30/31] Clean: format file. --- server/src/processing/tests.rs | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/server/src/processing/tests.rs b/server/src/processing/tests.rs index 0bd403cf..70245d23 100644 --- a/server/src/processing/tests.rs +++ b/server/src/processing/tests.rs @@ -579,13 +579,7 @@ fn test_source_to_codechat_for_web_1() { "javascript", "\nlet a = 1;\n\n", vec![ - build_codemirror_doc_block( - 0, - 1, - "", - "//", - "

Link

" - ), + build_codemirror_doc_block(0, 1, "", "//", "

Link

"), build_codemirror_doc_block(12, 13, "", "/*", "") ] ))) @@ -656,13 +650,7 @@ fn test_source_to_codechat_for_web_1() { Ok(TranslationResults::CodeChat(build_codechat_for_web( "cpp", "\n;", - vec![build_codemirror_doc_block( - 0, - 1, - "", - "//", - "

ΟƒπŸ˜„πŸ‘‰πŸΏπŸ‘¨β€πŸ‘¦πŸ‡ΊπŸ‡³" - ),] + vec![build_codemirror_doc_block(0, 1, "", "//", "

ΟƒπŸ˜„πŸ‘‰πŸΏπŸ‘¨β€πŸ‘¦πŸ‡ΊπŸ‡³"),] ))) ); From 4fa5605838ec473742f4669e1ec5c827b863a264 Mon Sep 17 00:00:00 2001 From: "Bryan A. Jones" Date: Wed, 6 May 2026 21:19:50 +0500 Subject: [PATCH 31/31] Freeze for release. --- CHANGELOG.md | 2 + client/pnpm-lock.yaml | 109 +++++++++++++------------------ extensions/VSCode/Cargo.lock | 22 +++---- extensions/VSCode/pnpm-lock.yaml | 30 ++++----- server/Cargo.lock | 38 ++++------- 5 files changed, 87 insertions(+), 114 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c29b2593..8fc10ee6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,8 @@ Changelog * Add the ability for the IDE cursor to follow the line when the Client cursor is in a doc block. * Add the ability to create pre-releases for testing. +* Improve cursor tracking in a re-translation. +* Reduce unnecessary re-translations with better HTML comparison. Version 0.1.54 -- 2026-Apr-16 ----------------------------- diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index 2a6f5d64..8448c8a2 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -177,8 +177,8 @@ packages: '@chevrotain/utils@12.0.0': resolution: {integrity: sha512-lB59uJoaGIfOOL9knQqQRfhl9g7x8/wqFkp13zTdkRu1huG9kg6IJs1O8hqj9rs6h7orGxHJUKb+mX3rPbWGhA==} - '@codemirror/autocomplete@6.20.1': - resolution: {integrity: sha512-1cvg3Vz1dSSToCNlJfRA2WSI4ht3K+WplO0UMOgmUYPivCyy2oueZY6Lx7M9wThm7SDUBViRmuT+OG/i8+ON9A==} + '@codemirror/autocomplete@6.20.2': + resolution: {integrity: sha512-G5FPkgIiLjOgZMjqVjvuKQ1rGPtHogLldJr33eFJdVLtmwY+giGrlv/ewljLz6b9BSQLkjxuwBc6g6omDM+YxQ==} '@codemirror/commands@6.10.3': resolution: {integrity: sha512-JFRiqhKu+bvSkDLI+rUhJwSxQxYb759W5GBezE8Uc8mHLqC9aV/9aTC7yJSqCtB3F00pylrLCwnyS91Ap5ej4Q==} @@ -231,8 +231,8 @@ packages: '@codemirror/legacy-modes@6.5.2': resolution: {integrity: sha512-/jJbwSTazlQEDOQw2FJ8LEEKVS72pU0lx6oM54kGpL8t/NJ2Jda3CZ4pcltiKTdqYSRk3ug1B3pil1gsjA6+8Q==} - '@codemirror/lint@6.9.5': - resolution: {integrity: sha512-GElsbU9G7QT9xXhpUg1zWGmftA/7jamh+7+ydKRuT0ORpWS3wOSP0yT1FOlIZa7mIJjpVPipErsyvVqB9cfTFA==} + '@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==} @@ -243,6 +243,9 @@ packages: '@codemirror/view@6.38.8': resolution: {integrity: sha512-XcE9fcnkHCbWkjeKyi0lllwXmBLtyYb5dt89dJyx23I9+LSh5vZDIuk7OLG4VM1lgrXZQcY6cxyZyk5WVPRv/A==} + '@codemirror/view@6.42.0': + resolution: {integrity: sha512-+PJEyndSCrsS2oLH3DfWoLBcF3xfeyGXtLnpXqHY01kL3TogyCLD12hNvSu73ww2KFftrx3Rd0nGOigbSkU3Hw==} + '@esbuild/aix-ppc64@0.28.0': resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} engines: {node: '>=18'} @@ -464,8 +467,8 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.1': - resolution: {integrity: sha512-MwzoDtw9rO1x+qfgLTV/IVXsHDBqeYZoMIQC8SfxfYSlaSUG+oWiAcoiB1yajAda6mqblm4/1/w2E8tRu7a7Tw==} + '@iconify/utils@3.1.2': + resolution: {integrity: sha512-jVf75icVVgSVGf9+QWBeCHdFL35yZ06HMHl9sCa059pITTP781lOacvRazfwAmXDKiBiUdQQMWVnuiw/RaQNhQ==} '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} @@ -958,9 +961,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - cose-base@1.0.3: resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} @@ -1486,6 +1486,9 @@ packages: resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} engines: {node: '>= 4'} + import-meta-resolve@4.2.0: + resolution: {integrity: sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -1521,8 +1524,8 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -1710,9 +1713,6 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - mlly@1.8.2: - resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} - mocha@11.7.5: resolution: {integrity: sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1804,9 +1804,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - pdfjs-dist@5.4.624: resolution: {integrity: sha512-sm6TxKTtWv1Oh6n3C6J6a8odejb5uO4A4zo/2dgkHuC0iu8ZMAXOezEODkVaoVp8nX1Xzr+0WxFJJmUr45hQzg==} engines: {node: '>=20.16.0 || >=22.3.0'} @@ -1818,9 +1815,6 @@ packages: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - points-on-curve@0.2.0: resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} @@ -2072,9 +2066,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.6.4: - resolution: {integrity: sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==} - unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -2192,7 +2183,7 @@ snapshots: '@chevrotain/utils@12.0.0': {} - '@codemirror/autocomplete@6.20.1': + '@codemirror/autocomplete@6.20.2': dependencies: '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 @@ -2213,7 +2204,7 @@ snapshots: '@codemirror/lang-css@6.3.1': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@lezer/common': 1.5.2 @@ -2221,7 +2212,7 @@ snapshots: '@codemirror/lang-go@6.0.1': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@lezer/common': 1.5.2 @@ -2229,7 +2220,7 @@ snapshots: '@codemirror/lang-html@6.4.11': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/lang-css': 6.3.1 '@codemirror/lang-javascript': 6.2.5 '@codemirror/language': 6.12.3 @@ -2246,9 +2237,9 @@ snapshots: '@codemirror/lang-javascript@6.2.5': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 - '@codemirror/lint': 6.9.5 + '@codemirror/lint': 6.9.6 '@codemirror/state': 6.6.0 '@codemirror/view': 6.38.8 '@lezer/common': 1.5.2 @@ -2261,7 +2252,7 @@ snapshots: '@codemirror/lang-markdown@6.5.0': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/lang-html': 6.4.11 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 @@ -2279,7 +2270,7 @@ snapshots: '@codemirror/lang-python@6.2.1': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@lezer/common': 1.5.2 @@ -2292,7 +2283,7 @@ snapshots: '@codemirror/lang-sql@6.10.0': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@lezer/common': 1.5.2 @@ -2301,7 +2292,7 @@ snapshots: '@codemirror/lang-xml@6.1.0': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@codemirror/view': 6.38.8 @@ -2310,7 +2301,7 @@ snapshots: '@codemirror/lang-yaml@6.1.3': dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/language': 6.12.3 '@codemirror/state': 6.6.0 '@lezer/common': 1.5.2 @@ -2331,10 +2322,10 @@ snapshots: dependencies: '@codemirror/language': 6.12.3 - '@codemirror/lint@6.9.5': + '@codemirror/lint@6.9.6': dependencies: '@codemirror/state': 6.6.0 - '@codemirror/view': 6.38.8 + '@codemirror/view': 6.42.0 crelt: 1.0.6 '@codemirror/search@6.7.0': @@ -2354,6 +2345,13 @@ snapshots: style-mod: 4.1.3 w3c-keyname: 2.2.8 + '@codemirror/view@6.42.0': + dependencies: + '@codemirror/state': 6.6.0 + crelt: 1.0.6 + style-mod: 4.1.3 + w3c-keyname: 2.2.8 + '@esbuild/aix-ppc64@0.28.0': optional: true @@ -2486,11 +2484,11 @@ snapshots: '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.1': + '@iconify/utils@3.1.2': dependencies: '@antfu/install-pkg': 1.1.0 '@iconify/types': 2.0.0 - mlly: 1.8.2 + import-meta-resolve: 4.2.0 '@isaacs/cliui@8.0.2': dependencies: @@ -3049,10 +3047,10 @@ snapshots: codemirror@6.0.2: dependencies: - '@codemirror/autocomplete': 6.20.1 + '@codemirror/autocomplete': 6.20.2 '@codemirror/commands': 6.10.3 '@codemirror/language': 6.12.3 - '@codemirror/lint': 6.9.5 + '@codemirror/lint': 6.9.6 '@codemirror/search': 6.7.0 '@codemirror/state': 6.6.0 '@codemirror/view': 6.38.8 @@ -3069,8 +3067,6 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.8: {} - cose-base@1.0.3: dependencies: layout-base: 1.0.2 @@ -3465,7 +3461,7 @@ snapshots: eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 - is-core-module: 2.16.1 + is-core-module: 2.16.2 resolve: 2.0.0-next.6 transitivePeerDependencies: - supports-color @@ -3493,7 +3489,7 @@ snapshots: eslint-import-resolver-node: 0.3.10 eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0) hasown: 2.0.3 - is-core-module: 2.16.1 + is-core-module: 2.16.2 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 @@ -3718,6 +3714,8 @@ snapshots: ignore@7.0.5: {} + import-meta-resolve@4.2.0: {} + imurmurhash@0.1.4: {} internal-slot@1.1.0: @@ -3755,7 +3753,7 @@ snapshots: is-callable@1.2.7: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: hasown: 2.0.3 @@ -3920,7 +3918,7 @@ snapshots: mermaid@11.14.0: dependencies: '@braintree/sanitize-url': 7.1.2 - '@iconify/utils': 3.1.1 + '@iconify/utils': 3.1.2 '@mermaid-js/parser': 1.1.0 '@types/d3': 7.4.3 '@upsetjs/venn.js': 2.0.0 @@ -3957,13 +3955,6 @@ snapshots: minipass@7.1.3: {} - mlly@1.8.2: - dependencies: - acorn: 8.16.0 - pathe: 2.0.3 - pkg-types: 1.3.1 - ufo: 1.6.4 - mocha@11.7.5: dependencies: browser-stdout: 1.3.1 @@ -4084,8 +4075,6 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.3 - pathe@2.0.3: {} - pdfjs-dist@5.4.624: optionalDependencies: '@napi-rs/canvas': 0.1.100 @@ -4095,12 +4084,6 @@ snapshots: picomatch@4.0.4: {} - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.8.2 - pathe: 2.0.3 - points-on-curve@0.2.0: {} points-on-path@0.2.1: @@ -4151,7 +4134,7 @@ snapshots: resolve@2.0.0-next.6: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 + is-core-module: 2.16.2 node-exports-info: 1.6.0 object-keys: 1.1.1 path-parse: 1.0.7 @@ -4401,8 +4384,6 @@ snapshots: typescript@6.0.3: {} - ufo@1.6.4: {} - unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 diff --git a/extensions/VSCode/Cargo.lock b/extensions/VSCode/Cargo.lock index e066075d..b150006f 100644 --- a/extensions/VSCode/Cargo.lock +++ b/extensions/VSCode/Cargo.lock @@ -1493,7 +1493,7 @@ dependencies = [ [[package]] name = "htmd" version = "0.5.4" -source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#68b5d9cfa22131ea32c71fa480b6746828700cc6" +source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#deafeb4b579530a94314828218cfbda79c615ef8" dependencies = [ "html5ever", "markup5ever_rcdom", @@ -1502,9 +1502,9 @@ dependencies = [ [[package]] name = "html5ever" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" dependencies = [ "log", "markup5ever", @@ -2064,9 +2064,9 @@ dependencies = [ [[package]] name = "markup5ever" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" dependencies = [ "log", "tendril", @@ -2075,9 +2075,9 @@ dependencies = [ [[package]] name = "markup5ever_rcdom" -version = "0.38.0+unofficial" +version = "0.39.0+unofficial" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "333171ccdf66e915257740d44e38ea5b1b19ce7b45d33cc35cb6f118fbd981ff" +checksum = "3ac010f19d6c4af81eeb4018a39d7a115de9d285af45c126a4ac02e6fc5716b7" dependencies = [ "html5ever", "markup5ever", @@ -2126,7 +2126,7 @@ dependencies = [ [[package]] name = "minify-html" version = "0.18.1" -source = "git+https://github.com/bjones1/minify-html.git?branch=dev#3eada4dbef725de3ea4ca5075ec9c12618ea4ece" +source = "git+https://github.com/bjones1/minify-html.git?branch=dev#b5cce1953106d00b5e622214a99457d3312c5fa9" dependencies = [ "ahash 0.8.12", "aho-corasick", @@ -2144,7 +2144,7 @@ dependencies = [ [[package]] name = "minify-html-common" version = "0.0.3" -source = "git+https://github.com/bjones1/minify-html.git?branch=dev#3eada4dbef725de3ea4ca5075ec9c12618ea4ece" +source = "git+https://github.com/bjones1/minify-html.git?branch=dev#b5cce1953106d00b5e622214a99457d3312c5fa9" dependencies = [ "ahash 0.8.12", "aho-corasick", @@ -4796,9 +4796,9 @@ dependencies = [ [[package]] name = "xml5ever" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dc9559429edf0cd3f327cc0afd9d6b36fa8cec6d93107b7fbe64f806b5f2d9" +checksum = "5ab627f34ff61b80d756180d556f9c68801d836d271b3b8c094504ceca69d221" dependencies = [ "log", "markup5ever", diff --git a/extensions/VSCode/pnpm-lock.yaml b/extensions/VSCode/pnpm-lock.yaml index 35f20b58..37676e31 100644 --- a/extensions/VSCode/pnpm-lock.yaml +++ b/extensions/VSCode/pnpm-lock.yaml @@ -1777,8 +1777,8 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.1: - resolution: {integrity: sha512-h2r7rcm6Ee/J8o0LD5djLuFVcfbZxhvho4vvsbeV0aMvXjUgqv4YpxpkEx0d68l6+IleVfLAdVEfhR7QNMkGHQ==} + fast-uri@3.1.2: + resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} fast-wrap-ansi@0.2.0: resolution: {integrity: sha512-rLV8JHxTyhVmFYhBJuMujcrHqOT2cnO5Zxj37qROj23CP39GXubJRBUFF0z8KFK77Uc0SukZUf7JZhsVEQ6n8w==} @@ -2007,8 +2007,8 @@ packages: resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} hasBin: true - is-core-module@2.16.1: - resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} is-data-view@1.0.2: @@ -2310,8 +2310,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-abi@3.90.0: - resolution: {integrity: sha512-pZNQT7UnYlMwMBy5N1lV5X/YLTbZM5ncytN3xL7CHEzhDN8uVe0u55yaPUJICIJjaCW8NrM5BFdqr7HLweStNA==} + node-abi@3.91.0: + resolution: {integrity: sha512-B+S7X/GS3Un6wMICtnsNjQD7oSpVBQrZftHE6GZ1Fe9/k3XOOoqbM5DZZ0GO4x3YiSCQfrM28yj1ppplwgIsfg==} engines: {node: '>=10'} node-addon-api@4.3.0: @@ -4054,7 +4054,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.1 + fast-uri: 3.1.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -4535,7 +4535,7 @@ snapshots: eslint-import-resolver-node@0.3.10: dependencies: debug: 3.2.7 - is-core-module: 2.16.1 + is-core-module: 2.16.2 resolve: 2.0.0-next.6 transitivePeerDependencies: - supports-color @@ -4569,7 +4569,7 @@ snapshots: eslint-import-resolver-node: 0.3.10 eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.59.2(eslint@10.3.0)(typescript@6.0.3))(eslint-import-resolver-node@0.3.10)(eslint@10.3.0) hasown: 2.0.3 - is-core-module: 2.16.1 + is-core-module: 2.16.2 is-glob: 4.0.3 minimatch: 3.1.5 object.fromentries: 2.0.8 @@ -4701,7 +4701,7 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.1: {} + fast-uri@3.1.2: {} fast-wrap-ansi@0.2.0: dependencies: @@ -4951,7 +4951,7 @@ snapshots: dependencies: ci-info: 2.0.0 - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: hasown: 2.0.3 @@ -5232,7 +5232,7 @@ snapshots: natural-compare@1.4.0: {} - node-abi@3.90.0: + node-abi@3.91.0: dependencies: semver: 7.7.4 optional: true @@ -5433,7 +5433,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.90.0 + node-abi: 3.91.0 pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1 @@ -5533,14 +5533,14 @@ snapshots: resolve@1.22.12: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 + is-core-module: 2.16.2 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 resolve@2.0.0-next.6: dependencies: es-errors: 1.3.0 - is-core-module: 2.16.1 + is-core-module: 2.16.2 node-exports-info: 1.6.0 object-keys: 1.1.1 path-parse: 1.0.7 diff --git a/server/Cargo.lock b/server/Cargo.lock index 3c9d4fd0..b979d999 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -1895,7 +1895,7 @@ dependencies = [ [[package]] name = "htmd" version = "0.5.4" -source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#68b5d9cfa22131ea32c71fa480b6746828700cc6" +source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#deafeb4b579530a94314828218cfbda79c615ef8" dependencies = [ "html5ever", "markup5ever_rcdom", @@ -1904,9 +1904,9 @@ dependencies = [ [[package]] name = "html5ever" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1054432bae2f14e0061e33d23402fbaa67a921d319d56adc6bcf887ddad1cbc2" +checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" dependencies = [ "log", "markup5ever", @@ -2298,16 +2298,6 @@ version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" -[[package]] -name = "iri-string" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "is_executable" version = "1.0.5" @@ -2675,9 +2665,9 @@ dependencies = [ [[package]] name = "markup5ever" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8983d30f2915feeaaab2d6babdd6bc7e9ed1a00b66b5e6d74df19aa9c0e91862" +checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" dependencies = [ "log", "tendril", @@ -2686,9 +2676,9 @@ dependencies = [ [[package]] name = "markup5ever_rcdom" -version = "0.38.0+unofficial" +version = "0.39.0+unofficial" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "333171ccdf66e915257740d44e38ea5b1b19ce7b45d33cc35cb6f118fbd981ff" +checksum = "3ac010f19d6c4af81eeb4018a39d7a115de9d285af45c126a4ac02e6fc5716b7" dependencies = [ "html5ever", "markup5ever", @@ -2747,7 +2737,7 @@ dependencies = [ [[package]] name = "minify-html" version = "0.18.1" -source = "git+https://github.com/bjones1/minify-html.git?branch=dev#3eada4dbef725de3ea4ca5075ec9c12618ea4ece" +source = "git+https://github.com/bjones1/minify-html.git?branch=dev#b5cce1953106d00b5e622214a99457d3312c5fa9" dependencies = [ "ahash 0.8.12", "aho-corasick", @@ -2765,7 +2755,7 @@ dependencies = [ [[package]] name = "minify-html-common" version = "0.0.3" -source = "git+https://github.com/bjones1/minify-html.git?branch=dev#3eada4dbef725de3ea4ca5075ec9c12618ea4ece" +source = "git+https://github.com/bjones1/minify-html.git?branch=dev#b5cce1953106d00b5e622214a99457d3312c5fa9" dependencies = [ "ahash 0.8.12", "aho-corasick", @@ -5214,20 +5204,20 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +checksum = "a28f0d049ccfaa566e14e9663d304d8577427b368cb4710a20528690287a738b" dependencies = [ "bitflags", "bytes", "futures-util", "http 1.4.0", "http-body", - "iri-string", "pin-project-lite", "tower", "tower-layer", "tower-service", + "url", ] [[package]] @@ -6195,9 +6185,9 @@ checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" [[package]] name = "xml5ever" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dc9559429edf0cd3f327cc0afd9d6b36fa8cec6d93107b7fbe64f806b5f2d9" +checksum = "5ab627f34ff61b80d756180d556f9c68801d836d271b3b8c094504ceca69d221" dependencies = [ "log", "markup5ever",