diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 08095de8..63517b5d 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # diff --git a/.gitignore b/.gitignore index c355898c..e2b526bc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # diff --git a/.prettierignore b/.prettierignore index dee2f55e..0b05398a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # diff --git a/CHANGELOG.md b/CHANGELOG.md index d1b5e088..e7094dba 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,4 @@ -Copyright (C) 2025 Bryan A. Jones. +Copyright (C) 2026 Bryan A. Jones. This file is part of the CodeChat Editor. @@ -22,7 +22,14 @@ Changelog [Github master](https://github.com/bjones1/CodeChat_Editor) ----------------------------------------------------------- -* No changes yet. +* No changes. + +Version 0.2.3 -- 2026-Sep-09 +---------------------------- + +* Alpha: added support for and . +* Improved Client editing experience -- fewer places exist where starting a new + heading, list item, etc. is removed immediately after creation. Version 0.2.2 -- 2026-Aug-28 ---------------------------- diff --git a/CLAUDE.md b/CLAUDE.md index 354a7513..5d8c171e 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -12,9 +12,10 @@ blocks may consist entirely of a comment, as illustrated below. A doc block consists of a comment (inline or block) optionally preceded by whitespace and optionally succeeded by whitespace. At least one whitespace character must separate the opening comment delimiter from the doc block text. -Doc blocks are differentiated by their indent: the whitespace characters -preceding the opening comment delimiter. Adjacent doc blocks with identical -indents are combined into a single, larger doc block. +Doc blocks are differentiated by their indent -- the whitespace characters +preceding the opening comment delimiter -- and by the opening comment delimiter +itself. Adjacent doc blocks are combined into a single, larger doc block only +when both their indent and their delimiter match. ```c // This is all one doc block, since only the preceding @@ -22,10 +23,10 @@ indents are combined into a single, larger doc block. // whitespace following the opening comment delimiters. // This is the beginning of a different doc // block, since the indent is different. - // Here's a third doc block; inline and block comments - /* combine as long as the whitespace preceding the comment -delimiters is identical. Whitespace inside the comment doesn't affect - the classification. */ + // Here's a third doc block. + /* And here's a fourth: a different opening delimiter starts a new doc + block even at an identical indent. Whitespace inside the comment + doesn't affect the classification. */ // These are two separate doc blocks, void foo(); // since they are separated by a code block. @@ -34,7 +35,10 @@ void foo(); Architecture ------------ -A Visual Studio Code extension in `extensions/VSCode` exchanges messages with the CodeChat Editor Server, located in `server/` (also terms the Server), which also exchanges message with the CodeChat Editor Client (also termed the Client) located in `client/`. +A Visual Studio Code extension in `extensions/VSCode` exchanges messages with +the CodeChat Editor Server, located in `server/` (also termed the Server), which +also exchanges messages with the CodeChat Editor Client (also termed the Client) +located in `client/`. Project build ------------- @@ -42,5 +46,153 @@ Project build All build commands must be executed from the `server/` directory. * To build the entire project, execute `./bt build`. +* To format and lint the entire project, execute `./bt flint`. * To build (bundle) only the Client, execute `./bt client-build`. * To run tests, execute `cargo test`. + +Commenting guide +---------------- + +This program uses a literate programming approach: comments are prose meant to +be read from top to bottom alongside the code, not annotations bolted onto +individual statements. + +`docs/style_guide.cpp` is the project's canonical, reader-facing style guide; +this section is a digest of it aimed at the Rust and TypeScript in this repo. +When asked to change "the style guide", edit that file, and keep the two +consistent. + +### What to comment + +* Use meaningful, descriptive names for variables, classes, functions, etc. Code + should be as self-documenting as possible. + +* Avoid comments when possible. Comments must describe current code, not its + history. Only add comments which supply what self-documenting code cannot. + +* Comments must satisfy at least one of these criteria: + + 1. Document a connection which cannot easily be determined by inspection -- + for example, the relationship between a web client HTTP request and the + Server endpoint which handles it. + 2. Record behavior discoverable only by running or debugging the code: a + third-party library quirk, a browser workaround, an ordering constraint. + Behavior which can be derived directly from the code should not produce a + comment. + 3. Capture design choices, requirements, etc. which specify the overall + purpose of the code at a higher level than the implementation. + 4. Link to an external reference (a manual, specification, etc.) which + explains a subtle design choice. +* Do not restate the code. Say what the item does, then add what the reader + cannot derive from the signature: + + ```rust + // Bad -- the signature already says this. + /// Set the file's contents to the given string. + fn set_contents(&mut self, contents: String); + + // Good -- keeps the summary, adds the constraint. + /// Replace the file's contents. The Client autosaves, so this runs on every + /// pause in typing; keep it cheap and idempotent. + fn set_contents(&mut self, contents: String); + ``` + +* Scale a comment's length to its altitude instead of aiming for uniform + brevity: file- and section-level comments carry the design narrative and may + run for dozens of lines (see `server/src/processing/cache.rs`), while a + comment on a single statement is a line or two. + +* In new work, mark deferred work with `TODO:` followed by both the task and the + condition which will resolve it, so a later reader knows when it may be + removed. Many existing `TODO`s predate this rule; leave them alone unless you + are already editing that code. + +* When implementing equations, place a comment giving the formula, along with an + explanation of the terms used, before the code implementing it. Use + LaTeX-style syntax: $x^2$. + +### Where to place comments + +Place documentation before the code it describes. In new and edited code, +comment each function parameter individually, and document the return value with +a comment placed immediately before the return type -- including in Rust, where +rustdoc renders neither. Many existing signatures are not yet annotated this +way; add annotations to signatures you touch rather than sweeping the tree: + +```rust +/// Phase 1 of hydration: parse the HTML, walk the DOM, then commit the +/// collected facts to the cache. +fn hydrate_dom( + // The HTML to hydrate. + html: &str, + // The cache for the project containing this file. + cache: &Arc>, + // The parsed, patched DOM plus the walk results needed by later phases. +) -> io::Result<(Rc, WalkContext)> { +``` + +### Doc block constraints + +Because comments become doc blocks, these mechanical rules apply: + +* Hold the indent *and* the delimiter constant across a comment's lines, and + match the indent to that of the code being described. +* Denote paragraphs using an empty comment (`//` or `///`), not an empty line. +* A comment on the same line as code is never a doc block; it stays part of the + code block. + +### File structure + +Source files follow this template (a few predate it; match it in new files): + +1. Crate-level attributes (Rust only). +2. The GPL copyright and license block, copied verbatim from a neighboring file + rather than retyped. In Rust it uses plain `//`, so it stays a doc block + separate from the title which follows it. +3. A single level-1 heading titling the file: the file name in a monospaced font + -- matching the file's actual name -- then `--`, then a short description. +4. The file-level design narrative, if the file needs one. +5. A `Modules` section, if the file has submodules, then an `Imports` section. + In Rust its subsections are `### Standard library`, `### Third-party`, and + `### Local`; the Client and the VSCode extension use their own names, so + follow the file you are editing. +6. The code, organized under further headings which outline the file. Don't skip + heading levels. + +Employ Markdown syntax throughout. Use setext underlines (`====` and `----`) for +heading levels 1 and 2, and ATX markers (`###`, `####`) for level 3 and below; +underline the full width of the heading text. Use asterisks for bullets, +emphasis, and strong emphasis. Wrap lines at 80 characters; if the indent +exceeds column 40, wrap at 40 columns past the indent instead of at column 80. + +```rust +//! `cache.rs` -- Keep a cache used to store all targets in a project +//! ================================================================= +//! +//! The cache stores the location and contents of every target in a project... + +// Imports +// ------- +// +// ### Standard library +use std::collections::HashMap; +``` + +### Rust specifics + +* Write file-level prose -- the title heading and the design narrative -- with + `//!`, so that it documents the module. +* Use `///` where allowed by rustdoc (functions, structs, enums, traits, and + macros); use `//` otherwise. + +### TypeScript specifics + +* Use `//` tags instead of `/**` blocks. +* Document parameters as described above instead of using `@param` tags. + +### Editing existing comments + +Comments describe the code as it now stands. When changing code inside a +documented region, revise the surrounding prose so that it still reads as a +continuous narrative: do not append a new comment beside text which the change +has made stale, and delete comments describing code which no longer exists. diff --git a/README.md b/README.md index eb58c430..804b29a0 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,16 @@ Switching documents in the IDE likewise switches the document shown in the CodeChat Editor. Likewise, following hyperlinks in the CodeChat Editor to a local file loads that file in the IDE, as well as showing it in the Editor. +

Projects

