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:

+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.
+ //
+ //
`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 ``.
// * 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 `