+ +The CodeChat Editor can either display a single file, or a project. In a +project, the table of contents is displayed on the left, while a file within the +project is displayed on the right. To create a project, simply place a file +named `toc.md` at the root of your project [\[2\]](#notes); its contents define +the table of contents. See the +[new project template](https://github.com/bjones1/CodeChat_Editor/tree/main/new-project-template) +for a simple example. + References to other files ------------------------- @@ -129,6 +139,49 @@ docs/ monitor.png ``` +

Cross-references

+ +Any HTML element with an id can be the target of either a hyperlink or a +cross-reference. If the id resides in a file within a [project](#cc-DscjSxRZHF), +then any file in that same project can refer to that id using a hyperlink or +cross-reference. For example: + +| Source | Rendered | +| ----------------------------------- | --------------------------------- | +| `[Style guide](#cc-nNZ6Gs2uWD)` | [Style guide](#cc-nNZ6Gs2uWD) | +| `` | | + +In projects, each id must be unique throughout the entire project. To simplify +the creation of unique ids, items assigned an `id="*"` with be replaced with a +unique id, such as `id=cc-DscjSxRZHF`. This autogenerated id isn't automatically +saved; you must make an edit to its containing file in the Client to save the +resulting id. + +

Gathering fragments

+ +Often, closely-related routines must be scattered across the source tree. For +example, a client's HTTP request and the corresponding server-side endpoint +which responds to that request are usually placed in separate files, even though +these are tightly coupled. The CodeChat Editor therefore supports gathering +these scattered fragments into one central location to better explain the code. +To do so: + +1. In a doc block preceding a code fragment to gather, add a ``. Do this for each fragment to gather. By + default, a fragment includes the doc block it was placed in along with the + next code/doc block. To include additional content, add the `following` + attribute: ``. For + example, the starting ID for the websocket connection between the CodeChat + Server (written in Rust) and the CodeChat Client (written in TypeScript) both + have `` tags. +2. In a doc block or a Markdown file, place an HTML element with both an id and + a `data-gather` attribute, such as `

Gathered code

`. Below + the the result of a gather tag for these fragments: + +

Starting websocket ID

+ Images ------ @@ -144,17 +197,6 @@ The CodeChat Editor disallows drag-and-drop of images, the result is a mess -- the image data is embedded directly in the source file. Avoid this; instead, place images in a separate file, then reference them as shown above. -Projects --------- - -The CodeChat Editor can either display a single file, or a project. In a -project, the table of contents is displayed on the left, while a file within the -project is displayed on the right. To create a project, simply place a file -named `toc.md` at the root of your project [\[2\]](#notes); its contents define -the table of contents. See the -[new project template](https://github.com/bjones1/CodeChat_Editor/tree/main/new-project-template) -for a simple example. - Mathematics ----------- @@ -268,6 +310,42 @@ can be directly edited by that package: ![](docs/sample_diagram.drawio.svg) +Research capture +---------------- + +The VS Code extension can record dissertation study capture events when a +participant explicitly opts in. A participant first registers in the capture +portal, which emails a capture token. In VS Code, run **Manage CodeChat Editor +Capture** or **CodeChat Editor: Enter Capture Token** from the command palette, +paste the token, then turn on consent and recording from the same capture +manager. + +The token is imported through the VS Code UI and persisted only in VS Code +SecretStorage. It is never written to workspace settings, repository files, or a +JSON configuration file. The extension asks CaptureWebService for token status; +the status item and capture manager show whether the token is accepted, +rejected, unavailable, or disabled by the portal. The participant ID used in +events comes from that status response, not from the token text. + +CodeChat no longer connects directly to the remote capture database and no +longer reads or stores database credentials. The old local JSON database-secret +configuration path has been removed. Capture events now leave CodeChat only by +calling CaptureWebService with the portal-issued bearer token; any database +writer role remains inside the service deployment. + +Events are sanitized, written to a durable local FIFO spool in VS Code's global +extension storage, then uploaded to CaptureWebService. Spooled events carry only +a non-secret token hash/service identity so events from an old token are not +uploaded under a new token. Offline recording is allowed only after the same +token and service URL have previously been verified as capture-enabled; a token +disabled by the portal remains disabled while the service is unavailable. If the +network or service is unavailable after the token has been accepted at least +once, queued events remain in the spool and upload as soon as the matching token +and service are available again. The capture service endpoint can be changed in +the user-level `CodeChatEditor.Capture.ServiceBaseUrl` setting; workspace values +are ignored for this token-bearing endpoint. Token-bearing requests require +HTTPS except for localhost development endpoints. + Supported languages --------------------------------------------------- diff --git a/builder/.gitignore b/builder/.gitignore index 2d3f357d..b1c67906 100644 --- a/builder/.gitignore +++ b/builder/.gitignore @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # diff --git a/builder/Cargo.lock b/builder/Cargo.lock index 45911b76..c6ecf0a0 100644 --- a/builder/Cargo.lock +++ b/builder/Cargo.lock @@ -128,7 +128,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -363,9 +363,9 @@ checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" [[package]] name = "portable-atomic-util" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a106d1259c23fac8e543272398ae0e3c0b8d33c88ed73d0cc71b0f1d902618" +checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" dependencies = [ "portable-atomic", ] @@ -462,7 +462,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -484,9 +484,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" dependencies = [ "proc-macro2", "quote", @@ -510,7 +510,7 @@ checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] diff --git a/builder/Cargo.toml b/builder/Cargo.toml index df465ba0..61d4d5d6 100644 --- a/builder/Cargo.toml +++ b/builder/Cargo.toml @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # diff --git a/builder/src/main.rs b/builder/src/main.rs index 156ac8e2..0a2b5f64 100644 --- a/builder/src/main.rs +++ b/builder/src/main.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 @@ -13,21 +13,21 @@ // 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](http://www.gnu.org/licenses). -/// `main.rs` -- Entrypoint for the `CodeChat` Editor Builder -/// ======================================================= -/// -/// This code uses [dist](https://opensource.axo.dev/cargo-dist/book/) as a part -/// of the release process. To update the `./release.yaml` file this tool -/// creates: -/// -/// 1. Edit `server/dist-workspace.toml`: change `allow-dirty` to `[]`. -/// 2. Run `dist init` and accept the defaults, then run `dist generate`. -/// 3. Review changes to `./release.yaml`, reapplying hand edits. -/// 4. Revert the changes to `server/dist-workspace.toml`. -/// 5. Test -/// -/// Keep the `DIST_VERSION` consistent with the version of dist in -/// `dist-workspace.toml` on release. +//! `main.rs` -- Entrypoint for the `CodeChat` Editor Builder +//! ======================================================= +//! +//! This code uses [dist](https://opensource.axo.dev/cargo-dist/book/) as a part +//! of the release process. To update the `./release.yaml` file this tool +//! creates: +//! +//! 1. Edit `server/dist-workspace.toml`: change `allow-dirty` to `[]`. +//! 2. Run `dist init` and accept the defaults, then run `dist generate`. +//! 3. Review changes to `./release.yaml`, reapplying hand edits. +//! 4. Revert the changes to `server/dist-workspace.toml`. +//! 5. Test +//! +//! Keep the `DIST_VERSION` consistent with the version of dist in +//! `dist-workspace.toml` on release. // Imports // ------- // @@ -645,6 +645,8 @@ fn run_client_build( let distflag = if dist { "--minify" } else { "--sourcemap" }; // The main build for the Client. + // + //

Overall client build pipeline

run_script( &esbuild, &[ @@ -652,7 +654,6 @@ fn run_client_build( "src/CodeChatEditor.mts", "src/CodeChatEditor-test.mts", "src/css/CodeChatEditorProject.css", - "src/css/CodeChatEditor.css", "--bundle", "--outdir=./static/bundled", distflag, diff --git a/client/.gitignore b/client/.gitignore index 67326985..d6e8c2ce 100644 --- a/client/.gitignore +++ b/client/.gitignore @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # diff --git a/client/.prettierignore b/client/.prettierignore index ee2a4f40..b1667072 100644 --- a/client/.prettierignore +++ b/client/.prettierignore @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/client/.prettierrc.json5 b/client/.prettierrc.json5 index 2683e82b..627d53c7 100644 --- a/client/.prettierrc.json5 +++ b/client/.prettierrc.json5 @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/client/eslint.config.js b/client/eslint.config.js index 5eb7bd63..c9ca0406 100644 --- a/client/eslint.config.js +++ b/client/eslint.config.js @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // This file is part of the CodeChat Editor. // @@ -19,6 +19,7 @@ // `.eslintrc.yml` -- Configure ESLint for this project // ==================================================== import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; +import prettier from "eslint-plugin-prettier"; import css from "@eslint/css"; import eslint from "@eslint/js"; import { defineConfig } from "eslint/config"; @@ -120,8 +121,16 @@ export default defineConfig( files: ["**/*.css"], ignores: ["src/third-party/**"], language: "css/css", - plugins: { css }, + // The `prettier/prettier` rule is enabled directly instead of + // extending `eslint-plugin-prettier/recommended`, since that config + // additionally disables the JavaScript stylistic rules which + // conflict with Prettier -- rules that don't exist (and whose + // plugins aren't loaded) under the CSS language. + plugins: { css, prettier }, extends: ["css/recommended"], + rules: { + "prettier/prettier": "error", + }, }, ]), ); diff --git a/client/package.json5 b/client/package.json5 index 87352243..7e06dccf 100644 --- a/client/package.json5 +++ b/client/package.json5 @@ -1,7 +1,7 @@ /* `package.json5` - JavaScript manifest ===================================== - Copyright (C) 2025 Bryan A. Jones. + Copyright (C) 2026 Bryan A. Jones. This file is part of the CodeChat Editor. @@ -43,7 +43,7 @@ url: 'https://github.com/bjones1/CodeChat_editor', }, type: 'module', - version: '0.2.2', + version: '0.2.3', dependencies: { '@codemirror/commands': '^6.11.0', '@codemirror/lang-cpp': '^6.0.3', @@ -61,38 +61,38 @@ '@codemirror/lang-xml': '^6.1.0', '@codemirror/lang-yaml': '^6.1.3', '@codemirror/language': '^6.12.4', - '@codemirror/legacy-modes': '^6.5.3', - '@codemirror/state': '^6.7.1', - '@codemirror/view': '^6.43.9', - '@hpcc-js/wasm-graphviz': '^1.28.0', + '@codemirror/legacy-modes': '^6.5.4', + '@codemirror/state': '^6.7.4', + '@codemirror/view': '^6.43.11', + '@hpcc-js/wasm-graphviz': '^1.29.0', '@mathjax/mathjax-newcm-font': '^4.1.3', codemirror: '^6.0.2', mathjax: '^4.1.3', mermaid: '^11.17.2', - 'pdfjs-dist': '^6.2.108', - tinymce: '^8.8.2', + 'pdfjs-dist': '^6.3.289', + tinymce: '^8.9.0', 'toastify-js': '^1.12.0', }, devDependencies: { - '@eslint/css': '^1.4.0', + '@eslint/css': '^2.0.0', '@eslint/js': '^10.0.1', '@types/chai': '^5.2.3', '@types/dom-navigation': '^1.0.7', '@types/js-beautify': '^1.14.3', '@types/mocha': '^10.0.10', - '@types/node': '^26.4.0', + '@types/node': '^26.5.0', '@types/toastify-js': '^1.12.4', - '@typescript-eslint/eslint-plugin': '^8.68.0', - '@typescript-eslint/parser': '^8.68.0', + '@typescript-eslint/eslint-plugin': '^8.70.0', + '@typescript-eslint/parser': '^8.70.0', '@typescript/native': 'npm:typescript@^7.0.2', chai: '^6.2.2', esbuild: '^0.28.2', - eslint: '^10.9.1', + eslint: '^10.10.0', 'eslint-config-prettier': '^10.1.8', 'eslint-plugin-import': '^2.32.0', 'eslint-plugin-prettier': '^5.5.6', - globals: '^17.11.0', - mocha: '^11.8.0', + globals: '^17.12.0', + mocha: '^12.0.0', 'npm-check-updates': '^23.1.0', prettier: '^3.9.6', /* Typescript 7 support for eslint is blocked per (this @@ -101,7 +101,7 @@ [Running Typescript 7.0 Side-by-Side with TypeScript 6.0](https://devblogs.microsoft.com/typescript/announcing-typescript-7-0/#running-side-by-side-with-typescript-6.0) for a workaround. */ typescript: 'npm:@typescript/typescript6@^6.0.2', - 'typescript-eslint': '^8.68.0', + 'typescript-eslint': '^8.70.0', }, scripts: { test: 'echo "Error: no test specified" && exit 1', diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml index 67f9977d..ba76ff94 100644 --- a/client/pnpm-lock.yaml +++ b/client/pnpm-lock.yaml @@ -57,17 +57,17 @@ importers: specifier: ^6.12.4 version: 6.12.4 '@codemirror/legacy-modes': - specifier: ^6.5.3 - version: 6.5.3 + specifier: ^6.5.4 + version: 6.5.4 '@codemirror/state': - specifier: ^6.7.1 - version: 6.7.1 + specifier: ^6.7.4 + version: 6.7.4 '@codemirror/view': - specifier: ^6.43.9 - version: 6.43.9 + specifier: ^6.43.11 + version: 6.43.11 '@hpcc-js/wasm-graphviz': - specifier: ^1.28.0 - version: 1.28.0 + specifier: ^1.29.0 + version: 1.29.0 '@mathjax/mathjax-newcm-font': specifier: ^4.1.3 version: 4.1.3 @@ -81,21 +81,21 @@ importers: specifier: ^11.17.2 version: 11.17.2 pdfjs-dist: - specifier: ^6.2.108 - version: 6.2.108 + specifier: ^6.3.289 + version: 6.3.289 tinymce: - specifier: ^8.8.2 - version: 8.8.2 + specifier: ^8.9.0 + version: 8.9.0 toastify-js: specifier: ^1.12.0 version: 1.12.0 devDependencies: '@eslint/css': - specifier: ^1.4.0 - version: 1.4.0 + specifier: ^2.0.0 + version: 2.0.0 '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.9.1(supports-color@8.1.1)) + version: 10.0.1(eslint@10.10.0(supports-color@8.1.1)) '@types/chai': specifier: ^5.2.3 version: 5.2.3 @@ -109,17 +109,17 @@ importers: specifier: ^10.0.10 version: 10.0.10 '@types/node': - specifier: ^26.4.0 - version: 26.4.0 + specifier: ^26.5.0 + version: 26.5.0 '@types/toastify-js': specifier: ^1.12.4 version: 1.12.4 '@typescript-eslint/eslint-plugin': - specifier: ^8.68.0 - version: 8.68.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1))(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) + specifier: ^8.70.0 + version: 8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1))(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) '@typescript-eslint/parser': - specifier: ^8.68.0 - version: 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) + specifier: ^8.70.0 + version: 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -130,23 +130,23 @@ importers: specifier: ^0.28.2 version: 0.28.2 eslint: - specifier: ^10.9.1 - version: 10.9.1(supports-color@8.1.1) + specifier: ^10.10.0 + version: 10.10.0(supports-color@8.1.1) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.9.1(supports-color@8.1.1)) + version: 10.1.8(eslint@10.10.0(supports-color@8.1.1)) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1))(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) + version: 2.32.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) eslint-plugin-prettier: specifier: ^5.5.6 - version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.9.1(supports-color@8.1.1)))(eslint@10.9.1(supports-color@8.1.1))(prettier@3.9.6) + version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.10.0(supports-color@8.1.1)))(eslint@10.10.0(supports-color@8.1.1))(prettier@3.9.6) globals: - specifier: ^17.11.0 - version: 17.11.0 + specifier: ^17.12.0 + version: 17.12.0 mocha: - specifier: ^11.8.0 - version: 11.8.0 + specifier: ^12.0.0 + version: 12.0.0 npm-check-updates: specifier: ^23.1.0 version: 23.1.0 @@ -157,17 +157,23 @@ importers: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' typescript-eslint: - specifier: ^8.68.0 - version: 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) + specifier: ^8.70.0 + version: 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) packages: - '@antfu/install-pkg@1.1.0': - resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@antfu/install-pkg@2.0.1': + resolution: {integrity: sha512-iCKVQcIC0e3oDxEfs3SHQGW+ovhBMZmS1TE+bTk50rVyMCBmCfClv7Qi3HQKlumYwvjb/iIMeWCW2i67q6kFfQ==} '@braintree/sanitize-url@7.1.2': resolution: {integrity: sha512-jigsZK+sMF/cuiB7sERuo9V7N9jx+dhmHHnQyDSVdpZwVutaBu7WvNYqMDLSgFgfB30n452TP3vjDAvFC973mA==} + '@cacheable/memory@2.2.0': + resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} + + '@cacheable/utils@2.5.0': + resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} + '@chevrotain/types@11.1.2': resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==} @@ -222,20 +228,20 @@ packages: '@codemirror/language@6.12.4': resolution: {integrity: sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==} - '@codemirror/legacy-modes@6.5.3': - resolution: {integrity: sha512-xCsmIzH78MyWkib9jlPaaun57XNkfbMIhagfaZVd0iLTqlpw3jXaIcbZm72MTmmn64eTZpBVNjbyYh+QXnxRsg==} + '@codemirror/legacy-modes@6.5.4': + resolution: {integrity: sha512-/cZr6qZyl08iYNLGsJ862CXXNI51LryRFRE40ejgoIjXZz0C1rGkD3/Ek5jM/8w1ceRjqtt4qx/KLMh4zBTgew==} '@codemirror/lint@6.9.7': resolution: {integrity: sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==} - '@codemirror/search@6.7.1': - resolution: {integrity: sha512-uMe5UO6PamJtSHrXhhHOzSX3ReWtiJrva6GnPMwSOrZtiExb5X5eExhr2OUZQVvdxPsKpY3Ro2mFbQadpPWmHA==} + '@codemirror/search@6.7.2': + resolution: {integrity: sha512-gUYkYhT2+n/+VGZ+8EzE5WFkYZUZYm1VOKDudIsNqh42uRVQJ0a6Yss9sdKT3MeOYfuL1N6AZA57oza0Oyr0LA==} - '@codemirror/state@6.7.1': - resolution: {integrity: sha512-9QzNDgE4EYDnAHfrTlR2lwiPciiOymLtwKK+8yHQzCc7GXhAP9xdEbEJFy2IWB1j9UGUl9BsgMmTo/ImA02T7A==} + '@codemirror/state@6.7.4': + resolution: {integrity: sha512-QhQIVRY+xHZDxwOSFrJ1eUMapJBUID3IdeAjf7dHO7zBUzSkyooHiodnalz5MG3iHzwixKMlAAyn7244y537EA==} - '@codemirror/view@6.43.9': - resolution: {integrity: sha512-sTuUzTpPMFebRhg6dawChoKKgndIwfjmJgKVxBefPElcU2NwQ6AFroupk0SFqEerQyZOGRfDNnSN8Dw/lMAsXw==} + '@codemirror/view@6.43.11': + resolution: {integrity: sha512-2+esucbQX6wB2JYi1eDvdCPFTA31BN8oSy6xCmk3G6CloV11yOvEjYk+gH7kLrP0MuHG94E8WDhjs5oMiu3+Wg==} '@esbuild/aix-ppc64@0.28.2': resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==} @@ -415,12 +421,12 @@ packages: resolution: {integrity: sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/css-tree@4.0.5': - resolution: {integrity: sha512-iPmijIAq4hlIJB86PYmY/fcZORHtjphSqICDbwuw32A/JmkhZQ/K/6TjHE03zqf3n5yABpVcbRAMG8Mi9ojy8g==} + '@eslint/css-tree@4.1.0': + resolution: {integrity: sha512-cg0ohyrAG3swyGqt8t1K/OK97DqBw/ftDvlvyY1fmEst5B40UOmsimwLENq74z2dyw5CDM+3zJIW+CV2nFNDdA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/css@1.4.0': - resolution: {integrity: sha512-OnRNKgnbX+tufPuZc2kOJS+v1iIARvfJHRNEAVwN77DBpojl+rGjEP8NKTL6pEZ7BR+HtwIuSSdrymEFlANGxg==} + '@eslint/css@2.0.0': + resolution: {integrity: sha512-lODVRbtxOXgcSOWNvv3gE4A8oRTSUHefA0tX9zrWUD57F+5RTLGDX9I8bnHQROO8nWb0hrmke0uO23pTlNfZ0A==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@eslint/js@10.0.1': @@ -436,12 +442,12 @@ packages: resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.7.2': - resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + '@eslint/plugin-kit@0.7.3': + resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@hpcc-js/wasm-graphviz@1.28.0': - resolution: {integrity: sha512-KqvPy7ckxPc1xv8Kt7H3bo9cj8U4gfOXxQ8grLZvDZxyQQjnXsKxrweJLLJtEoWWtQqAk4biUB0g2qsjkTiMVA==} + '@hpcc-js/wasm-graphviz@1.29.0': + resolution: {integrity: sha512-irr5OCt1G5s5j75jlGZm3Y5fb6DboE2c/aWiM/Fv/b3NygbJY/Rp8335kS5Qeklsib0dWInjAYCj4UEClIYQmQ==} '@humanfs/core@0.19.2': resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==} @@ -466,12 +472,17 @@ packages: '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@iconify/utils@3.1.4': - resolution: {integrity: sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==} + '@iconify/utils@3.1.7': + resolution: {integrity: sha512-JZHlwdID+dy+lTgbYC8NEC4zeugqeYsc6jewvzb4c58kHauJn+X7rNwQjxz5p2qSjqaEeQoLkCIQ9v/H4PK0/w==} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.6.0 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} '@lezer/common@1.5.2': resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==} @@ -491,8 +502,8 @@ packages: '@lezer/html@1.3.13': resolution: {integrity: sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==} - '@lezer/java@1.1.3': - resolution: {integrity: sha512-yHquUfujwg6Yu4Fd1GNHCvidIvJwi/1Xu2DaKl/pfWIA2c1oXkVvawH3NyXhCaFx4OdlYBVX5wvz2f7Aoa/4Xw==} + '@lezer/java@1.1.4': + resolution: {integrity: sha512-gQylJ2xHV2xXsVqtnAcJrcROvLZJaQiC0tR//+q0k961BxqvyYttusPkJ8d9T1fPDJKHJW2etUH8XbIn9jhVUg==} '@lezer/javascript@1.5.4': resolution: {integrity: sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==} @@ -506,8 +517,8 @@ packages: '@lezer/markdown@1.7.2': resolution: {integrity: sha512-iTkYvoVcKt3WkeL7qUDyXHONZEwLio4wj8KTNi2dnjQEXBZKMV63BpQrPqfsM+OkvuRbiSTAcycYAsQzLhRNoQ==} - '@lezer/php@1.0.5': - resolution: {integrity: sha512-W7asp9DhM6q0W6DYNwIkLSKOvxlXRrif+UXBMxzsJUuqmhE7oVU+gS3THO4S/Puh7Xzgm858UNaFi6dxTP8dJA==} + '@lezer/php@1.0.6': + resolution: {integrity: sha512-QJ2xNXPmsm/Z3IpThq8fnJrEIVpxhsIoj6GZBW0JYEd/l9zxpJZW216X4fzqQY4vgpdGIumypvI4uQjd4tnYtw==} '@lezer/python@1.1.19': resolution: {integrity: sha512-MhQIURHRytsNzP/YXnqpYKW6la6voAH3kyplTOOiCdjyFY6cWWGFVmYVdHIPrElqSDf4iCDktQCockB9FxuhzQ==} @@ -605,10 +616,6 @@ packages: resolution: {integrity: sha512-/SaLcvlqGWdm0HSCWMgHu7cjJiQXfP8/mOY+6dUyV9flQz7sPBBZ+ed2zYtoukojPmxOaL7bm+d/G4GeWWoN7g==} engines: {node: '>= 10'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@pkgr/core@0.3.6': resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -739,8 +746,8 @@ packages: '@types/mocha@10.0.10': resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} - '@types/node@26.4.0': - resolution: {integrity: sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==} + '@types/node@26.5.0': + resolution: {integrity: sha512-dVSGpriSoCgz8WnDNTuSSuSv1PC/ALXihO4ulRZt7Md8k9mlbdin3lGOcDE8SnWOgf513ByWlXd7BK4azmyg/A==} '@types/toastify-js@1.12.4': resolution: {integrity: sha512-zfZHU4tKffPCnZRe7pjv/eFKzTVHozKewFCKaCjZ4gFinKgJRz/t0bkZiMCXJxPhv/ZoeDGNOeRD09R0kQZ/nw==} @@ -748,63 +755,63 @@ packages: '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - '@typescript-eslint/eslint-plugin@8.68.0': - resolution: {integrity: sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==} + '@typescript-eslint/eslint-plugin@8.70.0': + resolution: {integrity: sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.68.0 + '@typescript-eslint/parser': ^8.70.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.68.0': - resolution: {integrity: sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==} + '@typescript-eslint/parser@8.70.0': + resolution: {integrity: sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==} 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.68.0': - resolution: {integrity: sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==} + '@typescript-eslint/project-service@8.70.0': + resolution: {integrity: sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.68.0': - resolution: {integrity: sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==} + '@typescript-eslint/scope-manager@8.70.0': + resolution: {integrity: sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.68.0': - resolution: {integrity: sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==} + '@typescript-eslint/tsconfig-utils@8.70.0': + resolution: {integrity: sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.68.0': - resolution: {integrity: sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==} + '@typescript-eslint/type-utils@8.70.0': + resolution: {integrity: sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==} 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.68.0': - resolution: {integrity: sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==} + '@typescript-eslint/types@8.70.0': + resolution: {integrity: sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.68.0': - resolution: {integrity: sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==} + '@typescript-eslint/typescript-estree@8.70.0': + resolution: {integrity: sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.68.0': - resolution: {integrity: sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==} + '@typescript-eslint/utils@8.70.0': + resolution: {integrity: sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==} 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.68.0': - resolution: {integrity: sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==} + '@typescript-eslint/visitor-keys@8.70.0': + resolution: {integrity: sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/typescript-aix-ppc64@7.0.2': @@ -947,22 +954,6 @@ packages: ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.3.0: - resolution: {integrity: sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1012,9 +1003,6 @@ packages: brace-expansion@1.1.18: resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} - brace-expansion@2.1.4: - resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} - brace-expansion@5.0.9: resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} engines: {node: 20 || >=22} @@ -1022,6 +1010,9 @@ packages: browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + cacheable@2.5.0: + resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1034,36 +1025,17 @@ packages: resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} engines: {node: '>= 0.4'} - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - chai@6.2.2: resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==} engines: {node: '>=18'} - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chokidar@4.0.3: - resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} - engines: {node: '>= 14.16.0'} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + chokidar@5.0.0: + resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==} + engines: {node: '>= 20.19.0'} codemirror@6.0.2: resolution: {integrity: sha512-VhydHotNW5w1UGK0Qj96BwSk/Zqbp9WbnyK2W/eVMv4QyF41INRGpjUhFJY7/uDNuudSc33a/PKr4iDqRduvHw==} - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -1098,8 +1070,8 @@ packages: peerDependencies: cytoscape: ^3.2.0 - cytoscape@3.34.2: - resolution: {integrity: sha512-Cm2jaj1X/PBNlzV9yH8zcfGOxO7U+CJ/+mxSBVPSchLaugdp4jtlGx5qaHtPRZ6tgiZ5P+o1XoRfJA+ba6KM3g==} + cytoscape@3.34.3: + resolution: {integrity: sha512-yfYGhRcGAntq6YBD583j4n0Eg3jIxvWmZtz/5uz9UYkeIStSlMxuUja+ec5j3iBD8nv1rwaOAYMW09tBdkSeaQ==} engines: {node: '>=0.10'} d3-array@2.12.1: @@ -1276,10 +1248,6 @@ packages: supports-color: optional: true - decamelize@4.0.0: - resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} - engines: {node: '>=10'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -1294,30 +1262,21 @@ packages: delaunator@5.1.0: resolution: {integrity: sha512-AGrQ4QSgssa1NGmWmLPqN5NY2KajF5MqxetNEO+o0n3ZwZZeTmt7bBnvzHWrmkZFxGgr4HdyFgelzgi06otLuQ==} - diff@7.0.0: - resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} + diff@9.0.0: + resolution: {integrity: sha512-svtcdpS8CgJyqAjEQIXdb3OjhFVVYjzGAPO8WGCmRbrml64SPw/jJD4GoE98aR7r25A0XcgrK3F02yw9R/vhQw==} engines: {node: '>=0.3.1'} doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} - dompurify@3.4.14: - resolution: {integrity: sha512-dVoH9z+MY+C9IilgGCk3YfFqjLi3fChm2OiKJMzh6axrJ5qwxqWaZamgmHrpv22CN/KdbZJuGEGgfQoL00LTdg==} + dompurify@3.4.15: + resolution: {integrity: sha512-EUBjM+B+lkDE41iE82DDSCfkoPGfXx8IxFxPMjNzm/Uk4xDet77rTN9wqlxlVg71kK7XGuUMv6wUxJUwwv+Xyw==} dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - es-abstract-get@1.0.0: resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==} engines: {node: '>= 0.4'} @@ -1350,18 +1309,14 @@ packages: resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} engines: {node: '>= 0.4'} - es-toolkit@1.51.0: - resolution: {integrity: sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw==} + es-toolkit@1.52.0: + resolution: {integrity: sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==} esbuild@0.28.2: resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} engines: {node: '>=18'} hasBin: true - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -1432,8 +1387,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.9.1: - resolution: {integrity: sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A==} + eslint@10.10.0: + resolution: {integrity: sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1486,21 +1441,15 @@ packages: picomatch: optional: true - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + file-entry-cache@11.1.5: + resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true + flat-cache@6.1.23: + resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} flatted@3.4.4: resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} @@ -1509,10 +1458,6 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} @@ -1527,10 +1472,6 @@ packages: resolution: {integrity: sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==} engines: {node: '>= 0.4'} - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -1547,13 +1488,12 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob@10.5.0: - resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - 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 + glob@13.0.6: + resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + engines: {node: 18 || 20 || >=22} - globals@17.11.0: - resolution: {integrity: sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==} + globals@17.12.0: + resolution: {integrity: sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==} engines: {node: '>=18'} globalthis@1.0.4: @@ -1590,13 +1530,19 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} + engines: {node: '>=20'} + hasown@2.0.4: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} + + hookified@2.2.0: + resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} @@ -1606,8 +1552,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.6: - resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + ignore@7.0.9: + resolution: {integrity: sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==} engines: {node: '>= 4'} import-meta-resolve@4.2.0: @@ -1672,10 +1618,6 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - is-generator-function@1.1.2: resolution: {integrity: sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==} engines: {node: '>= 0.4'} @@ -1700,10 +1642,6 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} - is-plain-obj@2.1.0: - resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} - engines: {node: '>=8'} - is-regex@1.2.1: resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} engines: {node: '>= 0.4'} @@ -1750,16 +1688,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - js-yaml@4.3.2: - resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} + js-yaml@5.4.1: + resolution: {integrity: sha512-28R/k+NAjeuf7+CKlTxWZVExJGwVVLwY06DgEnOMz2gEpfNkDcD7QvyiVPT0xy0XXhU8vHsd4Ot42OOPdJG7dQ==} hasBin: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -1774,8 +1706,8 @@ packages: resolution: {integrity: sha512-Eeo8Ys1doU1z+x8AZsPpQu+p/QcZBI5PeOo7QGQdy2x2m0MU/hYagBbGOmXwr5KVbEfVuWv9LpnQWeehogurjg==} hasBin: true - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} khroma@2.1.0: resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} @@ -1797,12 +1729,9 @@ packages: lodash-es@4.18.1: resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@11.5.2: + resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==} + engines: {node: 20 || >=22} marked@16.4.2: resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==} @@ -1816,8 +1745,8 @@ packages: mathjax@4.1.3: resolution: {integrity: sha512-BN/8Pkgn7G1pIDYJqd9md+JHsE/jydSYbyOZnSdSA0WziuVO8mRxdYiWFumkVVly/8U+hm9DpIIoWuvySverzw==} - mdn-data@2.29.0: - resolution: {integrity: sha512-pVxQFCcaYUEAH853+v7yoI/qzhxXSq1bTb9obMYGYAN1c3Hen+XDCEvr296XhstrwlSTNgOR7mCSD4JPjbJe5A==} + mdn-data@2.34.0: + resolution: {integrity: sha512-OgIlLv0NxJKVW4GTSAoEgpRGd4F2XCqGinK0MsMlBCCS/Zcm2/LsbercNWNA7PeMMcjl75NnI97eqyo7zkdxWA==} mermaid@11.17.2: resolution: {integrity: sha512-V6K3C8EBdEsPFZXSKMJe6ppQOENxuHARr9GvHX4hh47lAbhMRD9qf4oEK7LoaRQxULMa80/qt5gHO73aCleBBg==} @@ -1829,10 +1758,6 @@ packages: minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} - minimatch@9.0.9: - resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} - engines: {node: '>=16 || 14 >=14.17'} - minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -1840,9 +1765,9 @@ packages: resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==} engines: {node: '>=16 || 14 >=14.17'} - mocha@11.8.0: - resolution: {integrity: sha512-VyCeUdGN3A9lmCTTgG4yuvY9ixxaDk+xt2R/7/+1AP6EqNG+G9OKkzBwhVtVYoNX8YsxNSgAl8mOv3IAeOpFbw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + mocha@12.0.0: + resolution: {integrity: sha512-NYNh5IFt6WYqm9bi4601m7vix8MZdXC0DwS4gY6WhXO2RgJWhivhISVmq1oklCif18OSI9l+vx5Mdm5oh1XGiQ==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true ms@2.1.3: @@ -1904,9 +1829,6 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@1.8.0: resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==} @@ -1924,12 +1846,12 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + path-scurry@2.0.2: + resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + engines: {node: 18 || 20 || >=22} - pdfjs-dist@6.2.108: - resolution: {integrity: sha512-YxFb+SQcodN2rnX9Tn3dHYlqfb7NjlzzfONPpJd+AKoKtUjEdevTfbC07d5TcczzOK6261auRkP/M8OBHs9vFQ==} + pdfjs-dist@6.3.289: + resolution: {integrity: sha512-ZHjSVpDa3D6izMq8/04lvkhkATUmL9px6ChPaXc1k6nU2Mrhlg1/7F0bdUqCwUjw3NsPTfPZsMDUU6ZIcRaeQw==} engines: {node: '>=22.13.0 || >=24'} picocolors@1.1.1: @@ -1966,12 +1888,13 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + qified@0.10.1: + resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} + engines: {node: '>=20'} - readdirp@4.1.2: - resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} - engines: {node: '>= 14.18.0'} + readdirp@5.1.1: + resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==} + engines: {node: '>= 20.19.0'} reflect.getprototypeof@1.0.10: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} @@ -1981,10 +1904,6 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - resolve@2.0.0-next.7: resolution: {integrity: sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==} engines: {node: '>= 0.4'} @@ -2003,9 +1922,6 @@ packages: resolution: {integrity: sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==} engines: {node: '>=0.4'} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safe-push-apply@1.0.0: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} @@ -2026,8 +1942,9 @@ packages: engines: {node: '>=10'} hasBin: true - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + serialize-javascript@7.1.1: + resolution: {integrity: sha512-k3CMsaIvvdSwm8oLB4MXSl0wH2/cwlH7xGcnRd2DaeRmBkbzYmyT8j0tsX60DwD1eRwHTpNpH8ljKu9oUT1MeQ==} + engines: {node: '>=20.0.0'} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -2065,10 +1982,6 @@ packages: resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==} engines: {node: '>= 0.4'} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2080,14 +1993,6 @@ packages: strictdom@1.0.1: resolution: {integrity: sha512-cEmp9QeXXRmjj/rVp9oyiqcvyocWab/HaoN4+bwFeZ7QzykJD6L3yD4v12K1x0tHpqRqVpJevN3gW7kyM39Bqg==} - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - string.prototype.trim@1.2.11: resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==} engines: {node: '>= 0.4'} @@ -2100,21 +2005,13 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.2.0: - resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} - engines: {node: '>=12'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} + strip-json-comments@5.0.3: + resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} + engines: {node: '>=14.16'} style-mod@4.1.3: resolution: {integrity: sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==} @@ -2122,10 +2019,6 @@ packages: 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==} - engines: {node: '>=8'} - supports-color@8.1.1: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} @@ -2138,16 +2031,16 @@ packages: resolution: {integrity: sha512-eNRKgb3z66Yp3D2CixVujOUvXLFUTij/zVnV8KRyvFdQwpz7I5DS8UfRkTeLzb64u+dkzDSdelE24izu+zSSUg==} engines: {node: ^14.18.0 || >=16.0.0} - tinyexec@1.3.0: - resolution: {integrity: sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==} + tinyexec@1.3.1: + resolution: {integrity: sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==} engines: {node: '>=18'} tinyglobby@0.2.17: resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} - tinymce@8.8.2: - resolution: {integrity: sha512-wcUGaaAf4XFrQtbZtClbDN/QCqklXLlPt3+7UWliEoosuhnTOJUkXwf7Fzlq7agPnwkKKp1e4JGOhx3O1gWH3g==} + tinymce@8.9.0: + resolution: {integrity: sha512-zh9NKpdF89vnqOB3VEkTHiPtltrY6i3vTEVF5+l7vLxMX6lBju7d0UV9wWV7Vm1NyO1PccDCwa6qxAb2pWSvfg==} toastify-js@1.12.0: resolution: {integrity: sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==} @@ -2185,8 +2078,8 @@ packages: resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==} engines: {node: '>= 0.4'} - typescript-eslint@8.68.0: - resolution: {integrity: sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ==} + typescript-eslint@8.70.0: + resolution: {integrity: sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2206,8 +2099,8 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - undici-types@8.3.0: - resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + undici-types@8.9.0: + resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -2244,32 +2137,8 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerpool@9.3.4: - resolution: {integrity: sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs-unparser@2.0.0: - resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} - engines: {node: '>=10'} - - yargs@17.7.3: - resolution: {integrity: sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==} - engines: {node: '>=12'} + workerpool@10.0.3: + resolution: {integrity: sha512-6z2Iis68Wqth93/G/wJP9u+R3O+d2XTlgWChGCwuT1qLbBsOYueGRZuJ++v3mtDP5KjYdy+WzvWC+VWETSVXJA==} yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} @@ -2277,27 +2146,39 @@ packages: snapshots: - '@antfu/install-pkg@1.1.0': + '@antfu/install-pkg@2.0.1': dependencies: package-manager-detector: 1.8.0 - tinyexec: 1.3.0 + tinyexec: 1.3.1 '@braintree/sanitize-url@7.1.2': {} + '@cacheable/memory@2.2.0': + dependencies: + '@cacheable/utils': 2.5.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 + + '@cacheable/utils@2.5.0': + dependencies: + hashery: 1.5.1 + keyv: 5.6.0 + '@chevrotain/types@11.1.2': {} '@codemirror/autocomplete@6.20.3': dependencies: '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 + '@codemirror/state': 6.7.4 + '@codemirror/view': 6.43.11 '@lezer/common': 1.5.2 '@codemirror/commands@6.11.0': dependencies: '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 + '@codemirror/state': 6.7.4 + '@codemirror/view': 6.43.11 '@lezer/common': 1.5.2 '@codemirror/lang-cpp@6.0.3': @@ -2309,7 +2190,7 @@ snapshots: dependencies: '@codemirror/autocomplete': 6.20.3 '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.1 + '@codemirror/state': 6.7.4 '@lezer/common': 1.5.2 '@lezer/css': 1.3.6 @@ -2317,7 +2198,7 @@ snapshots: dependencies: '@codemirror/autocomplete': 6.20.3 '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.1 + '@codemirror/state': 6.7.4 '@lezer/common': 1.5.2 '@lezer/go': 1.0.1 @@ -2327,8 +2208,8 @@ snapshots: '@codemirror/lang-css': 6.3.1 '@codemirror/lang-javascript': 6.2.5 '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 + '@codemirror/state': 6.7.4 + '@codemirror/view': 6.43.11 '@lezer/common': 1.5.2 '@lezer/css': 1.3.6 '@lezer/html': 1.3.13 @@ -2336,15 +2217,15 @@ snapshots: '@codemirror/lang-java@6.0.2': dependencies: '@codemirror/language': 6.12.4 - '@lezer/java': 1.1.3 + '@lezer/java': 1.1.4 '@codemirror/lang-javascript@6.2.5': dependencies: '@codemirror/autocomplete': 6.20.3 '@codemirror/language': 6.12.4 '@codemirror/lint': 6.9.7 - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 + '@codemirror/state': 6.7.4 + '@codemirror/view': 6.43.11 '@lezer/common': 1.5.2 '@lezer/javascript': 1.5.4 @@ -2358,8 +2239,8 @@ snapshots: '@codemirror/autocomplete': 6.20.3 '@codemirror/lang-html': 6.4.12 '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 + '@codemirror/state': 6.7.4 + '@codemirror/view': 6.43.11 '@lezer/common': 1.5.2 '@lezer/markdown': 1.7.2 @@ -2367,15 +2248,15 @@ snapshots: dependencies: '@codemirror/lang-html': 6.4.12 '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.1 + '@codemirror/state': 6.7.4 '@lezer/common': 1.5.2 - '@lezer/php': 1.0.5 + '@lezer/php': 1.0.6 '@codemirror/lang-python@6.2.1': dependencies: '@codemirror/autocomplete': 6.20.3 '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.1 + '@codemirror/state': 6.7.4 '@lezer/common': 1.5.2 '@lezer/python': 1.1.19 @@ -2388,7 +2269,7 @@ snapshots: dependencies: '@codemirror/autocomplete': 6.20.3 '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.1 + '@codemirror/state': 6.7.4 '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.10 @@ -2397,8 +2278,8 @@ snapshots: dependencies: '@codemirror/autocomplete': 6.20.3 '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 + '@codemirror/state': 6.7.4 + '@codemirror/view': 6.43.11 '@lezer/common': 1.5.2 '@lezer/xml': 1.0.6 @@ -2406,7 +2287,7 @@ snapshots: dependencies: '@codemirror/autocomplete': 6.20.3 '@codemirror/language': 6.12.4 - '@codemirror/state': 6.7.1 + '@codemirror/state': 6.7.4 '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.10 @@ -2414,36 +2295,36 @@ snapshots: '@codemirror/language@6.12.4': dependencies: - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 + '@codemirror/state': 6.7.4 + '@codemirror/view': 6.43.11 '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.10 style-mod: 4.1.3 - '@codemirror/legacy-modes@6.5.3': + '@codemirror/legacy-modes@6.5.4': dependencies: '@codemirror/language': 6.12.4 '@codemirror/lint@6.9.7': dependencies: - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 + '@codemirror/state': 6.7.4 + '@codemirror/view': 6.43.11 crelt: 1.0.7 - '@codemirror/search@6.7.1': + '@codemirror/search@6.7.2': dependencies: - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 + '@codemirror/state': 6.7.4 + '@codemirror/view': 6.43.11 crelt: 1.0.7 - '@codemirror/state@6.7.1': + '@codemirror/state@6.7.4': dependencies: '@marijn/find-cluster-break': 1.0.4 - '@codemirror/view@6.43.9': + '@codemirror/view@6.43.11': dependencies: - '@codemirror/state': 6.7.1 + '@codemirror/state': 6.7.4 crelt: 1.0.7 style-mod: 4.1.3 w3c-keyname: 2.2.8 @@ -2526,9 +2407,9 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.9.1(supports-color@8.1.1))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.10.0(supports-color@8.1.1))': dependencies: - eslint: 10.9.1(supports-color@8.1.1) + eslint: 10.10.0(supports-color@8.1.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -2549,29 +2430,29 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/css-tree@4.0.5': + '@eslint/css-tree@4.1.0': dependencies: - mdn-data: 2.29.0 + mdn-data: 2.34.0 source-map-js: 1.2.1 - '@eslint/css@1.4.0': + '@eslint/css@2.0.0': dependencies: '@eslint/core': 1.2.1 - '@eslint/css-tree': 4.0.5 - '@eslint/plugin-kit': 0.7.2 + '@eslint/css-tree': 4.1.0 + '@eslint/plugin-kit': 0.7.3 - '@eslint/js@10.0.1(eslint@10.9.1(supports-color@8.1.1))': + '@eslint/js@10.0.1(eslint@10.10.0(supports-color@8.1.1))': optionalDependencies: - eslint: 10.9.1(supports-color@8.1.1) + eslint: 10.10.0(supports-color@8.1.1) '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.7.2': + '@eslint/plugin-kit@0.7.3': dependencies: '@eslint/core': 1.2.1 levn: 0.4.1 - '@hpcc-js/wasm-graphviz@1.28.0': {} + '@hpcc-js/wasm-graphviz@1.29.0': {} '@humanfs/core@0.19.2': dependencies: @@ -2591,20 +2472,19 @@ snapshots: '@iconify/types@2.0.0': {} - '@iconify/utils@3.1.4': + '@iconify/utils@3.1.7': dependencies: - '@antfu/install-pkg': 1.1.0 + '@antfu/install-pkg': 2.0.1 '@iconify/types': 2.0.0 import-meta-resolve: 4.2.0 - '@isaacs/cliui@8.0.2': + '@keyv/bigmap@1.3.1(keyv@5.6.0)': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.2.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 + + '@keyv/serialize@1.1.1': {} '@lezer/common@1.5.2': {} @@ -2636,7 +2516,7 @@ snapshots: '@lezer/highlight': 1.2.3 '@lezer/lr': 1.4.10 - '@lezer/java@1.1.3': + '@lezer/java@1.1.4': dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 @@ -2663,7 +2543,7 @@ snapshots: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 - '@lezer/php@1.0.5': + '@lezer/php@1.0.6': dependencies: '@lezer/common': 1.5.2 '@lezer/highlight': 1.2.3 @@ -2749,9 +2629,6 @@ snapshots: '@napi-rs/canvas-win32-x64-msvc': 1.0.8 optional: true - '@pkgjs/parseargs@0.11.0': - optional: true - '@pkgr/core@0.3.6': {} '@rtsao/scc@1.1.0': {} @@ -2896,81 +2773,81 @@ snapshots: '@types/mocha@10.0.10': {} - '@types/node@26.4.0': + '@types/node@26.5.0': dependencies: - undici-types: 8.3.0 + undici-types: 8.9.0 '@types/toastify-js@1.12.4': {} '@types/trusted-types@2.0.7': optional: true - '@typescript-eslint/eslint-plugin@8.68.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1))(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1)': + '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1))(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) - '@typescript-eslint/scope-manager': 8.68.0 - '@typescript-eslint/type-utils': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) - '@typescript-eslint/utils': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) - '@typescript-eslint/visitor-keys': 8.68.0 - eslint: 10.9.1(supports-color@8.1.1) - ignore: 7.0.6 + '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/type-utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) + '@typescript-eslint/visitor-keys': 8.70.0 + eslint: 10.10.0(supports-color@8.1.1) + ignore: 7.0.9 natural-compare: 1.4.0 ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1)': + '@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@typescript-eslint/scope-manager': 8.68.0 - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/typescript-estree': 8.68.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) - '@typescript-eslint/visitor-keys': 8.68.0 + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) + '@typescript-eslint/visitor-keys': 8.70.0 debug: 4.4.3(supports-color@8.1.1) - eslint: 10.9.1(supports-color@8.1.1) + eslint: 10.10.0(supports-color@8.1.1) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.68.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)': + '@typescript-eslint/project-service@8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.68.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/tsconfig-utils': 8.70.0(@typescript/typescript6@6.0.2) + '@typescript-eslint/types': 8.70.0 debug: 4.4.3(supports-color@8.1.1) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.68.0': + '@typescript-eslint/scope-manager@8.70.0': dependencies: - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/visitor-keys': 8.68.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/visitor-keys': 8.70.0 - '@typescript-eslint/tsconfig-utils@8.68.0(@typescript/typescript6@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.70.0(@typescript/typescript6@6.0.2)': dependencies: typescript: '@typescript/typescript6@6.0.2' - '@typescript-eslint/type-utils@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1)': + '@typescript-eslint/type-utils@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/typescript-estree': 8.68.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) - '@typescript-eslint/utils': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) debug: 4.4.3(supports-color@8.1.1) - eslint: 10.9.1(supports-color@8.1.1) + eslint: 10.10.0(supports-color@8.1.1) ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.68.0': {} + '@typescript-eslint/types@8.70.0': {} - '@typescript-eslint/typescript-estree@8.68.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)': + '@typescript-eslint/typescript-estree@8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)': dependencies: - '@typescript-eslint/project-service': 8.68.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) - '@typescript-eslint/tsconfig-utils': 8.68.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/visitor-keys': 8.68.0 + '@typescript-eslint/project-service': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) + '@typescript-eslint/tsconfig-utils': 8.70.0(@typescript/typescript6@6.0.2) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/visitor-keys': 8.70.0 debug: 4.4.3(supports-color@8.1.1) minimatch: 10.2.6 semver: 7.8.5 @@ -2980,20 +2857,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1)': + '@typescript-eslint/utils@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(supports-color@8.1.1)) - '@typescript-eslint/scope-manager': 8.68.0 - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/typescript-estree': 8.68.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) - eslint: 10.9.1(supports-color@8.1.1) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(supports-color@8.1.1)) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) + eslint: 10.10.0(supports-color@8.1.1) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.68.0': + '@typescript-eslint/visitor-keys@8.70.0': dependencies: - '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/types': 8.70.0 eslint-visitor-keys: 5.0.1 '@typescript/typescript-aix-ppc64@7.0.2': @@ -3078,16 +2955,6 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 - ansi-regex@5.0.1: {} - - ansi-regex@6.3.0: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.3: {} - argparse@2.0.1: {} array-buffer-byte-length@1.0.2: @@ -3157,16 +3024,20 @@ snapshots: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.1.4: - dependencies: - balanced-match: 1.0.2 - brace-expansion@5.0.9: dependencies: balanced-match: 4.0.4 browser-stdout@1.3.1: {} + cacheable@2.5.0: + dependencies: + '@cacheable/memory': 2.2.0 + '@cacheable/utils': 2.5.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.10.1 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -3184,24 +3055,11 @@ snapshots: call-bind-apply-helpers: 1.0.2 get-intrinsic: 1.3.0 - camelcase@6.3.0: {} - chai@6.2.2: {} - chalk@4.1.2: + chokidar@5.0.0: dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chokidar@4.0.3: - dependencies: - readdirp: 4.1.2 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 + readdirp: 5.1.1 codemirror@6.0.2: dependencies: @@ -3209,15 +3067,9 @@ snapshots: '@codemirror/commands': 6.11.0 '@codemirror/language': 6.12.4 '@codemirror/lint': 6.9.7 - '@codemirror/search': 6.7.1 - '@codemirror/state': 6.7.1 - '@codemirror/view': 6.43.9 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} + '@codemirror/search': 6.7.2 + '@codemirror/state': 6.7.4 + '@codemirror/view': 6.43.11 commander@7.2.0: {} @@ -3241,17 +3093,17 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.2): + cytoscape-cose-bilkent@4.1.0(cytoscape@3.34.3): dependencies: cose-base: 1.0.3 - cytoscape: 3.34.2 + cytoscape: 3.34.3 - cytoscape-fcose@2.2.0(cytoscape@3.34.2): + cytoscape-fcose@2.2.0(cytoscape@3.34.3): dependencies: cose-base: 2.2.0 - cytoscape: 3.34.2 + cytoscape: 3.34.3 - cytoscape@3.34.2: {} + cytoscape@3.34.3: {} d3-array@2.12.1: dependencies: @@ -3457,8 +3309,6 @@ snapshots: optionalDependencies: supports-color: 8.1.1 - decamelize@4.0.0: {} - deep-is@0.1.4: {} define-data-property@1.1.4: @@ -3477,13 +3327,13 @@ snapshots: dependencies: robust-predicates: 3.0.3 - diff@7.0.0: {} + diff@9.0.0: {} doctrine@2.1.0: dependencies: esutils: 2.0.3 - dompurify@3.4.14: + dompurify@3.4.15: optionalDependencies: '@types/trusted-types': 2.0.7 @@ -3493,12 +3343,6 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - es-abstract-get@1.0.0: dependencies: es-errors: 1.3.0 @@ -3591,7 +3435,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.51.0: {} + es-toolkit@1.52.0: {} esbuild@0.28.2: optionalDependencies: @@ -3622,13 +3466,11 @@ snapshots: '@esbuild/win32-ia32': 0.28.2 '@esbuild/win32-x64': 0.28.2 - escalade@3.2.0: {} - escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.9.1(supports-color@8.1.1)): + eslint-config-prettier@10.1.8(eslint@10.10.0(supports-color@8.1.1)): dependencies: - eslint: 10.9.1(supports-color@8.1.1) + eslint: 10.10.0(supports-color@8.1.1) eslint-import-resolver-node@0.3.10(supports-color@8.1.1): dependencies: @@ -3638,17 +3480,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.14.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1): + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1): dependencies: debug: 3.2.7(supports-color@8.1.1) optionalDependencies: - '@typescript-eslint/parser': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) - eslint: 10.9.1(supports-color@8.1.1) + '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) + eslint: 10.10.0(supports-color@8.1.1) eslint-import-resolver-node: 0.3.10(supports-color@8.1.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1))(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -3657,9 +3499,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7(supports-color@8.1.1) doctrine: 2.1.0 - eslint: 10.9.1(supports-color@8.1.1) + eslint: 10.10.0(supports-color@8.1.1) eslint-import-resolver-node: 0.3.10(supports-color@8.1.1) - eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -3671,20 +3513,20 @@ snapshots: string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) + '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.9.1(supports-color@8.1.1)))(eslint@10.9.1(supports-color@8.1.1))(prettier@3.9.6): + eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.10.0(supports-color@8.1.1)))(eslint@10.10.0(supports-color@8.1.1))(prettier@3.9.6): dependencies: - eslint: 10.9.1(supports-color@8.1.1) + eslint: 10.10.0(supports-color@8.1.1) prettier: 3.9.6 prettier-linter-helpers: 1.0.1 synckit: 0.11.13 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@10.9.1(supports-color@8.1.1)) + eslint-config-prettier: 10.1.8(eslint@10.10.0(supports-color@8.1.1)) eslint-scope@9.1.2: dependencies: @@ -3697,14 +3539,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.9.1(supports-color@8.1.1): + eslint@10.10.0(supports-color@8.1.1): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(supports-color@8.1.1)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(supports-color@8.1.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5(supports-color@8.1.1) '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.2 + '@eslint/plugin-kit': 0.7.3 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -3719,7 +3561,7 @@ snapshots: esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 + file-entry-cache: 11.1.5 find-up: 5.0.0 glob-parent: 6.0.2 ignore: 5.3.2 @@ -3766,21 +3608,20 @@ snapshots: optionalDependencies: picomatch: 4.0.7 - file-entry-cache@8.0.0: + file-entry-cache@11.1.5: dependencies: - flat-cache: 4.0.1 + flat-cache: 6.1.23 find-up@5.0.0: dependencies: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@4.0.1: + flat-cache@6.1.23: dependencies: + cacheable: 2.5.0 flatted: 3.4.4 - keyv: 4.5.4 - - flat@5.0.2: {} + hookified: 1.15.1 flatted@3.4.4: {} @@ -3788,11 +3629,6 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - function-bind@1.1.2: {} function.prototype.name@1.2.0: @@ -3811,8 +3647,6 @@ snapshots: generator-function@2.0.1: {} - get-caller-file@2.0.5: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -3841,16 +3675,13 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.5.0: + glob@13.0.6: dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.9 + minimatch: 10.2.6 minipass: 7.1.3 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 + path-scurry: 2.0.2 - globals@17.11.0: {} + globals@17.12.0: {} globalthis@1.0.4: dependencies: @@ -3879,11 +3710,17 @@ snapshots: dependencies: has-symbols: 1.1.0 + hashery@1.5.1: + dependencies: + hookified: 1.15.1 + hasown@2.0.4: dependencies: function-bind: 1.1.2 - he@1.2.0: {} + hookified@1.15.1: {} + + hookified@2.2.0: {} iconv-lite@0.6.3: dependencies: @@ -3891,7 +3728,7 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.6: {} + ignore@7.0.9: {} import-meta-resolve@4.2.0: {} @@ -3957,8 +3794,6 @@ snapshots: dependencies: call-bound: 1.0.4 - is-fullwidth-code-point@3.0.0: {} - is-generator-function@1.1.2: dependencies: call-bound: 1.0.4 @@ -3982,8 +3817,6 @@ snapshots: is-path-inside@3.0.3: {} - is-plain-obj@2.1.0: {} - is-regex@1.2.1: dependencies: call-bound: 1.0.4 @@ -4029,18 +3862,10 @@ snapshots: isexe@2.0.0: {} - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - js-yaml@4.3.2: + js-yaml@5.4.1: dependencies: argparse: 2.0.1 - json-buffer@3.0.1: {} - json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -4053,9 +3878,9 @@ snapshots: dependencies: commander: 8.3.0 - keyv@4.5.4: + keyv@5.6.0: dependencies: - json-buffer: 3.0.1 + '@keyv/serialize': 1.1.1 khroma@2.1.0: {} @@ -4074,12 +3899,7 @@ snapshots: lodash-es@4.18.1: {} - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 - - lru-cache@10.4.3: {} + lru-cache@11.5.2: {} marked@16.4.2: {} @@ -4089,24 +3909,24 @@ snapshots: dependencies: '@mathjax/mathjax-newcm-font': 4.1.3 - mdn-data@2.29.0: {} + mdn-data@2.34.0: {} mermaid@11.17.2: dependencies: '@braintree/sanitize-url': 7.1.2 - '@iconify/utils': 3.1.4 + '@iconify/utils': 3.1.7 '@mermaid-js/parser': 1.2.1 '@types/d3': 7.4.3 '@upsetjs/venn.js': 2.0.0 - cytoscape: 3.34.2 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.2) - cytoscape-fcose: 2.2.0(cytoscape@3.34.2) + cytoscape: 3.34.3 + cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.3) + cytoscape-fcose: 2.2.0(cytoscape@3.34.3) d3: 7.9.0 d3-sankey: 0.12.3 dagre-d3-es: 7.0.14 dayjs: 1.11.23 - dompurify: 3.4.14 - es-toolkit: 1.51.0 + dompurify: 3.4.15 + es-toolkit: 1.52.0 fastdom: 1.0.12 katex: 0.16.47 khroma: 2.1.0 @@ -4124,37 +3944,28 @@ snapshots: dependencies: brace-expansion: 1.1.18 - minimatch@9.0.9: - dependencies: - brace-expansion: 2.1.4 - minimist@1.2.8: {} minipass@7.1.3: {} - mocha@11.8.0: + mocha@12.0.0: dependencies: browser-stdout: 1.3.1 - chokidar: 4.0.3 + chokidar: 5.0.0 debug: 4.4.3(supports-color@8.1.1) - diff: 7.0.0 - escape-string-regexp: 4.0.0 + diff: 9.0.0 find-up: 5.0.0 - glob: 10.5.0 - he: 1.2.0 + glob: 13.0.6 is-path-inside: 3.0.3 - js-yaml: 4.3.2 - log-symbols: 4.1.0 - minimatch: 9.0.9 + is-unicode-supported: 0.1.0 + js-yaml: 5.4.1 + minimatch: 10.2.6 ms: 2.1.3 picocolors: 1.1.1 - serialize-javascript: 6.0.2 - strip-json-comments: 3.1.1 + serialize-javascript: 7.1.1 + strip-json-comments: 5.0.3 supports-color: 8.1.1 - workerpool: 9.3.4 - yargs: 17.7.3 - yargs-parser: 21.1.1 - yargs-unparser: 2.0.0 + workerpool: 10.0.3 ms@2.1.3: {} @@ -4233,8 +4044,6 @@ snapshots: dependencies: p-limit: 3.1.0 - package-json-from-dist@1.0.1: {} - package-manager-detector@1.8.0: {} path-data-parser@0.1.0: {} @@ -4245,12 +4054,12 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: + path-scurry@2.0.2: dependencies: - lru-cache: 10.4.3 + lru-cache: 11.5.2 minipass: 7.1.3 - pdfjs-dist@6.2.108: + pdfjs-dist@6.3.289: optionalDependencies: '@napi-rs/canvas': 1.0.8 @@ -4277,11 +4086,11 @@ snapshots: punycode@2.3.1: {} - randombytes@2.1.0: + qified@0.10.1: dependencies: - safe-buffer: 5.2.1 + hookified: 2.2.0 - readdirp@4.1.2: {} + readdirp@5.1.1: {} reflect.getprototypeof@1.0.10: dependencies: @@ -4303,8 +4112,6 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 - require-directory@2.1.1: {} - resolve@2.0.0-next.7: dependencies: es-errors: 1.3.0 @@ -4333,8 +4140,6 @@ snapshots: has-symbols: 1.1.0 isarray: 2.0.5 - safe-buffer@5.2.1: {} - safe-push-apply@1.0.0: dependencies: es-errors: 1.3.0 @@ -4352,9 +4157,7 @@ snapshots: semver@7.8.5: {} - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 + serialize-javascript@7.1.1: {} set-function-length@1.2.2: dependencies: @@ -4412,8 +4215,6 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - signal-exit@4.1.0: {} - source-map-js@1.2.1: {} stop-iteration-iterator@1.1.0: @@ -4423,18 +4224,6 @@ snapshots: strictdom@1.0.1: {} - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.2.0 - string.prototype.trim@1.2.11: dependencies: call-bind: 1.0.9 @@ -4459,26 +4248,14 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.2 - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.2.0: - dependencies: - ansi-regex: 6.3.0 - strip-bom@3.0.0: {} - strip-json-comments@3.1.1: {} + strip-json-comments@5.0.3: {} style-mod@4.1.3: {} stylis@4.4.0: {} - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - supports-color@8.1.1: dependencies: has-flag: 4.0.0 @@ -4489,14 +4266,14 @@ snapshots: dependencies: '@pkgr/core': 0.3.6 - tinyexec@1.3.0: {} + tinyexec@1.3.1: {} tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.7) picomatch: 4.0.7 - tinymce@8.8.2: {} + tinymce@8.9.0: {} toastify-js@1.12.0: {} @@ -4550,13 +4327,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1): + typescript-eslint@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1): dependencies: - '@typescript-eslint/eslint-plugin': 8.68.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1))(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) - '@typescript-eslint/parser': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) - '@typescript-eslint/typescript-estree': 8.68.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) - '@typescript-eslint/utils': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@8.1.1))(supports-color@8.1.1) - eslint: 10.9.1(supports-color@8.1.1) + '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1))(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) + '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@8.1.1))(supports-color@8.1.1) + eslint: 10.10.0(supports-color@8.1.1) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color @@ -4593,7 +4370,7 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - undici-types@8.3.0: {} + undici-types@8.9.0: {} uri-js@4.4.1: dependencies: @@ -4650,39 +4427,6 @@ snapshots: word-wrap@1.2.5: {} - workerpool@9.3.4: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.2.0 - - y18n@5.0.8: {} - - yargs-parser@21.1.1: {} - - yargs-unparser@2.0.0: - dependencies: - camelcase: 6.3.0 - decamelize: 4.0.0 - flat: 5.0.2 - is-plain-obj: 2.1.0 - - yargs@17.7.3: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 + workerpool@10.0.3: {} yocto-queue@0.1.0: {} diff --git a/client/src/CodeChatEditor-test.mts b/client/src/CodeChatEditor-test.mts index ca1083fe..15011c55 100644 --- a/client/src/CodeChatEditor-test.mts +++ b/client/src/CodeChatEditor-test.mts @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 @@ -157,6 +157,163 @@ window.CodeChatEditor_test = () => { ); }); }); + + // These check the layout the Server's `render_fragment_content` + // (`processing.rs`) and the `cc-*` styles in + // [CodeChatEditor.css](css/CodeChatEditor.css) produce together, which + // no test of either alone can see: a fragment gathered into a list must + // reproduce the layout of the source it came from. The fragment + // gathered in `test.py` is the case that matters -- a doc block and the + // line of code below it are both indented four spaces there. + suite("Gathered fragment layout", function () { + // The gather list is drawn by CodeMirror as the doc block holding + // the gather element scrolls into view. + const gatherItems = async () => { + await waitFor( + "gathered fragment", + () => + document.querySelector( + ".cc-gather-items .cc-fragment-code", + ) !== null, + ); + return document.querySelector(".cc-gather-items")!; + }; + + // The vertical position of each line number in the rendered code + // block, which says whether its lines are stacked as they are in + // the source or run together onto one line. Search from the copy of + // the gather list under test rather than from the document: + // focusing a doc block promotes it to a TinyMCE instance which + // holds its own copy of the list, and a search spanning both would + // report the two copies' positions interleaved. + const lineNumberTops = (gatherItems: ParentNode) => + Array.from( + gatherItems.querySelectorAll( + ".cc-fragment-code .cc-line-number", + ), + ).map((lineNumber) => lineNumber.getBoundingClientRect().top); + + test("aligns doc block indents with code", async function (this: Mocha.Context) { + this.timeout(MOCHA_TEST_TIMEOUT_MS); + + const items = await gatherItems(); + const indent = items.querySelector(".cc-fragment-indent")!; + const code = items.querySelector(".cc-fragment-code")!; + + // An indent aligns with the code below it only if the two are + // measured in the same character width. + const indentStyle = getComputedStyle(indent); + const codeStyle = getComputedStyle(code); + assert.equal(indentStyle.fontFamily, codeStyle.fontFamily); + assert.equal(indentStyle.fontSize, codeStyle.fontSize); + + // The doc block and the code are each preceded by their line + // numbers in `test.py`. + const docLineNumber = indent.querySelector(".cc-line-number")!; + assert.equal(docLineNumber.textContent, "7"); + const codeLineNumber = code.querySelector(".cc-line-number")!; + assert.equal(codeLineNumber.textContent, "9"); + + // The two gutters must be the same width, since each holds the + // column its side's content begins in. + assert.closeTo( + docLineNumber.getBoundingClientRect().width, + codeLineNumber.getBoundingClientRect().width, + 1, + ); + + // The doc block's contents begin where its indent ends... + const docStart = items + .querySelector(".cc-fragment-doc-contents")! + .getBoundingClientRect().left; + // ...and the code on the next line must begin in that same + // column: each line number fills a gutter of the same width, and + // the four spaces which follow the code's match the four the doc + // block is indented by. + const codeText = Array.from(code.childNodes).find( + (node) => node.nodeType === Node.TEXT_NODE, + ) as Text; + assert.equal(codeText.data.slice(0, 4), " "); + const codeIndent = document.createRange(); + codeIndent.setStart(codeText, 0); + codeIndent.setEnd(codeText, 4); + assert.closeTo( + codeIndent.getBoundingClientRect().right, + docStart, + 1, + ); + }); + + // The source `test.py` gathers a doc block with the code block + // directly beneath it, so the rendering must place them the same + // way: the paragraph the doc block becomes carries a top and bottom + // margin which would otherwise open a gap the source doesn't have. + // The `remove-space` rules in + // [CodeChatEditor.css](css/CodeChatEditor.css) trim it. + test("puts a doc block directly against the code below it", async function (this: Mocha.Context) { + this.timeout(MOCHA_TEST_TIMEOUT_MS); + + const items = await gatherItems(); + const docContents = items.querySelector( + ".cc-fragment-doc-contents", + )!; + const paragraph = docContents.firstElementChild!; + assert.equal(paragraph.tagName, "P"); + + // The doc block is exactly as tall as its text... + const paragraphBox = paragraph.getBoundingClientRect(); + const docContentsBox = docContents.getBoundingClientRect(); + assert.closeTo(paragraphBox.top, docContentsBox.top, 1); + assert.closeTo(paragraphBox.bottom, docContentsBox.bottom, 1); + + // ...and the code block begins where the doc block ends. + const docBox = items + .querySelector(".cc-fragment-doc")! + .getBoundingClientRect(); + const codeBox = items + .querySelector(".cc-fragment-code")! + .getBoundingClientRect(); + assert.closeTo(docBox.bottom, codeBox.top, 1); + }); + + test("puts each line of a code block on its own line", async function (this: Mocha.Context) { + this.timeout(MOCHA_TEST_TIMEOUT_MS); + + const items = await gatherItems(); + // The newlines separating a code block's lines are part of the + // code; losing them runs the whole block onto one line. + assert.include( + items.querySelector(".cc-fragment-code")!.textContent!, + "\n", + ); + const asRendered = lineNumberTops(items); + assert.lengthOf(asRendered, 2); + assert.isAbove(asRendered[1], asRendered[0]); + + // Focusing a doc block promotes it to a TinyMCE instance, which + // reparses the block's HTML. TinyMCE collapses the whitespace + // in every element it doesn't consider whitespace-sensitive, + // which is why a rendered fragment's code and indents are + // `
`s; see `render_fragment_content` in
+                // [processing.rs](../../server/src/processing.rs).
+                (
+                    items.closest(".CodeChat-doc-contents") as HTMLDivElement
+                ).focus();
+                await waitFor(
+                    "the doc block to become editable",
+                    () =>
+                        document.querySelector(
+                            "#TinyMCE-inst .cc-gather-items .cc-fragment-code",
+                        ) !== null,
+                );
+                const editedItems = document.querySelector(
+                    "#TinyMCE-inst .cc-gather-items",
+                )!;
+                const afterEditing = lineNumberTops(editedItems);
+                assert.lengthOf(afterEditing, 2);
+                assert.isAbove(afterEditing[1], afterEditing[0]);
+            });
+        });
     });
 
     // Avoid an infinite loop of tests calling this again.
diff --git a/client/src/CodeChatEditor.mts b/client/src/CodeChatEditor.mts
index 5b9d401b..cd18fc8c 100644
--- a/client/src/CodeChatEditor.mts
+++ b/client/src/CodeChatEditor.mts
@@ -1,4 +1,4 @@
-// Copyright (C) 2025 Bryan A. Jones.
+// Copyright (C) 2026 Bryan A. Jones.
 //
 // 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
diff --git a/client/src/CodeChatEditorFramework.mts b/client/src/CodeChatEditorFramework.mts
index 7a0ce102..ee0361ba 100644
--- a/client/src/CodeChatEditorFramework.mts
+++ b/client/src/CodeChatEditorFramework.mts
@@ -1,4 +1,4 @@
-// Copyright (C) 2025 Bryan A. Jones.
+// Copyright (C) 2026 Bryan A. Jones.
 //
 // 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
@@ -64,6 +64,7 @@ let webSocketComm: WebSocketComm;
 class WebSocketComm {
     // Use a unique ID for each websocket message sent. See the Implementation
     // section on Message IDs for more information.
+    // 
     wsId = 4;
 
     // The websocket used by this class. Really a `ReconnectingWebSocket`, but
diff --git a/client/src/CodeMirror-integration.mts b/client/src/CodeMirror-integration.mts
index 8b479561..2fa51660 100644
--- a/client/src/CodeMirror-integration.mts
+++ b/client/src/CodeMirror-integration.mts
@@ -1,4 +1,4 @@
-// Copyright (C) 2025 Bryan A. Jones.
+// Copyright (C) 2026 Bryan A. Jones.
 //
 // 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
@@ -1357,7 +1357,7 @@ export const DocBlockPlugin = ViewPlugin.fromClass(
                                 resolve(),
                         );
                         // Untypeset math in the old doc block and the current
-                        // doc block before moving its contents around.
+                        // doc block before moving its contents around. TODO: `tinymceDiv === null` in production at least once.
                         const tinymceDiv =
                             document.getElementById(TINYMCE_INST)!;
                         mathJaxUnTypeset(tinymceDiv);
diff --git a/client/src/HashReader.mts b/client/src/HashReader.mts
index 7d78cdd1..6e712c80 100644
--- a/client/src/HashReader.mts
+++ b/client/src/HashReader.mts
@@ -1,4 +1,4 @@
-// Copyright (C) 2025 Bryan A. Jones.
+// Copyright (C) 2026 Bryan A. Jones.
 //
 // 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
@@ -72,6 +72,7 @@ const outputContents: Record = {};
 let numFound = 0;
 for (const output in metafile.outputs) {
     const outputInfo = metafile.outputs[output];
+    // 
     switch (outputInfo.entryPoint) {
         case "src/CodeChatEditorFramework.mts":
             outputContents["CodeChatEditorFramework.js"] = output;
diff --git a/client/src/assert.mts b/client/src/assert.mts
index f594c166..167121c5 100644
--- a/client/src/assert.mts
+++ b/client/src/assert.mts
@@ -1,4 +1,4 @@
-// Copyright (C) 2025 Bryan A. Jones.
+// Copyright (C) 2026 Bryan A. Jones.
 //
 // 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
diff --git a/client/src/css/CodeChatEditor.css b/client/src/css/CodeChatEditor.css
index 73d557cb..2042d1d7 100644
--- a/client/src/css/CodeChatEditor.css
+++ b/client/src/css/CodeChatEditor.css
@@ -1,4 +1,4 @@
-/* Copyright (C) 2025 Bryan A. Jones.
+/* Copyright (C) 2026 Bryan A. Jones.
 
    This file is part of the CodeChat Editor.
 
@@ -20,237 +20,158 @@
    ======================================================
 
    This style sheet is used by the HTML generated by
-   [CodeChatEditor.mts](../CodeChatEditor.mts).
-
-   TODO: do a much better job of grouping common styles. Rename styles based on
-   whether they style a code or doc block.
-
-   Import a theme
-   --------------
-
-   Eventually, this will be a user-configurable setting. */
-@import url("themes/light.css");
-
-/* Styles for the entire page layout
-   ---------------------------------
-
-   This is used only to store a reused variable value. See the
-   [CSS docs](https://drafts.csswg.org/css-variables/). */
+   [CodeChatEditor.mts](../CodeChatEditor.mts). It is the entry point the
+   bundler builds; the two imports below pull in everything else.
+
+   The cascade
+   -----------
+
+   Both imports go into the same
+   [cascade layer](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer).
+   Within a layer the ordinary cascade applies, so putting the theme and the
+   base styles in one layer leaves their relationship exactly as it was before
+   this file declared any layer at all: the theme is imported first, so a base
+   rule of equal specificity wins by source order, and a more specific theme
+   rule wins over a less specific base rule.
+
+   What the layer buys is everything *outside* it. A declaration which belongs
+   to no layer beats every layered declaration regardless of specificity, so the
+   rules at the end of this file -- and only those -- are out of reach of both
+   the base styles and any theme. That is a property of the cascade rather than
+   of the selectors involved, which is what the
+   [gathered fragment styling](gathered-fragments) needs: it aligns generated
+   content against the source it came from, and a theme which happened to style
+   the elements it uses would break that alignment rather than restyle it.
+   Nothing but that section belongs out here; anything a theme should be free to
+   restyle goes in
+   [CodeChatEditorBase.css](CodeChatEditorBase.css) instead.
+
+   Eventually, the theme will be a user-configurable setting. */
+@import url("themes/light.css") layer(app);
+@import url("CodeChatEditorBase.css") layer(app);
+
+/* Gathered fragment styling
+   ---------------------------------------------------------
+
+   These rules are deliberately outside the layer the imports above go into; see
+   [The cascade](cascade).
+
+   A gather element is followed by `
`, which holds + the rendered content of each fragment the element lists; the Server produces + this markup in `render_fragment_content` (see + [processing.rs](../../../server/src/processing.rs)). That rendering + reproduces the layout of the source the fragment came from: each doc block + carries the indent it had there, each line of a code block and the first line + of each doc block are preceded by that line's number, and equal indents in the + source line up: + + ``` + \ \ \ + \ \ + ``` + + where the \ holds a line number and is the same width in both. + Achieving that alignment is what the rules below are for; two constraints + follow from it, and anything added here must respect them. + + * The indent and the code must render in the same + font at the same size, since the indent's job is to occupy exactly + as many character widths as the equivalent indent in the code. Both are + therefore styled here, together, and both begin by discarding every author + declaration which reached them (`all: revert`). Both are `
` elements:
+     that is what keeps their whitespace -- which is the layout -- from being
+     collapsed on its way to the screen (see `render_fragment_content` in
+     [processing.rs](../../../server/src/processing.rs)), but it also puts them
+     in reach of the `pre` styling nearly every theme has. Being outside the
+     layer wins the properties declared below; the `all: revert` is what
+     disposes of the rest, such as the background and padding a theme gives code
+     blocks it means to set apart.
+   * The gutter is a `.cc-line-number` on both sides -- the first child of
+     `.cc-fragment-indent` on the doc side, and the start of each line on the
+     code side -- so a single rule gives the two the same width. That width comes
+     from `--cc-gutter-width`, measured in `ch`: a custom property is substituted
+     before it's computed, so that width is a character width of the font of
+     whichever element uses it -- the same font in both, per the constraint
+     above (a `.cc-line-number` inherits the font of the `.cc-fragment-indent` or
+     `.cc-fragment-code` containing it). */
 :root {
-    --top-height: 3.7rem;
-    --body-padding: 0.2rem;
-    --body-height: calc(100vh - var(--top-height) - 2 * var(--body-padding));
-}
-
-/* See [box sizing](https://css-tricks.com/box-sizing/) for the following
-   technique to use `border-box` sizing. */
-html {
-    box-sizing: border-box;
-}
-
-*,
-*:before,
-*:after {
-    box-sizing: inherit;
-}
-
-body {
-    /* For box model simplicity, switch the padding and margin. */
-    padding: var(--body-padding);
-    margin: 0px;
-}
-
-/* Provide space at the top of the screen for the filename and TinyMCE menu bar. */
-#CodeChat-top {
-    height: var(--top-height);
-}
-
-/* The rest of the screen is the editor area. Omit this for printing, so the
-   text flows across multiple pages. */
-@media not print {
-     /* ### Height and scrollbars
-
-        When in document-only mode, the editor is a child of the body. */
-    #CodeChat-body > .CodeChat-doc-contents {
-        height: var(--body-height);
-        overflow: auto
-    }
-
-    /* Otherwise, set this per the
-       [CodeMirror docs](https://codemirror.net/examples/styling/). */
-    .cm-editor {
-        height: var(--body-height);
-    }
-    .cm-scroller {
-        overflow: auto
-    }
-}
-
-/* Misc styling
-   ------------
-
-   Make the filename compact. */
-#CodeChat-filename p {
-    margin: 0px;
-    white-space: nowrap;
-}
-
-/* Error overlay. When visible, obscure the screen. */
-#error-overlay {
-    position: fixed;
-    top: 0;
-    left: 0;
-    width: 100vw;
-    height: 100vh;
-    /* The toast z-index is 10000. */
-    z-index: 9999;
-    display: none;
-    opacity: 0.8;
-    background-color: gray;
-}
-
-.centered-text {
-  position: absolute;
-  top: 50%;
-  left: 50%;
-  /* Pulls element back exactly to its own middle */
-  transform: translate(-50%, -50%);
-  text-align: center;
-}
-
-/* Doc block styling
-   ----------------- */
-.CodeChat-doc {
-    /* Use
-       [flexbox layout](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox)
-       to style doc blocks. The goal of this layout is:
-
-       \ \ \ \
-
-       where:
-
-       * `
` contains \ - * `
` contains \ - * `
` contains \ - * `
` contains the \ */ + /* The width of the line number gutter: room for a three-digit line number + plus the space separating it from what follows. */ + --cc-gutter-width: 4ch; + /* The font shared by a rendered fragment's indents and code. Declaring it + once, and applying it with the `font` shorthand (which resets the font + properties it omits), is what guarantees the two are measured in the same + character width. The size is absolute, both so that the two can't diverge + through what they inherit and because a generic monospace family with no + size of its own renders smaller than the surrounding text in most + browsers. */ + --cc-fragment-font: 0.9rem monospace; +} + +/* One doc block of a rendered fragment. This is the layout `.CodeChat-doc` uses + for the doc blocks the editor itself displays. */ +.cc-fragment-doc { display: flex; - padding: 0px 2px 0px 6px; - /* Establish a positioning context for an empty `.CodeChat-doc-indent`; - see below. */ - position: relative; } -/* Preserve whitespace in the indent of a doc block. */ -.CodeChat-doc-indent { - /* Make this \ not expand or shrink, but take exactly the - width required by the text (spaces) it contains. */ +/* The whitespace which indents this doc block in its source file, preceded by + the doc side of the gutter -- a `.cc-line-number` holding the number of the + doc block's first line. */ +.cc-fragment-indent { + /* Discard the `pre` styling of any theme; see [above](cc-fragment-font). */ + all: revert; + /* `all` also drops the page-wide `box-sizing`; put it back. */ + box-sizing: inherit; + /* Take exactly the width of the gutter plus the whitespace it contains, + rather than expanding or shrinking as a flex item otherwise would. */ flex: 0 0 auto; white-space: pre; tab-size: 4; -} - -/* An empty indent would otherwise collapse to a zero-size element, which - isn't reliably clickable (a real mousedown/click can't hit-test a - too-small target -- the browser resolves the click point to whatever - sits behind/beside it instead) -- so it could never be focused to become - editable (see the inline `onmousedown` handler in `DocBlockWidget.toDOM` - and the `focusout` handler in `DocBlockPlugin`, which toggle - `contenteditable` on and off). Give it a nonzero, clickable size via - `position: absolute` rather than sizing it in normal flow (e.g. - `min-width`): per the - [Flexbox spec](https://www.w3.org/TR/css-flexbox-1/#abspos-items), an - absolutely-positioned flex item is removed from flex layout entirely, so - this can't shift `.CodeChat-doc-contents`'s horizontal start away from its - natural position -- which matters because the browser's native - caret-boundary walk (used for arrow-key navigation between adjacent doc - blocks; see `docBlockNavKeymap` in `CodeMirror-integration.mts`) tracks - the caret's horizontal position across lines, and a shifted contents - start throws that off. Position it at the indent's usual (here, zero) - offset from the block's left padding, so it visually and functionally - sits where the (empty) indent belongs. */ -.CodeChat-doc-indent:empty { - position: absolute; - left: 0; - top: 0; - width: 1ch; - height: 100%; -} - -/* Reset what CodeMirror messes up for doc blocks. */ -.CodeChat-doc-contents { - font-family: inherit; - line-height: initial; - white-space: normal; + /* A `pre` carries vertical margins of its own, which would push this out of + line with the code it must align to. */ + margin: 0; + /* Match `.cc-fragment-code`; see [above](cc-fragment-font). */ + font: var(--cc-fragment-font); +} + +/* The contents of that doc block, + which the + [rules in CodeChatEditorBase.css](CodeChatEditorBase.css#remove-space) trim + to the height of its text: a gathered doc block sits directly against the code + block above and below it, exactly as it does in the source. */ +.cc-fragment-doc-contents { flex-grow: 1; } -/* Remove the editor's border when it's selected, since this hides the cursor - when the cursor is at the beginning of a line and isn't necessary (the entire - screen is an editor, not just that region.) Note that the `focus-visible` - attribute is only visible briefly, but this eliminated that visual flicker. */ -.CodeChat-doc-contents.mce-edit-focus, -.CodeChat-doc-contents:focus-visible { - outline: 0px; -} - -/* Used to hide the TinyMCE editor instance when it's not in use. */ -.CodeChat-doc-hidden { - display: none; -} - -/* Combined code/doc block styling - ------------------------------- - - Remove space between a code block followed by a doc - block. Doc block elements typically have top margin and/or padding that - produce this undesired space; remove it on the first element in the doc - block, the first element of the first element in the doc block, etc. */ -.CodeChat-doc-contents > *:first-child, -.CodeChat-doc-contents > *:first-child > *:first-child, -.CodeChat-doc-contents > *:first-child > *:first-child > *:first-child, -.CodeChat-doc-contents - > *:first-child - > *:first-child - > *:first-child - > *:first-child, -.CodeChat-doc-contents - > *:first-child - > *:first-child - > *:first-child - > *:first-child - > *:first-child { - margin-top: 0px; - padding-top: 0px; -} - -/* [Remove space](remove-space) between a doc block followed by a code block. */ -.CodeChat-doc-contents > *:last-child, -.CodeChat-doc-contents > *:last-child > *:last-child, -.CodeChat-doc-contents > *:last-child > *:last-child > *:last-child, -.CodeChat-doc-contents - > *:last-child - > *:last-child - > *:last-child - > *:last-child, -.CodeChat-doc-contents - > *:last-child - > *:last-child - > *:last-child - > *:last-child - > *:last-child { - margin-bottom: 0px; - padding-bottom: 0px; -} - -/* Provide nicer defaults for tables. */ -.CodeChat-doc-contents table, -.CodeChat-doc-contents th, -.CodeChat-doc-contents td { - border-collapse: collapse; - padding-left: 4px; - padding-right: 4px; - border: 1px solid; +/* One code block of a rendered fragment. */ +.cc-fragment-code { + /* Discard the `pre` styling of any theme; see [above](cc-fragment-font). */ + all: revert; + /* `all` also drops the page-wide `box-sizing`; put it back. */ + box-sizing: inherit; + /* The code is reproduced exactly, newlines and all. */ + white-space: pre; + tab-size: 4; + /* A `pre` carries vertical margins of its own, which would open a gap + between this and the doc block above or below it -- a gap the source + doesn't have. */ + margin: 0; + /* Match `.cc-fragment-indent`; see [above](cc-fragment-font). */ + font: var(--cc-fragment-font); +} + +/* The line number which fills the gutter: one preceding each line of a code + block, and one preceding the indent of each doc block. Since this is generated + content rather than part of the source, it's excluded from what a selection + copies and dimmed to keep it from competing with the source itself. */ +.cc-line-number { + /* Right-align the number in the gutter, so that every line of code begins + in the same column regardless of how many digits precede it. Use + `min-width`, not `width`: a line number too long for the gutter must + widen it rather than overflow onto the code. */ + display: inline-block; + min-width: var(--cc-gutter-width); + padding-right: 1ch; + text-align: right; + opacity: 0.5; } diff --git a/client/src/css/CodeChatEditorBase.css b/client/src/css/CodeChatEditorBase.css new file mode 100644 index 00000000..69d64bfb --- /dev/null +++ b/client/src/css/CodeChatEditorBase.css @@ -0,0 +1,249 @@ +/* Copyright (C) 2026 Bryan A. Jones. + + 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. + + 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. + + 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/](http://www.gnu.org/licenses/). + + `CodeChatEditorBase.css` -- Ordinary styles for the CodeChat Editor + =================================================================== + + These are the styles a theme is allowed to override; the cascade which + arranges that lives in [CodeChatEditor.css](CodeChatEditor.css), the entry + point which imports both this file and the theme. Nothing here is imported + directly. + + TODO: do a much better job of grouping common styles. Rename styles based on + whether they style a code or doc block. */ +/* Styles for the entire page layout + --------------------------------- + + This is used only to store a reused variable value. See the + [CSS docs](https://drafts.csswg.org/css-variables/). */ +:root { + --top-height: 3.7rem; + --body-padding: 0.2rem; + --body-height: calc(100vh - var(--top-height) - 2 * var(--body-padding)); +} + +/* See [box sizing](https://css-tricks.com/box-sizing/) for the following + technique to use `border-box` sizing. */ +html { + box-sizing: border-box; +} + +*, +*:before, +*:after { + box-sizing: inherit; +} + +body { + /* For box model simplicity, switch the padding and margin. */ + padding: var(--body-padding); + margin: 0px; +} + +/* Provide space at the top of the screen for the filename and TinyMCE menu bar. */ +#CodeChat-top { + height: var(--top-height); +} + +/* The rest of the screen is the editor area. Omit this for printing, so the + text flows across multiple pages. */ +@media not print { + /* ### Height and scrollbars + + When in document-only mode, the editor is a child of the body. */ + #CodeChat-body > .CodeChat-doc-contents { + height: var(--body-height); + overflow: auto; + } + + /* Otherwise, set this per the + [CodeMirror docs](https://codemirror.net/examples/styling/). */ + .cm-editor { + height: var(--body-height); + } + .cm-scroller { + overflow: auto; + } +} + +/* Misc styling + ------------ + + Make the filename compact. */ +#CodeChat-filename p { + margin: 0px; + white-space: nowrap; +} + +/* Error overlay. When visible, obscure the screen. */ +#error-overlay { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + /* The toast z-index is 10000. */ + z-index: 9999; + display: none; + opacity: 0.8; + background-color: gray; +} + +.centered-text { + position: absolute; + top: 50%; + left: 50%; + /* Pulls element back exactly to its own middle */ + transform: translate(-50%, -50%); + text-align: center; +} + +/* Doc block styling + ----------------- */ +.CodeChat-doc { + /* Use + [flexbox layout](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Basic_Concepts_of_Flexbox) + to style doc blocks. The goal of this layout is: + + \ \ \ \ + + where: + + * `
` contains \ + * `
` contains the \ */ + display: flex; + padding: 0px 2px 0px 6px; + /* Establish a positioning context for an empty `.CodeChat-doc-indent`; + see below. */ + position: relative; +} + +/* Preserve whitespace in the indent of a doc block. */ +.CodeChat-doc-indent { + /* Make this \ not expand or shrink, but take exactly the + width required by the text (spaces) it contains. */ + flex: 0 0 auto; + white-space: pre; + tab-size: 4; +} + +/* An empty indent would otherwise collapse to a zero-size element, which + isn't reliably clickable (a real mousedown/click can't hit-test a + too-small target -- the browser resolves the click point to whatever + sits behind/beside it instead) -- so it could never be focused to become + editable (see the inline `onmousedown` handler in `DocBlockWidget.toDOM` + and the `focusout` handler in `DocBlockPlugin`, which toggle + `contenteditable` on and off). Give it a nonzero, clickable size via + `position: absolute` rather than sizing it in normal flow (e.g. + `min-width`): per the + [Flexbox spec](https://www.w3.org/TR/css-flexbox-1/#abspos-items), an + absolutely-positioned flex item is removed from flex layout entirely, so + this can't shift `.CodeChat-doc-contents`'s horizontal start away from its + natural position -- which matters because the browser's native + caret-boundary walk (used for arrow-key navigation between adjacent doc + blocks; see `docBlockNavKeymap` in `CodeMirror-integration.mts`) tracks + the caret's horizontal position across lines, and a shifted contents + start throws that off. Position it at the indent's usual (here, zero) + offset from the block's left padding, so it visually and functionally + sits where the (empty) indent belongs. */ +.CodeChat-doc-indent:empty { + position: absolute; + left: 0; + top: 0; + width: 1ch; + height: 100%; +} + +/* Reset what CodeMirror messes up for doc blocks. */ +.CodeChat-doc-contents { + font-family: inherit; + line-height: initial; + white-space: normal; + flex-grow: 1; +} + +/* Remove the editor's border when it's selected, since this hides the cursor + when the cursor is at the beginning of a line and isn't necessary (the entire + screen is an editor, not just that region.) Note that the `focus-visible` + attribute is only visible briefly, but this eliminated that visual flicker. */ +.CodeChat-doc-contents.mce-edit-focus, +.CodeChat-doc-contents:focus-visible { + outline: 0px; +} + +/* Used to hide the TinyMCE editor instance when it's not in use. */ +.CodeChat-doc-hidden { + display: none; +} + +/* Combined code/doc block styling + ------------------------------- + + A doc block must occupy exactly the vertical space + its text needs, so that it butts against the code block above and below it + just as it does in the source. Doc block elements typically carry a top and + bottom margin (and sometimes padding), which would instead open a gap at each + of those two edges; remove it there, while leaving the spacing *between* a + doc block's own elements alone. + + The element which produces the gap at the top edge isn't necessarily the + contents' first child. A first child's top margin + [collapses](https://www.w3.org/TR/CSS22/box.html#collapsing-margins) with its + parent's whenever no border or padding separates the two, so the gap can come + from the first element of the first element of ... the contents, to any + depth; the same holds at the bottom edge with last children. What must + therefore be selected is every element reachable from the contents by + following first children only -- which is what the `:not()` expresses, by + discarding any element which lies beneath an element that isn't a first + child. Those are interior to the doc block (the second and later `
  • `s of a + list and their contents, for instance), and their spacing is preserved. + + Each container scopes its own exclusion so that these rules nest correctly: + the gathered fragments the + [rules in CodeChatEditor.css](CodeChatEditor.css#cc-fragment-doc-contents) + lay out sit inside an editor doc block, yet each is a doc block in its own + right, whose edges are found relative to its own `.cc-fragment-doc-contents` + rather than to the `.CodeChat-doc-contents` enclosing the whole gather + list. */ +.CodeChat-doc-contents + :first-child:not(.CodeChat-doc-contents :not(:first-child) *), +.cc-fragment-doc-contents + :first-child:not(.cc-fragment-doc-contents :not(:first-child) *) { + margin-top: 0px; + padding-top: 0px; +} + +/* [Remove the space](remove-space) at a doc block's bottom edge. */ +.CodeChat-doc-contents + :last-child:not(.CodeChat-doc-contents :not(:last-child) *), +.cc-fragment-doc-contents + :last-child:not(.cc-fragment-doc-contents :not(:last-child) *) { + margin-bottom: 0px; + padding-bottom: 0px; +} + +/* Provide nicer defaults for tables. */ +.CodeChat-doc-contents table, +.CodeChat-doc-contents th, +.CodeChat-doc-contents td { + border-collapse: collapse; + padding-left: 4px; + padding-right: 4px; + border: 1px solid; +} diff --git a/client/src/css/CodeChatEditorProject.css b/client/src/css/CodeChatEditorProject.css index c42d02b7..0e755eae 100644 --- a/client/src/css/CodeChatEditorProject.css +++ b/client/src/css/CodeChatEditorProject.css @@ -1,4 +1,4 @@ -/* Copyright (C) 2025 Bryan A. Jones. +/* Copyright (C) 2026 Bryan A. Jones. This file is part of the CodeChat Editor. @@ -48,7 +48,8 @@ body { /* TODO: This is a overly simple, non-responsive layout to create a sidebar containing the table of contents. Fix. */ -#CodeChat-sidebar, #CodeChat-sidebar-nav { +#CodeChat-sidebar, +#CodeChat-sidebar-nav { width: var(--sidebar-width); height: calc(100vh - 2 * var(--body-padding)); border: 0px; diff --git a/client/src/css/themes/light.css b/client/src/css/themes/light.css index 4e9ddc5c..d27586c6 100644 --- a/client/src/css/themes/light.css +++ b/client/src/css/themes/light.css @@ -1,4 +1,4 @@ -/* Copyright (C) 2025 Bryan A. Jones. +/* Copyright (C) 2026 Bryan A. Jones. This file is part of the CodeChat Editor. diff --git a/client/src/debug_enabled.mts b/client/src/debug_enabled.mts index dc20adad..c5f8076c 100644 --- a/client/src/debug_enabled.mts +++ b/client/src/debug_enabled.mts @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/client/src/global.d.ts b/client/src/global.d.ts index 0dbec999..0e44974b 100644 --- a/client/src/global.d.ts +++ b/client/src/global.d.ts @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/client/src/graphviz-webcomponent-setup.mjs b/client/src/graphviz-webcomponent-setup.mjs index ca8876a5..279cc461 100644 --- a/client/src/graphviz-webcomponent-setup.mjs +++ b/client/src/graphviz-webcomponent-setup.mjs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/client/src/shared.mts b/client/src/shared.mts index 163f971c..d48451cb 100644 --- a/client/src/shared.mts +++ b/client/src/shared.mts @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/client/src/show_toast.mts b/client/src/show_toast.mts index 0e204b0b..2090afc4 100644 --- a/client/src/show_toast.mts +++ b/client/src/show_toast.mts @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/client/src/tinymce-config.mts b/client/src/tinymce-config.mts index bb891605..79e475c7 100644 --- a/client/src/tinymce-config.mts +++ b/client/src/tinymce-config.mts @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 @@ -143,8 +143,10 @@ export const init = async ( "bold italic underline codeformat | quicklink h2 h3", // Needed to allow custom elements. - extended_valid_elements: "graphviz-graph[scale],wc-mermaid", - custom_elements: "graphviz-graph,wc-mermaid", + extended_valid_elements: + "graphviz-graph[scale],wc-mermaid,xref[contenteditable|ref],fragment[contenteditable|id]", + // Per the [docs](https://www.tiny.cloud/docs/tinymce/latest/content-filtering/#custom_elements), `~` marks tags as an inline element, not a block element. + custom_elements: "graphviz-graph,wc-mermaid,~xref,~fragment", }, ); diff --git a/client/static/.gitignore b/client/static/.gitignore index bb529539..ee8cad7d 100644 --- a/client/static/.gitignore +++ b/client/static/.gitignore @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # diff --git a/client/tsconfig.json b/client/tsconfig.json index 520b0f2b..3e16209e 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/dist-workspace.toml b/dist-workspace.toml index 8187fba5..8ba0925e 100644 --- a/dist-workspace.toml +++ b/dist-workspace.toml @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # @@ -31,7 +31,12 @@ ci = "github" # The installers to generate for each app installers = [] # Target platforms to build apps for (Rust target-triple syntax) -targets = ["aarch64-apple-darwin", "x86_64-apple-darwin", "x86_64-unknown-linux-gnu", "x86_64-pc-windows-msvc"] +targets = [ + "aarch64-apple-darwin", + "x86_64-apple-darwin", + "x86_64-unknown-linux-gnu", + "x86_64-pc-windows-msvc", +] # Skip checking whether the specified configuration files are up to date allow-dirty = ["ci"] license-files = ["LICENSE.md"] diff --git a/docs/design.md b/docs/design.md index 173ec9f4..9ff88e05 100644 --- a/docs/design.md +++ b/docs/design.md @@ -1,3 +1,21 @@ +Copyright (C) 2026 Bryan A. Jones. + +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. + +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. + +You should have received a [copy](LICENSE.html) of the GNU General Public +License along with the CodeChat Editor. If not, see +[https://www.gnu.org/licenses/](https://www.gnu.org/licenses/). + CodeChat Editor design ====================== @@ -79,20 +97,19 @@ These form a set of high-level requirements to guide the project. * A gathering element: given an anchor, it shows the context of all hyperlinks to this anchor. - * If the hyperlink is a heading, the context extends to the next same-level - heading; - * If the hyperlink is a start of context, the context ends at the end of - context or end of file, whichever comes first. - * Otherwise, the context extends to the following code block. + * With no other parameters, a hyperlink to a gathering element includes the + current doc block and the next block if the next block is a code block. + The link may also include start and end query parameters to define a + multi-block span. + * The gather element can include presentation options: specify the order of + gathered blocks as a list or graph; links may be numbered, or include + prev/next links. * A report view: an extended gathering element that operates more like a query, producing nested, hierarchical results from the codebase. * Headings can be collapsed, which code code and doc blocks until the next same-level heading. - * A sequencing/path element: given a starting hyperlink, it produces prev/next - icons to show a startup/shutdown sequence, etc. - * A graph view: shows the entire document as a directed graph of hyperlinks. * An inlined output mode, like Jupyter: includes graphs and console output @@ -107,11 +124,12 @@ These form a set of high-level requirements to guide the project. * Interactive learning support: multiple choice, fill-in-th-blank, short/long answer, coding problem, etc. from Runestone or similar. - * Autogenerated anchors for all anchors (headings, hyperlinks, etc.) + * Lazily autogenerated ids for all targets (headings, hyperlinks, etc.); these + are generated when the target is referenced. * Hyperlinks to identifiers in code (use [ctags](https://github.com/universal-ctags/ctags)); perhaps auto-generate - headings for these identifiers? + headings for these identifiers? Use a language server? * An API view; show only parts of the code that's exported/publicly-accessible. @@ -120,9 +138,8 @@ These form a set of high-level requirements to guide the project. * Files/anchors can be freely moved without breaking links. This requires all anchors to be globally unique. HTML allows upper/lowercase ASCII plus the - hyphen and underscore for IDs, meaning that a 5-character string provides - - > 250 million unique anchors. + hyphen and underscore for IDs, meaning that a 5-character string provides > + 250 million unique anchors. * Make picking a file/anchor easy: provide a searchable, expanded TOC listing every anchor. * Provide edit and view options. (Rely on an IDE to edit raw source.) diff --git a/docs/implementation.md b/docs/implementation.md index e1510040..ed2321cb 100644 --- a/docs/implementation.md +++ b/docs/implementation.md @@ -1,4 +1,4 @@ -Copyright (C) 2025 Bryan A. Jones. +Copyright (C) 2026 Bryan A. Jones. This file is part of the CodeChat Editor. @@ -159,10 +159,9 @@ On load: * Classify the file; inputs are mutable global state (which, if present, indicates this is a project build), if the file is a TOC, the file's binary data, and the file's path. Output of the classification: binary, raw text, a - CodeChat document (a Markdown file), or a CodeChat file. The load processing - pipelines + CodeChat document (a Markdown file), or a CodeChat file. -For CodeChat files: +The load processing pipelines for CodeChat files: * (CodeChat files only) Run pre-parse hooks: they receive source code, file metadata. Examples: code formatters. Skip if cache is up to date. @@ -170,14 +169,6 @@ For CodeChat files: * Run post-parse hooks: they receive an array of code and doc blocks. * Transform Markdown to HTML. * Run HTML hooks: - * Update the cache for the current file only if the current file's cache is - stale. To do this, walk the DOM of each doc block. The hook specifies which - tags it wants, and the tree walker calls the hook when it encounters these. - If this requires adding/changing anything (anchors, for example), mark the - document as dirty. - * Update tags whose contents depend on data from other files. Hooks work the - same as the cache updates, but have a different role. They're always run, - while the cache update is skipped when the cache is current. * Determine next/prev/up hyperlinks based on this file's location in the TOC. * Transform the code and doc blocks into CodeMirror's format. @@ -209,112 +200,9 @@ On save: * Save the file to disk. * If dirty, re-load the file. -### Table of contents - -Ideas: - -* Something that reflects the filesystem. Subdirectories are branches, files are - leaves in the TOC tree. Problems: - * Subdirectories should have content, such as a readme. Assume a readme file - titles and provides content for a subdirectory? Or provide a config file - setting to assign this? - * I'd like the ability to relocate files/directories. The means a config file - that tracks this movement. - * We need ignores. - * To reorder files in the TOC, need a config file per directory to store this - ordering. - * Pro: all files are automatically included, so adding a new file is - automatic. The hierarchy is mostly defined by the filesystem, which is nice. - A GUI with drag and drop would make this really simple to maintain. - * Con: a lot of work/rewrite. - * So: readme.md provides a title and contents for a subdirectory. A config - file in each directory specifies ordering of files, titles for non-CodeChat - files (PDFs, etc.), moves of files/directories from other directories, and - ignores. -* Use mdbook's idea -- a very specific structure for a toc.md file. Simple, but - doesn't auto-update as files are added. -* Current TOC isn't immediately useful. Too much flexibility. - -Another topic: how to reconcile headings in a file with the TOC? - -* Separate them -- headings have orthogonal numbering to the TOC. I think this - is simplest. I just need the right way to display it; mdbook is reasonable in - this regard. I'll use this. -* Combine them -- H1 is current number, H2 is a subhead, etc. But this means the - TOC's numbering requires reading the contents of all files referenced by the - TOC, which could be slow. - ### Cache data format -The cache stores the location (file name and ID), numbering (of headings and -figures/equations/etc.), and contents (title text or code/doc blocks for tags) -of a target. Targets are HTML anchors (such as headings, figure titles, display -equations, etc.) or tags. - -Goals: - -* Given a file name and/or ID, retrieve the associated location, numbering, and - contents. -* Perform a search of the contents of all targets, returning a list of matching - targets. -* Given a file name and/or ID, provide a list of all targets in the containing - file. - -Cache data structure: - -* A hashmap of (Path, target data structure). TBD: think about ownership. I - think a page is the owner of all targets. -* A hashmap of (ID, target data structure).  - -Target data structure: - -* Location: the containing page and an `Option` containing the ID, if - assigned. -* Page numbering: `[Option, ...]` where each i32 in the list represents the - number of a H1..6 element (non-TOC) or the numbering of a list item (TOC); - `None` represents a missing level of the hierarchy (e.g. H1 following by and - H3, with no H2 between). -* Type: page, heading, link, tag, caption, equation; numbered items (caption, - equation) also include the current number. Pages include the page data - structure. -* Contents: either a string of HTML (would prefer Markdown) or a vec of code/doc - blocks. Page contents are an empty string. - -Page data structure: - -* Path: the path to this file. -* File info: timestamp, etc. to compare with the filesystem in order to - determine if this cache entry is up to date or no. An option, in the case that - the file doesn't exist -- it's the target of a broken link. -* TOC location: `[i32, ...]` gives the numbering of this page in the TOC; if - it's not in the TOC, this is an empty list. -* Vector of targets on this page. -* (Maybe) first ID on this page. - -Pseudocode: - -1. Create a hashmap of (file paths to index, list of links depending on this - file). Initialize it with the current file. -2. For each file in the hashset: - 1. If this is the first file, we already have its DOM. Otherwise, load the - file from disk and compute the DOM. - 2. Given a file's DOM, first create its page data structure. Pre-existing - cache data provides the TOC numbering. - 3. For each target in the DOM (non-TOC) / numbered item (TOC), add the - target's data structure to the page's vector of targets, updating the - current numbering if this is a numbered item (heading, caption, etc.) and - inserting the HTML to set its number in the DOM. - 4. If this is the first file: for each link in the DOM, if the link is local - and autotitled, look for it in the cache. If it's not in the cache or if - the cache for that file is outdated, add the referring file to the hashset - of files to update if it's not in the hashmap; append this link to its - list of dependent links. - 5. For each link in the list of links depending on this file, update it with - the loaded content. - -References: - -* Hyperlinks with no link text are auto-titled. Look up +Documented elsewhere. ### IDE/editor integration @@ -549,7 +437,7 @@ with descriptions of each setting. want something that includes type validation and allows comments within the config file. Perhaps JSON with a pre-parse step to discard comments then [JSON Typedef](https://jsontypedef.com/)? Possibly, vlang can do this - somewhat, since it wants to decode JSON into a V struct.) + somewhat, since it wants to decode JSON into a V struct. Organization ------------ diff --git a/docs/index.md b/docs/index.md index ec54c9ff..e1cf220e 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,4 +1,4 @@ -Copyright (C) 2025 Bryan A. Jones. +Copyright (C) 2026 Bryan A. Jones. This file is part of the CodeChat Editor. @@ -32,11 +32,13 @@ Authoring support\ IDE/text editor integration\   [1.2 Vision](README.md#vision-ide-integration)\ +   [1.3 Specification § IDE/text editor integration](README.md#specification-ide-integration) Programming language support\   [1.2 Vision](README.md#vision-programming-language-support)\ +   [1.3 Specification § Programming language support](README.md#implementation-programming-language-support) diff --git a/docs/style_guide.cpp b/docs/style_guide.cpp index a62b16ca..1d67bd3d 100644 --- a/docs/style_guide.cpp +++ b/docs/style_guide.cpp @@ -1,11 +1,10 @@ -// `style_guide.cpp` - Literate programming using the CodeChat Editor -// ================================================================== +//

    style_guide.cpp - Literate programming using the CodeChat Editor

    // // This document, written as a C++ source file, primarily demonstrates the use // of the CodeChat Editor in literate programming. It should be viewed using the // CodeChat Editor. // -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 @@ -41,7 +40,7 @@ const char* CODE_BLOCK = // doc blocks with differing indents cannot be combined. /* Doc blocks may use either inline comments (`//` in C++) or block comments (like this comment). Doc blocks with differing delimiters cannot be combined. */ -// Doc blocks are interpreted using Markdown (specifically,  +// Doc blocks are interpreted using Markdown (specifically, // [CommonMark](https://commonmark.org/)), enabling the use of headings, // *emphasis*, **strong emphasis**, `monospaced fonts`, and much more; see a // [brief overview of Markdown](https://commonmark.org/help/). @@ -69,9 +68,9 @@ const char* CODE_BLOCK = // any pieces of code that took significant development or debug time, or which // contain difficult to understand code. // -// **Phase 3 - post-writing.** Re-read what you wrote. Does this still make -// sense?​ Update your overall approach based on what you discover. Get another -// person to review what you wrote, then implement their ideas and suggestions. +// **Phase 3 - post-writing.** Re-read what you wrote. Update your overall +// approach based on what you discover. Have an LLM or another person review +// what you wrote, then implement their ideas and suggestions. // // Organization // ------------------------------------- @@ -116,7 +115,7 @@ class LedBlinker { // Formulas should be placed near code that implements them, along with good // explanations of the equations used. For example: // -// This function computes an accurate value for $g$, the acceleration due to +// This function computes an accurate value for $g$, the acceleration due to // Earth's gravity. // // Return value: $g$, in $m/s^2$. @@ -131,16 +130,16 @@ double accurate_g( // For more detail, see // [Theoretical Gravity](https://en.wikipedia.org/wiki/Theoretical_gravity). // - // The formulas used by this function are based on - // the [International Gravity Formula IGF) 1980](https://en.wikipedia.org/wiki/Normal_gravity_formula#International_gravity_formula_1980)  - // from the parameters of - // the [Geodetic Reference System 1980 (GRS80)](https://en.wikipedia.org/wiki/GRS_80), - // which determines the gravity from the position of latitude, and - // the [Free Air Correction (FAC)](https://en.wikipedia.org/wiki/Gravity_of_Earth#Free_air_correction) + // The formulas used by this function are based on the + // [International Gravity Formula IGF) 1980](https://en.wikipedia.org/wiki/Normal_gravity_formula#International_gravity_formula_1980) + // from the parameters of the + // [Geodetic Reference System 1980 (GRS80)](https://en.wikipedia.org/wiki/GRS_80), + // which determines the gravity from the position of latitude, and the + // [Free Air Correction (FAC)](https://en.wikipedia.org/wiki/Gravity_of_Earth#Free_air_correction) // which corrects for height above and below mean sea level in free air. // // Compute the International Gravity Formula (IGF):\ - // $IGF = 9.780327 (1 + 0.0053024 \\sin^2 \\phi – 0.0000058 \\sin^2 2\\phi)$ + // $IGF = 9.780327 (1 + 0.0053024 \\sin^2 \\phi – 0.0000058 \\sin^2 2\\phi)$ double IGF = 9.780327 * ( 1 + 0.0053024 * pow(sin(degrees_latitude), 2) - 0.0000058 * pow(sin(2 * degrees_latitude), 2) @@ -172,7 +171,7 @@ double accurate_g( // to ensure this consistency. // * Employ [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself) // principles. -// * Address warnings, not only errors; preferably, use a  +// * Address warnings, not only errors; preferably, use a // [linter](https://en.wikipedia.org/wiki/Lint_(software)). // * Write automated tests; employ // [test-driven development](https://en.wikipedia.org/wiki/Test-driven_development). @@ -201,7 +200,7 @@ double accurate_g( // // * Don't drag and drop an image into the Editor – this creates a mess. // Instead, save all images to a file, then use an SVG or PNG image for -// text/line art​ or a JPEG image for photos​. The Markdown syntax to insert an +// text/line art​ or a JPEG image for photos​. The Markdown syntax to insert an // image is `![Alt text](https://url.to/image.svg)`. // * Indent your comments to match the indentation of nearby code; don't // purposelessly vary the comment indentation. @@ -287,5 +286,4 @@ int main(int argc, char* argv[]) { #endif return 0; - } diff --git a/extensions/VSCode/.gitignore b/extensions/VSCode/.gitignore index 4d024c8a..8dc0c274 100644 --- a/extensions/VSCode/.gitignore +++ b/extensions/VSCode/.gitignore @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # diff --git a/extensions/VSCode/.vscodeignore b/extensions/VSCode/.vscodeignore index faaec241..7410f92c 100644 --- a/extensions/VSCode/.vscodeignore +++ b/extensions/VSCode/.vscodeignore @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # diff --git a/extensions/VSCode/Cargo.lock b/extensions/VSCode/Cargo.lock index 550f4b59..6c4195e1 100644 --- a/extensions/VSCode/Cargo.lock +++ b/extensions/VSCode/Cargo.lock @@ -44,12 +44,11 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.13.3" +version = "3.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11004b0e9b44b4eb3d15e0c3132b96fb178c7e50a74758b2f17bb9cc9a7fb4f6" +checksum = "86d62d1a48894ec9450bcde7ef1e3681205771ff6ea9c61cc5ae031145192787" dependencies = [ "actix-codec", - "actix-rt", "actix-service", "actix-utils", "base64", @@ -363,9 +362,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.18.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2b2dcc879c3bae0d371e77c99f2238400ef24ec001394befa67b6e543add9e" +checksum = "b281d307588d634de920874890732659e2e7672f72b5e10e81badc1a8a83621e" dependencies = [ "aws-lc-sys", "zeroize", @@ -373,9 +372,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.44.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09fae7be8bb3174e05c6afdb34199e6dc0c7c04ba9fa237b1967adfbde27483" +checksum = "9bff6c3b54fad79a2e60b8102caf565819711497c1f5f092f49508e2f5c31b27" dependencies = [ "cc", "cmake", @@ -484,9 +483,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.4.4" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" +checksum = "005ec2760ca554fae18df7a11195552ec576cd665632a881bc011d5bb2fd4d80" dependencies = [ "find-msvc-tools", "jobserver", @@ -551,7 +550,7 @@ dependencies = [ [[package]] name = "codechat-editor-server" -version = "0.2.2" +version = "0.2.3" dependencies = [ "actix-files", "actix-rt", @@ -582,7 +581,7 @@ dependencies = [ "pest", "pest_derive", "phf 0.14.0", - "pulldown-cmark 0.13.4", + "pulldown-cmark", "rand 0.10.2", "regex", "serde", @@ -602,7 +601,7 @@ dependencies = [ [[package]] name = "codechat-editor-vscode-extension" -version = "0.2.2" +version = "0.2.3" dependencies = [ "codechat-editor-server", "log", @@ -702,6 +701,12 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core_detect" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" + [[package]] name = "cow-utils" version = "0.1.3" @@ -728,9 +733,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -738,18 +743,18 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.20" +version = "0.9.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" [[package]] name = "crypto-common" @@ -784,12 +789,12 @@ dependencies = [ [[package]] name = "cssparser-macros" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a2a99df6e410a8ff4245aa2006499ea662245f967cc7c0a38c83ef8eb44dbf" +checksum = "d045de693cb712d0b22c6a64be5b953f67b3ce00ab5ad3dd5d8b441886ab8e1a" dependencies = [ "quote", - "syn 2.0.119", + "syn 3.0.5", ] [[package]] @@ -874,14 +879,14 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] name = "dprint-core" -version = "0.68.5" +version = "0.69.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace8a07022e292c498f9568c6859f73e40721fa18c4c0760cdc56220f4b99040" +checksum = "67359cea061dd052fca921d3589a9ce59bc16fa23bfb9d06d5c669a1dbd23915" dependencies = [ "bumpalo", "hashbrown 0.15.5", @@ -903,13 +908,11 @@ dependencies = [ [[package]] name = "dprint-plugin-markdown" -version = "0.22.1" -source = "git+https://github.com/bjones1/dprint-plugin-markdown.git?branch=all-fixes#3e767b74c195fdeb88033db99b9a35cf16d4a248" +version = "0.23.3" +source = "git+https://github.com/bjones1/dprint-plugin-markdown.git?branch=all-fixes#e5908d54a20e80835f36ca63abba9e6fd76e946a" dependencies = [ "dprint-core", "dprint-core-macros", - "pulldown-cmark 0.11.3", - "regex", "serde", "thiserror 2.0.20", "unicode-width", @@ -962,11 +965,17 @@ checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" [[package]] name = "encoding_rs" -version = "0.8.35" +version = "0.8.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "7b5ef0006ac9ab233c38522f5ae99cae3625151de8f706cacee1cba4b8e2832a" dependencies = [ "cfg-if", + "core_detect", + "multiversion", + "multiversion_no_op", + "rustversion", + "scopeguard", + "simdutf8", ] [[package]] @@ -993,9 +1002,9 @@ checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" [[package]] name = "find-msvc-tools" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" +checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" [[package]] name = "flate2" @@ -1097,7 +1106,7 @@ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -1230,7 +1239,7 @@ dependencies = [ [[package]] name = "htmd" version = "0.5.5" -source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#f1a6ff03a169fb388fed497fa0a1f7ece1d02387" +source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#68e54497edf1be23dbf73fe1bd6bdf6170b729cc" dependencies = [ "html5ever", "markup5ever_rcdom", @@ -1294,9 +1303,9 @@ checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" [[package]] name = "hybrid-array" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" dependencies = [ "typenum", ] @@ -1347,11 +1356,32 @@ checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" dependencies = [ "displaydoc", "litemap", + "serde", "tinystr", "writeable", "zerovec", ] +[[package]] +name = "icu_locale_fallback" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "251af8e57c9400e3eb58242fe5b8b1152b2a64fdf4cf632f923c38ccee6f2fa9" +dependencies = [ + "icu_locale_core", + "icu_locale_fallback_data", + "icu_provider", + "potential_utf", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locale_fallback_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "decf2a22ec8fa68f1a0c1129a3f8583f8f8bc24e8b9ccbe98ead99f62a4dc3a8" + [[package]] name = "icu_normalizer" version = "2.3.0" @@ -1401,6 +1431,8 @@ checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" dependencies = [ "displaydoc", "icu_locale_core", + "serde", + "stable_deref_trait", "writeable", "yoke", "zerofrom", @@ -1408,6 +1440,28 @@ dependencies = [ "zerovec", ] +[[package]] +name = "icu_segmenter" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d07aafccd67af15d02512a6adf5896fbc5ed00f2e99b471d2efa14016db3db" +dependencies = [ + "icu_collections", + "icu_locale_fallback", + "icu_provider", + "icu_segmenter_data", + "potential_utf", + "smallvec", + "utf8_iter", + "zerovec", +] + +[[package]] +name = "icu_segmenter_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae293c039020f9ec10710af98d29ce6aa2051486638b49c9a6409f3b4a9e98ad" + [[package]] name = "idna" version = "1.1.0" @@ -1457,15 +1511,15 @@ dependencies = [ [[package]] name = "impl-more" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "277ff51754a3f68f12f58446c5d006aa8baa4914ea273cce24a599cfaff33d4f" +checksum = "edaff2ce006342d4d0e00fae676f7082dada44a203560629ba18ea50a19277bb" [[package]] name = "indexmap" -version = "2.14.1" +version = "2.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", "hashbrown 0.17.1", @@ -1592,9 +1646,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.104" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" dependencies = [ "cfg-if", "futures-util", @@ -1867,9 +1921,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" dependencies = [ "libc", "log", @@ -1883,6 +1937,33 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bb517913cfcfb9eeda59f36020269075a152701a01606c612f547e4890be399" +[[package]] +name = "multiversion" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ca4bea16ffc3f443cf7d866912118196bfef4c6a1556ca00f9f9b00bb43f7c" +dependencies = [ + "multiversion-macros", +] + +[[package]] +name = "multiversion-macros" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d416831a7317ef4b08bee00b69cbbb9c8763da7959a7026244d6266869f9c83" +dependencies = [ + "proc-macro2", + "quote", + "rustversion", + "syn 3.0.5", +] + +[[package]] +name = "multiversion_no_op" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d" + [[package]] name = "napi" version = "3.12.2" @@ -2522,9 +2603,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07a60cc7a4d00c91f95c685609d1d2f79050e6804b70ebedd7650f0b839bcf" +checksum = "6d45aeb61b4bf818e12d4205f2466f8c4748f85f4fce0146d1c03d69d753f0ad" dependencies = [ "memchr", "ucd-trie", @@ -2532,9 +2613,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a83744a5c8455b8b3e0dc5031362780a347c878bdd11584d1a8984228cc88d" +checksum = "89cc5a242e25ed4e7704d0be240f2cfbe20a8c27e7e252d94835be93d92dc39f" dependencies = [ "pest", "pest_generator", @@ -2542,9 +2623,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd3451aa3de60d4b9a1e736885e4dea6b31617598026f12256ad566d63304a" +checksum = "7abf21475cc3820fe4b2ca2dc2142902f67a02189f3b5b3a229f4febc01a43e5" dependencies = [ "pest", "pest_meta", @@ -2555,9 +2636,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d3a0849e241d7dfce834c83b1c5edc8622009e8dd51a12ba1927c32f05496" +checksum = "adba4db388f687393c18c51348d44a41d870ca9df71a2c98172ea3035dc6936e" dependencies = [ "pest", ] @@ -2726,6 +2807,8 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" dependencies = [ + "serde_core", + "writeable", "zerovec", ] @@ -2786,17 +2869,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "pulldown-cmark" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "679341d22c78c6c649893cbd6c3278dcbe9fc4faa62fea3a9296ae2b50c14625" -dependencies = [ - "bitflags", - "memchr", - "unicase", -] - [[package]] name = "pulldown-cmark" version = "0.13.4" @@ -2985,9 +3057,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.43" +version = "0.23.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +checksum = "6725596c3f2c3a0aef021139e145d4eafe314a6623e4680ca83852b2c67ab2ba" dependencies = [ "aws-lc-rs", "log", @@ -3172,7 +3244,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -3296,9 +3368,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.2" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" [[package]] name = "smawk" @@ -3383,9 +3455,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" dependencies = [ "proc-macro2", "quote", @@ -3450,12 +3522,12 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.2" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +checksum = "b81c0cb5fce14f53e49c1d4da0c508334ff12040221bb8ab01b2dabd91d04b6e" dependencies = [ + "icu_segmenter", "smawk", - "unicode-linebreak", "unicode-width", ] @@ -3496,7 +3568,7 @@ checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -3555,6 +3627,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" dependencies = [ "displaydoc", + "serde_core", "zerovec", ] @@ -3583,7 +3656,7 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -3724,12 +3797,6 @@ 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-segmentation" version = "1.13.3" @@ -3853,9 +3920,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" dependencies = [ "cfg-if", "once_cell", @@ -3866,9 +3933,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3876,31 +3943,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.5", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.104" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" dependencies = [ "js-sys", "wasm-bindgen", @@ -4228,18 +4295,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.56" +version = "0.8.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.56" +version = "0.8.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" dependencies = [ "proc-macro2", "quote", @@ -4282,6 +4349,7 @@ dependencies = [ "displaydoc", "yoke", "zerofrom", + "zerovec", ] [[package]] @@ -4290,6 +4358,7 @@ version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" dependencies = [ + "serde", "yoke", "zerofrom", "zerovec-derive", @@ -4303,7 +4372,7 @@ checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -4329,18 +4398,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.4" +version = "7.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" +version = "2.1.0+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +checksum = "0ef0a8027ec3ee71300ab3bcbcd0393f434aa72b91ca6d635a39941deae8eea0" dependencies = [ "cc", "pkg-config", diff --git a/extensions/VSCode/Cargo.toml b/extensions/VSCode/Cargo.toml index 62180185..e32b1411 100644 --- a/extensions/VSCode/Cargo.toml +++ b/extensions/VSCode/Cargo.toml @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # @@ -32,7 +32,7 @@ license = "GPL-3.0-only" name = "codechat-editor-vscode-extension" readme = "../README.md" repository = "https://github.com/bjones1/CodeChat_Editor" -version = "0.2.2" +version = "0.2.3" # `cargo machete` doesn't scan `build.rs`, so it can't see `napi-build` used # there. diff --git a/extensions/VSCode/eslint.config.js b/extensions/VSCode/eslint.config.js index a59cc0c5..d8620f93 100644 --- a/extensions/VSCode/eslint.config.js +++ b/extensions/VSCode/eslint.config.js @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // This file is part of the CodeChat Editor. // diff --git a/extensions/VSCode/jsconfig.json b/extensions/VSCode/jsconfig.json index 3d9d7a69..b163bb01 100644 --- a/extensions/VSCode/jsconfig.json +++ b/extensions/VSCode/jsconfig.json @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/extensions/VSCode/package.json b/extensions/VSCode/package.json index 82ce3f68..50b90974 100644 --- a/extensions/VSCode/package.json +++ b/extensions/VSCode/package.json @@ -41,7 +41,7 @@ "type": "git", "url": "https://github.com/bjones1/CodeChat_Editor" }, - "version": "0.2.2", + "version": "0.2.3", "activationEvents": [ "onCommand:extension.codeChatEditorActivate", "onCommand:extension.codeChatEditorDeactivate", @@ -118,18 +118,18 @@ "@emnapi/core": "^1.11.3", "@emnapi/runtime": "^1.11.3", "@eslint/js": "^10.0.1", - "@napi-rs/cli": "^3.8.6", + "@napi-rs/cli": "^3.9.0", "@tybys/wasm-util": "^0.10.3", "@types/escape-html": "^1.0.4", - "@types/node": "^26.4.0", + "@types/node": "^26.5.0", "@types/vscode": "1.61.0", - "@typescript-eslint/eslint-plugin": "^8.68.0", - "@typescript-eslint/parser": "^8.68.0", + "@typescript-eslint/eslint-plugin": "^8.70.0", + "@typescript-eslint/parser": "^8.70.0", "@typescript/native": "npm:typescript@^7.0.2", "@vscode/vsce": "^3.9.2", - "chalk": "^5.6.2", + "chalk": "^6.0.0", "esbuild": "^0.28.2", - "eslint": "^10.9.1", + "eslint": "^10.10.0", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", "eslint-plugin-node": "^11.1.0", @@ -137,7 +137,7 @@ "npm-run-all2": "^9.0.3", "prettier": "^3.9.6", "typescript": "npm:@typescript/typescript6@^6.0.2", - "typescript-eslint": "^8.68.0" + "typescript-eslint": "^8.70.0" }, "optionalDependencies": { "bufferutil": "^4.1.0" diff --git a/extensions/VSCode/pnpm-lock.yaml b/extensions/VSCode/pnpm-lock.yaml index c158388b..2e9f7186 100644 --- a/extensions/VSCode/pnpm-lock.yaml +++ b/extensions/VSCode/pnpm-lock.yaml @@ -20,10 +20,10 @@ importers: version: 1.11.3 '@eslint/js': specifier: ^10.0.1 - version: 10.0.1(eslint@10.9.1(supports-color@7.2.0)) + version: 10.0.1(eslint@10.10.0(supports-color@7.2.0)) '@napi-rs/cli': - specifier: ^3.8.6 - version: 3.8.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@26.4.0)(emnapi@1.11.3)(supports-color@7.2.0) + specifier: ^3.9.0 + version: 3.9.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@26.5.0)(emnapi@1.11.3)(supports-color@7.2.0) '@tybys/wasm-util': specifier: ^0.10.3 version: 0.10.3 @@ -31,17 +31,17 @@ importers: specifier: ^1.0.4 version: 1.0.4 '@types/node': - specifier: ^26.4.0 - version: 26.4.0 + specifier: ^26.5.0 + version: 26.5.0 '@types/vscode': specifier: 1.61.0 version: 1.61.0 '@typescript-eslint/eslint-plugin': - specifier: ^8.68.0 - version: 8.68.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0))(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) + specifier: ^8.70.0 + version: 8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0))(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) '@typescript-eslint/parser': - specifier: ^8.68.0 - version: 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) + specifier: ^8.70.0 + version: 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) '@typescript/native': specifier: npm:typescript@^7.0.2 version: typescript@7.0.2 @@ -49,26 +49,26 @@ importers: specifier: ^3.9.2 version: 3.9.2(supports-color@7.2.0) chalk: - specifier: ^5.6.2 - version: 5.6.2 + specifier: ^6.0.0 + version: 6.0.0 esbuild: specifier: ^0.28.2 version: 0.28.2 eslint: - specifier: ^10.9.1 - version: 10.9.1(supports-color@7.2.0) + specifier: ^10.10.0 + version: 10.10.0(supports-color@7.2.0) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@10.9.1(supports-color@7.2.0)) + version: 10.1.8(eslint@10.10.0(supports-color@7.2.0)) eslint-plugin-import: specifier: ^2.32.0 - version: 2.32.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0))(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) + version: 2.32.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0))(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) eslint-plugin-node: specifier: ^11.1.0 - version: 11.1.0(eslint@10.9.1(supports-color@7.2.0)) + version: 11.1.0(eslint@10.10.0(supports-color@7.2.0)) eslint-plugin-prettier: specifier: ^5.5.6 - version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.9.1(supports-color@7.2.0)))(eslint@10.9.1(supports-color@7.2.0))(prettier@3.9.6) + version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.10.0(supports-color@7.2.0)))(eslint@10.10.0(supports-color@7.2.0))(prettier@3.9.6) npm-run-all2: specifier: ^9.0.3 version: 9.0.3 @@ -79,8 +79,8 @@ importers: specifier: npm:@typescript/typescript6@^6.0.2 version: '@typescript/typescript6@6.0.2' typescript-eslint: - specifier: ^8.68.0 - version: 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) + specifier: ^8.70.0 + version: 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) optionalDependencies: bufferutil: specifier: ^4.1.0 @@ -102,8 +102,8 @@ packages: resolution: {integrity: sha512-IUZydyTUkDnYdstOW9pFOOUQlBjAepK5teihDE3x6yxsPJs/hsAaaYpeGxdxrgtOiJbBKSjKW7MDk7AEhb4LRg==} engines: {node: '>=22.0.0'} - '@azure/core-client@1.11.0': - resolution: {integrity: sha512-JjQWO6akOck45PH/XBrxzsQGAiKrfFl4m5iggJ0ItMIz5omRufOXWpqCPpdjKN3vKDzlSUvFjaMb7Zwf0gvAdA==} + '@azure/core-client@1.11.1': + resolution: {integrity: sha512-2QygG2F76ZpMP2eMztiJvAiFMu71M9rDeU7vO/QKg5Css7MgM4frUOslFjhVjRhbGaCNPtz/S8M6y46/fFKVuQ==} engines: {node: '>=22.0.0'} '@azure/core-process@1.0.0': @@ -130,14 +130,18 @@ packages: resolution: {integrity: sha512-rbAE25KUfjU/s3XHUdJgceoCP5dEOpMx85J04kF+QMdta73XkuG9JGHHinch+XIoKpBdqljin+KqURpJriSzLA==} engines: {node: '>=22.0.0'} - '@azure/msal-browser@5.19.0': - resolution: {integrity: sha512-DHe9iRcyByGJuLPkl0K31a1JjOdRY2zX38Q07mQpSbR8zOj1EIgsWfTXhSQVyyijUxlcofVy/br7qWJbrMwVXQ==} + '@azure/msal-browser@5.21.0': + resolution: {integrity: sha512-80OcuXDErmcEDAIH9pBtSqBsed2sPT/IWmbG3xHLoPMl5zc8TINd6SlJAbVSmN5huGa3xGAg5qR7VnpaIEK0Zw==} engines: {node: '>=0.8.0'} '@azure/msal-common@16.13.0': resolution: {integrity: sha512-rOAy0KUcyBbdwVJ+f3uPpthXatFLLZN+/KWAsTLzk1aB23Xl9DRmmXYwSvBFOZyXj4jUQQ5FKxxRkhAFW1fOow==} engines: {node: '>=0.8.0'} + '@azure/msal-common@16.14.0': + resolution: {integrity: sha512-A4rb55hI86Q9tBl/+jBj7TMz7iX2RFgQs/nExFzcAtoI/BFRVdaH5SL/MivrYD7qvweMpN8AgVvVMHV8UBYxew==} + engines: {node: '>=0.8.0'} + '@azure/msal-node@5.6.0': resolution: {integrity: sha512-uFY9NxrWHw8PwZx7gAX6PDn+9vdfS05+levc/kwkx77IkjfaldnQbbcQzzDIZ5Hq5Zdr6/z92oAIoRWKp6MnOA==} engines: {node: '>=20'} @@ -150,6 +154,12 @@ packages: resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==} engines: {node: '>=6.9.0'} + '@cacheable/memory@2.2.0': + resolution: {integrity: sha512-CTLKqLItRCEixEAewD3/j9DB3/o96gpTPD4eJ1v+DGOlxZRZncRQkGYqqnAGCscYd6RNeXfGeiuCphsPtqyIfQ==} + + '@cacheable/utils@2.5.0': + resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==} + '@emnapi/core@1.11.2': resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} @@ -368,8 +378,8 @@ packages: resolution: {integrity: sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - '@eslint/plugin-kit@0.7.2': - resolution: {integrity: sha512-+CNAzxglkrpNf/kKywqQfk74QjtceuOE7Qm+AF8miRvPF/wmmK5+OJOgVh3AVTT3RP2mH3+FOaxlE5v72owk0A==} + '@eslint/plugin-kit@0.7.3': + resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} '@humanfs/core@0.19.2': @@ -392,12 +402,12 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@inquirer/ansi@2.0.7': - resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + '@inquirer/ansi@2.0.8': + resolution: {integrity: sha512-WpQM+Ti6Z40EFwwt+uL2p4UabT+W179zHp6HhLVOzfbwnVn05IPO/eXIZXGNqcT1jbQ15SujNLzQ39k4QPPxBQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/checkbox@5.2.3': - resolution: {integrity: sha512-XEYX2WA8SBkLPczL6/yXPHLPCvDoptmh9v56Cy05BSV1Smk1vWy19bTC4qJBuIffw7+6l4CcaYYzGqG60RfW1g==} + '@inquirer/checkbox@5.2.5': + resolution: {integrity: sha512-bRt8J8m+Fot9CXv+zNQGXUq2ET0MggR1fPz7v6edN6MFYmsbfGnMmkmWZJEegMKqrAC8ej/o1sqisHZXZJMAfQ==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -405,8 +415,8 @@ packages: '@types/node': optional: true - '@inquirer/confirm@6.3.0': - resolution: {integrity: sha512-pZHXJImFtERmSNMBHcjwuz8Ck5vEFEYNUZnwbb8aJpjHv/TwGuFErNxF2Hp8+V+pNJs2EYPMlyWscvFEqO9jOQ==} + '@inquirer/confirm@6.3.2': + resolution: {integrity: sha512-Xvr/0HggjddPtGppuqVmxhTw+Hr8PvsZ/k0HmOEaAqQEt80OITNkFWnsdNmyT0/eM4Ab+iJLx2R8rctlEyfSVg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -414,8 +424,8 @@ packages: '@types/node': optional: true - '@inquirer/core@12.0.1': - resolution: {integrity: sha512-JMD5Jy/ScL5TZE18m83Nw25HjqGFLoWXwnEkW7IdwwAhZpB9Bus55/WU7zn3UqR1MOCjjTQOIYpiD4vjWA3LPw==} + '@inquirer/core@12.0.3': + resolution: {integrity: sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -423,8 +433,8 @@ packages: '@types/node': optional: true - '@inquirer/editor@5.3.1': - resolution: {integrity: sha512-y43COoyVUjPWIobn2Qep/uI1drPS78aaZZZ9kVi94Tyu/GuW2N8d8Q4rifJXGAXCEAXCPTTMjD8gC1HyvM5ukA==} + '@inquirer/editor@5.3.3': + resolution: {integrity: sha512-YsKkS2q63IiLtaDK/9nqzdComN97SDQrmKiyNggN+ceP4ty+Z6VwyTz3FpjeUWeW1Efss2xHFKCC9sx7hnrsxg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -432,8 +442,8 @@ packages: '@types/node': optional: true - '@inquirer/expand@5.1.3': - resolution: {integrity: sha512-3NQJiXNJ/aj9wiAsr7pECdp5Qe9J0X9YUJCKsaFXS+ddOxfL6J4AIl3w3T4Gq3kK0WsQY5GMoDokK5X94m6lHw==} + '@inquirer/expand@5.1.5': + resolution: {integrity: sha512-uHuXLmXW+TtIfT/9vSBotypAkqn1n34Ul+CLGPos/xANyO4Ff5xZzkYhbKR4NEcfVK4a9mHQOpwVZzluSHFRGw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -441,8 +451,8 @@ packages: '@types/node': optional: true - '@inquirer/external-editor@3.0.4': - resolution: {integrity: sha512-tZbbaK2ovq6vlrRBNQvjrypmrED/p5x2ncIHQ79cD55tei3dD96v5glMMA+6tiq7K104i/25DVYKWVPJuV6ptA==} + '@inquirer/external-editor@3.0.5': + resolution: {integrity: sha512-f3QQJRIX5ZEneBHNUIuPjmbdzHnmRFJA8r2dkcb8q+OM5Uv5KtnuAttQumnrjcBVBM3mcTX1CkmtAkU58VRZxg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -450,12 +460,12 @@ packages: '@types/node': optional: true - '@inquirer/figures@2.0.8': - resolution: {integrity: sha512-tApbon79GM9ry56ja/Ud3SY2CL4TQsao9fIwDQbgTeNY55025GdMzQ2+UdegV/lx51VNGUB59M0v0nMpybYY4Q==} + '@inquirer/figures@2.0.9': + resolution: {integrity: sha512-EAWgUTGQ/Umgga51dE3B2PUHbufuXarDfg86uVgoSgNHNNQnyFKcOrQLWVqYMghuSyHh8+2HUH0Js9cTC1WAdg==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} - '@inquirer/input@5.1.4': - resolution: {integrity: sha512-3xQkQrOvgOzpSN2ciTVdRDlg1FWMCA8l+0KfB6SNlILoTCGzJTzO/gc0Rwjcb3usuGyKdaGtI6OiyMdeMeLWkg==} + '@inquirer/input@5.1.6': + resolution: {integrity: sha512-HtcJhB2QFVXbLuJ5S3syhNbTUVxYvwqV4VRBDkQceBloC9bmTViUoRFP5PbSaDZb3HzfPmpuU/gG4ybVBz4FHA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -463,8 +473,8 @@ packages: '@types/node': optional: true - '@inquirer/number@4.2.1': - resolution: {integrity: sha512-5KaqwZNLRpUuWcoCrYghPP9TMaXL5v2Sk4xqePM7RCVegcJStoXdWibio60YIC1bec+z1fCyb67N6XPJIkZtGA==} + '@inquirer/number@4.2.3': + resolution: {integrity: sha512-6Yuwh1NGSbu1Lo4N1EWjXs1jKRntLg/ZCwhmeorEHde90v1XxAozdbd4Iu30eOQLW+6h1hp2O9ujNfLSbTPJnA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -472,8 +482,8 @@ packages: '@types/node': optional: true - '@inquirer/password@5.2.0': - resolution: {integrity: sha512-CvVcW09emkBESEOW+4R8CjLNkP3fB3XrjeL8CDvfpjgrJN+V9oerXmJAXXM3l+4xqYPD5Yaujzy/Ph0PLOdDuA==} + '@inquirer/password@5.2.2': + resolution: {integrity: sha512-W9zYdyzogK+6110mqwaSJWCBu2yA5Q/OfnGSjjZB1bNpHlmUozXxTl0+QOZBNeVd6Qo81/qT75gW05gLAtITxw==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -481,8 +491,8 @@ packages: '@types/node': optional: true - '@inquirer/prompts@8.7.0': - resolution: {integrity: sha512-yQwBMYvpJ6jqrXtKiOwRD5XezjJoyt3VQvIyjsr5Arqb519nfIohOQymWVJ8/vEgg8xtZerrCsqlSaqt/LPC9A==} + '@inquirer/prompts@8.7.2': + resolution: {integrity: sha512-QoRB4wFIjgH5iOhSjoIKMkTvSHDuV+O3OITlIqAYO0oK5x364GJILXiMBvlPiE+klg7Xx9tq5XVqQHcGUDYYPA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -490,8 +500,8 @@ packages: '@types/node': optional: true - '@inquirer/rawlist@5.3.3': - resolution: {integrity: sha512-Mu7WrtmDLaXBDEyrRLS70SZgX9ZSm4Up1w0ZxiH8C1OOp9oaVCn2k8q3QGgmlnhsKYUhuaU3zFWhAP6wxkVIMA==} + '@inquirer/rawlist@5.3.5': + resolution: {integrity: sha512-1oHky1ONfCOwNrnkQGDE1oaSij/3fI6HFMSf2H/WsGO2lEyDX9My82iggITSy9ddSZ8yk8j9v41OI0fVoSIoaA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -499,8 +509,8 @@ packages: '@types/node': optional: true - '@inquirer/search@4.3.1': - resolution: {integrity: sha512-0VWOvsHWI0rPj6CG70MoP4oXNCB6adcyN8bVFZXnh11eLDdPIK2f2XCmva78acPPDfJisfab7qNakwBh7hdBXw==} + '@inquirer/search@4.3.3': + resolution: {integrity: sha512-fyuIU1Nbpvwlikjg3gXwJFDI11+EFjqQ7P+iByfmivIKQ1vmaykNrD/vy5unHuUqUpsOsnvJ25//tPF7E/RBRA==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -508,8 +518,8 @@ packages: '@types/node': optional: true - '@inquirer/select@5.2.3': - resolution: {integrity: sha512-KuRTodDa6xBXX2noIpjuitpX/QT7Sfav7dIZ/OfUY54Hxg95nrGoshSzxx6Ey7qqLbImKdiGkSDt7KjPXjQgmA==} + '@inquirer/select@5.2.5': + resolution: {integrity: sha512-9kc15hr8r/kI+3DO/xLog5nOzTz1jqsHXa6JBFzmQKhkoJ8Slda1I1L/uD8ZSZ9tF1yp79wwXe7mclvX1rqR2Q==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -517,8 +527,8 @@ packages: '@types/node': optional: true - '@inquirer/type@4.1.0': - resolution: {integrity: sha512-FMiJpuHUG3Dk0ex+UIXkre7i+i4OcwHWk9YdcVtZHFwb/r2rnrU2ipTCNAB7A+QOP0ryzIcqOfy76fRyyvOEAw==} + '@inquirer/type@4.1.1': + resolution: {integrity: sha512-yJoHYrMnxIsJZCY+0Vb66Dy3he3kL3e2wOBKhoSwWWAzZAY82emlxwgprCtp6yRixvNRNq9ztfRWQYPNr3Go7A==} engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} peerDependencies: '@types/node': '>=18' @@ -526,8 +536,17 @@ packages: '@types/node': optional: true - '@napi-rs/cli@3.8.6': - resolution: {integrity: sha512-FnJ9fghsV9Q4zh2aJGPSvQiUlJRC27B6KhzAXcIW2rlSD8keak3mhXw4tJYa3KJkP9whETfsPwqp/DJRnQg5ng==} + '@keyv/bigmap@1.3.1': + resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} + engines: {node: '>= 18'} + peerDependencies: + keyv: ^5.6.0 + + '@keyv/serialize@1.1.1': + resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==} + + '@napi-rs/cli@3.9.0': + resolution: {integrity: sha512-ZlerYOCLgVdaqbVDt8+uQxmU9j8bKMVFcYo6zRHJJHTO9jN5060+y953aIVc/0zkVSKq+fHjDAtTGOrbxpeZCw==} engines: {node: ^20.17.0 || ^22.13.0 || >= 23.5.0} hasBin: true peerDependencies: @@ -902,23 +921,23 @@ packages: resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==} engines: {node: '>= 20'} - '@octokit/core@7.0.7': - resolution: {integrity: sha512-DcB0M3KFgr9ECI328lhBMVsyFT2DnmNucSBTqEN3exyNKUzkkpUSCHmTRcunF41Eou2TIQKW4seewri8ON9bSA==} + '@octokit/core@7.0.8': + resolution: {integrity: sha512-L7y8eYc+AwxGr2PWI4WFt1VG4TiJ66c26BD16mXpYIlXxG0SMigM1+m4aTSlYyBr5BlQsGAlz8uDCoZN4SEMcg==} engines: {node: '>= 20'} - '@octokit/endpoint@11.0.4': - resolution: {integrity: sha512-f1cOWoHPmxryJFknxbtDdjODWfV8A9tc8Aae6ermXPNgHFZ/x91AtHIz4gicEjL8hkJiip+u21QHJORfBv/qiA==} + '@octokit/endpoint@11.0.5': + resolution: {integrity: sha512-iXa654H3yFafF/ieHkukfbgWo2rmXD2ceD0ZOtrPhw1bc3FDch1d9N/TNs0FQ1/cIbwb7kspUX8jzIs8nzb9DQ==} engines: {node: '>= 20'} - '@octokit/graphql@9.0.4': - resolution: {integrity: sha512-5s15CCiY8XXQ+FG+b1YQcl6Z2FA++nwAz/tg2VUrTmnMncP+2nnGUEYANImdnxsA2Fnq+Mbl7hDjUTw7cFAwcg==} + '@octokit/graphql@9.0.5': + resolution: {integrity: sha512-bt/hm03LeU6Vy7FwTrkkC9p3XGT/lBwClglMqxBSe5/q0E5CdJTXeAqEI0vlw89/LF/G6tryTIH8HirZ3prMVg==} engines: {node: '>= 20'} '@octokit/openapi-types@27.0.0': resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==} - '@octokit/openapi-types@28.0.0': - resolution: {integrity: sha512-0rFyLuyHvIj6uuZWuDslxkowFYdPXoNIkeAv4b27dzm2Tf4vGWXnPsMcxs7d65kLdMERgP3wc1AEPlqMz8e1cQ==} + '@octokit/openapi-types@29.0.1': + resolution: {integrity: sha512-9qWOMFNxxLokERcms42rU0PTLqQmVs7g5E41TI4mCOxmpFayD1rfC7XxOL55cG9MBZLFlC31BrR37myMKardwg==} '@octokit/plugin-paginate-rest@14.0.0': resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==} @@ -938,12 +957,12 @@ packages: peerDependencies: '@octokit/core': '>=6' - '@octokit/request-error@7.1.1': - resolution: {integrity: sha512-+eaY7G2VVpSf2pc5Gn1+mph837V/d/TYTJAgWL9Tb0ogGYcpN3IlAVFgjL+Vv93F/sevrxkvsYCedtpLdcFLzA==} + '@octokit/request-error@7.1.2': + resolution: {integrity: sha512-XZRuT3xZ84D3gYErI1DZvhJ33dCWVV6uzBtWkaBB4TvA/L6eOeTZodxLFVB44bBEEo3vEx7y00UfX1tBLrtLRg==} engines: {node: '>= 20'} - '@octokit/request@10.0.15': - resolution: {integrity: sha512-3CBg9aJ0hO9Pjyij8LbK/xYtEaPws9SW7xKz67daPNxQB1q5Y9OMA7DDOG0A6Hwf9ygGu3tvzusg0LXQ8/wAjA==} + '@octokit/request@10.0.16': + resolution: {integrity: sha512-A0zWGjHzISIb+9ccG8s0dq7LKO5zVpJLRICjgUb+sJxEWqn8RUHB1rD3AE51+PECvXHIxqZ1VVvs4fHTSD9nUQ==} engines: {node: '>= 20'} '@octokit/rest@22.0.1': @@ -953,8 +972,8 @@ packages: '@octokit/types@16.0.0': resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==} - '@octokit/types@17.0.0': - resolution: {integrity: sha512-ByP1v7YL5SMveFPP7+sj0/ZuWCOOg/Chs4NafOMpq6WNIM/hdGY0S7C0TCGDBWu1aGmOxmUIhMx3cO+IdwYZ1Q==} + '@octokit/types@18.0.0': + resolution: {integrity: sha512-l6bAF43PNxkJp6g+W4PjoUSSkxHomXw2nOum5CTftJz1NlV3vu93NImgOYtLf6CbBUb5j+fiuzW0PPQ5JTSvZA==} '@pkgr/core@0.3.6': resolution: {integrity: sha512-SEeaJLb3qBNF/OaXnaR1NmmBbFYk1zC0ZH/52fATcRPLFg/p791YrcyFFy44Bo9sLaGuSuLp5Q6axbb/O+v/RA==} @@ -1046,8 +1065,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@26.4.0': - resolution: {integrity: sha512-faiGnoIrLH/V8cibOMEAZ8pMw6oXqSukl29ra4mN8GdaB2ZewzeaLj+INpV5N+Z1eKWzY+IzaIZH2EIR6YZRNQ==} + '@types/node@26.5.0': + resolution: {integrity: sha512-dVSGpriSoCgz8WnDNTuSSuSv1PC/ALXihO4ulRZt7Md8k9mlbdin3lGOcDE8SnWOgf513ByWlXd7BK4azmyg/A==} '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -1058,63 +1077,63 @@ packages: '@types/vscode@1.61.0': resolution: {integrity: sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg==} - '@typescript-eslint/eslint-plugin@8.68.0': - resolution: {integrity: sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q==} + '@typescript-eslint/eslint-plugin@8.70.0': + resolution: {integrity: sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.68.0 + '@typescript-eslint/parser': ^8.70.0 eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/parser@8.68.0': - resolution: {integrity: sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ==} + '@typescript-eslint/parser@8.70.0': + resolution: {integrity: sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==} 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.68.0': - resolution: {integrity: sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw==} + '@typescript-eslint/project-service@8.70.0': + resolution: {integrity: sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/scope-manager@8.68.0': - resolution: {integrity: sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA==} + '@typescript-eslint/scope-manager@8.70.0': + resolution: {integrity: sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.68.0': - resolution: {integrity: sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw==} + '@typescript-eslint/tsconfig-utils@8.70.0': + resolution: {integrity: sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/type-utils@8.68.0': - resolution: {integrity: sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg==} + '@typescript-eslint/type-utils@8.70.0': + resolution: {integrity: sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==} 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.68.0': - resolution: {integrity: sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg==} + '@typescript-eslint/types@8.70.0': + resolution: {integrity: sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.68.0': - resolution: {integrity: sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA==} + '@typescript-eslint/typescript-estree@8.70.0': + resolution: {integrity: sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.1.0' - '@typescript-eslint/utils@8.68.0': - resolution: {integrity: sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ==} + '@typescript-eslint/utils@8.70.0': + resolution: {integrity: sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==} 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.68.0': - resolution: {integrity: sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A==} + '@typescript-eslint/visitor-keys@8.70.0': + resolution: {integrity: sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript/typescript-aix-ppc64@7.0.2': @@ -1241,8 +1260,8 @@ packages: resolution: {integrity: sha512-mbCddXd+jm7hfx7w2YU64/Av4/NqqeG3GoRZgxPcgoTxYjhrcfJRw9ULch71SS4G+Q3bOXFhRvPqjguN0Hyp5w==} hasBin: true - '@typespec/ts-http-runtime@0.3.8': - resolution: {integrity: sha512-bLMpVcWZNzq6lYOybwFwOAR1IXKcHnhUNqYeHjl1bET/qE3jFPFH+p8Wrh3rU4xwdnifPxmKNESBYnvnmc75aA==} + '@typespec/ts-http-runtime@0.3.9': + resolution: {integrity: sha512-edSdeAqkdxBVzA1yL1LrLCml1YjyCVvPMtMqJpbF+6K609tHe8V6sQUzFQSGcYNhcuhOceZtjvN32+mpIth30A==} engines: {node: '>=22.0.0'} '@vscode/vsce-sign-alpine-arm64@2.0.6': @@ -1437,6 +1456,9 @@ packages: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} engines: {node: '>=18'} + cacheable@2.5.0: + resolution: {integrity: sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g==} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -1457,6 +1479,10 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@6.0.0: + resolution: {integrity: sha512-2uNTXIuTTxk7ciZgAU1BQcgnchcG0xXnrs6jzkQfj9SsRa9M2s5zE8WT96hS6KmG4MzWHSrvH43DF1m4XRkrFg==} + engines: {node: '>=22'} + chardet@2.2.0: resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} @@ -1680,8 +1706,8 @@ packages: resolution: {integrity: sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==} engines: {node: '>= 0.4'} - es-toolkit@1.51.0: - resolution: {integrity: sha512-zC2lQGkM7QX+Gm6iM3+WIdZJzthsEd14LvRNJneSO2hzyz/zNBENR8+YXWo1cKxgPBtV6ksPYHELbcwBRzmdCw==} + es-toolkit@1.52.0: + resolution: {integrity: sha512-XTNEJQh1tY1ZJVcf6ayP/2n4ZPyaHlW2FWs7xvw5ddPuhUVjLD3olQVQS7kf58JbAB48iL0uL/jerTrjtV3lDA==} esbuild@0.28.2: resolution: {integrity: sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==} @@ -1781,8 +1807,8 @@ packages: resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} - eslint@10.9.1: - resolution: {integrity: sha512-9VaAkDURekixUQJy0oJYl2DcN6oKMfxay7XzaGYAWQwsb6qfKf+x76R2k1L8kb1boc+FyCAaTA9GmiKaaiaF+A==} + eslint@10.10.0: + resolution: {integrity: sha512-NPXn6r5zl4uET1DAVPaOwzX3rut4c0wcmw3dWJAfOsTM5+TogXo0DDjz8pwm/hL8cyVNpHqeK4JpN0NjnyFFNw==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} hasBin: true peerDependencies: @@ -1837,14 +1863,14 @@ packages: fast-string-width@3.0.2: resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} - fast-uri@3.1.6: - resolution: {integrity: sha512-7Ical1vFEMr0onbVzEDIreM22I4khW+fzyQPwvAFWBp1iwdshSZRsL4jjRvPG9JP1uiqMHRto+YU6R2/CzDz5Q==} + fast-uri@3.1.7: + resolution: {integrity: sha512-dOvZVzjdZdz7phd9v6jCbwxrBW3fK6n8Rc0CtdmM4bumzMnxywBYhuph6J819RRw/ku+rLbelwfMunktuzVVHg==} fast-wrap-ansi@0.2.2: resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} - fastq@1.20.1: - resolution: {integrity: sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==} + fastq@1.20.3: + resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==} fdir@6.5.0: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} @@ -1855,9 +1881,8 @@ packages: picomatch: optional: true - file-entry-cache@8.0.0: - resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} - engines: {node: '>=16.0.0'} + file-entry-cache@11.1.5: + resolution: {integrity: sha512-+PFTHITI08JIGhnNpGNI8T8inUpgZfk3GNEqfT9R2zZV2iFXg3CvqzSl/uEhs7TSGujYRELEANyDvS8Fj7+S7Q==} fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} @@ -1867,9 +1892,8 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - flat-cache@4.0.1: - resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} - engines: {node: '>=16'} + flat-cache@6.1.23: + resolution: {integrity: sha512-f++BY9pTk+983xK1FLzlLpmM0i0z+jHmx3QESGkURMXujQZz1k5wzwX6hjnQ8goaD0B+sYnDK1yZ6MTyZfUaqA==} flatted@3.4.4: resolution: {integrity: sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==} @@ -1968,10 +1992,20 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + hashery@1.5.1: + resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} + engines: {node: '>=20'} + hasown@2.0.4: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} + hookified@1.15.1: + resolution: {integrity: sha512-MvG/clsADq1GPM2KGo2nyfaWVyn9naPiXrqIe4jYjXNZQt238kWyOGrsyc/DmRAQ+Re6yeo6yX/yoNCG5KAEVg==} + + hookified@2.2.0: + resolution: {integrity: sha512-p/LgFzRN5FeoD3DLS6bkUapeye6E4SI6yJs6KetENd18S+FBthqYq2amJUWpt5z0EQwwHemidjY5OqJGEKm5uA==} + hosted-git-info@4.1.0: resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} engines: {node: '>=10'} @@ -2006,8 +2040,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - ignore@7.0.6: - resolution: {integrity: sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==} + ignore@7.0.9: + resolution: {integrity: sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==} engines: {node: '>= 4'} imurmurhash@0.1.4: @@ -2171,9 +2205,6 @@ packages: resolution: {integrity: sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==} hasBin: true - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - json-parse-even-better-errors@6.0.0: resolution: {integrity: sha512-2/8adwnK1/+Fdjyts4r6wSpfANWw8zdNhU9U/Llk59c6O+DjSisPWPykwoL8gZmocP9Dy64S7oie2g+Mia123A==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} @@ -2218,8 +2249,8 @@ packages: keytar@7.9.0: resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + keyv@5.6.0: + resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} @@ -2347,8 +2378,8 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - node-abi@3.95.0: - resolution: {integrity: sha512-T9iGctuocf0qIWFFOTxPzjT5q0SILqaBYXt272tlBHvTKC5+3JnkMirLxNJNkXHtFyBjU2Jx+NL4Zipr0B/c6Q==} + node-abi@3.96.0: + resolution: {integrity: sha512-rebQ/lz7i0EkoLzUVSrKRzA69zMkwLp95kKMWoMDkkM00Suxz0D7zEQPwRml5fQum24mj7bPvmlgLAmu2JCiYg==} engines: {node: '>=10'} node-addon-api@4.3.0: @@ -2437,8 +2468,8 @@ packages: resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} engines: {node: '>=10'} - p-map@7.0.6: - resolution: {integrity: sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==} + p-map@7.0.7: + resolution: {integrity: sha512-VaWRu2i4FJNRtiRWCuuQRgfQ1B7a6+gMSrO+3j0EQi/k0ULfS9kosRxGoiqwzIjZTDI02tGfk5mXXltLg6QtfQ==} engines: {node: '>=18'} parse-json@8.3.0: @@ -2536,8 +2567,12 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - qs@6.15.3: - resolution: {integrity: sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==} + qified@0.10.1: + resolution: {integrity: sha512-+Owyggi9IxT1ePKGafcI87ubSmxol6smwJ+RAHDQlx9+9cPwFWDiKFFCPuWhr9ignlGpZ9vDQLw67N4dcTVFEA==} + engines: {node: '>=20'} + + qs@6.16.0: + resolution: {integrity: sha512-h6fhOIaRrID2CbEY2fqs+7t+UXZo+MLAnU5gRIq85uFtdiUPCdsApMlHhXogKVM4HM2DVbIjGNTTYH2OcmP1vA==} engines: {node: '>=0.6'} queue-microtask@1.2.3: @@ -2854,8 +2889,8 @@ packages: typed-rest-client@1.8.11: resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} - typescript-eslint@8.68.0: - resolution: {integrity: sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ==} + typescript-eslint@8.70.0: + resolution: {integrity: sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 @@ -2881,11 +2916,11 @@ packages: underscore@1.13.8: resolution: {integrity: sha512-DXtD3ZtEQzc7M8m4cXotyHR+FAS18C64asBYY5vqZexfYryNNnDc02W4hKg3rdQuqOYas1jkseX0+nZXjTXnvQ==} - undici-types@8.3.0: - resolution: {integrity: sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==} + undici-types@8.9.0: + resolution: {integrity: sha512-KTDyRTYX8sWmKXAikPHHSyc63CRPETMctyjKFupcC6OBLXT3xsN0e9aF7m+mIXutFWpUXuedtowG7iLOzp0kQg==} - undici@7.29.0: - resolution: {integrity: sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==} + undici@7.29.1: + resolution: {integrity: sha512-RYONW2MeafgYlkVOKYKkA/Ag7BmXqgIWCa8t1m0JcxrQg9pI9lEqRhAOruOBCbAohOa/gkCF+iPi9hrgvTzu6Q==} engines: {node: '>=20.18.1'} unicorn-magic@0.1.0: @@ -3007,7 +3042,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@azure/core-client@1.11.0(supports-color@7.2.0)': + '@azure/core-client@1.11.1(supports-color@7.2.0)': dependencies: '@azure/abort-controller': 2.2.0 '@azure/core-auth': 1.11.0(supports-color@7.2.0) @@ -3028,7 +3063,7 @@ snapshots: '@azure/core-tracing': 1.4.0 '@azure/core-util': 1.14.0(supports-color@7.2.0) '@azure/logger': 1.4.0(supports-color@7.2.0) - '@typespec/ts-http-runtime': 0.3.8(supports-color@7.2.0) + '@typespec/ts-http-runtime': 0.3.9(supports-color@7.2.0) tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -3040,7 +3075,7 @@ snapshots: '@azure/core-util@1.14.0(supports-color@7.2.0)': dependencies: '@azure/abort-controller': 2.2.0 - '@typespec/ts-http-runtime': 0.3.8(supports-color@7.2.0) + '@typespec/ts-http-runtime': 0.3.9(supports-color@7.2.0) tslib: 2.8.1 transitivePeerDependencies: - supports-color @@ -3049,13 +3084,13 @@ snapshots: dependencies: '@azure/abort-controller': 2.2.0 '@azure/core-auth': 1.11.0(supports-color@7.2.0) - '@azure/core-client': 1.11.0(supports-color@7.2.0) + '@azure/core-client': 1.11.1(supports-color@7.2.0) '@azure/core-process': 1.0.0 '@azure/core-rest-pipeline': 1.25.0(supports-color@7.2.0) '@azure/core-tracing': 1.4.0 '@azure/core-util': 1.14.0(supports-color@7.2.0) '@azure/logger': 1.4.0(supports-color@7.2.0) - '@azure/msal-browser': 5.19.0 + '@azure/msal-browser': 5.21.0 '@azure/msal-node': 5.6.0 open: 10.2.0 tslib: 2.8.1 @@ -3064,17 +3099,19 @@ snapshots: '@azure/logger@1.4.0(supports-color@7.2.0)': dependencies: - '@typespec/ts-http-runtime': 0.3.8(supports-color@7.2.0) + '@typespec/ts-http-runtime': 0.3.9(supports-color@7.2.0) tslib: 2.8.1 transitivePeerDependencies: - supports-color - '@azure/msal-browser@5.19.0': + '@azure/msal-browser@5.21.0': dependencies: - '@azure/msal-common': 16.13.0 + '@azure/msal-common': 16.14.0 '@azure/msal-common@16.13.0': {} + '@azure/msal-common@16.14.0': {} + '@azure/msal-node@5.6.0': dependencies: '@azure/msal-common': 16.13.0 @@ -3088,6 +3125,18 @@ snapshots: '@babel/helper-validator-identifier@7.29.7': {} + '@cacheable/memory@2.2.0': + dependencies: + '@cacheable/utils': 2.5.0 + '@keyv/bigmap': 1.3.1(keyv@5.6.0) + hookified: 1.15.1 + keyv: 5.6.0 + + '@cacheable/utils@2.5.0': + dependencies: + hashery: 1.5.1 + keyv: 5.6.0 + '@emnapi/core@1.11.2': dependencies: '@emnapi/wasi-threads': 1.2.2 @@ -3211,9 +3260,9 @@ snapshots: '@esbuild/win32-x64@0.28.2': optional: true - '@eslint-community/eslint-utils@4.10.1(eslint@10.9.1(supports-color@7.2.0))': + '@eslint-community/eslint-utils@4.10.1(eslint@10.10.0(supports-color@7.2.0))': dependencies: - eslint: 10.9.1(supports-color@7.2.0) + eslint: 10.10.0(supports-color@7.2.0) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -3234,13 +3283,13 @@ snapshots: dependencies: '@types/json-schema': 7.0.15 - '@eslint/js@10.0.1(eslint@10.9.1(supports-color@7.2.0))': + '@eslint/js@10.0.1(eslint@10.10.0(supports-color@7.2.0))': optionalDependencies: - eslint: 10.9.1(supports-color@7.2.0) + eslint: 10.10.0(supports-color@7.2.0) '@eslint/object-schema@3.0.5': {} - '@eslint/plugin-kit@0.7.2': + '@eslint/plugin-kit@0.7.3': dependencies: '@eslint/core': 1.2.1 levn: 0.4.1 @@ -3261,134 +3310,142 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@inquirer/ansi@2.0.7': {} + '@inquirer/ansi@2.0.8': {} - '@inquirer/checkbox@5.2.3(@types/node@26.4.0)': + '@inquirer/checkbox@5.2.5(@types/node@26.5.0)': dependencies: - '@inquirer/ansi': 2.0.7 - '@inquirer/core': 12.0.1(@types/node@26.4.0) - '@inquirer/figures': 2.0.8 - '@inquirer/type': 4.1.0(@types/node@26.4.0) + '@inquirer/ansi': 2.0.8 + '@inquirer/core': 12.0.3(@types/node@26.5.0) + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1(@types/node@26.5.0) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@inquirer/confirm@6.3.0(@types/node@26.4.0)': + '@inquirer/confirm@6.3.2(@types/node@26.5.0)': dependencies: - '@inquirer/core': 12.0.1(@types/node@26.4.0) - '@inquirer/type': 4.1.0(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.5.0) + '@inquirer/type': 4.1.1(@types/node@26.5.0) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@inquirer/core@12.0.1(@types/node@26.4.0)': + '@inquirer/core@12.0.3(@types/node@26.5.0)': dependencies: - '@inquirer/ansi': 2.0.7 - '@inquirer/figures': 2.0.8 - '@inquirer/type': 4.1.0(@types/node@26.4.0) + '@inquirer/ansi': 2.0.8 + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1(@types/node@26.5.0) cli-width: 4.1.0 fast-wrap-ansi: 0.2.2 mute-stream: 3.0.0 signal-exit: 4.1.0 optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@inquirer/editor@5.3.1(@types/node@26.4.0)': + '@inquirer/editor@5.3.3(@types/node@26.5.0)': dependencies: - '@inquirer/core': 12.0.1(@types/node@26.4.0) - '@inquirer/external-editor': 3.0.4(@types/node@26.4.0) - '@inquirer/type': 4.1.0(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.5.0) + '@inquirer/external-editor': 3.0.5(@types/node@26.5.0) + '@inquirer/type': 4.1.1(@types/node@26.5.0) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@inquirer/expand@5.1.3(@types/node@26.4.0)': + '@inquirer/expand@5.1.5(@types/node@26.5.0)': dependencies: - '@inquirer/core': 12.0.1(@types/node@26.4.0) - '@inquirer/type': 4.1.0(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.5.0) + '@inquirer/type': 4.1.1(@types/node@26.5.0) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@inquirer/external-editor@3.0.4(@types/node@26.4.0)': + '@inquirer/external-editor@3.0.5(@types/node@26.5.0)': dependencies: chardet: 2.2.0 iconv-lite: 0.7.3 optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@inquirer/figures@2.0.8': {} + '@inquirer/figures@2.0.9': {} - '@inquirer/input@5.1.4(@types/node@26.4.0)': + '@inquirer/input@5.1.6(@types/node@26.5.0)': dependencies: - '@inquirer/core': 12.0.1(@types/node@26.4.0) - '@inquirer/type': 4.1.0(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.5.0) + '@inquirer/type': 4.1.1(@types/node@26.5.0) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@inquirer/number@4.2.1(@types/node@26.4.0)': + '@inquirer/number@4.2.3(@types/node@26.5.0)': dependencies: - '@inquirer/core': 12.0.1(@types/node@26.4.0) - '@inquirer/type': 4.1.0(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.5.0) + '@inquirer/type': 4.1.1(@types/node@26.5.0) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@inquirer/password@5.2.0(@types/node@26.4.0)': + '@inquirer/password@5.2.2(@types/node@26.5.0)': dependencies: - '@inquirer/ansi': 2.0.7 - '@inquirer/core': 12.0.1(@types/node@26.4.0) - '@inquirer/type': 4.1.0(@types/node@26.4.0) + '@inquirer/ansi': 2.0.8 + '@inquirer/core': 12.0.3(@types/node@26.5.0) + '@inquirer/type': 4.1.1(@types/node@26.5.0) optionalDependencies: - '@types/node': 26.4.0 - - '@inquirer/prompts@8.7.0(@types/node@26.4.0)': - dependencies: - '@inquirer/checkbox': 5.2.3(@types/node@26.4.0) - '@inquirer/confirm': 6.3.0(@types/node@26.4.0) - '@inquirer/editor': 5.3.1(@types/node@26.4.0) - '@inquirer/expand': 5.1.3(@types/node@26.4.0) - '@inquirer/input': 5.1.4(@types/node@26.4.0) - '@inquirer/number': 4.2.1(@types/node@26.4.0) - '@inquirer/password': 5.2.0(@types/node@26.4.0) - '@inquirer/rawlist': 5.3.3(@types/node@26.4.0) - '@inquirer/search': 4.3.1(@types/node@26.4.0) - '@inquirer/select': 5.2.3(@types/node@26.4.0) + '@types/node': 26.5.0 + + '@inquirer/prompts@8.7.2(@types/node@26.5.0)': + dependencies: + '@inquirer/checkbox': 5.2.5(@types/node@26.5.0) + '@inquirer/confirm': 6.3.2(@types/node@26.5.0) + '@inquirer/editor': 5.3.3(@types/node@26.5.0) + '@inquirer/expand': 5.1.5(@types/node@26.5.0) + '@inquirer/input': 5.1.6(@types/node@26.5.0) + '@inquirer/number': 4.2.3(@types/node@26.5.0) + '@inquirer/password': 5.2.2(@types/node@26.5.0) + '@inquirer/rawlist': 5.3.5(@types/node@26.5.0) + '@inquirer/search': 4.3.3(@types/node@26.5.0) + '@inquirer/select': 5.2.5(@types/node@26.5.0) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@inquirer/rawlist@5.3.3(@types/node@26.4.0)': + '@inquirer/rawlist@5.3.5(@types/node@26.5.0)': dependencies: - '@inquirer/core': 12.0.1(@types/node@26.4.0) - '@inquirer/type': 4.1.0(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.5.0) + '@inquirer/type': 4.1.1(@types/node@26.5.0) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@inquirer/search@4.3.1(@types/node@26.4.0)': + '@inquirer/search@4.3.3(@types/node@26.5.0)': dependencies: - '@inquirer/core': 12.0.1(@types/node@26.4.0) - '@inquirer/figures': 2.0.8 - '@inquirer/type': 4.1.0(@types/node@26.4.0) + '@inquirer/core': 12.0.3(@types/node@26.5.0) + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1(@types/node@26.5.0) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@inquirer/select@5.2.3(@types/node@26.4.0)': + '@inquirer/select@5.2.5(@types/node@26.5.0)': dependencies: - '@inquirer/ansi': 2.0.7 - '@inquirer/core': 12.0.1(@types/node@26.4.0) - '@inquirer/figures': 2.0.8 - '@inquirer/type': 4.1.0(@types/node@26.4.0) + '@inquirer/ansi': 2.0.8 + '@inquirer/core': 12.0.3(@types/node@26.5.0) + '@inquirer/figures': 2.0.9 + '@inquirer/type': 4.1.1(@types/node@26.5.0) optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@inquirer/type@4.1.0(@types/node@26.4.0)': + '@inquirer/type@4.1.1(@types/node@26.5.0)': optionalDependencies: - '@types/node': 26.4.0 + '@types/node': 26.5.0 - '@napi-rs/cli@3.8.6(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@26.4.0)(emnapi@1.11.3)(supports-color@7.2.0)': + '@keyv/bigmap@1.3.1(keyv@5.6.0)': dependencies: - '@inquirer/prompts': 8.7.0(@types/node@26.4.0) + hashery: 1.5.1 + hookified: 1.15.1 + keyv: 5.6.0 + + '@keyv/serialize@1.1.1': {} + + '@napi-rs/cli@3.9.0(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@26.5.0)(emnapi@1.11.3)(supports-color@7.2.0)': + dependencies: + '@inquirer/prompts': 8.7.2(@types/node@26.5.0) '@napi-rs/cross-toolchain': 1.0.3(supports-color@7.2.0) '@napi-rs/wasm-tools': 1.1.0 '@octokit/rest': 22.0.1 clipanion: 4.0.0-rc.4(typanion@3.14.0) colorette: 2.0.20 - es-toolkit: 1.51.0 + es-toolkit: 1.52.0 js-yaml: 4.3.2 obug: 2.1.4 semver: 7.8.5 @@ -3649,76 +3706,76 @@ snapshots: '@nodelib/fs.walk@1.2.8': dependencies: '@nodelib/fs.scandir': 2.1.5 - fastq: 1.20.1 + fastq: 1.20.3 '@octokit/auth-token@6.0.0': {} - '@octokit/core@7.0.7': + '@octokit/core@7.0.8': dependencies: '@octokit/auth-token': 6.0.0 - '@octokit/graphql': 9.0.4 - '@octokit/request': 10.0.15 - '@octokit/request-error': 7.1.1 - '@octokit/types': 17.0.0 + '@octokit/graphql': 9.0.5 + '@octokit/request': 10.0.16 + '@octokit/request-error': 7.1.2 + '@octokit/types': 18.0.0 before-after-hook: 4.0.0 universal-user-agent: 7.0.3 - '@octokit/endpoint@11.0.4': + '@octokit/endpoint@11.0.5': dependencies: - '@octokit/types': 17.0.0 + '@octokit/types': 18.0.0 universal-user-agent: 7.0.3 - '@octokit/graphql@9.0.4': + '@octokit/graphql@9.0.5': dependencies: - '@octokit/request': 10.0.15 - '@octokit/types': 17.0.0 + '@octokit/request': 10.0.16 + '@octokit/types': 18.0.0 universal-user-agent: 7.0.3 '@octokit/openapi-types@27.0.0': {} - '@octokit/openapi-types@28.0.0': {} + '@octokit/openapi-types@29.0.1': {} - '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.7)': + '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.8)': dependencies: - '@octokit/core': 7.0.7 + '@octokit/core': 7.0.8 '@octokit/types': 16.0.0 - '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.7)': + '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.8)': dependencies: - '@octokit/core': 7.0.7 + '@octokit/core': 7.0.8 - '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.7)': + '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.8)': dependencies: - '@octokit/core': 7.0.7 + '@octokit/core': 7.0.8 '@octokit/types': 16.0.0 - '@octokit/request-error@7.1.1': + '@octokit/request-error@7.1.2': dependencies: - '@octokit/types': 17.0.0 + '@octokit/types': 18.0.0 - '@octokit/request@10.0.15': + '@octokit/request@10.0.16': dependencies: - '@octokit/endpoint': 11.0.4 - '@octokit/request-error': 7.1.1 - '@octokit/types': 17.0.0 + '@octokit/endpoint': 11.0.5 + '@octokit/request-error': 7.1.2 + '@octokit/types': 18.0.0 content-type: 3.0.0 json-with-bigint: 3.5.12 universal-user-agent: 7.0.3 '@octokit/rest@22.0.1': dependencies: - '@octokit/core': 7.0.7 - '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.7) - '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.7) - '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.7) + '@octokit/core': 7.0.8 + '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.8) + '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.8) + '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.8) '@octokit/types@16.0.0': dependencies: '@octokit/openapi-types': 27.0.0 - '@octokit/types@17.0.0': + '@octokit/types@18.0.0': dependencies: - '@octokit/openapi-types': 28.0.0 + '@octokit/openapi-types': 29.0.1 '@pkgr/core@0.3.6': {} @@ -3773,7 +3830,7 @@ snapshots: '@secretlint/source-creator': 10.2.2 '@secretlint/types': 10.2.2 debug: 4.4.3(supports-color@7.2.0) - p-map: 7.0.6 + p-map: 7.0.7 transitivePeerDependencies: - supports-color @@ -3842,9 +3899,9 @@ snapshots: '@types/json5@0.0.29': {} - '@types/node@26.4.0': + '@types/node@26.5.0': dependencies: - undici-types: 8.3.0 + undici-types: 8.9.0 '@types/normalize-package-data@2.4.4': {} @@ -3852,72 +3909,72 @@ snapshots: '@types/vscode@1.61.0': {} - '@typescript-eslint/eslint-plugin@8.68.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0))(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)': + '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0))(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) - '@typescript-eslint/scope-manager': 8.68.0 - '@typescript-eslint/type-utils': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) - '@typescript-eslint/utils': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) - '@typescript-eslint/visitor-keys': 8.68.0 - eslint: 10.9.1(supports-color@7.2.0) - ignore: 7.0.6 + '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/type-utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) + '@typescript-eslint/visitor-keys': 8.70.0 + eslint: 10.10.0(supports-color@7.2.0) + ignore: 7.0.9 natural-compare: 1.4.0 ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)': + '@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: - '@typescript-eslint/scope-manager': 8.68.0 - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/typescript-estree': 8.68.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) - '@typescript-eslint/visitor-keys': 8.68.0 + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) + '@typescript-eslint/visitor-keys': 8.70.0 debug: 4.4.3(supports-color@7.2.0) - eslint: 10.9.1(supports-color@7.2.0) + eslint: 10.10.0(supports-color@7.2.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.68.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)': + '@typescript-eslint/project-service@8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.68.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/tsconfig-utils': 8.70.0(@typescript/typescript6@6.0.2) + '@typescript-eslint/types': 8.70.0 debug: 4.4.3(supports-color@7.2.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.68.0': + '@typescript-eslint/scope-manager@8.70.0': dependencies: - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/visitor-keys': 8.68.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/visitor-keys': 8.70.0 - '@typescript-eslint/tsconfig-utils@8.68.0(@typescript/typescript6@6.0.2)': + '@typescript-eslint/tsconfig-utils@8.70.0(@typescript/typescript6@6.0.2)': dependencies: typescript: '@typescript/typescript6@6.0.2' - '@typescript-eslint/type-utils@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)': + '@typescript-eslint/type-utils@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/typescript-estree': 8.68.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) - '@typescript-eslint/utils': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) debug: 4.4.3(supports-color@7.2.0) - eslint: 10.9.1(supports-color@7.2.0) + eslint: 10.10.0(supports-color@7.2.0) ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.68.0': {} + '@typescript-eslint/types@8.70.0': {} - '@typescript-eslint/typescript-estree@8.68.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)': + '@typescript-eslint/typescript-estree@8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0)': dependencies: - '@typescript-eslint/project-service': 8.68.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) - '@typescript-eslint/tsconfig-utils': 8.68.0(@typescript/typescript6@6.0.2) - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/visitor-keys': 8.68.0 + '@typescript-eslint/project-service': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) + '@typescript-eslint/tsconfig-utils': 8.70.0(@typescript/typescript6@6.0.2) + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/visitor-keys': 8.70.0 debug: 4.4.3(supports-color@7.2.0) minimatch: 10.2.6 semver: 7.8.5 @@ -3927,20 +3984,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0)': + '@typescript-eslint/utils@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0)': dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(supports-color@7.2.0)) - '@typescript-eslint/scope-manager': 8.68.0 - '@typescript-eslint/types': 8.68.0 - '@typescript-eslint/typescript-estree': 8.68.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) - eslint: 10.9.1(supports-color@7.2.0) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(supports-color@7.2.0)) + '@typescript-eslint/scope-manager': 8.70.0 + '@typescript-eslint/types': 8.70.0 + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) + eslint: 10.10.0(supports-color@7.2.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.68.0': + '@typescript-eslint/visitor-keys@8.70.0': dependencies: - '@typescript-eslint/types': 8.68.0 + '@typescript-eslint/types': 8.70.0 eslint-visitor-keys: 5.0.1 '@typescript/typescript-aix-ppc64@7.0.2': @@ -4007,7 +4064,7 @@ snapshots: dependencies: '@typescript/old': typescript@6.0.3 - '@typespec/ts-http-runtime@0.3.8(supports-color@7.2.0)': + '@typespec/ts-http-runtime@0.3.9(supports-color@7.2.0)': dependencies: http-proxy-agent: 7.0.2(supports-color@7.2.0) https-proxy-agent: 7.0.6(supports-color@7.2.0) @@ -4108,7 +4165,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.6 + fast-uri: 3.1.7 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -4249,6 +4306,14 @@ snapshots: dependencies: run-applescript: 7.1.0 + cacheable@2.5.0: + dependencies: + '@cacheable/memory': 2.2.0 + '@cacheable/utils': 2.5.0 + hookified: 1.15.1 + keyv: 5.6.0 + qified: 0.10.1 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -4273,6 +4338,8 @@ snapshots: chalk@5.6.2: {} + chalk@6.0.0: {} + chardet@2.2.0: {} cheerio-select@2.1.0: @@ -4295,7 +4362,7 @@ snapshots: parse5: 7.3.0 parse5-htmlparser2-tree-adapter: 7.1.0 parse5-parser-stream: 7.1.2 - undici: 7.29.0 + undici: 7.29.1 whatwg-mimetype: 4.0.0 chownr@1.1.4: @@ -4560,7 +4627,7 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - es-toolkit@1.51.0: {} + es-toolkit@1.52.0: {} esbuild@0.28.2: optionalDependencies: @@ -4595,9 +4662,9 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.8(eslint@10.9.1(supports-color@7.2.0)): + eslint-config-prettier@10.1.8(eslint@10.10.0(supports-color@7.2.0)): dependencies: - eslint: 10.9.1(supports-color@7.2.0) + eslint: 10.10.0(supports-color@7.2.0) eslint-import-resolver-node@0.3.10(supports-color@7.2.0): dependencies: @@ -4607,23 +4674,23 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.14.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0): + eslint-module-utils@2.14.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0): dependencies: debug: 3.2.7(supports-color@7.2.0) optionalDependencies: - '@typescript-eslint/parser': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) - eslint: 10.9.1(supports-color@7.2.0) + '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) + eslint: 10.10.0(supports-color@7.2.0) eslint-import-resolver-node: 0.3.10(supports-color@7.2.0) transitivePeerDependencies: - supports-color - eslint-plugin-es@3.0.1(eslint@10.9.1(supports-color@7.2.0)): + eslint-plugin-es@3.0.1(eslint@10.10.0(supports-color@7.2.0)): dependencies: - eslint: 10.9.1(supports-color@7.2.0) + eslint: 10.10.0(supports-color@7.2.0) eslint-utils: 2.1.0 regexpp: 3.2.0 - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0))(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0))(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -4632,9 +4699,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7(supports-color@7.2.0) doctrine: 2.1.0 - eslint: 10.9.1(supports-color@7.2.0) + eslint: 10.10.0(supports-color@7.2.0) eslint-import-resolver-node: 0.3.10(supports-color@7.2.0) - eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) + eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0))(eslint-import-resolver-node@0.3.10(supports-color@7.2.0))(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) hasown: 2.0.4 is-core-module: 2.16.2 is-glob: 4.0.3 @@ -4646,30 +4713,30 @@ snapshots: string.prototype.trimend: 1.0.10 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) + '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-node@11.1.0(eslint@10.9.1(supports-color@7.2.0)): + eslint-plugin-node@11.1.0(eslint@10.10.0(supports-color@7.2.0)): dependencies: - eslint: 10.9.1(supports-color@7.2.0) - eslint-plugin-es: 3.0.1(eslint@10.9.1(supports-color@7.2.0)) + eslint: 10.10.0(supports-color@7.2.0) + eslint-plugin-es: 3.0.1(eslint@10.10.0(supports-color@7.2.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.6(eslint-config-prettier@10.1.8(eslint@10.9.1(supports-color@7.2.0)))(eslint@10.9.1(supports-color@7.2.0))(prettier@3.9.6): + eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.10.0(supports-color@7.2.0)))(eslint@10.10.0(supports-color@7.2.0))(prettier@3.9.6): dependencies: - eslint: 10.9.1(supports-color@7.2.0) + eslint: 10.10.0(supports-color@7.2.0) prettier: 3.9.6 prettier-linter-helpers: 1.0.1 synckit: 0.11.13 optionalDependencies: - eslint-config-prettier: 10.1.8(eslint@10.9.1(supports-color@7.2.0)) + eslint-config-prettier: 10.1.8(eslint@10.10.0(supports-color@7.2.0)) eslint-scope@9.1.2: dependencies: @@ -4688,14 +4755,14 @@ snapshots: eslint-visitor-keys@5.0.1: {} - eslint@10.9.1(supports-color@7.2.0): + eslint@10.10.0(supports-color@7.2.0): dependencies: - '@eslint-community/eslint-utils': 4.10.1(eslint@10.9.1(supports-color@7.2.0)) + '@eslint-community/eslint-utils': 4.10.1(eslint@10.10.0(supports-color@7.2.0)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.23.5(supports-color@7.2.0) '@eslint/config-helpers': 0.7.0 '@eslint/core': 1.2.1 - '@eslint/plugin-kit': 0.7.2 + '@eslint/plugin-kit': 0.7.3 '@humanfs/node': 0.16.8 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -4710,7 +4777,7 @@ snapshots: esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 8.0.0 + file-entry-cache: 11.1.5 find-up: 5.0.0 glob-parent: 6.0.2 ignore: 5.3.2 @@ -4766,13 +4833,13 @@ snapshots: dependencies: fast-string-truncated-width: 3.0.3 - fast-uri@3.1.6: {} + fast-uri@3.1.7: {} fast-wrap-ansi@0.2.2: dependencies: fast-string-width: 3.0.2 - fastq@1.20.1: + fastq@1.20.3: dependencies: reusify: 1.1.0 @@ -4780,9 +4847,9 @@ snapshots: optionalDependencies: picomatch: 4.0.7 - file-entry-cache@8.0.0: + file-entry-cache@11.1.5: dependencies: - flat-cache: 4.0.1 + flat-cache: 6.1.23 fill-range@7.1.1: dependencies: @@ -4793,10 +4860,11 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - flat-cache@4.0.1: + flat-cache@6.1.23: dependencies: + cacheable: 2.5.0 flatted: 3.4.4 - keyv: 4.5.4 + hookified: 1.15.1 flatted@3.4.4: {} @@ -4889,7 +4957,7 @@ snapshots: dependencies: '@sindresorhus/merge-streams': 2.3.0 fast-glob: 3.3.3 - ignore: 7.0.6 + ignore: 7.0.9 path-type: 6.0.0 slash: 5.1.0 unicorn-magic: 0.3.0 @@ -4916,10 +4984,18 @@ snapshots: dependencies: has-symbols: 1.1.0 + hashery@1.5.1: + dependencies: + hookified: 1.15.1 + hasown@2.0.4: dependencies: function-bind: 1.1.2 + hookified@1.15.1: {} + + hookified@2.2.0: {} + hosted-git-info@4.1.0: dependencies: lru-cache: 6.0.0 @@ -4962,7 +5038,7 @@ snapshots: ignore@5.3.2: {} - ignore@7.0.6: {} + ignore@7.0.9: {} imurmurhash@0.1.4: {} @@ -5122,8 +5198,6 @@ snapshots: dependencies: argparse: 2.0.1 - json-buffer@3.0.1: {} - json-parse-even-better-errors@6.0.0: {} json-schema-traverse@0.4.1: {} @@ -5178,9 +5252,9 @@ snapshots: prebuild-install: 7.1.3 optional: true - keyv@4.5.4: + keyv@5.6.0: dependencies: - json-buffer: 3.0.1 + '@keyv/serialize': 1.1.1 leven@3.1.0: {} @@ -5282,7 +5356,7 @@ snapshots: natural-compare@1.4.0: {} - node-abi@3.95.0: + node-abi@3.96.0: dependencies: semver: 7.8.5 optional: true @@ -5406,7 +5480,7 @@ snapshots: dependencies: p-limit: 3.1.0 - p-map@7.0.6: {} + p-map@7.0.7: {} parse-json@8.3.0: dependencies: @@ -5468,7 +5542,7 @@ snapshots: minimist: 1.2.8 mkdirp-classic: 0.5.3 napi-build-utils: 2.0.0 - node-abi: 3.95.0 + node-abi: 3.96.0 pump: 3.0.4 rc: 1.2.8 simple-get: 4.0.1 @@ -5494,7 +5568,11 @@ snapshots: punycode@2.3.1: {} - qs@6.15.3: + qified@0.10.1: + dependencies: + hookified: 2.2.0 + + qs@6.16.0: dependencies: es-define-property: 1.0.1 side-channel: 1.1.1 @@ -5907,17 +5985,17 @@ snapshots: typed-rest-client@1.8.11: dependencies: - qs: 6.15.3 + qs: 6.16.0 tunnel: 0.0.6 underscore: 1.13.8 - typescript-eslint@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0): + typescript-eslint@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0): dependencies: - '@typescript-eslint/eslint-plugin': 8.68.0(@typescript-eslint/parser@8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0))(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) - '@typescript-eslint/parser': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) - '@typescript-eslint/typescript-estree': 8.68.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) - '@typescript-eslint/utils': 8.68.0(@typescript/typescript6@6.0.2)(eslint@10.9.1(supports-color@7.2.0))(supports-color@7.2.0) - eslint: 10.9.1(supports-color@7.2.0) + '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0))(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) + '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) + '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@7.2.0) + '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.10.0(supports-color@7.2.0))(supports-color@7.2.0) + eslint: 10.10.0(supports-color@7.2.0) typescript: '@typescript/typescript6@6.0.2' transitivePeerDependencies: - supports-color @@ -5958,9 +6036,9 @@ snapshots: underscore@1.13.8: {} - undici-types@8.3.0: {} + undici-types@8.9.0: {} - undici@7.29.0: {} + undici@7.29.1: {} unicorn-magic@0.1.0: {} diff --git a/extensions/VSCode/src/capture-policy.ts b/extensions/VSCode/src/capture-policy.ts index 6411ba18..04c7065d 100644 --- a/extensions/VSCode/src/capture-policy.ts +++ b/extensions/VSCode/src/capture-policy.ts @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // This file is part of the CodeChat Editor. diff --git a/extensions/VSCode/src/extension.ts b/extensions/VSCode/src/extension.ts index 38058609..4fe8e14c 100644 --- a/extensions/VSCode/src/extension.ts +++ b/extensions/VSCode/src/extension.ts @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/extensions/VSCode/src/lib.rs b/extensions/VSCode/src/lib.rs index 86c8e2b9..22e7854e 100644 --- a/extensions/VSCode/src/lib.rs +++ b/extensions/VSCode/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/extensions/VSCode/tsconfig.json b/extensions/VSCode/tsconfig.json index ddf87b24..81174e7a 100644 --- a/extensions/VSCode/tsconfig.json +++ b/extensions/VSCode/tsconfig.json @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/extensions/standalone/Cargo.lock b/extensions/standalone/Cargo.lock index a1f3f789..9e105656 100644 --- a/extensions/standalone/Cargo.lock +++ b/extensions/standalone/Cargo.lock @@ -44,12 +44,11 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.13.3" +version = "3.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11004b0e9b44b4eb3d15e0c3132b96fb178c7e50a74758b2f17bb9cc9a7fb4f6" +checksum = "86d62d1a48894ec9450bcde7ef1e3681205771ff6ea9c61cc5ae031145192787" dependencies = [ "actix-codec", - "actix-rt", "actix-service", "actix-utils", "base64", @@ -422,9 +421,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.18.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2b2dcc879c3bae0d371e77c99f2238400ef24ec001394befa67b6e543add9e" +checksum = "b281d307588d634de920874890732659e2e7672f72b5e10e81badc1a8a83621e" dependencies = [ "aws-lc-sys", "zeroize", @@ -432,9 +431,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.44.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09fae7be8bb3174e05c6afdb34199e6dc0c7c04ba9fa237b1967adfbde27483" +checksum = "9bff6c3b54fad79a2e60b8102caf565819711497c1f5f092f49508e2f5c31b27" dependencies = [ "cc", "cmake", @@ -544,9 +543,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.4.4" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" +checksum = "005ec2760ca554fae18df7a11195552ec576cd665632a881bc011d5bb2fd4d80" dependencies = [ "find-msvc-tools", "jobserver", @@ -622,7 +621,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -651,7 +650,7 @@ dependencies = [ [[package]] name = "codechat-editor-server" -version = "0.2.2" +version = "0.2.3" dependencies = [ "actix-files", "actix-rt", @@ -682,7 +681,7 @@ dependencies = [ "pest", "pest_derive", "phf 0.14.0", - "pulldown-cmark 0.13.4", + "pulldown-cmark", "rand 0.10.2", "regex", "serde", @@ -702,7 +701,7 @@ dependencies = [ [[package]] name = "codechat-editor-standalone" -version = "0.2.2" +version = "0.2.3" dependencies = [ "actix-http", "actix-rt", @@ -815,6 +814,12 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core_detect" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" + [[package]] name = "cow-utils" version = "0.1.3" @@ -841,9 +846,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -851,18 +856,18 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.20" +version = "0.9.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" [[package]] name = "crypto-common" @@ -897,12 +902,12 @@ dependencies = [ [[package]] name = "cssparser-macros" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a2a99df6e410a8ff4245aa2006499ea662245f967cc7c0a38c83ef8eb44dbf" +checksum = "d045de693cb712d0b22c6a64be5b953f67b3ce00ab5ad3dd5d8b441886ab8e1a" dependencies = [ "quote", - "syn 2.0.119", + "syn 3.0.5", ] [[package]] @@ -987,14 +992,14 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] name = "dprint-core" -version = "0.68.5" +version = "0.69.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace8a07022e292c498f9568c6859f73e40721fa18c4c0760cdc56220f4b99040" +checksum = "67359cea061dd052fca921d3589a9ce59bc16fa23bfb9d06d5c669a1dbd23915" dependencies = [ "bumpalo", "hashbrown 0.15.5", @@ -1016,13 +1021,11 @@ dependencies = [ [[package]] name = "dprint-plugin-markdown" -version = "0.22.1" -source = "git+https://github.com/bjones1/dprint-plugin-markdown.git?branch=all-fixes#3e767b74c195fdeb88033db99b9a35cf16d4a248" +version = "0.23.3" +source = "git+https://github.com/bjones1/dprint-plugin-markdown.git?branch=all-fixes#e5908d54a20e80835f36ca63abba9e6fd76e946a" dependencies = [ "dprint-core", "dprint-core-macros", - "pulldown-cmark 0.11.3", - "regex", "serde", "thiserror 2.0.20", "unicode-width", @@ -1075,11 +1078,17 @@ checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" [[package]] name = "encoding_rs" -version = "0.8.35" +version = "0.8.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "7b5ef0006ac9ab233c38522f5ae99cae3625151de8f706cacee1cba4b8e2832a" dependencies = [ "cfg-if", + "core_detect", + "multiversion", + "multiversion_no_op", + "rustversion", + "scopeguard", + "simdutf8", ] [[package]] @@ -1115,9 +1124,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" +checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" [[package]] name = "flate2" @@ -1195,7 +1204,7 @@ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -1330,7 +1339,7 @@ checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "htmd" version = "0.5.5" -source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#f1a6ff03a169fb388fed497fa0a1f7ece1d02387" +source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#68e54497edf1be23dbf73fe1bd6bdf6170b729cc" dependencies = [ "html5ever", "markup5ever_rcdom", @@ -1394,9 +1403,9 @@ checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" [[package]] name = "hybrid-array" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" dependencies = [ "typenum", ] @@ -1447,11 +1456,32 @@ checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" dependencies = [ "displaydoc", "litemap", + "serde", "tinystr", "writeable", "zerovec", ] +[[package]] +name = "icu_locale_fallback" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "251af8e57c9400e3eb58242fe5b8b1152b2a64fdf4cf632f923c38ccee6f2fa9" +dependencies = [ + "icu_locale_core", + "icu_locale_fallback_data", + "icu_provider", + "potential_utf", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locale_fallback_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "decf2a22ec8fa68f1a0c1129a3f8583f8f8bc24e8b9ccbe98ead99f62a4dc3a8" + [[package]] name = "icu_normalizer" version = "2.3.0" @@ -1501,6 +1531,8 @@ checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" dependencies = [ "displaydoc", "icu_locale_core", + "serde", + "stable_deref_trait", "writeable", "yoke", "zerofrom", @@ -1508,6 +1540,28 @@ dependencies = [ "zerovec", ] +[[package]] +name = "icu_segmenter" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d07aafccd67af15d02512a6adf5896fbc5ed00f2e99b471d2efa14016db3db" +dependencies = [ + "icu_collections", + "icu_locale_fallback", + "icu_provider", + "icu_segmenter_data", + "potential_utf", + "smallvec", + "utf8_iter", + "zerovec", +] + +[[package]] +name = "icu_segmenter_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae293c039020f9ec10710af98d29ce6aa2051486638b49c9a6409f3b4a9e98ad" + [[package]] name = "idna" version = "1.1.0" @@ -1557,15 +1611,15 @@ dependencies = [ [[package]] name = "impl-more" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "277ff51754a3f68f12f58446c5d006aa8baa4914ea273cce24a599cfaff33d4f" +checksum = "edaff2ce006342d4d0e00fae676f7082dada44a203560629ba18ea50a19277bb" [[package]] name = "indexmap" -version = "2.14.1" +version = "2.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", "hashbrown 0.17.1", @@ -1718,9 +1772,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.104" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" dependencies = [ "cfg-if", "futures-util", @@ -2003,9 +2057,9 @@ dependencies = [ [[package]] name = "mio" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" dependencies = [ "libc", "log", @@ -2019,6 +2073,33 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bb517913cfcfb9eeda59f36020269075a152701a01606c612f547e4890be399" +[[package]] +name = "multiversion" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ca4bea16ffc3f443cf7d866912118196bfef4c6a1556ca00f9f9b00bb43f7c" +dependencies = [ + "multiversion-macros", +] + +[[package]] +name = "multiversion-macros" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d416831a7317ef4b08bee00b69cbbb9c8763da7959a7026244d6266869f9c83" +dependencies = [ + "proc-macro2", + "quote", + "rustversion", + "syn 3.0.5", +] + +[[package]] +name = "multiversion_no_op" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d" + [[package]] name = "ndk-context" version = "0.1.1" @@ -2639,9 +2720,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07a60cc7a4d00c91f95c685609d1d2f79050e6804b70ebedd7650f0b839bcf" +checksum = "6d45aeb61b4bf818e12d4205f2466f8c4748f85f4fce0146d1c03d69d753f0ad" dependencies = [ "memchr", "ucd-trie", @@ -2649,9 +2730,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a83744a5c8455b8b3e0dc5031362780a347c878bdd11584d1a8984228cc88d" +checksum = "89cc5a242e25ed4e7704d0be240f2cfbe20a8c27e7e252d94835be93d92dc39f" dependencies = [ "pest", "pest_generator", @@ -2659,9 +2740,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd3451aa3de60d4b9a1e736885e4dea6b31617598026f12256ad566d63304a" +checksum = "7abf21475cc3820fe4b2ca2dc2142902f67a02189f3b5b3a229f4febc01a43e5" dependencies = [ "pest", "pest_meta", @@ -2672,9 +2753,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d3a0849e241d7dfce834c83b1c5edc8622009e8dd51a12ba1927c32f05496" +checksum = "adba4db388f687393c18c51348d44a41d870ca9df71a2c98172ea3035dc6936e" dependencies = [ "pest", ] @@ -2843,6 +2924,8 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" dependencies = [ + "serde_core", + "writeable", "zerovec", ] @@ -2916,17 +2999,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "pulldown-cmark" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "679341d22c78c6c649893cbd6c3278dcbe9fc4faa62fea3a9296ae2b50c14625" -dependencies = [ - "bitflags", - "memchr", - "unicase", -] - [[package]] name = "pulldown-cmark" version = "0.13.4" @@ -3115,9 +3187,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.43" +version = "0.23.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +checksum = "6725596c3f2c3a0aef021139e145d4eafe314a6623e4680ca83852b2c67ab2ba" dependencies = [ "aws-lc-rs", "log", @@ -3302,7 +3374,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -3426,9 +3498,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.2" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" [[package]] name = "smawk" @@ -3519,9 +3591,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" dependencies = [ "proc-macro2", "quote", @@ -3586,12 +3658,12 @@ dependencies = [ [[package]] name = "textwrap" -version = "0.16.2" +version = "0.16.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c13547615a44dc9c452a8a534638acdf07120d4b6847c8178705da06306a3057" +checksum = "b81c0cb5fce14f53e49c1d4da0c508334ff12040221bb8ab01b2dabd91d04b6e" dependencies = [ + "icu_segmenter", "smawk", - "unicode-linebreak", "unicode-width", ] @@ -3632,7 +3704,7 @@ checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -3691,6 +3763,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" dependencies = [ "displaydoc", + "serde_core", "zerovec", ] @@ -3719,7 +3792,7 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -3860,12 +3933,6 @@ 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-segmentation" version = "1.13.3" @@ -4004,9 +4071,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" dependencies = [ "cfg-if", "once_cell", @@ -4017,9 +4084,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4027,31 +4094,31 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.5", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" dependencies = [ "unicode-ident", ] [[package]] name = "web-sys" -version = "0.3.104" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" dependencies = [ "js-sys", "wasm-bindgen", @@ -4510,18 +4577,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.56" +version = "0.8.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.56" +version = "0.8.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" dependencies = [ "proc-macro2", "quote", @@ -4564,6 +4631,7 @@ dependencies = [ "displaydoc", "yoke", "zerofrom", + "zerovec", ] [[package]] @@ -4572,6 +4640,7 @@ version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" dependencies = [ + "serde", "yoke", "zerofrom", "zerovec-derive", @@ -4585,7 +4654,7 @@ checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -4611,18 +4680,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.4" +version = "7.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" +version = "2.1.0+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +checksum = "0ef0a8027ec3ee71300ab3bcbcd0393f434aa72b91ca6d635a39941deae8eea0" dependencies = [ "cc", "pkg-config", diff --git a/extensions/standalone/Cargo.toml b/extensions/standalone/Cargo.toml index 89e21f56..8ec95349 100644 --- a/extensions/standalone/Cargo.toml +++ b/extensions/standalone/Cargo.toml @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # @@ -32,7 +32,7 @@ license = "GPL-3.0-only" name = "codechat-editor-standalone" readme = "../../README.md" repository = "https://github.com/bjones1/CodeChat_Editor" -version = "0.2.2" +version = "0.2.3" # Dependencies # ------------ diff --git a/extensions/standalone/dist.toml b/extensions/standalone/dist.toml index a5fc55d1..3233240e 100644 --- a/extensions/standalone/dist.toml +++ b/extensions/standalone/dist.toml @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # @@ -23,4 +23,8 @@ [dist] # Extra static files to include in each App (path relative to this Cargo.toml's # dir) -include = ["../../server/log4rs.yml", "../../server/hashLocations.json", "../../client/static"] +include = [ + "../../server/log4rs.yml", + "../../server/hashLocations.json", + "../../client/static", +] diff --git a/extensions/standalone/src/filewatcher.rs b/extensions/standalone/src/filewatcher.rs index e6589d1a..8898d610 100644 --- a/extensions/standalone/src/filewatcher.rs +++ b/extensions/standalone/src/filewatcher.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 @@ -13,8 +13,8 @@ // 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](http://www.gnu.org/licenses). -/// `filewatcher.rs` -- Implement the File Watcher "IDE" -/// ==================================================== +//! `filewatcher.rs` -- Implement the File Watcher "IDE" +//! ==================================================== // Imports // ------- // @@ -784,7 +784,7 @@ mod tests { }; use code_chat_editor::{ processing::{ - CodeChatForWeb, CodeMirror, CodeMirrorDiffable, SourceFileMetadata, TranslationResults, + CodeChatForWeb, CodeMirror, CodeMirrorDiffable, SourceFileMetadata, source_to_codechat_for_web, }, webserver::{ @@ -935,13 +935,12 @@ mod tests { // Check the contents. let translation_results = source_to_codechat_for_web( "", - &"py".to_string(), + Path::new("foo.py"), umc.contents.as_ref().unwrap().version, false, - false, + None, ); - let tr = cast!(translation_results, Ok); - let codechat_for_web = cast!(tr, TranslationResults::CodeChat); + let codechat_for_web = translation_results.unwrap(); assert_eq!(umc.contents, Some(codechat_for_web)); // Report any errors produced when removing the temporary directory. diff --git a/extensions/standalone/src/main.rs b/extensions/standalone/src/main.rs index 3b11aa5e..e7149ed5 100644 --- a/extensions/standalone/src/main.rs +++ b/extensions/standalone/src/main.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/extensions/standalone/tests/cli.rs b/extensions/standalone/tests/cli.rs index 90f8561d..94de599e 100644 --- a/extensions/standalone/tests/cli.rs +++ b/extensions/standalone/tests/cli.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 @@ -13,8 +13,8 @@ // 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](http://www.gnu.org/licenses). -/// `cli.rs` - Test the CLI interface -/// ================================= +//! `cli.rs` - Test the CLI interface +//! ================================= // Imports // ------- // diff --git a/server/.gitignore b/server/.gitignore index 3df19d07..3cf227fe 100644 --- a/server/.gitignore +++ b/server/.gitignore @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # diff --git a/server/Cargo.lock b/server/Cargo.lock index d79d52ce..21d53ee7 100644 --- a/server/Cargo.lock +++ b/server/Cargo.lock @@ -44,15 +44,14 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.13.3" +version = "3.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11004b0e9b44b4eb3d15e0c3132b96fb178c7e50a74758b2f17bb9cc9a7fb4f6" +checksum = "86d62d1a48894ec9450bcde7ef1e3681205771ff6ea9c61cc5ae031145192787" dependencies = [ "actix-codec", - "actix-rt", "actix-service", "actix-utils", - "base64", + "base64 0.22.1", "bitflags", "brotli", "bytes", @@ -217,7 +216,7 @@ checksum = "456348ed9dcd72a13a1f4a660449fafdecee9ac8205552e286809eb5b0b29bd3" dependencies = [ "actix-utils", "actix-web", - "base64", + "base64 0.22.1", "futures-core", "futures-util", "log", @@ -363,7 +362,7 @@ checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -380,9 +379,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-lc-rs" -version = "1.18.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce2b2dcc879c3bae0d371e77c99f2238400ef24ec001394befa67b6e543add9e" +checksum = "b281d307588d634de920874890732659e2e7672f72b5e10e81badc1a8a83621e" dependencies = [ "aws-lc-sys", "zeroize", @@ -390,9 +389,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.44.0" +version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f09fae7be8bb3174e05c6afdb34199e6dc0c7c04ba9fa237b1967adfbde27483" +checksum = "9bff6c3b54fad79a2e60b8102caf565819711497c1f5f092f49508e2f5c31b27" dependencies = [ "cc", "cmake", @@ -407,6 +406,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "base64" +version = "0.23.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac07cdecf99051d9a5238b80f35af32cdeba5b336e55d957b318b50137e18da5" + [[package]] name = "base64-simd" version = "0.8.0" @@ -501,9 +506,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.4.4" +version = "1.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad534f4357a5264cce5019c989cf66a4f0dc4e0d1b1d15f8aacec0ff7360273" +checksum = "005ec2760ca554fae18df7a11195552ec576cd665632a881bc011d5bb2fd4d80" dependencies = [ "find-msvc-tools", "jobserver", @@ -574,7 +579,7 @@ dependencies = [ [[package]] name = "codechat-editor-server" -version = "0.2.2" +version = "0.2.3" dependencies = [ "actix-files", "actix-rt", @@ -610,7 +615,7 @@ dependencies = [ "phf 0.14.0", "predicates", "pretty_assertions", - "pulldown-cmark 0.13.4", + "pulldown-cmark", "rand 0.10.2", "regex", "serde", @@ -732,6 +737,12 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core_detect" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" + [[package]] name = "cow-utils" version = "0.1.3" @@ -758,9 +769,9 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -768,18 +779,18 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.20" +version = "0.9.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" dependencies = [ "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" [[package]] name = "crypto-common" @@ -814,12 +825,12 @@ dependencies = [ [[package]] name = "cssparser-macros" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a2a99df6e410a8ff4245aa2006499ea662245f967cc7c0a38c83ef8eb44dbf" +checksum = "d045de693cb712d0b22c6a64be5b953f67b3ce00ab5ad3dd5d8b441886ab8e1a" dependencies = [ "quote", - "syn 2.0.119", + "syn 3.0.5", ] [[package]] @@ -925,14 +936,14 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] name = "dprint-core" -version = "0.68.5" +version = "0.69.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace8a07022e292c498f9568c6859f73e40721fa18c4c0760cdc56220f4b99040" +checksum = "67359cea061dd052fca921d3589a9ce59bc16fa23bfb9d06d5c669a1dbd23915" dependencies = [ "bumpalo", "hashbrown 0.15.5", @@ -954,13 +965,11 @@ dependencies = [ [[package]] name = "dprint-plugin-markdown" -version = "0.22.1" -source = "git+https://github.com/bjones1/dprint-plugin-markdown.git?branch=all-fixes#3e767b74c195fdeb88033db99b9a35cf16d4a248" +version = "0.23.3" +source = "git+https://github.com/bjones1/dprint-plugin-markdown.git?branch=all-fixes#e5908d54a20e80835f36ca63abba9e6fd76e946a" dependencies = [ "dprint-core", "dprint-core-macros", - "pulldown-cmark 0.11.3", - "regex", "serde", "thiserror 2.0.20", "unicode-width", @@ -1013,11 +1022,17 @@ checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" [[package]] name = "encoding_rs" -version = "0.8.35" +version = "0.8.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "7b5ef0006ac9ab233c38522f5ae99cae3625151de8f706cacee1cba4b8e2832a" dependencies = [ "cfg-if", + "core_detect", + "multiversion", + "multiversion_no_op", + "rustversion", + "scopeguard", + "simdutf8", ] [[package]] @@ -1054,9 +1069,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d45db016d36b838f563236e9193d0ee6ce38f3f68b6c94e914b4929c96bbb890" +checksum = "3e0f1c7c3a72c66fd80abe965175f7523475c0489a87d3ff9d6e8c87d87a9d2d" [[package]] name = "flate2" @@ -1178,7 +1193,7 @@ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -1315,7 +1330,7 @@ dependencies = [ [[package]] name = "htmd" version = "0.5.5" -source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#f1a6ff03a169fb388fed497fa0a1f7ece1d02387" +source = "git+https://github.com/bjones1/htmd.git?branch=dom-interface#68e54497edf1be23dbf73fe1bd6bdf6170b729cc" dependencies = [ "html5ever", "markup5ever_rcdom", @@ -1412,9 +1427,9 @@ checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" [[package]] name = "hybrid-array" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707114b52a152fa7bdb290cd7cd5912d9467273b6d74e21b8d81aca1f8533f6b" +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" dependencies = [ "typenum", ] @@ -1460,7 +1475,7 @@ version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "base64", + "base64 0.22.1", "bytes", "futures-channel", "futures-util", @@ -1633,15 +1648,15 @@ dependencies = [ [[package]] name = "impl-more" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "277ff51754a3f68f12f58446c5d006aa8baa4914ea273cce24a599cfaff33d4f" +checksum = "edaff2ce006342d4d0e00fae676f7082dada44a203560629ba18ea50a19277bb" [[package]] name = "indexmap" -version = "2.14.1" +version = "2.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07aa2048142242915a31d35844fb311e0e53fcca590c3a0a40dcf1b841fa09eb" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" dependencies = [ "equivalent", "hashbrown 0.17.1", @@ -1660,9 +1675,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.12.1" +version = "2.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a756c3fac73139e83f14c2d742155dd2b78d3ee56597b419a0579b7bdd6dd78" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" [[package]] name = "itertools" @@ -1774,9 +1789,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.104" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0c1080212aad755ea003d18543e8768dd432c48819efd73a7bf1e39b7a5a3a" +checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" dependencies = [ "cfg-if", "futures-util", @@ -1824,9 +1839,9 @@ checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" [[package]] name = "libredox" -version = "0.1.21" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7955dfc218a8afb29dfeffd540e3a6e96baeb94fe7138228dd7cc6937fbbf96" +checksum = "8d8f1ea3f21fd3405dcaf6c9b5c1630af9afc422d9073ea39c5f6d6c772e08ed" dependencies = [ "libc", ] @@ -2062,16 +2077,16 @@ version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "659579df697b372ef9e36f02fcbb41f6d6f157dcec7db9c9618fa0f23cf0fc20" dependencies = [ - "base64", + "base64 0.22.1", "rustls", "rustls-platform-verifier 0.6.2", ] [[package]] name = "mio" -version = "1.2.2" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d65c71f1ce40ab09135ce117d742b9f8a19ff91a41a8b57ed50bc2de59c427" +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" dependencies = [ "libc", "log", @@ -2085,6 +2100,33 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9bb517913cfcfb9eeda59f36020269075a152701a01606c612f547e4890be399" +[[package]] +name = "multiversion" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ca4bea16ffc3f443cf7d866912118196bfef4c6a1556ca00f9f9b00bb43f7c" +dependencies = [ + "multiversion-macros", +] + +[[package]] +name = "multiversion-macros" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d416831a7317ef4b08bee00b69cbbb9c8763da7959a7026244d6266869f9c83" +dependencies = [ + "proc-macro2", + "quote", + "rustversion", + "syn 3.0.5", +] + +[[package]] +name = "multiversion_no_op" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d" + [[package]] name = "ndk-context" version = "0.1.1" @@ -2671,9 +2713,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a07a60cc7a4d00c91f95c685609d1d2f79050e6804b70ebedd7650f0b839bcf" +checksum = "6d45aeb61b4bf818e12d4205f2466f8c4748f85f4fce0146d1c03d69d753f0ad" dependencies = [ "memchr", "ucd-trie", @@ -2681,9 +2723,9 @@ dependencies = [ [[package]] name = "pest_derive" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a83744a5c8455b8b3e0dc5031362780a347c878bdd11584d1a8984228cc88d" +checksum = "89cc5a242e25ed4e7704d0be240f2cfbe20a8c27e7e252d94835be93d92dc39f" dependencies = [ "pest", "pest_generator", @@ -2691,9 +2733,9 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0cd3451aa3de60d4b9a1e736885e4dea6b31617598026f12256ad566d63304a" +checksum = "7abf21475cc3820fe4b2ca2dc2142902f67a02189f3b5b3a229f4febc01a43e5" dependencies = [ "pest", "pest_meta", @@ -2704,9 +2746,9 @@ dependencies = [ [[package]] name = "pest_meta" -version = "2.9.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04d3a0849e241d7dfce834c83b1c5edc8622009e8dd51a12ba1927c32f05496" +checksum = "adba4db388f687393c18c51348d44a41d870ca9df71a2c98172ea3035dc6936e" dependencies = [ "pest", ] @@ -2948,17 +2990,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "pulldown-cmark" -version = "0.11.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "679341d22c78c6c649893cbd6c3278dcbe9fc4faa62fea3a9296ae2b50c14625" -dependencies = [ - "bitflags", - "memchr", - "unicase", -] - [[package]] name = "pulldown-cmark" version = "0.13.4" @@ -3182,11 +3213,11 @@ checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" [[package]] name = "reqwest" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219c5811de6525e5416c7d5d53bb656d3afdbc6c5af816e0802bcfa42dbdc1c3" +checksum = "16a1cfa75cc186dd73d5818e510e042e40927bccc9c236b061cea97e1eb08029" dependencies = [ - "base64", + "base64 0.23.1", "bytes", "futures-core", "futures-util", @@ -3264,9 +3295,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.43" +version = "0.23.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0283386ce02abc0151e1761d08802dfe86c173b0b494af5cbc086574e453da06" +checksum = "6725596c3f2c3a0aef021139e145d4eafe314a6623e4680ca83852b2c67ab2ba" dependencies = [ "aws-lc-rs", "log", @@ -3473,7 +3504,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -3498,7 +3529,7 @@ checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -3609,9 +3640,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] name = "smallvec" -version = "1.15.2" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +checksum = "b9be42f50aa861c555654aa3a37f52f4b1074bacf4e48fe0ef7fa584e80f1f0f" [[package]] name = "smawk" @@ -3705,9 +3736,9 @@ dependencies = [ [[package]] name = "syn" -version = "3.0.4" +version = "3.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6275cddf4610d1775e6d1fe9469b2e77d0f39fd98fb7450901b821e0c53649f" +checksum = "12df2e0110f65b775f769bb17ef989067a1d931b2eb822bd4346631eeada89f9" dependencies = [ "proc-macro2", "quote", @@ -3809,7 +3840,7 @@ checksum = "28b596eb866a1a2bac3e8e17080b8f21739e1bdb0b5479fe5c70d14375362a92" dependencies = [ "arc-swap", "async-trait", - "base64", + "base64 0.22.1", "bytes", "cfg-if", "const_format", @@ -3883,7 +3914,7 @@ checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -3947,9 +3978,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.12.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb4ebadaa0af04fab11ae01eb5f9fdb5f9c5b875506e210e71c07873528baa7f" +checksum = "4cf0ded5c4e56918d8f8a339e1bb67d038d3bc6d144ac407904015ba2e4cde9b" dependencies = [ "tinyvec_macros", ] @@ -3985,14 +4016,14 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] name = "tokio-rustls" -version = "0.26.4" +version = "0.26.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67" dependencies = [ "rustls", "tokio", @@ -4371,9 +4402,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b70935747edd64d89de3efa29d73789b806c15798f8e7dca4d8ac356b50ce70" +checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" dependencies = [ "cfg-if", "once_cell", @@ -4384,9 +4415,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.77" +version = "0.4.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7777d5cc23d0e91404e53ce2d5e8ec7acae3026b16233dba62cd3246457950" +checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" dependencies = [ "js-sys", "wasm-bindgen", @@ -4394,9 +4425,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77775f8f3f7217702089053b94958f8f54061a3f663417df76e19cbdcca29bc1" +checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4404,22 +4435,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e11d33f857dc2fb11b8bc75aee111aa9cbeb12cd9f25efd3d4c2a3dd4e235284" +checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.119", + "syn 3.0.5", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.127" +version = "0.2.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef64dbcc55df09c7e5a46182d181c2cfa3e925f3da937ea764728b4bbb9dcbf" +checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" dependencies = [ "unicode-ident", ] @@ -4439,9 +4470,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.104" +version = "0.3.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c435338968042f4f59a557f690a253676d47ce13ceb55d70100e7facf6620a30" +checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" dependencies = [ "js-sys", "wasm-bindgen", @@ -4795,18 +4826,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.56" +version = "0.8.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556764e583adb45a9f8d413c2a147fa7e8d821e48e12b14fd560b607998b75eb" +checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.56" +version = "0.8.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ab42fc20575779bd240faa45f94a74256f755c0fa9e89f0ede20d91d0cdfc1" +checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc" dependencies = [ "proc-macro2", "quote", @@ -4870,7 +4901,7 @@ checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" dependencies = [ "proc-macro2", "quote", - "syn 3.0.4", + "syn 3.0.5", ] [[package]] @@ -4922,18 +4953,18 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.4" +version = "7.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" +checksum = "64d80649ab6db9d9f6f9c80a40becd948eda4714a0a5ac8c4d157a32231c7882" dependencies = [ "zstd-sys", ] [[package]] name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" +version = "2.1.0+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" +checksum = "0ef0a8027ec3ee71300ab3bcbcd0393f434aa72b91ca6d635a39941deae8eea0" dependencies = [ "cc", "pkg-config", diff --git a/server/Cargo.toml b/server/Cargo.toml index c579899a..c920f6a7 100644 --- a/server/Cargo.toml +++ b/server/Cargo.toml @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # @@ -32,7 +32,7 @@ license = "GPL-3.0-only" name = "codechat-editor-server" readme = "../README.md" repository = "https://github.com/bjones1/CodeChat_Editor" -version = "0.2.2" +version = "0.2.3" # This library allows other packages to use core CodeChat Editor features. [lib] diff --git a/server/bt b/server/bt index 75dda0c4..47788c5c 100755 --- a/server/bt +++ b/server/bt @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # diff --git a/server/bt.ps1 b/server/bt.ps1 index fcaca37f..d039d8ba 100644 --- a/server/bt.ps1 +++ b/server/bt.ps1 @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # diff --git a/server/cache.pptx b/server/cache.pptx new file mode 100644 index 00000000..bca3924e Binary files /dev/null and b/server/cache.pptx differ diff --git a/server/log4rs.yml b/server/log4rs.yml index d534ba2a..9867910d 100644 --- a/server/log4rs.yml +++ b/server/log4rs.yml @@ -1,4 +1,4 @@ -# Copyright (C) 2025 Bryan A. Jones. +# Copyright (C) 2026 Bryan A. Jones. # # This file is part of the CodeChat Editor. # @@ -30,7 +30,7 @@ appenders: # File appender for INFO, WARN, and ERROR levels file_appender: kind: file - path: "app.log" # Specify desired logfile path + path: "app.log" # Specify desired logfile path encoder: pattern: "{d} {l} {t} {L} - {m}{n}" @@ -43,4 +43,4 @@ root: level: debug appenders: - console_appender - - file_appender \ No newline at end of file + - file_appender diff --git a/server/src/capture.rs b/server/src/capture.rs index a2505024..6bbe99c9 100644 --- a/server/src/capture.rs +++ b/server/src/capture.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/server/src/ide.rs b/server/src/ide.rs index 6c690d22..8c1393c7 100644 --- a/server/src/ide.rs +++ b/server/src/ide.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/server/src/ide/vscode.rs b/server/src/ide/vscode.rs index 104a9b14..9e6ba06e 100644 --- a/server/src/ide/vscode.rs +++ b/server/src/ide/vscode.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 @@ -13,9 +13,9 @@ // 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](http://www.gnu.org/licenses). -/// `vscode.rs` -- Implement server-side functionality for the Visual Studio -/// Code IDE -/// ======================================================================== +//! `vscode.rs` -- Implement server-side functionality for the Visual Studio +//! Code IDE +//! ======================================================================== // Modules // ------- #[cfg(test)] diff --git a/server/src/ide/vscode/tests.rs b/server/src/ide/vscode/tests.rs index b6b42a14..f0553cfd 100644 --- a/server/src/ide/vscode/tests.rs +++ b/server/src/ide/vscode/tests.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 @@ -13,8 +13,8 @@ // 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](http://www.gnu.org/licenses). -/// `test.rs` -- Unit tests for the vscode interface -/// ================================================ +//! `test.rs` -- Unit tests for the vscode interface +//! ================================================ // Imports // ------- use std::{ diff --git a/server/src/lexer.rs b/server/src/lexer.rs index fc4c5c77..3ec01072 100644 --- a/server/src/lexer.rs +++ b/server/src/lexer.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 @@ -13,11 +13,11 @@ // 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](http://www.gnu.org/licenses). -mod pest_parser; -/// `lexer.rs` -- Lex source code into code and doc blocks -/// ====================================================== +//! `lexer.rs` -- Lex source code into code and doc blocks +//! ====================================================== // Submodule definitions // --------------------- +mod pest_parser; pub mod supported_languages; // Imports @@ -37,36 +37,35 @@ use regex::Regex; // ### Local use supported_languages::get_language_lexer_vec; -/// Data structures -/// --------------- -/// -/// ### Language definition -/// -/// These data structures define everything the lexer needs in order to analyze -/// a programming language: -/// -/// * It defines block and inline comment delimiters; these (when correctly -/// formatted) become doc blocks. -/// * It defines strings: what is the escape character? Are newlines allowed? If -/// so, must newlines be escaped? -/// * It defines heredocs in a flexible form (see `HeredocDelim` for more -/// details). -/// * It associates a CodeMirror mode and filename extensions with the lexer. -/// -/// This lexer ignores line continuation characters; in C/C++/Python, it's a `\` -/// character followed immediately by a newline -/// ([C reference](https://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf#page22), -/// [Python reference](https://docs.python.org/3/reference/lexical_analysis.html#explicit-line-joining)). -/// From a lexer perspective, supporting these adds little value: -/// -/// 1. It would allow the lexer to recognize the following C/C++ snippet as a -/// doc block: `// This is an odd\` `two-line inline comment.` However, this -/// is such unusual syntax (most authors would instead use either a block -/// comment or another inline comment) that recognizing it adds little value. -/// 2. I'm unaware of any valid syntax in which ignoring a line continuation -/// would cause the lexer to mis-recognize code as a comment. (Escaped -/// newlines in strings, a separate case, are handled correctly). -/// +// Data structures +// --------------- +// +// ### Language definition +// +// These data structures define everything the lexer needs in order to analyze +// a programming language: +// +// * It defines block and inline comment delimiters; these (when correctly +// formatted) become doc blocks. +// * It defines strings: what is the escape character? Are newlines allowed? If +// so, must newlines be escaped? +// * It defines heredocs in a flexible form (see `HeredocDelim` for more +// details). +// * It associates a CodeMirror mode and filename extensions with the lexer. +// +// This lexer ignores line continuation characters; in C/C++/Python, it's a `\` +// character followed immediately by a newline +// ([C reference](https://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf#page22), +// [Python reference](https://docs.python.org/3/reference/lexical_analysis.html#explicit-line-joining)). +// From a lexer perspective, supporting these adds little value: +// +// 1. It would allow the lexer to recognize the following C/C++ snippet as a +// doc block: `// This is an odd\` `two-line inline comment.` However, this +// is such unusual syntax (most authors would instead use either a block +// comment or another inline comment) that recognizing it adds little value. +// 2. I'm unaware of any valid syntax in which ignoring a line continuation +// would cause the lexer to mis-recognize code as a comment. (Escaped +// newlines in strings, a separate case, are handled correctly). /// This struct defines the delimiters for a block comment. #[derive(Clone)] pub struct BlockCommentDelim { diff --git a/server/src/lexer/lexer-walkthrough.md b/server/src/lexer/lexer-walkthrough.md index 261ece09..78b41f62 100644 --- a/server/src/lexer/lexer-walkthrough.md +++ b/server/src/lexer/lexer-walkthrough.md @@ -1,4 +1,4 @@ -Copyright (C) 2025 Bryan A. Jones. +Copyright (C) 2026 Bryan A. Jones. This file is part of the CodeChat Editor. diff --git a/server/src/lexer/pest/c.pest b/server/src/lexer/pest/c.pest index 0cebf315..20e3c707 100644 --- a/server/src/lexer/pest/c.pest +++ b/server/src/lexer/pest/c.pest @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/server/src/lexer/pest/python.pest b/server/src/lexer/pest/python.pest index 07b523d3..391487eb 100644 --- a/server/src/lexer/pest/python.pest +++ b/server/src/lexer/pest/python.pest @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/server/src/lexer/pest/shared.pest b/server/src/lexer/pest/shared.pest index 1df626df..71ce5377 100644 --- a/server/src/lexer/pest/shared.pest +++ b/server/src/lexer/pest/shared.pest @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/server/src/lexer/pest_parser.rs b/server/src/lexer/pest_parser.rs index b2887305..3f5cad5f 100644 --- a/server/src/lexer/pest_parser.rs +++ b/server/src/lexer/pest_parser.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 diff --git a/server/src/lexer/supported_languages.rs b/server/src/lexer/supported_languages.rs index dc34c11c..de66d70b 100644 --- a/server/src/lexer/supported_languages.rs +++ b/server/src/lexer/supported_languages.rs @@ -1,50 +1,49 @@ -/// Copyright (C) 2025 Bryan A. Jones. -/// -/// 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. -/// -/// 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. -/// -/// 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](http://www.gnu.org/licenses). -/// -/// `supported_languages.rs` - Provide lexer info for all supported languages -/// ========================================================================= -/// -/// This file contains a data structure which describes all supported languages; -/// the [lexer](../lexer.rs) uses this lex a given language. -/// -/// Lexer implementation -/// -------------------- -/// -/// Ordering matters: all these delimiters end up in a large regex separated by -/// an or operator. The regex or operator matches from left to right. So, longer -/// Python string delimiters must be specified first (leftmost): `"""` (a -/// multi-line Python string) must come before `"`. The resulting regex will -/// then have `"""|"`, which will first search for the multi-line triple quote, -/// then if that's not found, the single quote. A regex of `"|"""` would never -/// match the triple quote, since the single quote would match first. -/// -/// Note that the lexers here should be complemented by the appropriate -/// CodeMirror mode in -/// [CodeMirror-integration.mts](../../../client/src/CodeMirror-integration.mts). -/// -/// ### String delimiter doubling -/// -/// Some languages allow inserting the string delimiter within a string by -/// putting two back-to-back delimiters in the string. For example, SQL's string -/// delimiter is a single quote. To insert a single quote in a string, double -/// it: `'She''s here.'`, for example. From a lexer perspective, we don't need -/// extra logic to handle this; instead, it's treated as two back-to-back -/// strings. In this case, they would be `'She'` and `'s here.'`. While this -/// doesn't parse the string correctly, it does correctly identify where -/// comments can't be, which is all that the lexer needs to do. +// Copyright (C) 2026 Bryan A. Jones. +// +// 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. +// +// 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. +// +// 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](http://www.gnu.org/licenses). +//! `supported_languages.rs` - Provide lexer info for all supported languages +//! ========================================================================= +//! +//! This file contains a data structure which describes all supported languages; +//! the [lexer](../lexer.rs) uses this lex a given language. +//! +//! Lexer implementation +//! -------------------- +//! +//! Ordering matters: all these delimiters end up in a large regex separated by +//! an or operator. The regex or operator matches from left to right. So, longer +//! Python string delimiters must be specified first (leftmost): `"""` (a +//! multi-line Python string) must come before `"`. The resulting regex will +//! then have `"""|"`, which will first search for the multi-line triple quote, +//! then if that's not found, the single quote. A regex of `"|"""` would never +//! match the triple quote, since the single quote would match first. +//! +//! Note that the lexers here should be complemented by the appropriate +//! CodeMirror mode in +//! [CodeMirror-integration.mts](../../../client/src/CodeMirror-integration.mts). +//! +//! ### String delimiter doubling +//! +//! Some languages allow inserting the string delimiter within a string by +//! putting two back-to-back delimiters in the string. For example, SQL's string +//! delimiter is a single quote. To insert a single quote in a string, double +//! it: `'She''s here.'`, for example. From a lexer perspective, we don't need +//! extra logic to handle this; instead, it's treated as two back-to-back +//! strings. In this case, they would be `'She'` and `'s here.'`. While this +//! doesn't parse the string correctly, it does correctly identify where +//! comments can't be, which is all that the lexer needs to do. // Imports // ------- // diff --git a/server/src/lexer/tests.rs b/server/src/lexer/tests.rs index 040c7d95..7540da21 100644 --- a/server/src/lexer/tests.rs +++ b/server/src/lexer/tests.rs @@ -1,21 +1,20 @@ -/// Copyright (C) 2025 Bryan A. Jones. -/// -/// 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. -/// -/// 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. -/// -/// 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](http://www.gnu.org/licenses). -/// -/// `test.rs` -- Unit tests for the lexer -/// ===================================== +// Copyright (C) 2026 Bryan A. Jones. +// +// 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. +// +// 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. +// +// 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](http://www.gnu.org/licenses). +//! `test.rs` -- Unit tests for the lexer +//! ===================================== // Imports // ------- use super::supported_languages::get_language_lexer_vec; diff --git a/server/src/lib.rs b/server/src/lib.rs index 7f09f8e2..6b6bc6ab 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 @@ -24,11 +24,11 @@ clippy::float_cmp ) )] -/// `lib.rs` -- Define library modules for the CodeChat Editor Server -/// ================================================================= -/// -/// TODO: Add the ability to use -/// [plugins](https://zicklag.github.io/rust-tutorials/rust-plugins.html). +//! `lib.rs` -- Define library modules for the CodeChat Editor Server +//! ================================================================= +//! +//! TODO: Add the ability to use +//! [plugins](https://zicklag.github.io/rust-tutorials/rust-plugins.html). pub mod capture; pub mod ide; pub mod lexer; diff --git a/server/src/processing.rs b/server/src/processing.rs index baf13c14..6d67e01a 100644 --- a/server/src/processing.rs +++ b/server/src/processing.rs @@ -1,4 +1,4 @@ -// Copyright (C) 2025 Bryan A. Jones. +// Copyright (C) 2026 Bryan A. Jones. // // 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 @@ -13,9 +13,13 @@ // 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](http://www.gnu.org/licenses). -/// `processing.rs` -- Transform source code to its web-editable equivalent and -/// back -/// =========================================================================== +//! `processing.rs` -- Transform source code to its web-editable equivalent and +//! back +//! =========================================================================== +// Modules +// ------- +pub mod cache; + // Imports // ------- // @@ -24,16 +28,19 @@ use std::{ borrow::Cow, cell::RefCell, cmp::{max, min}, + collections::HashMap, collections::HashSet, ffi::OsStr, io, iter::Map, + mem, ops::Range, path::{Path, PathBuf}, rc::Rc, slice::Iter, string::FromUtf8Error, sync::LazyLock, + sync::{Arc, Mutex}, }; // ### Third-party @@ -41,14 +48,14 @@ use ammonia::Builder; use dprint_plugin_markdown::{ FormatError, configuration::{ - Configuration, ConfigurationBuilder, EmphasisKind, HeadingKind, StrongKind, TextWrap, - UnorderedListKind, + Configuration, ConfigurationBuilder, EmphasisKind, HeadingKind, ListUnorderedMarker, + StrongKind, TextWrap, }, format_text, }; use htmd::{ HtmlToMarkdown, - options::{LinkStyle, TranslationMode}, + options::{BrStyle, LinkStyle, TranslationMode}, }; use html5ever::{ Attribute, LocalName, Namespace, ParseOpts, QualName, parse_document, serialize, @@ -59,6 +66,7 @@ use html5ever::{ use imara_diff::{Algorithm, Diff, Hunk, InternedInput, TokenSource}; use markup5ever_rcdom::{Node, NodeData, RcDom, SerializableHandle}; use minify_html; +use path_slash::PathBufExt as _; use phf::phf_map; use pulldown_cmark::{Options, Parser, html}; use regex::Regex; @@ -66,10 +74,14 @@ use serde::{Deserialize, Serialize}; use ts_rs::TS; // ### Local -use crate::lexer::{ - CodeDocBlock, DocBlock, LEXERS, LanguageLexerCompiled, source_lexer, - supported_languages::MARKDOWN_MODE, +use crate::{ + lexer::{ + CodeDocBlock, DocBlock, LEXERS, LanguageLexerCompiled, source_lexer, + supported_languages::MARKDOWN_MODE, + }, + processing::cache::{FileFacts, FragmentFact, IdResolution, TargetFact}, }; +use cache::{Cache, CacheMap}; // Data structures // --------------- @@ -214,18 +226,6 @@ pub struct StringDiff { pub insert: String, } -/// This enum contains the results of translating a source file to the CodeChat -/// Editor format. -#[derive(Debug, PartialEq)] -pub enum TranslationResults { - /// This file is unknown to and therefore not supported by the CodeChat - /// Editor. - Unknown, - /// A CodeChat Editor file; the struct contains the file's contents - /// translated to CodeMirror. - CodeChat(CodeChatForWeb), -} - /// This enum contains the results of translating a source file to a string /// rendering of the CodeChat Editor format. #[derive(Debug, PartialEq)] @@ -249,8 +249,8 @@ pub enum TranslationResultsString { /// Match the lexer directive in a source file. static LEXER_DIRECTIVE: LazyLock = LazyLock::new(|| Regex::new(r"CodeChat Editor lexer: (\w+)").unwrap()); -/// If this matches, it means an unterminated fenced code block. This should -/// be replaced with the `
  • ` terminator. +/// If this matches, it means an unterminated fenced code block. This should be +/// replaced with the `
    ` terminator. static DOC_BLOCK_SEPARATOR_BROKEN_FENCE: LazyLock = LazyLock::new(|| { Regex::new(concat!( // Allow the `.` wildcard to match newlines. @@ -261,10 +261,24 @@ static DOC_BLOCK_SEPARATOR_BROKEN_FENCE: LazyLock = LazyLock::new(|| { // Non-greedy wildcard -- match the first separator, so we don't munch // multiple `DOC_BLOCK_SEPARATOR_STRING`s in one replacement. ".*?", - "\n" + r"(\d+)\n" )) .unwrap() }); +/// After converting Markdown to HTML, this can be used to split doc blocks +/// apart. Since this is post hydration, the element names are normalized to +/// lower case. +static DOC_BLOCK_SEPARATOR_SPLIT_REGEX: LazyLock = LazyLock::new(|| { + Regex::new(r"\d+").unwrap() +}); +/// Match a valid +/// [CSS identifier](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/ident), +/// which all cached ids must be. This is a slight simplification of the CSS +/// grammar: escape sequences aren't recognized, and all code points above +/// U+0080 are accepted. +static CSS_IDENTIFIER: LazyLock = LazyLock::new(|| { + Regex::new(r"^(?:--|-?[_a-zA-Z\x{0080}-\x{10FFFF}])[-_a-zA-Z0-9\x{0080}-\x{10FFFF}]*$").unwrap() +}); // Use this as a way to end unterminated fenced code blocks and specific types // of HTML blocks. (The remaining types of HTML blocks are terminated by a blank @@ -294,16 +308,11 @@ const DOC_BLOCK_SEPARATOR_STRING: &str = concat!( r#" ~~~~~~~~~~~~~~~~~~~~~~~ - +{} "# ); -// After converting Markdown to HTML, this can be used to split doc blocks -// apart. Since this is post hydration, the element names are normalized to -// lower case. -const DOC_BLOCK_SEPARATOR_SPLIT_STRING: &str = - ""; // Correctly terminated fenced code blocks produce this, which can be removed // from the HTML produced by Markdown conversion. const DOC_BLOCK_SEPARATOR_REMOVE_FENCE: &str = r" @@ -314,10 +323,14 @@ const DOC_BLOCK_SEPARATOR_REMOVE_FENCE: &str = r" ~~~~~~~~~~~~~~~~~~~~~~~ "; -// The replacement string for the `DOC_BLOCK_SEPARATOR_BROKEN_FENCE` regex. +// The replacement string for the `DOC_BLOCK_SEPARATOR_BROKEN_FENCE` regex. It +// relies on the first capture group in that regex (`$1`) containing the index, +// which it replaces here. const DOC_BLOCK_SEPARATOR_MENDED_FENCE: &str = - "\n\n"; -// + "\n$1\n"; +// The value of an `id` attribute which requests that the cache assign an id; +// see `Auto-assignment of ids` in `cache.rs`. +const AUTO_ID: &str = "*"; // The column at which to word wrap doc blocks. const WORD_WRAP_COLUMN: usize = 80; // The minimum width for doc block word wrap, since large indents may leave @@ -446,7 +459,7 @@ 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, None)?; + let tree = html_to_dom(&code_mirror.doc, None)?; dehydrating_walk_node(&tree); return converter .convert(&tree) @@ -565,6 +578,8 @@ impl HtmlToMarkdownWrapped { .options(htmd::options::Options { link_style: LinkStyle::Inlined, translation_mode: TranslationMode::Faithful, + // Note that this is ignored in Faithful mode. + br_style: BrStyle::Backslash, ..Default::default() }) .build(), @@ -573,10 +588,11 @@ impl HtmlToMarkdownWrapped { word_wrap_config: ConfigurationBuilder::new() .emphasis_kind(EmphasisKind::Asterisks) .strong_kind(StrongKind::Asterisks) - .unordered_list_kind(UnorderedListKind::Asterisks) + .list_unordered_marker(ListUnorderedMarker::Asterisks) .text_wrap(TextWrap::Always) .heading_kind(HeadingKind::Setext) - .allow_fenced_blank_lines(true) + .code_block_preserve_blank_lines(true) + .code_block_preserve_indentation(true) .build(), } } @@ -589,6 +605,7 @@ impl HtmlToMarkdownWrapped { /// at the root, not continue a previous incomplete section of the DOM. fn next(&self, tree: &Rc) -> Result { let converted = self.html_to_markdown.tree_to_markdown(tree); + println!("htmd output: {converted:#?}"); Ok( format_text(&converted, &self.word_wrap_config, |_, _, _| Ok(None))? // A return value of `None` means the text was unchanged or @@ -633,7 +650,7 @@ pub fn doc_block_html_to_markdown( 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); - let tree = html_to_tree(&doc_block.contents, dom_location)?; + let tree = html_to_dom(&doc_block.contents, dom_location)?; dehydrating_walk_node(&tree); // Calculate the total delimiter width: the delimiter width plus the @@ -838,6 +855,8 @@ pub enum SourceToCodeChatForWebError { // convert the IO error to a string. #[error("unable to parse HTML {0}")] ParseFailed(String), + #[error("no lexer for this file")] + NoLexer, #[error("encoding error {0}")] EncodeFailed(#[from] FromUtf8Error), } @@ -847,18 +866,27 @@ pub enum SourceToCodeChatForWebError { // // Given the contents of a file, classify it and (for CodeChat Editor files) // convert it to the `CodeChatForWeb` format. +#[allow(clippy::too_many_lines)] pub fn source_to_codechat_for_web( // The file's contents. file_contents: &str, // The file's extension. - file_ext: &String, + file_path: &Path, // The version of this file. version: f64, // True if this file is a TOC. _is_toc: bool, - // True if this file is part of a project. - _is_project: bool, -) -> Result { + // If provided, the cache for this project; otherwise, this file is not in a + // project. + cache: Option>>, +) -> Result { + // Determine the file's extension, in order to look up a lexer. + let file_ext = &file_path + .extension() + .unwrap_or_else(|| OsStr::new("")) + .to_string_lossy() + .to_string(); + // Determine the lexer to use for this file. let lexer_name; // First, search for a lexer directive in the file contents. @@ -875,13 +903,25 @@ pub fn source_to_codechat_for_web( match LEXERS.map_ext_to_lexer_vec.get(file_ext) { Some(llc) => llc.first().unwrap(), _ => { - // The file type is unknown; treat it as plain text. - return Ok(TranslationResults::Unknown); + // The file type is unknown; we can't lex it. + return Err(SourceToCodeChatForWebError::NoLexer); } } }; // Transform the provided file into the `CodeChatForWeb` structure. + let cache = if let Some(project_cache) = cache { + project_cache + } else { + // A non-project file uses a throwaway cache whose "project" is the + // file's directory: only references within this file resolve. + Arc::new(Mutex::new(Cache::new( + file_path + .parent() + .unwrap_or_else(|| Path::new("")) + .to_path_buf(), + ))) + }; let code_doc_block_arr; let codechat_for_web = CodeChatForWeb { metadata: SourceFileMetadata { @@ -889,9 +929,11 @@ pub fn source_to_codechat_for_web( }, version, source: if lexer.language_lexer.lexer_name.as_str() == MARKDOWN_MODE { - // Document-only files are easy: just encode the contents. + // Document-only files are easy: just encode the contents. Fragments + // aren't supported in Markdown documents; `hydrate_html` reports + // them as errors. let dry_html = markdown_to_html(file_contents); - let html = hydrate_html(&dry_html) + let html = hydrate_html(&dry_html, file_path, &cache) .map_err(|e| SourceToCodeChatForWebError::ParseFailed(e.to_string()))?; let html = minify(&html)?; CodeMirrorDiffable::Plain(CodeMirror { @@ -923,18 +965,26 @@ pub fn source_to_codechat_for_web( // Walk through the code/doc blocks, ... let doc_contents = code_doc_block_arr .iter() + .enumerate() // ...selecting only the doc block contents... - .filter_map(|cdb| { + .filter_map(|(index, cdb)| { if let CodeDocBlock::DocBlock(db) = cdb { - Some(db.contents.as_str()) + Some((index, db.contents.as_str())) } else { None } }) - // ...then collect them, separated by the doc block separator - // string. - .collect::>() - .join(DOC_BLOCK_SEPARATOR_STRING); + // Precede each doc block with the separator string; the + // separator contains the index of this doc block in the vec of + // code/doc blocks. The separator appears before *every* doc + // block (including the first), so the DOM walk always knows the + // current doc block index and empty doc blocks stay aligned + // with their separators. + .fold(String::new(), |mut acc: String, x: (usize, &str)| { + acc.push_str(&DOC_BLOCK_SEPARATOR_STRING.replace("{}", &x.0.to_string())); + acc.push_str(x.1); + acc + }); // Convert the Markdown to HTML. let html = markdown_to_html(&doc_contents); @@ -946,12 +996,49 @@ pub fn source_to_codechat_for_web( .replace_all(&html, DOC_BLOCK_SEPARATOR_MENDED_FENCE); // 2. Remove good fences. let html = html.replace(DOC_BLOCK_SEPARATOR_REMOVE_FENCE, ""); - // 3. Hydrate the cleaned HTML. - let html = hydrate_html(&html) + // 3. Hydrate the cleaned HTML: commit this file's facts to the + // cache, then patch cross-references and fragment backlinks. + let (dom, walk_context) = hydrate_dom(&html, file_path, &cache, false) .map_err(|e| SourceToCodeChatForWebError::ParseFailed(e.to_string()))?; - // 4. Split on the separator. - let mut doc_block_contents_iter = html.split(DOC_BLOCK_SEPARATOR_SPLIT_STRING); - // + // 4. Serialize and split on the separator, giving each doc block's + // hydrated HTML -- the form in which fragment contents are + // stored. The piece before the first separator isn't a doc + // block; discard it. + let intermediate_html = dom_to_html(&dom) + .map_err(|e| SourceToCodeChatForWebError::ParseFailed(e.to_string()))?; + let mut chunk_iter = DOC_BLOCK_SEPARATOR_SPLIT_REGEX.split(&intermediate_html); + chunk_iter.next(); + // Pair the index of each doc block in `code_doc_block_arr` with its + // hydrated HTML. + let mut doc_block_html: HashMap = HashMap::new(); + for (index, code_doc_block) in code_doc_block_arr.iter().enumerate() { + if matches!(code_doc_block, CodeDocBlock::DocBlock(_)) + && let Some(chunk) = chunk_iter.next() + { + doc_block_html.insert(index, chunk); + } + } + // 5. Store each fragment's content in the cache, which marks the + // files containing gather elements listing changed fragments as + // outdated. + store_fragment_contents( + &walk_context, + Some((&code_doc_block_arr, &doc_block_html)), + &cache, + ); + // 6. Hydrate gather lists, now that every fragment's content -- + // including those defined in this file -- is in the cache. + hydrate_gathers(&walk_context, &cache) + .map_err(|e| SourceToCodeChatForWebError::ParseFailed(e.to_string()))?; + // 7. Serialize the fully-hydrated DOM and split it into the final + // doc block contents, again discarding the piece before the + // first separator. + let html = dom_to_html(&dom) + .map_err(|e| SourceToCodeChatForWebError::ParseFailed(e.to_string()))?; + let mut doc_block_contents_iter: regex::Split<'_, '_> = + DOC_BLOCK_SEPARATOR_SPLIT_REGEX.split(&html); + doc_block_contents_iter.next(); + // Translate each `CodeDocBlock` to its `CodeMirror` equivalent. let mut len = len_utf16(&code_mirror.doc); for code_or_doc_block in code_doc_block_arr { @@ -986,7 +1073,7 @@ pub fn source_to_codechat_for_web( }, }; - Ok(TranslationResults::CodeChat(codechat_for_web)) + Ok(codechat_for_web) } // Options for a spec-compliant minifier. @@ -1011,31 +1098,134 @@ static AMMONIA_OPTIONS: LazyLock = LazyLock::new(|| { // Add custom tags produced during hydration, plus `input` (task list // checkboxes produced by pulldown-cmark) and `iframe` (embedded media // inserted via TinyMCE), neither of which Ammonia allows by default. - b.add_tags(&["wc-mermaid", "graphviz-graph", "input", "iframe"]) - // Allow any element to be assigned an ID. - .add_generic_attributes(&["id"]) - // This allows math produced by pulldown-cmark and updated by the - // hydration code. + b.add_tags(&[ + "wc-mermaid", + "graphviz-graph", + "xref", + "fragment", + "input", + "iframe", + ]) + // Allow any element to be assigned an ID and to be a gather element. + .add_generic_attributes(&["id", "data-gather"]) + // This allows math produced by pulldown-cmark and updated by the hydration + // code, plus hydration error messages. + .add_allowed_classes( + "span", + &[ + "math", + "math-inline", + "math-display", + "mceNonEditable", + "cc-error", + // The line number preceding each line of a code block in a rendered + // fragment; see `render_fragment_content`. + "cc-line-number", + ], + ) + // Classes produced by gather-element hydration. The `cc-gather` class may + // appear on any element with an `id` and `data-gather`; Ammonia only + // supports per-tag class allowlists, so list the elements which plausibly + // serve as gather elements. + .add_allowed_classes("h1", &["cc-gather"]) + .add_allowed_classes("h2", &["cc-gather"]) + .add_allowed_classes("h3", &["cc-gather"]) + .add_allowed_classes("h4", &["cc-gather"]) + .add_allowed_classes("h5", &["cc-gather"]) + .add_allowed_classes("h6", &["cc-gather"]) + .add_allowed_classes("p", &["cc-gather", "cc-gather-item-link"]) + // The `cc-fragment-*` classes lay out one doc block of a rendered fragment: + // its source indent, then its contents. See `render_fragment_content`. + .add_allowed_classes( + "div", + &[ + "cc-gather", + "cc-gather-items", + "cc-fragment-doc", + "cc-fragment-doc-contents", + ], + ) + // The doc block indents and the code blocks of a rendered fragment; see + // `render_fragment_content`. Listing these here rather than allowing a + // `class` attribute on any `pre` (as `code` below does) keeps a doc block's + // hand-written `
    ` from claiming the layout these name.
    +    .add_allowed_classes("pre", &["cc-fragment-indent", "cc-fragment-code"])
    +    // The gather-items list is generated content, marked non-editable.
    +    .add_tag_attributes("div", &["contenteditable"])
    +    // `code` tags can have `class=language-*`. Since Ammonia doesn't support a
    +    // regex like this, just allow anything.
    +    .add_tag_attributes("code", &["class"])
    +    // Task list checkboxes are rendered as ``.
    +    .add_tag_attributes("input", &["type", "checked", "disabled"])
    +    // Allow the attributes TinyMCE/the IDE place on embedded `