diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 8b2a7147..891c6ecb 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -64,7 +64,7 @@ jobs:
# we specify bash to get pipefail; it guards against the `curl` command
# failing. otherwise `sh` won't catch that `curl` returned non-0
shell: bash
- run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.30.0/cargo-dist-installer.sh | sh"
+ run: "curl --proto '=https' --tlsv1.2 -LsSf https://github.com/axodotdev/cargo-dist/releases/download/v0.30.2/cargo-dist-installer.sh | sh"
- name: Cache dist
uses: actions/upload-artifact@v4
with:
@@ -234,8 +234,8 @@ jobs:
- plan
- build-local-artifacts
- build-global-artifacts
- # Only run if we're "publishing", and only if local and global didn't fail (skipped is fine)
- if: ${{ always() && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }}
+ # Only run if we're "publishing", and only if plan, local and global didn't fail (skipped is fine)
+ if: ${{ always() && needs.plan.result == 'success' && needs.plan.outputs.publishing == 'true' && (needs.build-global-artifacts.result == 'skipped' || needs.build-global-artifacts.result == 'success') && (needs.build-local-artifacts.result == 'skipped' || needs.build-local-artifacts.result == 'success') }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
runs-on: "ubuntu-22.04"
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 50a50cbe..7896b251 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -24,6 +24,14 @@ Changelog
* No changes.
+Version 0.1.40 -- 2025-Nov-11
+-----------------------------
+
+* File watcher now accepts new files from the Client.
+* Improved translation from HTML to Markdown.
+* Build correct binary for Mac M1.
+* Add CodeMirror support for SQL and YAML.
+
Version 0.1.39 -- 2025-Oct-23
-----------------------------
diff --git a/README.md b/README.md
index 2556539d..1f320278 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
Welcome to the CodeChat Editor
-==============================
+================================================================================
The CodeChat Editor is a GUI-based programmer's word processor /
[Jupyter](https://jupyter.org/) for software developers. This document describes
@@ -8,59 +8,58 @@ provides strategies for effectively employing the CodeChat Editor to improve the
software development process.
Full manual
------------
+--------------------------------------------------------------------------------
-Read the [manual rendered using the CodeChat
-Editor](https://codechat-editor.onrender.com/fw/fsb/opt/render/project/src/README.md),
+Read the
+[manual rendered using the CodeChat Editor](https://codechat-editor.onrender.com/fw/fsb/opt/render/project/src/README.md),
since this documentation doesn't correctly render on GitHub.
Installation
-------------
+--------------------------------------------------------------------------------
-Install the [CodeChat Editor extension for Visual Studio
-code](extensions/VSCode/README.md). For developers, see [building from
-source](docs/design.md).
+Install the
+[CodeChat Editor extension for Visual Studio code](extensions/VSCode/README.md).
+For developers, see [building from source](docs/design.md).
Structure
----------
+--------------------------------------------------------------------------------
The CodeChat Editor divides source code into code blocks and documentation (doc)
-blocks. These blocks are separated by newlines; the image below shows the [style
-guide](docs/style_guide.cpp) on the left in the Visual Studio Code (VSCode) text
-editor, while the right pane shows the same text from style guide in the
-CodeChat Editor (using the VSCode extension). Specifically, this screenshot
-shows:
-
-* ❶: a doc block. Doc blocks must have
- one space after the comment delimiter.
-* ❷: a code block. Comments on the same
- line as code are not interpreted as doc blocks.
-* ❸: varying indents before a doc block.
-* ❹: [Markdown](https://commonmark.org/)
- in a doc block; see a [brief overview of
- Markdown](https://commonmark.org/help/).
-
-
+blocks. These blocks are separated by newlines; the image below shows the
+[style guide](docs/style_guide.cpp) on the left in the Visual Studio Code
+(VSCode) text editor, while the right pane shows the same text from style guide
+in the CodeChat Editor (using the VSCode extension). Specifically, this
+screenshot shows:
+
+* ❶: a doc block. Doc blocks must have one
+ space after the comment delimiter.
+* ❷: a code block. Comments on the same
+ line as code are not interpreted as doc blocks.
+* ❸: varying indents before a doc block.
+* ❹: [Markdown](https://commonmark.org/)
+ in a doc block; see a
+ [brief overview of Markdown](https://commonmark.org/help/).
+
+
See the [style guide](docs/style_guide.cpp) for more examples.
Editing
--------
+--------------------------------------------------------------------------------
Edits may be made either in the IDE hosting the CodeChat Editor, or within the
CodeChat Editor window itself. Edits made in one place are transferred to the
other after a short delay.
Navigation
-----------
+--------------------------------------------------------------------------------
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.
References to other files
--------------------------
+--------------------------------------------------------------------------------
The CodeChat Editor supports hyperlinks to any recognized file type; to refer to
another source file, simply insert a hyperlink to it. For example,
@@ -83,7 +82,7 @@ docs/
```
Images
-------
+--------------------------------------------------------------------------------
Likewise, the path to local images is relative to the current file's location
(see the preceding diagram for the location of `monitor.png`). For example
@@ -98,18 +97,18 @@ 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)
+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
------------
+--------------------------------------------------------------------------------
The CodeChat Editor uses [MathJax](https://www.mathjax.org/) to support typeset
mathematics. Place the delimiters `$` or `\\(` and `\\)` immediately before and
@@ -141,20 +140,20 @@ following characters should be escaped: `*`, `_`, `\`, `[`, `]`, `<`.
| `$a \; b$` | $a \; b$ | `$a \\; b$` | $a \\; b$ |
Diagrams
---------
+--------------------------------------------------------------------------------
### Graphviz
The CodeChat Editor contains rudimentary support for diagrams created by
[Graphviz](https://graphviz.org/). For example,
-| Source | Rendered |
-| ----------------------------------------------------- | --------------------------------------------------- |
-| `digraph { A -> B }` | digraph { A -> B } |
+| Source | Rendered |
+| ----------------------------------------------------- | ------------------------------------------------------ |
+| `digraph { A -> B }` | digraph { A -> B } |
-To edit these diagrams, use an [HTML entity
-encoder/decoder](https://mothereff.in/html-entities) and a Graphviz editor such
-as [Edotor](https://edotor.net/).
+To edit these diagrams, use an
+[HTML entity encoder/decoder](https://mothereff.in/html-entities) and a Graphviz
+editor such as [Edotor](https://edotor.net/).
### Mermaid
@@ -165,9 +164,9 @@ The CodeChat Editor contains rudimentary support for diagrams created by
| --------------------------------------------- | ---------------------------------------------- |
| `graph TD; A --> B;` | graph TD; A --> B; |
-To edit these diagrams, use an [HTML entity
-encoder/decoder](https://mothereff.in/html-entities) and the [Mermaid live
-editor](https://mermaid.live/).
+To edit these diagrams, use an
+[HTML entity encoder/decoder](https://mothereff.in/html-entities) and the
+[Mermaid live editor](https://mermaid.live/).
### PlantUML
@@ -178,43 +177,43 @@ diagram directly to an SVG; for example,
| ------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `` |  |
-To edit these diagrams, paste the URL into the [PlantUML web
-server](https://www.plantuml.com/plantuml/uml), click Decode URL, edit, then
-copy and paste the SVG URL back to this file.
+To edit these diagrams, paste the URL into the
+[PlantUML web server](https://www.plantuml.com/plantuml/uml), click Decode URL,
+edit, then copy and paste the SVG URL back to this file.
Supported languages
----------------------------------------------------
-
-* C/C++
-* C#
-* CSS
-* Go
-* HTML
-* Java/Kotlin
-* JavaScript/ECMAScript and TypeScript
-* JSON with comments ([JSON5](https://json5.org/))
-* Markdown
-* MATLAB
-* Python
-* Rust
-* Shell scripts (`.sh`)
-* SQL
-* Swift
-* TOML
-* VHDL
-* Verilog/SystemVerilog
-* Vlang
-* YAML
+--------------------------------------------------------------------------------
+
+* C/C++
+* C#
+* CSS
+* Go
+* HTML
+* Java/Kotlin
+* JavaScript/ECMAScript and TypeScript
+* JSON with comments ([JSON5](https://json5.org/))
+* Markdown
+* MATLAB
+* Python
+* Rust
+* Shell scripts (`.sh`)
+* SQL
+* Swift
+* TOML
+* VHDL
+* Verilog/SystemVerilog
+* Vlang
+* YAML
Issues and feature requests
----------------------------
+--------------------------------------------------------------------------------
-Please report issues and provide suggestions for improvement using the [Github
-page for this project](https://github.com/bjones1/CodeChat_Editor).
+Please report issues and provide suggestions for improvement using the
+[Github page for this project](https://github.com/bjones1/CodeChat_Editor).
Contributions to the code are welcome and encouraged!
License
--------
+--------------------------------------------------------------------------------
Copyright (C) 2025 Bryan A. Jones.
@@ -235,11 +234,11 @@ License along with the CodeChat Editor. If not, see
[https://www.gnu.org/licenses/](https://www.gnu.org/licenses/).
Notes
------------------------
-
-1. The image used comes from [Monitor icons created by prettycons -
- Flaticon](https://www.flaticon.com/free-icons/monitor "monitor icons").
-2. Note that the filename for the table of contents is lowercase; while the
- acronym is TOC, requiring upper-case naming can cause confusion when moving
- files between case-insensitive filesystems (Windows) and case-sensitive
- filesystems (Linux/OS X).
\ No newline at end of file
+--------------------------------------------------------------------------------
+
+1. The image used comes from
+ [Monitor icons created by prettycons - Flaticon](https://www.flaticon.com/free-icons/monitor "monitor icons").
+2. Note that the filename for the table of contents is lowercase; while the
+ acronym is TOC, requiring upper-case naming can cause confusion when moving
+ files between case-insensitive filesystems (Windows) and case-sensitive
+ filesystems (Linux/OS X).
diff --git a/builder/Cargo.lock b/builder/Cargo.lock
index 52590893..4ec14ca5 100644
--- a/builder/Cargo.lock
+++ b/builder/Cargo.lock
@@ -4,9 +4,9 @@ version = 4
[[package]]
name = "aho-corasick"
-version = "1.1.3"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
dependencies = [
"memchr",
]
@@ -81,9 +81,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.50"
+version = "4.5.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c2cfd7bf8a6017ddaa4e32ffe7403d547790db06bd171c1c53926faab501623"
+checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5"
dependencies = [
"clap_builder",
"clap_derive",
@@ -91,9 +91,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.5.50"
+version = "4.5.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a4c05b9e80c5ccd3a7ef080ad7b6ba7d6fc00a985b8b157197075677c82c7a0"
+checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a"
dependencies = [
"anstream",
"anstyle",
@@ -210,22 +210,22 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
[[package]]
name = "jiff"
-version = "0.2.15"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49"
+checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35"
dependencies = [
"jiff-static",
"log",
"portable-atomic",
"portable-atomic-util",
- "serde",
+ "serde_core",
]
[[package]]
name = "jiff-static"
-version = "0.2.15"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4"
+checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69"
dependencies = [
"proc-macro2",
"quote",
@@ -311,18 +311,18 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.101"
+version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
+checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
-version = "1.0.41"
+version = "1.0.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1"
+checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
dependencies = [
"proc-macro2",
]
@@ -356,15 +356,6 @@ version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58"
-[[package]]
-name = "serde"
-version = "1.0.228"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
-dependencies = [
- "serde_core",
-]
-
[[package]]
name = "serde_core"
version = "1.0.228"
@@ -393,9 +384,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "syn"
-version = "2.0.107"
+version = "2.0.110"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b"
+checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea"
dependencies = [
"proc-macro2",
"quote",
@@ -404,9 +395,9 @@ dependencies = [
[[package]]
name = "unicode-ident"
-version = "1.0.20"
+version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06"
+checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]]
name = "utf8parse"
diff --git a/builder/src/main.rs b/builder/src/main.rs
index 5f8ee6af..ec1a3719 100644
--- a/builder/src/main.rs
+++ b/builder/src/main.rs
@@ -121,6 +121,7 @@ struct TypeScriptBuildOptions {
static VSCODE_PATH: &str = "../extensions/VSCode";
static CLIENT_PATH: &str = "../client";
static BUILDER_PATH: &str = "../builder";
+static NAPI_TARGET: &str = "NAPI_TARGET";
// Code
// ----
@@ -623,6 +624,12 @@ fn run_extensions_build(
if dist {
napi_args.push("--release");
}
+ // See if this is a cross-platform build -- if so, add in the specified target.
+ let target;
+ if let Ok(tmp) = env::var(NAPI_TARGET) {
+ target = tmp;
+ napi_args.extend(["--target", &target]);
+ }
run_script("npx", &napi_args, VSCODE_PATH, true)?;
// The main build for the extension.
@@ -707,6 +714,10 @@ fn run_postrelease(target: &str) -> io::Result<()> {
"aarch64-apple-darwin" => "darwin-arm64",
_ => panic!("Unsupported platform {target}."),
};
+ // `vsce` will invoke this program's `ext_build`; however, it doesn't provide a way to pass the target when cross-compiling. Use an environment variable instead.
+ unsafe {
+ env::set_var(NAPI_TARGET, target);
+ }
run_script(
"npx",
&[
diff --git a/client/package.json5 b/client/package.json5
index be97cc5c..d00a1867 100644
--- a/client/package.json5
+++ b/client/package.json5
@@ -43,9 +43,9 @@
url: 'https://github.com/bjones1/CodeChat_editor',
},
type: 'module',
- version: '0.1.39',
+ version: '0.1.40',
dependencies: {
- '@codemirror/commands': '^6.9.0',
+ '@codemirror/commands': '^6.10.0',
'@codemirror/lang-cpp': '^6.0.3',
'@codemirror/lang-css': '^6.3.1',
'@codemirror/lang-go': '^6.0.1',
@@ -53,38 +53,40 @@
'@codemirror/lang-java': '^6.0.2',
'@codemirror/lang-javascript': '^6.2.4',
'@codemirror/lang-json': '^6.0.2',
- '@codemirror/lang-markdown': '^6.4.0',
+ '@codemirror/lang-markdown': '^6.5.0',
'@codemirror/lang-php': '^6.0.2',
'@codemirror/lang-python': '^6.2.1',
'@codemirror/lang-rust': '^6.0.2',
+ '@codemirror/lang-sql': '^6.10.0',
'@codemirror/lang-xml': '^6.1.0',
+ '@codemirror/lang-yaml': '^6.1.2',
'@codemirror/state': '^6.5.2',
'@codemirror/view': '^6.38.6',
'@mathjax/mathjax-newcm-font': '4.0.0',
codemirror: '^6.0.2',
'graphviz-webcomponent': 'github:bjones1/graphviz-webcomponent#dist',
mathjax: '4.0.0',
- mermaid: '^11.12.0',
- 'npm-check-updates': '^19.1.1',
- 'pdfjs-dist': '^5.4.296',
- tinymce: '^8.1.2',
+ mermaid: '^11.12.1',
+ 'npm-check-updates': '^19.1.2',
+ 'pdfjs-dist': '^5.4.394',
+ tinymce: '^8.2.1',
'toastify-js': '^1.12.0',
},
devDependencies: {
'@types/chai': '^5.2.3',
'@types/js-beautify': '^1.14.3',
'@types/mocha': '^10.0.10',
- '@types/node': '^24.9.1',
+ '@types/node': '^24.10.0',
'@types/toastify-js': '^1.12.4',
- '@typescript-eslint/eslint-plugin': '^8.46.2',
- '@typescript-eslint/parser': '^8.46.2',
+ '@typescript-eslint/eslint-plugin': '^8.46.4',
+ '@typescript-eslint/parser': '^8.46.4',
chai: '^6.2.0',
- esbuild: '^0.25.11',
- eslint: '^9.38.0',
+ esbuild: '^0.27.0',
+ eslint: '^9.39.1',
'eslint-config-prettier': '^10.1.8',
'eslint-plugin-import': '^2.32.0',
'eslint-plugin-prettier': '^5.5.4',
- mocha: '^11.7.4',
+ mocha: '^11.7.5',
prettier: '^3.6.2',
typescript: '^5.9.3',
},
diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml
index 2a3fc691..201098a8 100644
--- a/client/pnpm-lock.yaml
+++ b/client/pnpm-lock.yaml
@@ -9,8 +9,8 @@ importers:
.:
dependencies:
'@codemirror/commands':
- specifier: ^6.9.0
- version: 6.9.0
+ specifier: ^6.10.0
+ version: 6.10.0
'@codemirror/lang-cpp':
specifier: ^6.0.3
version: 6.0.3
@@ -33,8 +33,8 @@ importers:
specifier: ^6.0.2
version: 6.0.2
'@codemirror/lang-markdown':
- specifier: ^6.4.0
- version: 6.4.0
+ specifier: ^6.5.0
+ version: 6.5.0
'@codemirror/lang-php':
specifier: ^6.0.2
version: 6.0.2
@@ -44,9 +44,15 @@ importers:
'@codemirror/lang-rust':
specifier: ^6.0.2
version: 6.0.2
+ '@codemirror/lang-sql':
+ specifier: ^6.10.0
+ version: 6.10.0
'@codemirror/lang-xml':
specifier: ^6.1.0
version: 6.1.0
+ '@codemirror/lang-yaml':
+ specifier: ^6.1.2
+ version: 6.1.2
'@codemirror/state':
specifier: ^6.5.2
version: 6.5.2
@@ -66,17 +72,17 @@ importers:
specifier: 4.0.0
version: 4.0.0
mermaid:
- specifier: ^11.12.0
- version: 11.12.0
+ specifier: ^11.12.1
+ version: 11.12.1
npm-check-updates:
- specifier: ^19.1.1
- version: 19.1.1
+ specifier: ^19.1.2
+ version: 19.1.2
pdfjs-dist:
- specifier: ^5.4.296
- version: 5.4.296
+ specifier: ^5.4.394
+ version: 5.4.394
tinymce:
- specifier: ^8.1.2
- version: 8.1.2
+ specifier: ^8.2.1
+ version: 8.2.1
toastify-js:
specifier: ^1.12.0
version: 1.12.0
@@ -91,38 +97,38 @@ importers:
specifier: ^10.0.10
version: 10.0.10
'@types/node':
- specifier: ^24.9.1
- version: 24.9.1
+ specifier: ^24.10.0
+ version: 24.10.0
'@types/toastify-js':
specifier: ^1.12.4
version: 1.12.4
'@typescript-eslint/eslint-plugin':
- specifier: ^8.46.2
- version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3)
+ specifier: ^8.46.4
+ version: 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
'@typescript-eslint/parser':
- specifier: ^8.46.2
- version: 8.46.2(eslint@9.38.0)(typescript@5.9.3)
+ specifier: ^8.46.4
+ version: 8.46.4(eslint@9.39.1)(typescript@5.9.3)
chai:
specifier: ^6.2.0
version: 6.2.0
esbuild:
- specifier: ^0.25.11
- version: 0.25.11
+ specifier: ^0.27.0
+ version: 0.27.0
eslint:
- specifier: ^9.38.0
- version: 9.38.0
+ specifier: ^9.39.1
+ version: 9.39.1
eslint-config-prettier:
specifier: ^10.1.8
- version: 10.1.8(eslint@9.38.0)
+ version: 10.1.8(eslint@9.39.1)
eslint-plugin-import:
specifier: ^2.32.0
- version: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)
+ version: 2.32.0(@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)
eslint-plugin-prettier:
specifier: ^5.5.4
- version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(prettier@3.6.2)
+ version: 5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(prettier@3.6.2)
mocha:
- specifier: ^11.7.4
- version: 11.7.4
+ specifier: ^11.7.5
+ version: 11.7.5
prettier:
specifier: ^3.6.2
version: 3.6.2
@@ -156,11 +162,11 @@ packages:
'@chevrotain/utils@11.0.3':
resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==}
- '@codemirror/autocomplete@6.19.0':
- resolution: {integrity: sha512-61Hfv3cF07XvUxNeC3E7jhG8XNi1Yom1G0lRC936oLnlF+jrbrv8rc/J98XlYzcsAoTVupfsf5fLej1aI8kyIg==}
+ '@codemirror/autocomplete@6.19.1':
+ resolution: {integrity: sha512-q6NenYkEy2fn9+JyjIxMWcNjzTL/IhwqfzOut1/G3PrIFkrbl4AL7Wkse5tLrQUUyqGoAKU5+Pi5jnnXxH5HGw==}
- '@codemirror/commands@6.9.0':
- resolution: {integrity: sha512-454TVgjhO6cMufsyyGN70rGIfJxJEjcqjBG2x2Y03Y/+Fm99d3O/Kv1QDYWuG6hvxsgmjXmBuATikIIYvERX+w==}
+ '@codemirror/commands@6.10.0':
+ resolution: {integrity: sha512-2xUIc5mHXQzT16JnyOFkh8PvfeXuIut3pslWGfsGOhxP/lpgRm9HOl/mpzLErgt5mXDovqA0d11P21gofRLb9w==}
'@codemirror/lang-cpp@6.0.3':
resolution: {integrity: sha512-URM26M3vunFFn9/sm6rzqrBzDgfWuDixp85uTY49wKudToc2jTHUrKIGGKs+QWND+YLofNNZpxcNGRynFJfvgA==}
@@ -183,8 +189,8 @@ packages:
'@codemirror/lang-json@6.0.2':
resolution: {integrity: sha512-x2OtO+AvwEHrEwR0FyyPtfDUiloG3rnVTSZV1W8UteaLL8/MajQd8DpvUb2YVzC+/T18aSDv0H9mu+xw0EStoQ==}
- '@codemirror/lang-markdown@6.4.0':
- resolution: {integrity: sha512-ZeArR54seh4laFbUTVy0ZmQgO+C/cxxlW4jEoQMhL3HALScBpZBeZcLzrQmJsTEx4is9GzOe0bFAke2B1KZqeA==}
+ '@codemirror/lang-markdown@6.5.0':
+ resolution: {integrity: sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==}
'@codemirror/lang-php@6.0.2':
resolution: {integrity: sha512-ZKy2v1n8Fc8oEXj0Th0PUMXzQJ0AIR6TaZU+PbDHExFwdu+guzOA4jmCHS1Nz4vbFezwD7LyBdDnddSJeScMCA==}
@@ -195,14 +201,20 @@ packages:
'@codemirror/lang-rust@6.0.2':
resolution: {integrity: sha512-EZaGjCUegtiU7kSMvOfEZpaCReowEf3yNidYu7+vfuGTm9ow4mthAparY5hisJqOHmJowVH3Upu+eJlUji6qqA==}
+ '@codemirror/lang-sql@6.10.0':
+ resolution: {integrity: sha512-6ayPkEd/yRw0XKBx5uAiToSgGECo/GY2NoJIHXIIQh1EVwLuKoU8BP/qK0qH5NLXAbtJRLuT73hx7P9X34iO4w==}
+
'@codemirror/lang-xml@6.1.0':
resolution: {integrity: sha512-3z0blhicHLfwi2UgkZYRPioSgVTo9PV5GP5ducFH6FaHy0IAJRg+ixj5gTR1gnT/glAIC8xv4w2VL1LoZfs+Jg==}
+ '@codemirror/lang-yaml@6.1.2':
+ resolution: {integrity: sha512-dxrfG8w5Ce/QbT7YID7mWZFKhdhsaTNOYjOkSIMt1qmC4VQnXSDSYVHHHn8k6kJUfIhtLo8t1JJgltlxWdsITw==}
+
'@codemirror/language@6.11.3':
resolution: {integrity: sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==}
- '@codemirror/lint@6.9.0':
- resolution: {integrity: sha512-wZxW+9XDytH3SKvS8cQzMyQCaaazH8XL1EMHleHe00wVzsv7NBQKVW2yzEHrRhmM7ZOhVdItPbvlRBvMp9ej7A==}
+ '@codemirror/lint@6.9.2':
+ resolution: {integrity: sha512-sv3DylBiIyi+xKwRCJAAsBZZZWo82shJ/RTMymLabAdtbkV5cSKwWDeCgtUq3v8flTaXS2y1kKkICuRYtUswyQ==}
'@codemirror/search@6.5.11':
resolution: {integrity: sha512-KmWepDE6jUdL6n8cAAqIpRmLPBZ5ZKnicE8oGU/s3QrAVID+0VhLFrzUucVKHG5035/BSykhExDL/Xm7dHthiA==}
@@ -213,158 +225,158 @@ packages:
'@codemirror/view@6.38.6':
resolution: {integrity: sha512-qiS0z1bKs5WOvHIAC0Cybmv4AJSkAXgX5aD6Mqd2epSLlVJsQl8NG23jCVouIgkh4All/mrbdsf2UOLFnJw0tw==}
- '@esbuild/aix-ppc64@0.25.11':
- resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
+ '@esbuild/aix-ppc64@0.27.0':
+ resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/android-arm64@0.25.11':
- resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==}
+ '@esbuild/android-arm64@0.27.0':
+ resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.25.11':
- resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==}
+ '@esbuild/android-arm@0.27.0':
+ resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.25.11':
- resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==}
+ '@esbuild/android-x64@0.27.0':
+ resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.25.11':
- resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==}
+ '@esbuild/darwin-arm64@0.27.0':
+ resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.25.11':
- resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==}
+ '@esbuild/darwin-x64@0.27.0':
+ resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.25.11':
- resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==}
+ '@esbuild/freebsd-arm64@0.27.0':
+ resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.25.11':
- resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==}
+ '@esbuild/freebsd-x64@0.27.0':
+ resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.25.11':
- resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==}
+ '@esbuild/linux-arm64@0.27.0':
+ resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.25.11':
- resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==}
+ '@esbuild/linux-arm@0.27.0':
+ resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.25.11':
- resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==}
+ '@esbuild/linux-ia32@0.27.0':
+ resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.25.11':
- resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==}
+ '@esbuild/linux-loong64@0.27.0':
+ resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.25.11':
- resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==}
+ '@esbuild/linux-mips64el@0.27.0':
+ resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-ppc64@0.25.11':
- resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==}
+ '@esbuild/linux-ppc64@0.27.0':
+ resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.25.11':
- resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==}
+ '@esbuild/linux-riscv64@0.27.0':
+ resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.25.11':
- resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==}
+ '@esbuild/linux-s390x@0.27.0':
+ resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.25.11':
- resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==}
+ '@esbuild/linux-x64@0.27.0':
+ resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-arm64@0.25.11':
- resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==}
+ '@esbuild/netbsd-arm64@0.27.0':
+ resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.25.11':
- resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==}
+ '@esbuild/netbsd-x64@0.27.0':
+ resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- '@esbuild/openbsd-arm64@0.25.11':
- resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==}
+ '@esbuild/openbsd-arm64@0.27.0':
+ resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.25.11':
- resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==}
+ '@esbuild/openbsd-x64@0.27.0':
+ resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- '@esbuild/openharmony-arm64@0.25.11':
- resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==}
+ '@esbuild/openharmony-arm64@0.27.0':
+ resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
- '@esbuild/sunos-x64@0.25.11':
- resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==}
+ '@esbuild/sunos-x64@0.27.0':
+ resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- '@esbuild/win32-arm64@0.25.11':
- resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==}
+ '@esbuild/win32-arm64@0.27.0':
+ resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.25.11':
- resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==}
+ '@esbuild/win32-ia32@0.27.0':
+ resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.25.11':
- resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==}
+ '@esbuild/win32-x64@0.27.0':
+ resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
@@ -375,36 +387,36 @@ packages:
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- '@eslint-community/regexpp@4.12.1':
- resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
'@eslint/config-array@0.21.1':
resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/config-helpers@0.4.1':
- resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==}
+ '@eslint/config-helpers@0.4.2':
+ resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/core@0.16.0':
- resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==}
+ '@eslint/core@0.17.0':
+ resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/eslintrc@3.3.1':
resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/js@9.38.0':
- resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==}
+ '@eslint/js@9.39.1':
+ resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.7':
resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/plugin-kit@0.4.0':
- resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==}
+ '@eslint/plugin-kit@0.4.1':
+ resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@humanfs/core@0.19.1':
@@ -445,8 +457,8 @@ packages:
'@lezer/go@1.0.1':
resolution: {integrity: sha512-xToRsYxwsgJNHTgNdStpcvmbVuKxTapV0dM0wey1geMMRc9aggoVyKgzYp41D2/vVOx+Ii4hmE206kvxIXBVXQ==}
- '@lezer/highlight@1.2.2':
- resolution: {integrity: sha512-z8TQwaBXXQIvG6i2g3e9cgMwUUXu9Ib7jo2qRRggdhwKpM56Dw3PM3wmexn+EGaaOZ7az0K7sjc3/gcGW7sz7A==}
+ '@lezer/highlight@1.2.3':
+ resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==}
'@lezer/html@1.3.12':
resolution: {integrity: sha512-RJ7eRWdaJe3bsiiLLHjCFT1JMk8m1YP9kaUbvu2rMLEoOnke9mcTVDyfOslsln0LtujdWespjJ39w6zo+RsQYw==}
@@ -460,11 +472,11 @@ packages:
'@lezer/json@1.0.3':
resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==}
- '@lezer/lr@1.4.2':
- resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==}
+ '@lezer/lr@1.4.3':
+ resolution: {integrity: sha512-yenN5SqAxAPv/qMnpWW0AT7l+SxVrgG+u0tNsRQWqbrz66HIl8DnEbBObvy21J5K7+I1v7gsAnlE2VQ5yYVSeA==}
- '@lezer/markdown@1.5.1':
- resolution: {integrity: sha512-F3ZFnIfNAOy/jPSk6Q0e3bs7e9grfK/n5zerkKoc5COH6Guy3Zb0vrJwXzdck79K16goBhYBRAvhf+ksqe0cMg==}
+ '@lezer/markdown@1.6.0':
+ resolution: {integrity: sha512-AXb98u3M6BEzTnreBnGtQaF7xFTiMA92Dsy5tqEjpacbjRxDSFdN4bKJo9uvU4cEEOS7D2B9MT7kvDgOEIzJSw==}
'@lezer/php@1.0.5':
resolution: {integrity: sha512-W7asp9DhM6q0W6DYNwIkLSKOvxlXRrif+UXBMxzsJUuqmhE7oVU+gS3THO4S/Puh7Xzgm858UNaFi6dxTP8dJA==}
@@ -478,6 +490,9 @@ packages:
'@lezer/xml@1.0.6':
resolution: {integrity: sha512-CdDwirL0OEaStFue/66ZmFSeppuL6Dwjlk8qk153mSQwiSH/Dlri4GNymrNWnUmPl2Um7QfV1FO9KFUyX3Twww==}
+ '@lezer/yaml@1.0.3':
+ resolution: {integrity: sha512-GuBLekbw9jDBDhGur82nuwkxKQ+a3W5H0GfaAthDXcAu+XdpS43VlnxA9E9hllkpSP5ellRDKjLLj7Lu9Wr6xA==}
+
'@marijn/find-cluster-break@1.0.2':
resolution: {integrity: sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==}
@@ -487,68 +502,68 @@ packages:
'@mermaid-js/parser@0.6.3':
resolution: {integrity: sha512-lnjOhe7zyHjc+If7yT4zoedx2vo4sHaTmtkl1+or8BRTnCtDmcTpAjpzDSfCZrshM5bCoz0GyidzadJAH1xobA==}
- '@napi-rs/canvas-android-arm64@0.1.80':
- resolution: {integrity: sha512-sk7xhN/MoXeuExlggf91pNziBxLPVUqF2CAVnB57KLG/pz7+U5TKG8eXdc3pm0d7Od0WreB6ZKLj37sX9muGOQ==}
+ '@napi-rs/canvas-android-arm64@0.1.82':
+ resolution: {integrity: sha512-bvZhN0iI54ouaQOrgJV96H2q7J3ZoufnHf4E1fUaERwW29Rz4rgicohnAg4venwBJZYjGl5Yl3CGmlAl1LZowQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
- '@napi-rs/canvas-darwin-arm64@0.1.80':
- resolution: {integrity: sha512-O64APRTXRUiAz0P8gErkfEr3lipLJgM6pjATwavZ22ebhjYl/SUbpgM0xcWPQBNMP1n29afAC/Us5PX1vg+JNQ==}
+ '@napi-rs/canvas-darwin-arm64@0.1.82':
+ resolution: {integrity: sha512-InuBHKCyuFqhNwNr4gpqazo5Xp6ltKflqOLiROn4hqAS8u21xAHyYCJRgHwd+a5NKmutFTaRWeUIT/vxWbU/iw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@napi-rs/canvas-darwin-x64@0.1.80':
- resolution: {integrity: sha512-FqqSU7qFce0Cp3pwnTjVkKjjOtxMqRe6lmINxpIZYaZNnVI0H5FtsaraZJ36SiTHNjZlUB69/HhxNDT1Aaa9vA==}
+ '@napi-rs/canvas-darwin-x64@0.1.82':
+ resolution: {integrity: sha512-aQGV5Ynn96onSXcuvYb2y7TRXD/t4CL2EGmnGqvLyeJX1JLSNisKQlWN/1bPDDXymZYSdUqbXehj5qzBlOx+RQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@napi-rs/canvas-linux-arm-gnueabihf@0.1.80':
- resolution: {integrity: sha512-eyWz0ddBDQc7/JbAtY4OtZ5SpK8tR4JsCYEZjCE3dI8pqoWUC8oMwYSBGCYfsx2w47cQgQCgMVRVTFiiO38hHQ==}
+ '@napi-rs/canvas-linux-arm-gnueabihf@0.1.82':
+ resolution: {integrity: sha512-YIUpmHWeHGGRhWitT1KJkgj/JPXPfc9ox8oUoyaGPxolLGPp5AxJkq8wIg8CdFGtutget968dtwmx71m8o3h5g==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
- '@napi-rs/canvas-linux-arm64-gnu@0.1.80':
- resolution: {integrity: sha512-qwA63t8A86bnxhuA/GwOkK3jvb+XTQaTiVML0vAWoHyoZYTjNs7BzoOONDgTnNtr8/yHrq64XXzUoLqDzU+Uuw==}
+ '@napi-rs/canvas-linux-arm64-gnu@0.1.82':
+ resolution: {integrity: sha512-AwLzwLBgmvk7kWeUgItOUor/QyG31xqtD26w1tLpf4yE0hiXTGp23yc669aawjB6FzgIkjh1NKaNS52B7/qEBQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@napi-rs/canvas-linux-arm64-musl@0.1.80':
- resolution: {integrity: sha512-1XbCOz/ymhj24lFaIXtWnwv/6eFHXDrjP0jYkc6iHQ9q8oXKzUX1Lc6bu+wuGiLhGh2GS/2JlfORC5ZcXimRcg==}
+ '@napi-rs/canvas-linux-arm64-musl@0.1.82':
+ resolution: {integrity: sha512-moZWuqepAwWBffdF4JDadt8TgBD02iMhG6I1FHZf8xO20AsIp9rB+p0B8Zma2h2vAF/YMjeFCDmW5un6+zZz9g==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
- '@napi-rs/canvas-linux-riscv64-gnu@0.1.80':
- resolution: {integrity: sha512-XTzR125w5ZMs0lJcxRlS1K3P5RaZ9RmUsPtd1uGt+EfDyYMu4c6SEROYsxyatbbu/2+lPe7MPHOO/0a0x7L/gw==}
+ '@napi-rs/canvas-linux-riscv64-gnu@0.1.82':
+ resolution: {integrity: sha512-w9++2df2kG9eC9LWYIHIlMLuhIrKGQYfUxs97CwgxYjITeFakIRazI9LYWgVzEc98QZ9x9GQvlicFsrROV59MQ==}
engines: {node: '>= 10'}
cpu: [riscv64]
os: [linux]
- '@napi-rs/canvas-linux-x64-gnu@0.1.80':
- resolution: {integrity: sha512-BeXAmhKg1kX3UCrJsYbdQd3hIMDH/K6HnP/pG2LuITaXhXBiNdh//TVVVVCBbJzVQaV5gK/4ZOCMrQW9mvuTqA==}
+ '@napi-rs/canvas-linux-x64-gnu@0.1.82':
+ resolution: {integrity: sha512-lZulOPwrRi6hEg/17CaqdwWEUfOlIJuhXxincx1aVzsVOCmyHf+xFq4i6liJl1P+x2v6Iz2Z/H5zHvXJCC7Bwg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@napi-rs/canvas-linux-x64-musl@0.1.80':
- resolution: {integrity: sha512-x0XvZWdHbkgdgucJsRxprX/4o4sEed7qo9rCQA9ugiS9qE2QvP0RIiEugtZhfLH3cyI+jIRFJHV4Fuz+1BHHMg==}
+ '@napi-rs/canvas-linux-x64-musl@0.1.82':
+ resolution: {integrity: sha512-Be9Wf5RTv1w6GXlTph55K3PH3vsAh1Ax4T1FQY1UYM0QfD0yrwGdnJ8/fhqw7dEgMjd59zIbjJQC8C3msbGn5g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
- '@napi-rs/canvas-win32-x64-msvc@0.1.80':
- resolution: {integrity: sha512-Z8jPsM6df5V8B1HrCHB05+bDiCxjE9QA//3YrkKIdVDEwn5RKaqOxCJDRJkl48cJbylcrJbW4HxZbTte8juuPg==}
+ '@napi-rs/canvas-win32-x64-msvc@0.1.82':
+ resolution: {integrity: sha512-LN/i8VrvxTDmEEK1c10z2cdOTkWT76LlTGtyZe5Kr1sqoSomKeExAjbilnu1+oee5lZUgS5yfZ2LNlVhCeARuw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
- '@napi-rs/canvas@0.1.80':
- resolution: {integrity: sha512-DxuT1ClnIPts1kQx8FBmkk4BQDTfI5kIzywAaMjQSXfNnra5UFU9PwurXrl+Je3bJ6BGsp/zmshVVFbCmyI+ww==}
+ '@napi-rs/canvas@0.1.82':
+ resolution: {integrity: sha512-FGjyUBoF0sl1EenSiE4UV2WYu76q6F9GSYedq5EiOCOyGYoQ/Owulcv6rd7v/tWOpljDDtefXXIaOCJrVKem4w==}
engines: {node: '>= 10'}
'@nodelib/fs.scandir@2.1.5':
@@ -691,8 +706,8 @@ packages:
'@types/mocha@10.0.10':
resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==}
- '@types/node@24.9.1':
- resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==}
+ '@types/node@24.10.0':
+ resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==}
'@types/toastify-js@1.12.4':
resolution: {integrity: sha512-zfZHU4tKffPCnZRe7pjv/eFKzTVHozKewFCKaCjZ4gFinKgJRz/t0bkZiMCXJxPhv/ZoeDGNOeRD09R0kQZ/nw==}
@@ -700,63 +715,63 @@ packages:
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
- '@typescript-eslint/eslint-plugin@8.46.2':
- resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==}
+ '@typescript-eslint/eslint-plugin@8.46.4':
+ resolution: {integrity: sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.46.2
+ '@typescript-eslint/parser': ^8.46.4
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/parser@8.46.2':
- resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==}
+ '@typescript-eslint/parser@8.46.4':
+ resolution: {integrity: sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/project-service@8.46.2':
- resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==}
+ '@typescript-eslint/project-service@8.46.4':
+ resolution: {integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/scope-manager@8.46.2':
- resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==}
+ '@typescript-eslint/scope-manager@8.46.4':
+ resolution: {integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/tsconfig-utils@8.46.2':
- resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==}
+ '@typescript-eslint/tsconfig-utils@8.46.4':
+ resolution: {integrity: sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/type-utils@8.46.2':
- resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==}
+ '@typescript-eslint/type-utils@8.46.4':
+ resolution: {integrity: sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/types@8.46.2':
- resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==}
+ '@typescript-eslint/types@8.46.4':
+ resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.46.2':
- resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==}
+ '@typescript-eslint/typescript-estree@8.46.4':
+ resolution: {integrity: sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/utils@8.46.2':
- resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==}
+ '@typescript-eslint/utils@8.46.4':
+ resolution: {integrity: sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/visitor-keys@8.46.2':
- resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==}
+ '@typescript-eslint/visitor-keys@8.46.4':
+ resolution: {integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
acorn-jsx@5.3.2:
@@ -1080,8 +1095,8 @@ packages:
resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==}
engines: {node: '>=12'}
- dagre-d3-es@7.0.11:
- resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==}
+ dagre-d3-es@7.0.13:
+ resolution: {integrity: sha512-efEhnxpSuwpYOKRm/L5KbqoZmNNukHa/Flty4Wp62JRvgH2ojwVgPgdYyr4twpieZnyRDdIH7PY2mopX26+j2Q==}
data-view-buffer@1.0.2:
resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
@@ -1095,8 +1110,8 @@ packages:
resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
engines: {node: '>= 0.4'}
- dayjs@1.11.18:
- resolution: {integrity: sha512-zFBQ7WFRvVRhKcWoUh+ZA1g2HVgUbsZm9sbddh8EC5iv93sui8DVVz1Npvz+r6meo9VKfa8NyLWBsQK1VvIKPA==}
+ dayjs@1.11.19:
+ resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==}
debug@3.2.7:
resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
@@ -1185,8 +1200,8 @@ packages:
resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
engines: {node: '>= 0.4'}
- esbuild@0.25.11:
- resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
+ esbuild@0.27.0:
+ resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==}
engines: {node: '>=18'}
hasBin: true
@@ -1264,8 +1279,8 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- eslint@9.38.0:
- resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==}
+ eslint@9.39.1:
+ resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
peerDependencies:
@@ -1294,8 +1309,8 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
- exsolve@1.0.7:
- resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==}
+ exsolve@1.0.8:
+ resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==}
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
@@ -1668,8 +1683,8 @@ packages:
lru-cache@10.4.3:
resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==}
- marked@16.4.1:
- resolution: {integrity: sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==}
+ marked@16.4.2:
+ resolution: {integrity: sha512-TI3V8YYWvkVf3KJe1dRkpnjs68JUPyEa5vjKrp1XEEJUAOaQc+Qj+L1qWbPd0SJuAdQkFU0h73sXXqwDYxsiDA==}
engines: {node: '>= 20'}
hasBin: true
@@ -1684,8 +1699,8 @@ packages:
resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
engines: {node: '>= 8'}
- mermaid@11.12.0:
- resolution: {integrity: sha512-ZudVx73BwrMJfCFmSSJT84y6u5brEoV8DOItdHomNLz32uBjNrelm7mg95X7g+C6UoQH/W6mBLGDEDv73JdxBg==}
+ mermaid@11.12.1:
+ resolution: {integrity: sha512-UlIZrRariB11TY1RtTgUWp65tphtBv4CSq7vyS2ZZ2TgoMjs2nloq+wFqxiwcxlhHUvs7DPGgMjs2aeQxz5h9g==}
micromatch@4.0.8:
resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
@@ -1708,8 +1723,8 @@ packages:
mlly@1.8.0:
resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==}
- mocha@11.7.4:
- resolution: {integrity: sha512-1jYAaY8x0kAZ0XszLWu14pzsf4KV740Gld4HXkhNTXwcHx4AUEDkPzgEHg9CM5dVcW+zv036tjpsEbLraPJj4w==}
+ mocha@11.7.5:
+ resolution: {integrity: sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
@@ -1719,8 +1734,8 @@ packages:
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
- npm-check-updates@19.1.1:
- resolution: {integrity: sha512-vy/uNbaK6Xfj/QzM8OXeALZak67E0uHjUlbdT1YGy4bdj0xlBU6AVd+8bscY8vlDpyzL6Y7mxcrX8kzEDeEpNg==}
+ npm-check-updates@19.1.2:
+ resolution: {integrity: sha512-FNeFCVgPOj0fz89hOpGtxP2rnnRHR7hD2E8qNU8SMWfkyDZXA/xpgjsL3UMLSo3F/K13QvJDnbxPngulNDDo/g==}
engines: {node: '>=20.0.0', npm: '>=8.12.1'}
hasBin: true
@@ -1795,8 +1810,8 @@ packages:
pathe@2.0.3:
resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
- pdfjs-dist@5.4.296:
- resolution: {integrity: sha512-DlOzet0HO7OEnmUmB6wWGJrrdvbyJKftI1bhMitK7O2N8W2gc757yyYBbINy9IDafXAV9wmKr9t7xsTaNKRG5Q==}
+ pdfjs-dist@5.4.394:
+ resolution: {integrity: sha512-9ariAYGqUJzx+V/1W4jHyiyCep6IZALmDzoaTLZ6VNu8q9LWi1/ukhzHgE2Xsx96AZi0mbZuK4/ttIbqSbLypg==}
engines: {node: '>=20.16.0 || >=22.3.0'}
picocolors@1.1.1:
@@ -2021,11 +2036,12 @@ packages:
resolution: {integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==}
engines: {node: ^14.18.0 || >=16.0.0}
- tinyexec@1.0.1:
- resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==}
+ tinyexec@1.0.2:
+ resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==}
+ engines: {node: '>=18'}
- tinymce@8.1.2:
- resolution: {integrity: sha512-KITxHEEHRlxC5xOnxA123eAJ67NgsWxNphtItWt9TRu07DiTZrWIqJeIKRX9euE51/l3kJO4WQiqoBXKTJJGsA==}
+ tinymce@8.2.1:
+ resolution: {integrity: sha512-gbZJH91f91jLfD39juLt/oiAMoaxwTquJMJZR0A1uzcOVrddo8hI/2Y+Uji0/vPudmbDxatnmfIG/9/j3KzP0g==}
to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
@@ -2173,7 +2189,7 @@ snapshots:
'@antfu/install-pkg@1.1.0':
dependencies:
package-manager-detector: 1.5.0
- tinyexec: 1.0.1
+ tinyexec: 1.0.2
'@antfu/utils@9.3.0': {}
@@ -2196,14 +2212,14 @@ snapshots:
'@chevrotain/utils@11.0.3': {}
- '@codemirror/autocomplete@6.19.0':
+ '@codemirror/autocomplete@6.19.1':
dependencies:
'@codemirror/language': 6.11.3
'@codemirror/state': 6.5.2
'@codemirror/view': 6.38.6
'@lezer/common': 1.3.0
- '@codemirror/commands@6.9.0':
+ '@codemirror/commands@6.10.0':
dependencies:
'@codemirror/language': 6.11.3
'@codemirror/state': 6.5.2
@@ -2217,7 +2233,7 @@ snapshots:
'@codemirror/lang-css@6.3.1':
dependencies:
- '@codemirror/autocomplete': 6.19.0
+ '@codemirror/autocomplete': 6.19.1
'@codemirror/language': 6.11.3
'@codemirror/state': 6.5.2
'@lezer/common': 1.3.0
@@ -2225,7 +2241,7 @@ snapshots:
'@codemirror/lang-go@6.0.1':
dependencies:
- '@codemirror/autocomplete': 6.19.0
+ '@codemirror/autocomplete': 6.19.1
'@codemirror/language': 6.11.3
'@codemirror/state': 6.5.2
'@lezer/common': 1.3.0
@@ -2233,7 +2249,7 @@ snapshots:
'@codemirror/lang-html@6.4.11':
dependencies:
- '@codemirror/autocomplete': 6.19.0
+ '@codemirror/autocomplete': 6.19.1
'@codemirror/lang-css': 6.3.1
'@codemirror/lang-javascript': 6.2.4
'@codemirror/language': 6.11.3
@@ -2250,9 +2266,9 @@ snapshots:
'@codemirror/lang-javascript@6.2.4':
dependencies:
- '@codemirror/autocomplete': 6.19.0
+ '@codemirror/autocomplete': 6.19.1
'@codemirror/language': 6.11.3
- '@codemirror/lint': 6.9.0
+ '@codemirror/lint': 6.9.2
'@codemirror/state': 6.5.2
'@codemirror/view': 6.38.6
'@lezer/common': 1.3.0
@@ -2263,15 +2279,15 @@ snapshots:
'@codemirror/language': 6.11.3
'@lezer/json': 1.0.3
- '@codemirror/lang-markdown@6.4.0':
+ '@codemirror/lang-markdown@6.5.0':
dependencies:
- '@codemirror/autocomplete': 6.19.0
+ '@codemirror/autocomplete': 6.19.1
'@codemirror/lang-html': 6.4.11
'@codemirror/language': 6.11.3
'@codemirror/state': 6.5.2
'@codemirror/view': 6.38.6
'@lezer/common': 1.3.0
- '@lezer/markdown': 1.5.1
+ '@lezer/markdown': 1.6.0
'@codemirror/lang-php@6.0.2':
dependencies:
@@ -2283,7 +2299,7 @@ snapshots:
'@codemirror/lang-python@6.2.1':
dependencies:
- '@codemirror/autocomplete': 6.19.0
+ '@codemirror/autocomplete': 6.19.1
'@codemirror/language': 6.11.3
'@codemirror/state': 6.5.2
'@lezer/common': 1.3.0
@@ -2294,25 +2310,44 @@ snapshots:
'@codemirror/language': 6.11.3
'@lezer/rust': 1.0.2
+ '@codemirror/lang-sql@6.10.0':
+ dependencies:
+ '@codemirror/autocomplete': 6.19.1
+ '@codemirror/language': 6.11.3
+ '@codemirror/state': 6.5.2
+ '@lezer/common': 1.3.0
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
+
'@codemirror/lang-xml@6.1.0':
dependencies:
- '@codemirror/autocomplete': 6.19.0
+ '@codemirror/autocomplete': 6.19.1
'@codemirror/language': 6.11.3
'@codemirror/state': 6.5.2
'@codemirror/view': 6.38.6
'@lezer/common': 1.3.0
'@lezer/xml': 1.0.6
+ '@codemirror/lang-yaml@6.1.2':
+ dependencies:
+ '@codemirror/autocomplete': 6.19.1
+ '@codemirror/language': 6.11.3
+ '@codemirror/state': 6.5.2
+ '@lezer/common': 1.3.0
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
+ '@lezer/yaml': 1.0.3
+
'@codemirror/language@6.11.3':
dependencies:
'@codemirror/state': 6.5.2
'@codemirror/view': 6.38.6
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
- '@lezer/lr': 1.4.2
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
style-mod: 4.1.3
- '@codemirror/lint@6.9.0':
+ '@codemirror/lint@6.9.2':
dependencies:
'@codemirror/state': 6.5.2
'@codemirror/view': 6.38.6
@@ -2335,90 +2370,90 @@ snapshots:
style-mod: 4.1.3
w3c-keyname: 2.2.8
- '@esbuild/aix-ppc64@0.25.11':
+ '@esbuild/aix-ppc64@0.27.0':
optional: true
- '@esbuild/android-arm64@0.25.11':
+ '@esbuild/android-arm64@0.27.0':
optional: true
- '@esbuild/android-arm@0.25.11':
+ '@esbuild/android-arm@0.27.0':
optional: true
- '@esbuild/android-x64@0.25.11':
+ '@esbuild/android-x64@0.27.0':
optional: true
- '@esbuild/darwin-arm64@0.25.11':
+ '@esbuild/darwin-arm64@0.27.0':
optional: true
- '@esbuild/darwin-x64@0.25.11':
+ '@esbuild/darwin-x64@0.27.0':
optional: true
- '@esbuild/freebsd-arm64@0.25.11':
+ '@esbuild/freebsd-arm64@0.27.0':
optional: true
- '@esbuild/freebsd-x64@0.25.11':
+ '@esbuild/freebsd-x64@0.27.0':
optional: true
- '@esbuild/linux-arm64@0.25.11':
+ '@esbuild/linux-arm64@0.27.0':
optional: true
- '@esbuild/linux-arm@0.25.11':
+ '@esbuild/linux-arm@0.27.0':
optional: true
- '@esbuild/linux-ia32@0.25.11':
+ '@esbuild/linux-ia32@0.27.0':
optional: true
- '@esbuild/linux-loong64@0.25.11':
+ '@esbuild/linux-loong64@0.27.0':
optional: true
- '@esbuild/linux-mips64el@0.25.11':
+ '@esbuild/linux-mips64el@0.27.0':
optional: true
- '@esbuild/linux-ppc64@0.25.11':
+ '@esbuild/linux-ppc64@0.27.0':
optional: true
- '@esbuild/linux-riscv64@0.25.11':
+ '@esbuild/linux-riscv64@0.27.0':
optional: true
- '@esbuild/linux-s390x@0.25.11':
+ '@esbuild/linux-s390x@0.27.0':
optional: true
- '@esbuild/linux-x64@0.25.11':
+ '@esbuild/linux-x64@0.27.0':
optional: true
- '@esbuild/netbsd-arm64@0.25.11':
+ '@esbuild/netbsd-arm64@0.27.0':
optional: true
- '@esbuild/netbsd-x64@0.25.11':
+ '@esbuild/netbsd-x64@0.27.0':
optional: true
- '@esbuild/openbsd-arm64@0.25.11':
+ '@esbuild/openbsd-arm64@0.27.0':
optional: true
- '@esbuild/openbsd-x64@0.25.11':
+ '@esbuild/openbsd-x64@0.27.0':
optional: true
- '@esbuild/openharmony-arm64@0.25.11':
+ '@esbuild/openharmony-arm64@0.27.0':
optional: true
- '@esbuild/sunos-x64@0.25.11':
+ '@esbuild/sunos-x64@0.27.0':
optional: true
- '@esbuild/win32-arm64@0.25.11':
+ '@esbuild/win32-arm64@0.27.0':
optional: true
- '@esbuild/win32-ia32@0.25.11':
+ '@esbuild/win32-ia32@0.27.0':
optional: true
- '@esbuild/win32-x64@0.25.11':
+ '@esbuild/win32-x64@0.27.0':
optional: true
- '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0)':
+ '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)':
dependencies:
- eslint: 9.38.0
+ eslint: 9.39.1
eslint-visitor-keys: 3.4.3
- '@eslint-community/regexpp@4.12.1': {}
+ '@eslint-community/regexpp@4.12.2': {}
'@eslint/config-array@0.21.1':
dependencies:
@@ -2428,11 +2463,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@eslint/config-helpers@0.4.1':
+ '@eslint/config-helpers@0.4.2':
dependencies:
- '@eslint/core': 0.16.0
+ '@eslint/core': 0.17.0
- '@eslint/core@0.16.0':
+ '@eslint/core@0.17.0':
dependencies:
'@types/json-schema': 7.0.15
@@ -2450,13 +2485,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@eslint/js@9.38.0': {}
+ '@eslint/js@9.39.1': {}
'@eslint/object-schema@2.1.7': {}
- '@eslint/plugin-kit@0.4.0':
+ '@eslint/plugin-kit@0.4.1':
dependencies:
- '@eslint/core': 0.16.0
+ '@eslint/core': 0.17.0
levn: 0.4.1
'@humanfs/core@0.19.1': {}
@@ -2499,81 +2534,87 @@ snapshots:
'@lezer/cpp@1.1.3':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
- '@lezer/lr': 1.4.2
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
'@lezer/css@1.3.0':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
- '@lezer/lr': 1.4.2
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
'@lezer/go@1.0.1':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
- '@lezer/lr': 1.4.2
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
- '@lezer/highlight@1.2.2':
+ '@lezer/highlight@1.2.3':
dependencies:
'@lezer/common': 1.3.0
'@lezer/html@1.3.12':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
- '@lezer/lr': 1.4.2
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
'@lezer/java@1.1.3':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
- '@lezer/lr': 1.4.2
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
'@lezer/javascript@1.5.4':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
- '@lezer/lr': 1.4.2
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
'@lezer/json@1.0.3':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
- '@lezer/lr': 1.4.2
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
- '@lezer/lr@1.4.2':
+ '@lezer/lr@1.4.3':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/markdown@1.5.1':
+ '@lezer/markdown@1.6.0':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
+ '@lezer/highlight': 1.2.3
'@lezer/php@1.0.5':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
- '@lezer/lr': 1.4.2
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
'@lezer/python@1.1.18':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
- '@lezer/lr': 1.4.2
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
'@lezer/rust@1.0.2':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
- '@lezer/lr': 1.4.2
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
'@lezer/xml@1.0.6':
dependencies:
'@lezer/common': 1.3.0
- '@lezer/highlight': 1.2.2
- '@lezer/lr': 1.4.2
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
+
+ '@lezer/yaml@1.0.3':
+ dependencies:
+ '@lezer/common': 1.3.0
+ '@lezer/highlight': 1.2.3
+ '@lezer/lr': 1.4.3
'@marijn/find-cluster-break@1.0.2': {}
@@ -2583,48 +2624,48 @@ snapshots:
dependencies:
langium: 3.3.1
- '@napi-rs/canvas-android-arm64@0.1.80':
+ '@napi-rs/canvas-android-arm64@0.1.82':
optional: true
- '@napi-rs/canvas-darwin-arm64@0.1.80':
+ '@napi-rs/canvas-darwin-arm64@0.1.82':
optional: true
- '@napi-rs/canvas-darwin-x64@0.1.80':
+ '@napi-rs/canvas-darwin-x64@0.1.82':
optional: true
- '@napi-rs/canvas-linux-arm-gnueabihf@0.1.80':
+ '@napi-rs/canvas-linux-arm-gnueabihf@0.1.82':
optional: true
- '@napi-rs/canvas-linux-arm64-gnu@0.1.80':
+ '@napi-rs/canvas-linux-arm64-gnu@0.1.82':
optional: true
- '@napi-rs/canvas-linux-arm64-musl@0.1.80':
+ '@napi-rs/canvas-linux-arm64-musl@0.1.82':
optional: true
- '@napi-rs/canvas-linux-riscv64-gnu@0.1.80':
+ '@napi-rs/canvas-linux-riscv64-gnu@0.1.82':
optional: true
- '@napi-rs/canvas-linux-x64-gnu@0.1.80':
+ '@napi-rs/canvas-linux-x64-gnu@0.1.82':
optional: true
- '@napi-rs/canvas-linux-x64-musl@0.1.80':
+ '@napi-rs/canvas-linux-x64-musl@0.1.82':
optional: true
- '@napi-rs/canvas-win32-x64-msvc@0.1.80':
+ '@napi-rs/canvas-win32-x64-msvc@0.1.82':
optional: true
- '@napi-rs/canvas@0.1.80':
+ '@napi-rs/canvas@0.1.82':
optionalDependencies:
- '@napi-rs/canvas-android-arm64': 0.1.80
- '@napi-rs/canvas-darwin-arm64': 0.1.80
- '@napi-rs/canvas-darwin-x64': 0.1.80
- '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.80
- '@napi-rs/canvas-linux-arm64-gnu': 0.1.80
- '@napi-rs/canvas-linux-arm64-musl': 0.1.80
- '@napi-rs/canvas-linux-riscv64-gnu': 0.1.80
- '@napi-rs/canvas-linux-x64-gnu': 0.1.80
- '@napi-rs/canvas-linux-x64-musl': 0.1.80
- '@napi-rs/canvas-win32-x64-msvc': 0.1.80
+ '@napi-rs/canvas-android-arm64': 0.1.82
+ '@napi-rs/canvas-darwin-arm64': 0.1.82
+ '@napi-rs/canvas-darwin-x64': 0.1.82
+ '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.82
+ '@napi-rs/canvas-linux-arm64-gnu': 0.1.82
+ '@napi-rs/canvas-linux-arm64-musl': 0.1.82
+ '@napi-rs/canvas-linux-riscv64-gnu': 0.1.82
+ '@napi-rs/canvas-linux-x64-gnu': 0.1.82
+ '@napi-rs/canvas-linux-x64-musl': 0.1.82
+ '@napi-rs/canvas-win32-x64-msvc': 0.1.82
optional: true
'@nodelib/fs.scandir@2.1.5':
@@ -2782,7 +2823,7 @@ snapshots:
'@types/mocha@10.0.10': {}
- '@types/node@24.9.1':
+ '@types/node@24.10.0':
dependencies:
undici-types: 7.16.0
@@ -2791,15 +2832,15 @@ snapshots:
'@types/trusted-types@2.0.7':
optional: true
- '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3)':
+ '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)':
dependencies:
- '@eslint-community/regexpp': 4.12.1
- '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3)
- '@typescript-eslint/scope-manager': 8.46.2
- '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3)
- '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3)
- '@typescript-eslint/visitor-keys': 8.46.2
- eslint: 9.38.0
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.46.4(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.46.4
+ '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.46.4(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.46.4
+ eslint: 9.39.1
graphemer: 1.4.0
ignore: 7.0.5
natural-compare: 1.4.0
@@ -2808,56 +2849,56 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3)':
+ '@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.46.2
- '@typescript-eslint/types': 8.46.2
- '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3)
- '@typescript-eslint/visitor-keys': 8.46.2
+ '@typescript-eslint/scope-manager': 8.46.4
+ '@typescript-eslint/types': 8.46.4
+ '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.46.4
debug: 4.4.3(supports-color@8.1.1)
- eslint: 9.38.0
+ eslint: 9.39.1
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)':
+ '@typescript-eslint/project-service@8.46.4(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3)
- '@typescript-eslint/types': 8.46.2
+ '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3)
+ '@typescript-eslint/types': 8.46.4
debug: 4.4.3(supports-color@8.1.1)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.46.2':
+ '@typescript-eslint/scope-manager@8.46.4':
dependencies:
- '@typescript-eslint/types': 8.46.2
- '@typescript-eslint/visitor-keys': 8.46.2
+ '@typescript-eslint/types': 8.46.4
+ '@typescript-eslint/visitor-keys': 8.46.4
- '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)':
+ '@typescript-eslint/tsconfig-utils@8.46.4(typescript@5.9.3)':
dependencies:
typescript: 5.9.3
- '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)':
+ '@typescript-eslint/type-utils@8.46.4(eslint@9.39.1)(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/types': 8.46.2
- '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3)
- '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3)
+ '@typescript-eslint/types': 8.46.4
+ '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.46.4(eslint@9.39.1)(typescript@5.9.3)
debug: 4.4.3(supports-color@8.1.1)
- eslint: 9.38.0
+ eslint: 9.39.1
ts-api-utils: 2.1.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.46.2': {}
+ '@typescript-eslint/types@8.46.4': {}
- '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)':
+ '@typescript-eslint/typescript-estree@8.46.4(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3)
- '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3)
- '@typescript-eslint/types': 8.46.2
- '@typescript-eslint/visitor-keys': 8.46.2
+ '@typescript-eslint/project-service': 8.46.4(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3)
+ '@typescript-eslint/types': 8.46.4
+ '@typescript-eslint/visitor-keys': 8.46.4
debug: 4.4.3(supports-color@8.1.1)
fast-glob: 3.3.3
is-glob: 4.0.3
@@ -2868,20 +2909,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)':
+ '@typescript-eslint/utils@8.46.4(eslint@9.39.1)(typescript@5.9.3)':
dependencies:
- '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0)
- '@typescript-eslint/scope-manager': 8.46.2
- '@typescript-eslint/types': 8.46.2
- '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3)
- eslint: 9.38.0
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
+ '@typescript-eslint/scope-manager': 8.46.4
+ '@typescript-eslint/types': 8.46.4
+ '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3)
+ eslint: 9.39.1
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.46.2':
+ '@typescript-eslint/visitor-keys@8.46.4':
dependencies:
- '@typescript-eslint/types': 8.46.2
+ '@typescript-eslint/types': 8.46.4
eslint-visitor-keys: 4.2.1
acorn-jsx@5.3.2(acorn@8.15.0):
@@ -3038,10 +3079,10 @@ snapshots:
codemirror@6.0.2:
dependencies:
- '@codemirror/autocomplete': 6.19.0
- '@codemirror/commands': 6.9.0
+ '@codemirror/autocomplete': 6.19.1
+ '@codemirror/commands': 6.10.0
'@codemirror/language': 6.11.3
- '@codemirror/lint': 6.9.0
+ '@codemirror/lint': 6.9.2
'@codemirror/search': 6.5.11
'@codemirror/state': 6.5.2
'@codemirror/view': 6.38.6
@@ -3257,7 +3298,7 @@ snapshots:
d3-transition: 3.0.1(d3-selection@3.0.0)
d3-zoom: 3.0.0
- dagre-d3-es@7.0.11:
+ dagre-d3-es@7.0.13:
dependencies:
d3: 7.9.0
lodash-es: 4.17.21
@@ -3280,7 +3321,7 @@ snapshots:
es-errors: 1.3.0
is-data-view: 1.0.2
- dayjs@1.11.18: {}
+ dayjs@1.11.19: {}
debug@3.2.7:
dependencies:
@@ -3416,42 +3457,42 @@ snapshots:
is-date-object: 1.1.0
is-symbol: 1.1.1
- esbuild@0.25.11:
+ esbuild@0.27.0:
optionalDependencies:
- '@esbuild/aix-ppc64': 0.25.11
- '@esbuild/android-arm': 0.25.11
- '@esbuild/android-arm64': 0.25.11
- '@esbuild/android-x64': 0.25.11
- '@esbuild/darwin-arm64': 0.25.11
- '@esbuild/darwin-x64': 0.25.11
- '@esbuild/freebsd-arm64': 0.25.11
- '@esbuild/freebsd-x64': 0.25.11
- '@esbuild/linux-arm': 0.25.11
- '@esbuild/linux-arm64': 0.25.11
- '@esbuild/linux-ia32': 0.25.11
- '@esbuild/linux-loong64': 0.25.11
- '@esbuild/linux-mips64el': 0.25.11
- '@esbuild/linux-ppc64': 0.25.11
- '@esbuild/linux-riscv64': 0.25.11
- '@esbuild/linux-s390x': 0.25.11
- '@esbuild/linux-x64': 0.25.11
- '@esbuild/netbsd-arm64': 0.25.11
- '@esbuild/netbsd-x64': 0.25.11
- '@esbuild/openbsd-arm64': 0.25.11
- '@esbuild/openbsd-x64': 0.25.11
- '@esbuild/openharmony-arm64': 0.25.11
- '@esbuild/sunos-x64': 0.25.11
- '@esbuild/win32-arm64': 0.25.11
- '@esbuild/win32-ia32': 0.25.11
- '@esbuild/win32-x64': 0.25.11
+ '@esbuild/aix-ppc64': 0.27.0
+ '@esbuild/android-arm': 0.27.0
+ '@esbuild/android-arm64': 0.27.0
+ '@esbuild/android-x64': 0.27.0
+ '@esbuild/darwin-arm64': 0.27.0
+ '@esbuild/darwin-x64': 0.27.0
+ '@esbuild/freebsd-arm64': 0.27.0
+ '@esbuild/freebsd-x64': 0.27.0
+ '@esbuild/linux-arm': 0.27.0
+ '@esbuild/linux-arm64': 0.27.0
+ '@esbuild/linux-ia32': 0.27.0
+ '@esbuild/linux-loong64': 0.27.0
+ '@esbuild/linux-mips64el': 0.27.0
+ '@esbuild/linux-ppc64': 0.27.0
+ '@esbuild/linux-riscv64': 0.27.0
+ '@esbuild/linux-s390x': 0.27.0
+ '@esbuild/linux-x64': 0.27.0
+ '@esbuild/netbsd-arm64': 0.27.0
+ '@esbuild/netbsd-x64': 0.27.0
+ '@esbuild/openbsd-arm64': 0.27.0
+ '@esbuild/openbsd-x64': 0.27.0
+ '@esbuild/openharmony-arm64': 0.27.0
+ '@esbuild/sunos-x64': 0.27.0
+ '@esbuild/win32-arm64': 0.27.0
+ '@esbuild/win32-ia32': 0.27.0
+ '@esbuild/win32-x64': 0.27.0
escalade@3.2.0: {}
escape-string-regexp@4.0.0: {}
- eslint-config-prettier@10.1.8(eslint@9.38.0):
+ eslint-config-prettier@10.1.8(eslint@9.39.1):
dependencies:
- eslint: 9.38.0
+ eslint: 9.39.1
eslint-import-resolver-node@0.3.9:
dependencies:
@@ -3461,17 +3502,17 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0):
+ eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1):
dependencies:
debug: 3.2.7
optionalDependencies:
- '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3)
- eslint: 9.38.0
+ '@typescript-eslint/parser': 8.46.4(eslint@9.39.1)(typescript@5.9.3)
+ eslint: 9.39.1
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0):
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.9
@@ -3480,9 +3521,9 @@ snapshots:
array.prototype.flatmap: 1.3.3
debug: 3.2.7
doctrine: 2.1.0
- eslint: 9.38.0
+ eslint: 9.39.1
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0)
+ eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1)
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -3494,20 +3535,20 @@ snapshots:
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.46.4(eslint@9.39.1)(typescript@5.9.3)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
- eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.38.0))(eslint@9.38.0)(prettier@3.6.2):
+ eslint-plugin-prettier@5.5.4(eslint-config-prettier@10.1.8(eslint@9.39.1))(eslint@9.39.1)(prettier@3.6.2):
dependencies:
- eslint: 9.38.0
+ eslint: 9.39.1
prettier: 3.6.2
prettier-linter-helpers: 1.0.0
synckit: 0.11.11
optionalDependencies:
- eslint-config-prettier: 10.1.8(eslint@9.38.0)
+ eslint-config-prettier: 10.1.8(eslint@9.39.1)
eslint-scope@8.4.0:
dependencies:
@@ -3518,16 +3559,16 @@ snapshots:
eslint-visitor-keys@4.2.1: {}
- eslint@9.38.0:
+ eslint@9.39.1:
dependencies:
- '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0)
- '@eslint-community/regexpp': 4.12.1
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
+ '@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.21.1
- '@eslint/config-helpers': 0.4.1
- '@eslint/core': 0.16.0
+ '@eslint/config-helpers': 0.4.2
+ '@eslint/core': 0.17.0
'@eslint/eslintrc': 3.3.1
- '@eslint/js': 9.38.0
- '@eslint/plugin-kit': 0.4.0
+ '@eslint/js': 9.39.1
+ '@eslint/plugin-kit': 0.4.1
'@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.3
@@ -3575,7 +3616,7 @@ snapshots:
esutils@2.0.3: {}
- exsolve@1.0.7: {}
+ exsolve@1.0.8: {}
fast-deep-equal@3.1.3: {}
@@ -3942,7 +3983,7 @@ snapshots:
lru-cache@10.4.3: {}
- marked@16.4.1: {}
+ marked@16.4.2: {}
math-intrinsics@1.1.0: {}
@@ -3952,7 +3993,7 @@ snapshots:
merge2@1.4.1: {}
- mermaid@11.12.0:
+ mermaid@11.12.1:
dependencies:
'@braintree/sanitize-url': 7.1.1
'@iconify/utils': 3.0.2
@@ -3963,13 +4004,13 @@ snapshots:
cytoscape-fcose: 2.2.0(cytoscape@3.33.1)
d3: 7.9.0
d3-sankey: 0.12.3
- dagre-d3-es: 7.0.11
- dayjs: 1.11.18
+ dagre-d3-es: 7.0.13
+ dayjs: 1.11.19
dompurify: 3.3.0
katex: 0.16.25
khroma: 2.1.0
lodash-es: 4.17.21
- marked: 16.4.1
+ marked: 16.4.2
roughjs: 4.6.6
stylis: 4.3.6
ts-dedent: 2.2.0
@@ -4001,7 +4042,7 @@ snapshots:
pkg-types: 1.3.1
ufo: 1.6.1
- mocha@11.7.4:
+ mocha@11.7.5:
dependencies:
browser-stdout: 1.3.1
chokidar: 4.0.3
@@ -4029,7 +4070,7 @@ snapshots:
natural-compare@1.4.0: {}
- npm-check-updates@19.1.1: {}
+ npm-check-updates@19.1.2: {}
object-inspect@1.13.4: {}
@@ -4110,9 +4151,9 @@ snapshots:
pathe@2.0.3: {}
- pdfjs-dist@5.4.296:
+ pdfjs-dist@5.4.394:
optionalDependencies:
- '@napi-rs/canvas': 0.1.80
+ '@napi-rs/canvas': 0.1.82
picocolors@1.1.1: {}
@@ -4127,7 +4168,7 @@ snapshots:
pkg-types@2.3.0:
dependencies:
confbox: 0.2.2
- exsolve: 1.0.7
+ exsolve: 1.0.8
pathe: 2.0.3
points-on-curve@0.2.0: {}
@@ -4365,9 +4406,9 @@ snapshots:
dependencies:
'@pkgr/core': 0.2.9
- tinyexec@1.0.1: {}
+ tinyexec@1.0.2: {}
- tinymce@8.1.2: {}
+ tinymce@8.2.1: {}
to-regex-range@5.0.1:
dependencies:
diff --git a/client/src/CodeChatEditor-test.mts b/client/src/CodeChatEditor-test.mts
index a2b5c24e..4c790054 100644
--- a/client/src/CodeChatEditor-test.mts
+++ b/client/src/CodeChatEditor-test.mts
@@ -42,7 +42,7 @@ import {
// Nothing needed at present.
//
// Provide convenient access to all functions tested here.
-const { codechat_html_to_markdown } = exportedForTesting;
+const {} = exportedForTesting;
// From [SO](https://stackoverflow.com/a/39914235).
const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));
@@ -74,55 +74,6 @@ window.CodeChatEditor_test = () => {
// Define some tests. See the [Mocha TDD docs](https://mochajs.org/#tdd) and
// the [Chai assert API](https://www.chaijs.com/api/assert/).
suite("CodeChatEditor.mts", function () {
- suite("codechat_html_to_markdown", function () {
- test("Translate an empty comment", async function () {
- const db: [CodeMirrorDocBlockTuple] = [[0, 0, "", "//", ""]];
- codechat_html_to_markdown(db);
- assert.deepEqual(db, [[0, 0, "", "//", "\n"]]);
- });
-
- test("Translate non-breaking space", async function () {
- const db: [CodeMirrorDocBlockTuple] = [
- [0, 0, "", "//", " "],
- ];
- codechat_html_to_markdown(db);
- assert.deepEqual(db, [[0, 0, "", "//", "\n"]]);
- });
-
- test("Translate two empty comments", async function () {
- const db: CodeMirrorDocBlockTuple[] = [
- [0, 0, "", "//", ""],
- [2, 2, "", "//", ""],
- ];
- const source = {
- doc_blocks: db,
- };
- codechat_html_to_markdown(db);
- assert.deepEqual(db, [
- [0, 0, "", "//", "\n"],
- [2, 2, "", "//", "\n"],
- ]);
- });
-
- test("Translate unclosed HTML", async function () {
- const db: CodeMirrorDocBlockTuple[] = [
- [0, 0, "", "//", "
A
\n"],
- [2, 2, "", "//", "Ax
"],
- ];
- codechat_html_to_markdown(db);
- assert.deepEqual(db, [
- [
- 0,
- 0,
- "",
- "//",
- "A\n===============\n\n\n",
- ],
- [2, 2, "", "//", "Ax\n--\n"],
- ]);
- });
- });
-
suite("CodeMirror checks", function () {
test("insert/delete/replace expectations", function () {
// Create a div to hold an editor.
diff --git a/client/src/CodeChatEditor.mts b/client/src/CodeChatEditor.mts
index 902d6662..8462b04c 100644
--- a/client/src/CodeChatEditor.mts
+++ b/client/src/CodeChatEditor.mts
@@ -11,45 +11,44 @@
// 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).
+// the CodeChat Editor. If not, see
+// [http://www.gnu.org/licenses](http://www.gnu.org/licenses).
//
// `CodeChatEditor.mts` -- the CodeChat Editor Client
-// ==================================================
+// =============================================================================
//
// The overall process of load a file is:
//
-// 1. The user browses to a file on the local machine, using the very simple
-// file browser webpage provided by the CodeChat Server. Clicking on this
-// file starts the process of loading a file into the CodeChat editor.
-// 2. The server sees a request for a file supported by the CodeChat Editor. It
-// lexes the files into code and doc blocks, then wraps these in a webpage
-// which contains this program (the CodeChat Editor).
-// 3. On load, this program (the CodeChat Editor) loads these code and doc
-// blocks into the CodeMirror text editor, using TinyMCE to provide a GUI
-// editor within CodeMirror for doc blocks.
+// 1. The user browses to a file on the local machine, using the very simple
+// file browser webpage provided by the CodeChat Server. Clicking on this
+// file starts the process of loading a file into the CodeChat editor.
+// 2. The server sees a request for a file supported by the CodeChat Editor. It
+// lexes the files into code and doc blocks, then wraps these in a webpage
+// which contains this program (the CodeChat Editor).
+// 3. On load, this program (the CodeChat Editor) loads these code and doc
+// blocks into the CodeMirror text editor, using TinyMCE to provide a GUI
+// editor within CodeMirror for doc blocks.
//
// The user then uses the editing capabilities of CodeMirror/TinyMCE to edit
// their program. When the user saves a file:
//
-// 1. This program serializes the CodeMirror text plus doc blocks, and
-// transforms HTML back to markdown.
-// 2. It sends these code/doc blocks back to the server.
-// 3. The server then transforms these code/doc blocks into source code, then
-// writes this code to the disk.
+// 1. This program serializes the CodeMirror text plus doc blocks, and
+// transforms HTML back to markdown.
+// 2. It sends these code/doc blocks back to the server.
+// 3. The server then transforms these code/doc blocks into source code, then
+// writes this code to the disk.
//
// Imports
-// -------
+// -----------------------------------------------------------------------------
//
// ### JavaScript/TypeScript
//
// #### Third-party
-import TurndownService from "./third-party/turndown/turndown.browser.es.mjs";
-import { gfm } from "./third-party/turndown/turndown-plugin-gfm.browser.es.js";
import "./third-party/wc-mermaid/wc-mermaid";
// #### Local
import { assert } from "./assert.mjs";
+import { DEBUG_ENABLED } from "./debug_enabled.mjs";
import {
apply_diff_str,
CodeMirror_load,
@@ -78,10 +77,10 @@ import { show_toast } from "./show_toast.mjs";
import "./css/CodeChatEditor.css";
// Data structures
-// ---------------
+// -----------------------------------------------------------------------------
//
// Define all possible editor modes; these are passed as
-// a[query string](https://en.wikipedia.org/wiki/Query_string)
+// a [query string](https://en.wikipedia.org/wiki/Query_string)
// (`http://path/to/foo.py?mode=toc`, for example) to the page's URL.
enum EditorMode {
// Display the source code using CodeChat, but disallow editing.
@@ -95,8 +94,8 @@ enum EditorMode {
raw,
}
-// Since this is experimental, TypeScript doesn't define it. See
-// the[docs](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent).
+// Since this is experimental, TypeScript doesn't define it. See the
+// [docs](https://developer.mozilla.org/en-US/docs/Web/API/NavigateEvent).
interface NavigateEvent extends Event {
canIntercept: boolean;
destination: any;
@@ -130,11 +129,8 @@ declare global {
}
// Globals
-// -------
+// -----------------------------------------------------------------------------
//
-// True to enable additional debug logging.
-export const DEBUG_ENABLED = false;
-
// The ID of the autosave timer; when this timer expires, the document will be
// autosaved.
let autosaveTimeoutId: null | number = null;
@@ -145,7 +141,7 @@ let autosaveEnabled = true;
// Store the lexer info for the currently-loaded language.
//
// This mirrors the data provided by the server --
-// see[SourceFileMetadata](../../server/src/webserver.rs#SourceFileMetadata).
+// see [SourceFileMetadata](../../server/src/webserver.rs#SourceFileMetadata).
let current_metadata: {
mode: string;
};
@@ -153,24 +149,8 @@ let current_metadata: {
// True if the document is dirty (needs saving).
let is_dirty = false;
-// ### Markdown to HTML conversion
-//
-// Instantiate[turndown](https://github.com/mixmark-io/turndown) for HTML to
-// Markdown conversion
-const turndownService = new TurndownService({
- br: "\\",
- codeBlockStyle: "fenced",
- renderAsPure: false,
- wordWrap: [80, 40],
-});
-
-// Add the plugins
-// from[turndown-plugin-gfm](https://github.com/laurent22/joplin/tree/dev/packages/turndown-plugin-gfm)
-// to enable conversions for tables, task lists, and strikethroughs.
-turndownService.use(gfm);
-
// Page initialization
-// -------------------
+// -----------------------------------------------------------------------------
export const set_is_dirty = (value: boolean = true) => {
is_dirty = value;
};
@@ -188,7 +168,7 @@ export const on_dom_content_loaded = (on_load_func: () => void) => {
};
// File handling
-// -------------
+// -----------------------------------------------------------------------------
//
// True if this is a CodeChat Editor document (not a source file).
const is_doc_only = () => {
@@ -223,25 +203,24 @@ let doc_content = "";
// web page with the results.
const _open_lp = async (
// A data structure provided by the server, containing the source and
- // associated metadata. See[`AllSource`](#AllSource).
+ // associated metadata. See [`AllSource`](#AllSource).
codechat_for_web: CodeChatForWeb,
cursor_position?: number,
) => {
- // Use[URLSearchParams](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams)
+ // Use
+ // [URLSearchParams](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams)
// to parse out the search parameters of this window's URL.
const urlParams = new URLSearchParams(window.location.search);
- // Get the mode from the page's query parameters. Default to edit using
- // the[nullish coalescing
- // operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator).
+ // Get the mode from the page's query parameters. Default to edit using the
+ // [nullish coalescing operator](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator).
// This works, but TypeScript marks it as an error. Ignore this error by
- // including the[@ts-ignore
- // directive](https://www.typescriptlang.org/docs/handbook/intro-to-js-ts.html#ts-check).
+ // including the
+ // [@ts-ignore directive](https://www.typescriptlang.org/docs/handbook/intro-to-js-ts.html#ts-check).
/// @ts-ignore
const editorMode = EditorMode[urlParams.get("mode") ?? "edit"];
- // Get thecurrent_metadata from
- // the provided `code_chat_for_web` struct and store it as a global
- // variable.
+ // Get the [current_metadata](#current_metadata) from the
+ // provided `code_chat_for_web` struct and store it as a global variable.
current_metadata = codechat_for_web["metadata"];
const source = codechat_for_web["source"];
const codechat_body = document.getElementById(
@@ -253,8 +232,8 @@ const _open_lp = async (
// Before calling any MathJax, make sure it's fully loaded and the initial
// render is finished.
await window.MathJax.startup.promise;
- // Per
- // the[docs](https://docs.mathjax.org/en/latest/web/typeset.html#updating-previously-typeset-content),
+ // Per the
+ // [docs](https://docs.mathjax.org/en/latest/web/typeset.html#updating-previously-typeset-content),
// "If you modify the page to remove content that contains typeset
// mathematics, you will need to tell MathJax about that so that it knows
// the typeset math that you are removing is no longer on the page."
@@ -271,15 +250,15 @@ const _open_lp = async (
await init({
selector: ".CodeChat-doc-contents",
// In the doc-only mode, add autosave functionality. While there
- // is an[autosave
- // plugin](https://www.tiny.cloud/docs/tinymce/6/autosave/),
+ // is an
+ // [autosave plugin](https://www.tiny.cloud/docs/tinymce/6/autosave/),
// this autosave functionality is completely different from the
- // autosave provided here. Per[handling editor
- // events](https://www.tiny.cloud/docs/tinymce/6/events/#handling-editor-events),
+ // autosave provided here. Per
+ // [handling editor events](https://www.tiny.cloud/docs/tinymce/6/events/#handling-editor-events),
// this is how to create a TinyMCE event handler.
setup: (editor: Editor) => {
- // The[editor core events
- // list](https://www.tiny.cloud/docs/tinymce/6/events/#editor-core-events)
+ // The
+ // [editor core events list](https://www.tiny.cloud/docs/tinymce/6/events/#editor-core-events)
// includes the`Dirty` event.
editor.on("Dirty", (_event: Event) => {
is_dirty = true;
@@ -289,8 +268,8 @@ const _open_lp = async (
});
tinymce.activeEditor!.focus();
} else {
- // Save and restore cursor/scroll location after an update per
- // the[docs](https://www.tiny.cloud/docs/tinymce/6/apis/tinymce.dom.bookmarkmanager).
+ // Save and restore cursor/scroll location after an update per the
+ // [docs](https://www.tiny.cloud/docs/tinymce/6/apis/tinymce.dom.bookmarkmanager).
// However, this doesn't seem to work for the cursor location.
// Perhaps when TinyMCE normalizes the document, this gets lost?
const bm = tinymce.activeEditor!.selection.getBookmark();
@@ -312,10 +291,9 @@ const _open_lp = async (
}
autosaveEnabled = true;
- // If tests should be run, then
- // the[following global
- // variable](CodeChatEditor-test.mts#CodeChatEditor_test) is function that
- // runs them.
+ // If tests should be run, then the
+ // [following global variable](CodeChatEditor-test.mts#CodeChatEditor_test)
+ // is function that runs them.
if (typeof window.CodeChatEditor_test === "function") {
window.CodeChatEditor_test();
}
@@ -351,7 +329,7 @@ const save_lp = (is_dirty: boolean) => {
Plain: CodeMirror;
}
).Plain = {
- doc: turndownService.turndown(html),
+ doc: html,
doc_blocks: [],
};
// Retypeset all math after saving the document.
@@ -359,7 +337,6 @@ const save_lp = (is_dirty: boolean) => {
} else {
code_mirror_diffable = CodeMirror_save();
assert("Plain" in code_mirror_diffable);
- codechat_html_to_markdown(code_mirror_diffable.Plain.doc_blocks);
}
update.contents = {
metadata: current_metadata,
@@ -396,22 +373,6 @@ const on_save = async (only_if_dirty: boolean = false) => {
is_dirty = false;
};
-const codechat_html_to_markdown = (doc_blocks: CodeMirrorDocBlockTuple[]) => {
- const entries = doc_blocks.entries();
- for (const [index, doc_block] of entries) {
- const wordWrapMargin = Math.max(
- 40,
- 80 - doc_block[3].length - doc_block[2].length - 1,
- );
- turndownService.options["wordWrap"] = [wordWrapMargin, 40];
- doc_block[4] =
- (index == doc_blocks.length - 1
- ? turndownService.last(doc_block[4])
- : turndownService.next(doc_block[4])) + "\n";
- }
- turndownService.options["wordWrap"] = [80, 40];
-};
-
// ### Autosave feature
//
// Schedule an autosave; call this whenever the document is modified.
@@ -437,15 +398,14 @@ const clearAutosaveTimer = () => {
};
// Navigation
-// ----------
+// -----------------------------------------------------------------------------
//
// The TOC and this page calls this when a hyperlink is clicked. This saves the
// current document before navigating.
const on_navigate = (navigateEvent: NavigateEvent) => {
if (
- // Some of this was copied from[Modern client-side routing: the
- // Navigation
- // API](https://developer.chrome.com/docs/web-platform/navigation-api/#deciding_how_to_handle_a_navigation).
+ // Some of this was copied from
+ // [Modern client-side routing: the Navigation API](https://developer.chrome.com/docs/web-platform/navigation-api/#deciding_how_to_handle_a_navigation).
// If we're navigating within the document, ignore this.
navigateEvent.hashChange ||
// If this is a download, let the browser perform the download.
@@ -583,12 +543,11 @@ on_dom_content_loaded(async () => {
});
// Testing
-// -------
+// -----------------------------------------------------------------------------
//
-// A great and simple idea taken from[SO](https://stackoverflow.com/a/54116079):
-// wrap all testing exports in a single variable. This avoids namespace
-// pollution, since only one name is exported, and it's clearly marked for
-// testing only. Test code still gets access to everything it needs.
-export const exportedForTesting = {
- codechat_html_to_markdown,
-};
+// A great and simple idea taken from
+// [SO](https://stackoverflow.com/a/54116079): wrap all testing exports in a
+// single variable. This avoids namespace pollution, since only one name is
+// exported, and it's clearly marked for testing only. Test code still gets
+// access to everything it needs.
+export const exportedForTesting = {};
diff --git a/client/src/CodeChatEditorFramework.mts b/client/src/CodeChatEditorFramework.mts
index 3ce453d2..153ffb10 100644
--- a/client/src/CodeChatEditorFramework.mts
+++ b/client/src/CodeChatEditorFramework.mts
@@ -15,7 +15,7 @@
// [http://www.gnu.org/licenses](http://www.gnu.org/licenses).
//
// `CodeChatEditorFramework.mts` -- the CodeChat Editor Client Framework
-// =====================================================================
+// =============================================================================
//
// This maintains a websocket connection between the CodeChat Editor Server. The
// accompanying HTML is a full-screen iframe, allowing the Framework to change
@@ -24,7 +24,7 @@
// location changes.
//
// Imports
-// -------
+// -----------------------------------------------------------------------------
//
// ### Third-party
import ReconnectingWebSocket from "./third-party/ReconnectingWebSocket.cjs";
@@ -32,6 +32,7 @@ import { show_toast as show_toast_core } from "./show_toast.mjs";
// ### Local
import { assert } from "./assert.mjs";
+import { DEBUG_ENABLED, MAX_MESSAGE_LENGTH } from "./debug_enabled.mjs";
import {
CodeChatForWeb,
EditorMessage,
@@ -41,19 +42,16 @@ import {
} from "./shared_types.mjs";
import {
console_log,
- DEBUG_ENABLED,
on_error,
on_dom_content_loaded,
} from "./CodeChatEditor.mjs";
// Websocket
-// ---------
+// -----------------------------------------------------------------------------
//
// This code communicates with the CodeChat Editor Server via its websocket
// interface.
//
-// The max length of a message to show in the console.
-const MAX_MESSAGE_LENGTH = 200;
// The timeout for a websocket `Response`, in ms.
const RESPONSE_TIMEOUT_MS = 15000;
@@ -406,9 +404,9 @@ let testMode = false;
// Load the dynamic content into the static page.
export const page_init = (
// The pathname for the websocket to use. The remainder of the URL is
- // derived from the hosting page's URL. See the [Location
- // docs](https://developer.mozilla.org/en-US/docs/Web/API/Location) for a
- // nice, interactive definition of the components of a URL.
+ // derived from the hosting page's URL. See the
+ // [Location docs](https://developer.mozilla.org/en-US/docs/Web/API/Location)
+ // for a nice, interactive definition of the components of a URL.
ws_pathname: string,
// Test mode flag
testMode_: boolean,
diff --git a/client/src/CodeMirror-integration.mts b/client/src/CodeMirror-integration.mts
index e4eb35bc..e5ae10db 100644
--- a/client/src/CodeMirror-integration.mts
+++ b/client/src/CodeMirror-integration.mts
@@ -36,17 +36,17 @@
//
// To accomplish this:
//
-// 1. Create a single CodeMirror instance, which holds the parsed source.
-// Create a single TinyMCE instance, for editing doc block contents.
-// 2. Define a replacement decoration for each doc block, which replaces the
-// newlines in the parsed source with editable doc blocks.
-// 3. Define a StateField to store the doc block decorations.
-// 4. Define a ViewPlugin to route events to doc blocks; when doc block
-// contents are focused, apply the TinyMCE instance to those contents.
-// 5. Define a set of StateEffects to add/update/etc. doc blocks.
+// 1. Create a single CodeMirror instance, which holds the parsed source. Create
+// a single TinyMCE instance, for editing doc block contents.
+// 2. Define a replacement decoration for each doc block, which replaces the
+// newlines in the parsed source with editable doc blocks.
+// 3. Define a StateField to store the doc block decorations.
+// 4. Define a ViewPlugin to route events to doc blocks; when doc block contents
+// are focused, apply the TinyMCE instance to those contents.
+// 5. Define a set of StateEffects to add/update/etc. doc blocks.
//
// Imports
-// -------
+// -----------------------------------------------------------------------------
//
// ### Third-party
import { basicSetup } from "codemirror";
@@ -79,6 +79,8 @@ import { javascript } from "@codemirror/lang-javascript";
import { json } from "@codemirror/lang-json";
import { python } from "@codemirror/lang-python";
import { rust } from "@codemirror/lang-rust";
+import { sql } from "@codemirror/lang-sql";
+import { yaml } from "@codemirror/lang-yaml";
import { Editor, init, tinymce } from "./tinymce-config.mjs";
// ### Local
@@ -95,7 +97,7 @@ import { assert } from "./assert.mjs";
import { show_toast } from "./show_toast.mjs";
// Globals
-// -------
+// -----------------------------------------------------------------------------
let current_view: EditorView;
let tinymce_singleton: Editor | undefined;
// When true, don't update on the next call to `on_dirty`. See that function for
@@ -120,7 +122,7 @@ declare global {
const docBlockFreezeAnnotation = Annotation.define();
// Doc blocks in CodeMirror
-// ------------------------
+// -----------------------------------------------------------------------------
//
// The goal: given a [Range](https://codemirror.net/docs/ref/#state.Range) of
// lines containing a doc block (a delimiter, indent, and contents) residing at
@@ -468,9 +470,8 @@ class DocBlockWidget extends WidgetType {
}
ignoreEvent(event: Event) {
- // Avoid handling other events, since this causes [weird problems with
- // event
- // routing](https://discuss.codemirror.net/t/how-to-get-focusin-events-on-a-custom-widget-decoration/6792).
+ // Avoid handling other events, since this causes
+ // [weird problems with event routing](https://discuss.codemirror.net/t/how-to-get-focusin-events-on-a-custom-widget-decoration/6792).
if (event.type === "focusin" || event.type === "input") {
return false;
} else {
@@ -494,8 +495,8 @@ class DocBlockWidget extends WidgetType {
}
}
-// Typeset the provided node; taken from the [MathJax
-// docs](https://docs.mathjax.org/en/latest/web/typeset.html#handling-asynchronous-typesetting).
+// Typeset the provided node; taken from the
+// [MathJax docs](https://docs.mathjax.org/en/latest/web/typeset.html#handling-asynchronous-typesetting).
export const mathJaxTypeset = async (
// The node to typeset.
node: HTMLElement,
@@ -503,8 +504,8 @@ export const mathJaxTypeset = async (
afterTypesetFunc: () => void = () => {},
) => {
// Don't await this promise -- other MathJax processing may still be
- // running. See the [release
- // notes](https://github.com/mathjax/MathJax-src/releases/tag/4.0.0-rc.4#api).
+ // running. See the
+ // [release notes](https://github.com/mathjax/MathJax-src/releases/tag/4.0.0-rc.4#api).
window.MathJax.typesetPromise([node]);
try {
// Instead, this function calls `afterTypesetFunc` after it awaits all
@@ -551,21 +552,21 @@ const element_is_in_doc_block = (
// Called when a doc block is dirty...
//
-// ...but it's more complicated than that. TinyMCE keeps track of a [dirty
-// flag](https://www.tiny.cloud/docs/tinymce/latest/apis/tinymce.editor/#isDirty),
+// ...but it's more complicated than that. TinyMCE keeps track of a
+// [dirty flag](https://www.tiny.cloud/docs/tinymce/latest/apis/tinymce.editor/#isDirty),
// but some dirty events it reports shouldn't be saved:
//
-// 1. When the existing TinyMCE instance is updated with new text on a redraw,
-// the resulting dirty flag should be ignored.
-// 2. When the existing TinyMCE instance is focused, existing math should be
-// untypeset, then the dirty ignored.
-// 3. When MathJax typesets math on a TinyMCE focus out event, the dirty flag
-// gets set. This should be ignored. However, typesetting is an async
-// operation, so we assume it's OK to await the typeset completion, then
-// clear the `ignore_next_dirty flag`. This will lead to nasty bugs at some
-// point.
-// 4. When an HTML doc block is assigned to the TinyMCE instance for editing,
-// the dirty flag is set. This must be ignored.
+// 1. When the existing TinyMCE instance is updated with new text on a redraw,
+// the resulting dirty flag should be ignored.
+// 2. When the existing TinyMCE instance is focused, existing math should be
+// untypeset, then the dirty ignored.
+// 3. When MathJax typesets math on a TinyMCE focus out event, the dirty flag
+// gets set. This should be ignored. However, typesetting is an async
+// operation, so we assume it's OK to await the typeset completion, then
+// clear the `ignore_next_dirty flag`. This will lead to nasty bugs at some
+// point.
+// 4. When an HTML doc block is assigned to the TinyMCE instance for editing,
+// the dirty flag is set. This must be ignored.
const on_dirty = (
// The div that's dirty. It must be a child of the doc block div.
event_target: HTMLElement,
@@ -680,13 +681,13 @@ export const DocBlockPlugin = ViewPlugin.fromClass(
// needing to check if it's already present.
indent_div.addEventListener(
"beforeinput",
- // Allow only spaces and delete/backspaces when editing the indent of a doc
- // block.
+ // Allow only spaces and delete/backspaces when editing the
+ // indent of a doc block.
(event: InputEvent) => {
// Only modify the behavior of inserts.
if (event.data) {
- // Block any insert that's not an insert of spaces. TODO: need to
- // support tabs.
+ // Block any insert that's not an insert of spaces.
+ // TODO: need to support tabs.
if (event.data !== " ".repeat(event.data.length)) {
event.preventDefault();
}
@@ -849,18 +850,19 @@ export const DocBlockPlugin = ViewPlugin.fromClass(
);
// UI
-// --
+// -----------------------------------------------------------------------------
+//
// There doesn't seem to be any tracking of a dirty/clean flag built into
-// CodeMirror v6 (although [v5
-// does](https://codemirror.net/5/doc/manual.html#isClean)). The best I've found
-// is a [forum
-// post](https://discuss.codemirror.net/t/codemirror-6-proper-way-to-listen-for-changes/2395/11)
+// CodeMirror v6 (although
+// [v5 does](https://codemirror.net/5/doc/manual.html#isClean)). The best I've
+// found is a
+// [forum post](https://discuss.codemirror.net/t/codemirror-6-proper-way-to-listen-for-changes/2395/11)
// showing code to do this, which I use below.
//
// How this works: the
// [EditorView.updateListener](https://codemirror.net/docs/ref/#codemirror) is a
-// [Facet](https://codemirror.net/docs/ref/#state.Facet) with an [of
-// function](https://codemirror.net/docs/ref/#state.Facet.of) that creates a
+// [Facet](https://codemirror.net/docs/ref/#state.Facet) with an
+// [of function](https://codemirror.net/docs/ref/#state.Facet.of) that creates a
// CodeMirror extension.
const autosaveExtension = EditorView.updateListener.of(
// CodeMirror passes this function a
@@ -970,9 +972,15 @@ export const CodeMirror_load = async (
case "rust":
parser = rust();
break;
+ case "sql":
+ parser = sql();
+ break;
case "typescript":
parser = javascript({ typescript: true });
break;
+ case "yaml":
+ parser = yaml();
+ break;
// Languages without a parser.
case "json5":
@@ -981,9 +989,6 @@ export const CodeMirror_load = async (
case "matlab":
parser = python();
break;
- case "sql":
- parser = python();
- break;
case "swift":
parser = python();
break;
diff --git a/client/src/assert.mts b/client/src/assert.mts
index 27be8f1e..93d3ddc3 100644
--- a/client/src/assert.mts
+++ b/client/src/assert.mts
@@ -1,6 +1,6 @@
// `assert.mts`
// ============
-////
+//
// Provide a simple `assert` function to check conditions at runtime. Using
// things like [assert](https://nodejs.org/api/assert.html) causes problems --
// somehow, this indicates that the code is running in a development environment
diff --git a/client/src/css/CodeChatEditor.css b/client/src/css/CodeChatEditor.css
index 4339aa1d..842c1fd4 100644
--- a/client/src/css/CodeChatEditor.css
+++ b/client/src/css/CodeChatEditor.css
@@ -17,7 +17,7 @@
[http://www.gnu.org/licenses/](http://www.gnu.org/licenses/).
`CodeChatEditor.css` -- Styles for the CodeChat Editor
- ======================================================
+ =============================================================================
This style sheet is used by the HTML generated by
[CodeChatEditor.mts](../CodeChatEditor.mts).
@@ -26,16 +26,16 @@
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/). */
+ 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;
@@ -73,7 +73,7 @@ body {
}
}
/* Misc styling
- ------------
+ -----------------------------------------------------------------------------
Make the filename compact. */
#CodeChat-filename p {
@@ -82,10 +82,10 @@ body {
}
/* 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)
+ /* 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:
\ \ \` contains \
- * `` contains \
- * `` contains \
- * `` contains the \
*/
+ * `` contains \
+ * `` contains \
+ * `` contains \
+ * `` contains the \
*/
display: flex;
padding: 0px 2px 0px 6px;
}
@@ -130,7 +130,7 @@ body {
}
/* 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
diff --git a/client/src/css/themes/light.css b/client/src/css/themes/light.css
index bf28b5dc..12e0575d 100644
--- a/client/src/css/themes/light.css
+++ b/client/src/css/themes/light.css
@@ -17,10 +17,10 @@
[http://www.gnu.org/licenses/](http://www.gnu.org/licenses/).
`light.css` -- Styles for the light theme
- =========================================
+ =============================================================================
- Use [CSS
- nesting](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_nesting/Using_CSS_nesting)
+ Use
+ [CSS nesting](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_nesting/Using_CSS_nesting)
to make everything in this style sheet apply only to the light theme. */
body.CodeChat-theme-light {
/* Style code blocks so that they are clearly separated from doc blocks. Per
diff --git a/client/src/debug_enabled.mts b/client/src/debug_enabled.mts
new file mode 100644
index 00000000..871b04bf
--- /dev/null
+++ b/client/src/debug_enabled.mts
@@ -0,0 +1,23 @@
+// 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).
+//
+// `debug_enable.mts` -- Configure debug features
+// ==============================================
+// True to enable additional debug logging.
+export const DEBUG_ENABLED = false;
+
+// The max length of a message to show in the console when debug logging is enabled.
+export const MAX_MESSAGE_LENGTH = 20000;
diff --git a/client/src/third-party/turndown/turndown-plugin-gfm.browser.es.js b/client/src/third-party/turndown/turndown-plugin-gfm.browser.es.js
deleted file mode 100644
index 6fb4bc93..00000000
--- a/client/src/third-party/turndown/turndown-plugin-gfm.browser.es.js
+++ /dev/null
@@ -1,158 +0,0 @@
-var highlightRegExp = /highlight-(?:text|source)-([a-z0-9]+)/;
-
-function highlightedCodeBlock (turndownService) {
- turndownService.addRule('highlightedCodeBlock', {
- filter: function (node) {
- var firstChild = node.firstChild;
- return (
- node.nodeName === 'DIV' &&
- highlightRegExp.test(node.className) &&
- firstChild &&
- firstChild.nodeName === 'PRE'
- )
- },
- replacement: function (content, node, options) {
- var className = node.className || '';
- var language = (className.match(highlightRegExp) || [null, ''])[1];
-
- return (
- '\n\n' + options.fence + language + '\n' +
- node.firstChild.textContent +
- '\n' + options.fence + '\n\n'
- )
- }
- });
-}
-
-function strikethrough (turndownService) {
- turndownService.addRule('strikethrough', {
- filter: ['del', 's', 'strike'],
- replacement: function (content) {
- return '~' + content + '~'
- }
- });
-}
-
-var indexOf = Array.prototype.indexOf;
-var every = Array.prototype.every;
-var rules = {};
-
-rules.tableCell = {
- filter: ['th', 'td'],
- pureAttributes: { style: undefined },
- replacement: function (content, node) {
- return cell(content, node)
- }
-};
-
-rules.tableRow = {
- filter: 'tr',
- replacement: function (content, node) {
- var borderCells = '';
- var alignMap = { left: ':--', right: '--:', center: ':-:' };
-
- if (isHeadingRow(node)) {
- for (var i = 0; i < node.childNodes.length; i++) {
- var border = '---';
- var align = (
- node.childNodes[i].getAttribute('align') || ''
- ).toLowerCase();
-
- if (align) border = alignMap[align] || border;
-
- borderCells += cell(border, node.childNodes[i]);
- }
- }
- return '\n' + content + (borderCells ? '\n' + borderCells : '')
- }
-};
-
-rules.table = {
- // Only convert tables with a heading row.
- // Tables with no heading row are kept using `keep` (see below).
- filter: function (node) {
- return node.nodeName === 'TABLE' && isHeadingRow(node.rows[0])
- },
-
- pureAttributes: { style: undefined },
-
- replacement: function (content) {
- // Ensure there are no blank lines
- content = content.replace('\n\n', '\n');
- return '\n\n' + content + '\n\n'
- }
-};
-
-rules.tableSection = {
- filter: ['thead', 'tbody', 'tfoot'],
- replacement: function (content) {
- return content
- }
-};
-
-// A tr is a heading row if:
-// - the parent is a THEAD
-// - or if its the first child of the TABLE or the first TBODY (possibly
-// following a blank THEAD)
-// - and every cell is a TH
-function isHeadingRow (tr) {
- var parentNode = tr.parentNode;
- return (
- parentNode.nodeName === 'THEAD' ||
- (
- parentNode.firstChild === tr &&
- (parentNode.nodeName === 'TABLE' || isFirstTbody(parentNode)) &&
- every.call(tr.childNodes, function (n) { return n.nodeName === 'TH' })
- )
- )
-}
-
-function isFirstTbody (element) {
- var previousSibling = element.previousSibling;
- return (
- element.nodeName === 'TBODY' && (
- !previousSibling ||
- (
- previousSibling.nodeName === 'THEAD' &&
- /^\s*$/i.test(previousSibling.textContent)
- )
- )
- )
-}
-
-function cell (content, node) {
- var index = indexOf.call(node.parentNode.childNodes, node);
- var prefix = ' ';
- if (index === 0) prefix = '| ';
- return prefix + content + ' |'
-}
-
-function tables (turndownService) {
- turndownService.keep(function (node) {
- return node.nodeName === 'TABLE' && !isHeadingRow(node.rows[0])
- });
- for (var key in rules) turndownService.addRule(key, rules[key]);
-}
-
-function taskListItems (turndownService) {
- turndownService.addRule('taskListItems', {
- filter: function (node) {
- return node.type === 'checkbox' && node.parentNode.nodeName === 'LI'
- },
- pureAttributes: {checked: "checked", disabled: "disabled", type: "checkbox" },
- replacement: function (content, node) {
- return (node.checked ? '[x]' : '[ ]') + ' '
- }
- });
-}
-
-function gfm (turndownService) {
- turndownService.use([
- highlightedCodeBlock,
- strikethrough,
- tables,
- taskListItems
- ]);
-}
-
-export { gfm, highlightedCodeBlock, strikethrough, tables, taskListItems };
diff --git a/client/src/third-party/turndown/turndown.browser.es.d.mts b/client/src/third-party/turndown/turndown.browser.es.d.mts
deleted file mode 100644
index 3c4cb077..00000000
--- a/client/src/third-party/turndown/turndown.browser.es.d.mts
+++ /dev/null
@@ -1,13 +0,0 @@
-// `turndown.browser.es.d.mts` - TypeScript ignores for the Turndown library
-// =========================================================================
-//
-// This suppresses type errors when using the Turndown library.
-declare class TurndownService {
- constructor(options: any);
- use(_: Function|Array): any;
- turndown(_: string|HTMLElement): string;
- next(_: string|HTMLElement): string;
- last(_: string|HTMLElement): string;
- options: {[name: string]: any}
-}
-export default TurndownService;
diff --git a/client/src/third-party/turndown/turndown.browser.es.mjs b/client/src/third-party/turndown/turndown.browser.es.mjs
deleted file mode 100644
index 45f4211c..00000000
--- a/client/src/third-party/turndown/turndown.browser.es.mjs
+++ /dev/null
@@ -1,1385 +0,0 @@
-function extend (destination) {
- for (var i = 1; i < arguments.length; i++) {
- var source = arguments[i];
- for (var key in source) {
- if (source.hasOwnProperty(key)) destination[key] = source[key];
- }
- }
- return destination
-}
-
-function repeat (character, count) {
- return Array(count + 1).join(character)
-}
-
-function trimLeadingNewlines (string) {
- return string.replace(/^\n*/, '')
-}
-
-function trimTrailingNewlines (string) {
- // avoid match-at-end regexp bottleneck, see #370
- var indexEnd = string.length;
- while (indexEnd > 0 && string[indexEnd - 1] === '\n') indexEnd--;
- return string.substring(0, indexEnd)
-}
-
-var blockElements = [
- 'ADDRESS', 'ARTICLE', 'ASIDE', 'AUDIO', 'BLOCKQUOTE', 'BODY', 'CANVAS',
- 'CENTER', 'DD', 'DIR', 'DIV', 'DL', 'DT', 'FIELDSET', 'FIGCAPTION', 'FIGURE',
- 'FOOTER', 'FORM', 'FRAMESET', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HEADER',
- 'HGROUP', 'HR', 'HTML', 'ISINDEX', 'LI', 'MAIN', 'MENU', 'NAV', 'NOFRAMES',
- 'NOSCRIPT', 'OL', 'OUTPUT', 'P', 'PRE', 'SECTION', 'TABLE', 'TBODY', 'TD',
- 'TFOOT', 'TH', 'THEAD', 'TR', 'UL'
-];
-
-function isBlock (node) {
- return is(node, blockElements)
-}
-
-var voidElements = [
- 'AREA', 'BASE', 'BR', 'COL', 'COMMAND', 'EMBED', 'HR', 'IMG', 'INPUT',
- 'KEYGEN', 'LINK', 'META', 'PARAM', 'SOURCE', 'TRACK', 'WBR'
-];
-
-function isVoid (node) {
- return is(node, voidElements)
-}
-
-function hasVoid (node) {
- return has(node, voidElements)
-}
-
-var meaningfulWhenBlankElements = [
- 'A', 'TABLE', 'THEAD', 'TBODY', 'TFOOT', 'TH', 'TD', 'IFRAME', 'SCRIPT',
- 'AUDIO', 'VIDEO'
-];
-
-function isMeaningfulWhenBlank (node) {
- // Certain standard HTML tags, plus any custom tag, are meaningful when blank.
- return is(node, meaningfulWhenBlankElements) || node.nodeName.includes('-')
-}
-
-function hasMeaningfulWhenBlank (node) {
- return has(node, meaningfulWhenBlankElements)
-}
-
-function is (node, tagNames) {
- return tagNames.indexOf(node.nodeName) >= 0
-}
-
-function has (node, tagNames) {
- return (
- node.getElementsByTagName &&
- tagNames.some(function (tagName) {
- return node.getElementsByTagName(tagName).length
- })
- )
-}
-
-function Node (node, options) {
- node.isBlock = isBlock(node);
- node.isCode = node.nodeName === 'CODE' || node.nodeName === 'WC-MERMAID' || node.nodeName === 'GRAPHVIZ-GRAPH' || node.parentNode.isCode;
- node.isBlank = isBlank(node);
- node.flankingWhitespace = flankingWhitespace(node, options);
- // When true, this node will be rendered as pure Markdown; false indicates it
- // will be rendered using HTML. A value of true can indicate either that the
- // source HTML can be perfectly captured as Markdown, or that the source HTML
- // will be approximated as Markdown by discarding some HTML attributes
- // (options.renderAsPure === true). Note that the value computed below is an
- // initial estimate, which may be updated by a rule's `pureAttributes`
- // property.
- node.renderAsPure = options.renderAsPure || node.attributes === undefined || node.attributes.length === 0;
- // Given a dict of attributes that an HTML element may contain and still be
- // convertable to pure Markdown, update the `node.renderAsPure` attribute. The
- // keys of the dict define allowable attributes; the values define the value
- // allowed for that key. If the value is `undefined`, then any value is
- // allowed for the given key.
- node.addPureAttributes = (d) => {
- // Only perform this check if the node isn't pure and there's something to
- // check. Note that `d.length` is always `undefined` (JavaScript is fun).
- if (!node.renderAsPure && Object.keys(d).length) {
- // Check to see how many of the allowed attributes match the actual
- // attributes.
- let allowedLength = 0;
- for (const [key, value] of Object.entries(d)) {
- if (key in node.attributes && (value === undefined || node.attributes[key].value === value)) {
- ++allowedLength;
- }
- }
- // If the lengths are equal, then every attribute matched with an allowed
- // attribute: this node is representable in pure Markdown.
- if (node.attributes.length === allowedLength) {
- node.renderAsPure = true;
- }
- }
- };
-
- // Provide a means to escape HTML to conform to Markdown's requirements:
- // inside raw HTML, one
- // [end condition](https://spec.commonmark.org/0.31.2/#html-blocks) is a blank
- // line (two consecutive newlines). To avoid this, escape newline pairs. Note:
- // this is a bit conservative, since some tags end only with a closing tag,
- // not on a newline.
- node.cleanOuterHTML = () => node.outerHTML.replace(/\n\n/g, '\n
').replace(/\r\r/g, '\r
').replace(/\n\r\n\r/g, '\n\r
').replace(/\r\n\r\n/g, '\r\n
');
- // Output the provided string if `node.renderAsPure`; otherwise, output
- // `node.outerHTML`.
- node.ifPure = (str) => node.renderAsPure ? str : node.cleanOuterHTML();
- return node
-}
-
-function isBlank (node) {
- return (
- !isVoid(node) &&
- !isMeaningfulWhenBlank(node) &&
- /^\s*$/i.test(node.textContent) &&
- !hasVoid(node) &&
- !hasMeaningfulWhenBlank(node) &&
- (node.childNodes === undefined || node.childNodes.length === 0)
- )
-}
-
-function flankingWhitespace (node, options) {
- if (node.isBlock || (options.preformattedCode && node.isCode)) {
- return { leading: '', trailing: '' }
- }
-
- var edges = edgeWhitespace(node.textContent);
-
- // abandon leading ASCII WS if left-flanked by ASCII WS
- if (edges.leadingAscii && isFlankedByWhitespace('left', node, options)) {
- edges.leading = edges.leadingNonAscii;
- }
-
- // abandon trailing ASCII WS if right-flanked by ASCII WS
- if (edges.trailingAscii && isFlankedByWhitespace('right', node, options)) {
- edges.trailing = edges.trailingNonAscii;
- }
-
- return { leading: edges.leading, trailing: edges.trailing }
-}
-
-function edgeWhitespace (string) {
- var m = string.match(/^(([ \t\r\n]*)(\s*))(?:(?=\S)[\s\S]*\S)?((\s*?)([ \t\r\n]*))$/);
- return {
- leading: m[1], // whole string for whitespace-only strings
- leadingAscii: m[2],
- leadingNonAscii: m[3],
- trailing: m[4], // empty for whitespace-only strings
- trailingNonAscii: m[5],
- trailingAscii: m[6]
- }
-}
-
-function isFlankedByWhitespace (side, node, options) {
- var sibling;
- var regExp;
- var isFlanked;
-
- if (side === 'left') {
- sibling = node.previousSibling;
- regExp = / $/;
- } else {
- sibling = node.nextSibling;
- regExp = /^ /;
- }
-
- if (sibling) {
- if (sibling.nodeType === 3) {
- isFlanked = regExp.test(sibling.nodeValue);
- } else if (options.preformattedCode && sibling.nodeName === 'CODE') {
- isFlanked = false;
- } else if (sibling.nodeType === 1 && !isBlock(sibling)) {
- isFlanked = regExp.test(sibling.textContent);
- }
- }
- return isFlanked
-}
-
-/*!
- * word-wrap
- *
- * Copyright (c) 2014-2023, Jon Schlinkert.
- * Released under the MIT License.
- */
-
-function trimEnd(str) {
- let lastCharPos = str.length - 1;
- let lastChar = str[lastCharPos];
- while(lastChar === ' ' || lastChar === '\t') {
- lastChar = str[--lastCharPos];
- }
- return str.substring(0, lastCharPos + 1);
-}
-
-function trimTabAndSpaces(str) {
- const lines = str.split('\n');
- const trimmedLines = lines.map((line) => trimEnd(line));
- return trimmedLines.join('\n');
-}
-
-var wordWrap = function(str, options) {
- options = options || {};
- if (str == null) {
- return str;
- }
-
- var width = options.width || 50;
- var indent = (typeof options.indent === 'string')
- ? options.indent
- : ' ';
-
- var newline = options.newline || '\n' + indent;
- var escape = typeof options.escape === 'function'
- ? options.escape
- : identity;
-
- var regexString = '.{1,' + width + '}';
- if (options.cut !== true) {
- regexString += '([\\s\u200B]+|$)|[^\\s\u200B]+?([\\s\u200B]+|$)';
- }
-
- var re = new RegExp(regexString, 'g');
- var lines = str.match(re) || [];
- var result = indent + lines.map(function(line) {
- if (line.slice(-1) === '\n') {
- line = line.slice(0, line.length - 1);
- }
- return escape(line);
- }).join(newline);
-
- if (options.trim === true) {
- result = trimTabAndSpaces(result);
- }
- return result;
-};
-
-function identity(str) {
- return str;
-}
-
-// Determine the approximate left indent. It will be incorrect for list items
-// whose numbers are over two digits.
-const approxLeftIndent = (node) => {
- let leftIndent = 0;
- while (node) {
- if (node.nodeName === 'BLOCKQUOTE') {
- leftIndent += 2;
- } else if (node.nodeName === 'UL' || node.nodeName === 'OL') {
- leftIndent += 4;
- }
- node = node.parentNode;
- }
- return leftIndent
-};
-
-// Wrap the provided text if so requested by the options.
-const wrapContent = (content, node, options) => {
- if (!options.wordWrap.length) {
- return content
- }
- const [wordWrapColumn, wordWrapMinWidth] = options.wordWrap;
- const wrapWidth = Math.max(wordWrapColumn - approxLeftIndent(node), wordWrapMinWidth);
- return wordWrap(content, {width: wrapWidth, indent: '', trim: true})
-};
-
-var rules = {};
-
-rules.paragraph = {
- filter: 'p',
-
- replacement: function (content, node, options) {
- return '\n\n' + wrapContent(content, node, options) + '\n\n'
- }
-};
-
-rules.lineBreak = {
- filter: 'br',
-
- replacement: function (content, node, options) {
- return options.br + '\n'
- }
-};
-
-rules.heading = {
- filter: ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'],
-
- replacement: function (content, node, options) {
- var hLevel = Number(node.nodeName.charAt(1));
-
- if (options.headingStyle === 'setext' && hLevel < 3) {
- // Only wrap setext headings -- atx heading don't work wrapped.
- content = wrapContent(content, node, options);
- // Split the contents into lines, then find the longest line length.
- const splitContent = content.split(/\r\n|\n|\r/);
- // From [SO](https://stackoverflow.com/a/43304999/16038919).
- const maxLineLength = Math.max(...(splitContent.map(el => el.length)));
- var underline = repeat((hLevel === 1 ? '=' : '-'), maxLineLength);
- return (
- '\n\n' + content + '\n' + underline + '\n\n'
- )
- } else {
- return '\n\n' + repeat('#', hLevel) + ' ' + content + '\n\n'
- }
- }
-};
-
-rules.blockquote = {
- filter: 'blockquote',
-
- replacement: function (content, node, options) {
- content = wrapContent(content, node, options);
- content = content.replace(/^\n+|\n+$/g, '');
- content = content.replace(/^/gm, '> ');
- return '\n\n' + content + '\n\n'
- }
-};
-
-rules.list = {
- filter: ['ul', 'ol'],
- pureAttributes: function (node, options) {
- // When rendering in faithful mode, check that all children are ``
- // elements that can be faithfully rendered. If not, this must be rendered
- // as HTML.
- if (!options.renderAsPure) {
- var childrenPure = Array.prototype.reduce.call(node.childNodes,
- (previousValue, currentValue) =>
- previousValue &&
- currentValue.nodeName === 'LI' &&
- (new Node(currentValue, options)).renderAsPure, true
- );
- if (!childrenPure) {
- // If any of the children must be rendered as HTML, then this node must
- // also be rendered as HTML.
- node.renderAsPure = false;
- return
- }
- }
- // Allow a `start` attribute if this is an `ol`.
- return node.nodeName === 'OL' ? {start: undefined} : {}
- },
-
- replacement: function (content, node) {
- var parent = node.parentNode;
- if (parent.nodeName === 'LI' && parent.lastElementChild === node) {
- return '\n' + content
- } else {
- return '\n\n' + content + '\n\n'
- }
- }
-};
-
-rules.listItem = {
- filter: 'li',
-
- replacement: function (content, node, options) {
- const spaces = 2;
- let prefix = '';
- content = content
- .replace(/^\n+/, '') // remove leading newlines
- .replace(/\n+$/, '\n'); // replace trailing newlines with just a single one
- const parent = node.parentNode;
- if (parent.nodeName === 'OL') {
- const start = parseInt(parent.getAttribute('start')) || 0;
- const digits = Math.log(parent.children.length + start) * Math.LOG10E + 1 | 0;
- const index = Array.prototype.indexOf.call(parent.children, node);
- const itemNumber = (start ? Number(start) + index : index + 1);
- const suffix = '.';
- const padding = (digits > spaces ? digits + 1 : spaces + 1) + suffix.length; // increase padding if beyond 99
- prefix = (itemNumber + suffix).padEnd(padding);
- // Indent all non-blank lines.
- content = content.replace(/\n(.+)/gm, '\n '.padEnd(1 + padding) + '$1');
- } else {
- prefix = options.bulletListMarker + ' '.padEnd(1 + spaces);
- // Indent all non-blank lines.
- content = content.replace(/\n(.+)/gm, '\n '.padEnd(3 + spaces) + '$1');
- }
- return (
- prefix + content + (node.nextSibling && !content.endsWith('\n\n') ? '\n' : '')
- )
- }
-};
-
-// Determine if a code block is pure. It accepts the following structure:
-//
-// ```HTML
-//
-// code contents, including newlines
-// ...then 0 or more of either:
-//
<-- this is translated to a newline
-// more code
-//
-// ```
-let codeBlockPureAttributes = (node, options, isFenced) => {
- // Check the purity of the child block(s) which contain the code.
- node.renderAsPure = options.renderAsPure || (node.childNodes.length > 0 && Array.prototype.reduce.call(node.childNodes, (accumulator, childNode) => {
- const cn = new Node(childNode, options);
- // All previous siblings are pure and...
- return accumulator && (
- // ... it's either a `br` (which cannot have children) ...
- (cn.nodeName === 'BR' && cn.attributes.length === 0) ||
- // ... or a `code` element which has ...
- (cn.nodeName === 'CODE' &&
- // ... no attributes or (for a fenced code block) a class attribute
- // containing a language name...
- (cn.attributes.length === 0 || (isFenced && cn.attributes.length === 1 && cn.className.match(/language-(\S+)/))) &&
- // ... only one child...
- cn.childNodes.length === 1 &&
- // ... containing text, ...
- cn.firstChild.nodeType === 3
- )
- )
- // ... then this node and its subtree are pure.
- }, true));
-};
-
-rules.indentedCodeBlock = {
- filter: function (node, options) {
- return (
- options.codeBlockStyle === 'indented' &&
- node.nodeName === 'PRE' &&
- node.firstChild &&
- node.firstChild.nodeName === 'CODE'
- )
- },
-
- pureAttributes: (node, options) => codeBlockPureAttributes(node, options, false),
-
- replacement: function (content, node, options) {
- return (
- '\n\n ' +
- node.firstChild.textContent.replace(/\n/g, '\n ') +
- '\n\n'
- )
- }
-};
-
-rules.fencedCodeBlock = {
- filter: function (node, options) {
- return (
- options.codeBlockStyle === 'fenced' &&
- node.nodeName === 'PRE' &&
- node.firstChild &&
- node.firstChild.nodeName === 'CODE'
- )
- },
-
- pureAttributes: (node, options) => codeBlockPureAttributes(node, options, true),
-
- replacement: function (content, node, options) {
- var className = node.firstChild.getAttribute('class') || '';
- var language = (className.match(/language-(\S+)/) || [null, ''])[1];
- // In the HTML, combine the text inside `code` tags while translating `br`
- // tags to a newline.
- var code = Array.prototype.reduce.call(node.childNodes, (accumulator, childNode) => accumulator + (childNode.tagName === 'BR' ? '\n' : childNode.textContent), '');
-
- var fenceChar = options.fence.charAt(0);
- var fenceSize = 3;
- var fenceInCodeRegex = new RegExp('^' + fenceChar + '{3,}', 'gm');
-
- var match;
- while ((match = fenceInCodeRegex.exec(code))) {
- if (match[0].length >= fenceSize) {
- fenceSize = match[0].length + 1;
- }
- }
-
- var fence = repeat(fenceChar, fenceSize);
-
- return (
- '\n\n' + fence + language + '\n' +
- code.replace(/\n$/, '') +
- '\n' + fence + '\n\n'
- )
- }
-};
-
-rules.horizontalRule = {
- filter: 'hr',
-
- replacement: function (content, node, options) {
- return '\n\n' + options.hr + '\n\n'
- }
-};
-
-rules.inlineLink = {
- filter: function (node, options) {
- return (
- options.linkStyle === 'inlined' &&
- node.nodeName === 'A' &&
- node.getAttribute('href')
- )
- },
-
- pureAttributes: {href: undefined, title: undefined},
-
- replacement: function (content, node) {
- var href = node.getAttribute('href');
- if (href) href = href.replace(/([()])/g, '\\$1');
- var title = cleanAttribute(node.getAttribute('title'));
- if (title) title = ' "' + title.replace(/"/g, '\\"') + '"';
- return '[' + content + '](' + href + title + ')'
- }
-};
-
-rules.referenceLink = {
- filter: function (node, options) {
- return (
- options.linkStyle === 'referenced' &&
- node.nodeName === 'A' &&
- node.getAttribute('href')
- )
- },
-
- pureAttributes: {href: undefined, title: undefined},
-
- replacement: function (content, node, options) {
- var href = node.getAttribute('href');
- var title = cleanAttribute(node.getAttribute('title'));
- if (title) title = ' "' + title + '"';
- var replacement;
- var reference;
-
- switch (options.linkReferenceStyle) {
- case 'collapsed':
- replacement = '[' + content + '][]';
- reference = '[' + content + ']: ' + href + title;
- break
- case 'shortcut':
- replacement = '[' + content + ']';
- reference = '[' + content + ']: ' + href + title;
- break
- default:
- var id = this.references.length + 1;
- replacement = '[' + content + '][' + id + ']';
- reference = '[' + id + ']: ' + href + title;
- }
-
- this.references.push(reference);
- return replacement
- },
-
- references: [],
-
- append: function (options) {
- var references = '';
- if (this.references.length) {
- references = '\n\n' + this.references.join('\n') + '\n\n';
- this.references = []; // Reset references
- }
- return references
- }
-};
-
-const WHITESPACE_START = /^(\\?\n| )+/;
-const WHITESPACE_END = /(\\?\n| )+$/;
-rules.emphasis = {
- filter: ['em', 'i'],
-
- replacement: function (content, node, options) {
- if (!content.trim()) return ''
- var startWhitespace = '';
- var endWhitespace = '';
- var m = WHITESPACE_START.exec(content);
- if (m) {
- startWhitespace = m[0];
- content = content.slice(startWhitespace.length);
- }
- m = WHITESPACE_END.exec(content);
- if (m) {
- endWhitespace = m[0];
- content = content.slice(0, -endWhitespace.length);
- }
- return startWhitespace + options.emDelimiter + content + options.emDelimiter + endWhitespace
- }
-};
-
-rules.strong = {
- filter: ['strong', 'b'],
-
- replacement: function (content, node, options) {
- if (!content.trim()) return ''
- var startWhitespace = '';
- var endWhitespace = '';
- var m = WHITESPACE_START.exec(content);
- if (m) {
- startWhitespace = m[0];
- content = content.slice(startWhitespace.length);
- }
- m = WHITESPACE_END.exec(content);
- if (m) {
- endWhitespace = m[0];
- content = content.slice(0, -endWhitespace.length);
- }
- return startWhitespace + options.strongDelimiter + content + options.strongDelimiter + endWhitespace
- }
-};
-
-rules.code = {
- filter: function (node) {
- var hasSiblings = node.previousSibling || node.nextSibling;
- var isCodeBlock = node.parentNode.nodeName === 'PRE' && !hasSiblings;
-
- return node.nodeName === 'CODE' && !isCodeBlock
- },
-
- pureAttributes: function (node, options) {
- // An inline code block must contain only text to be rendered as Markdown.
- node.renderAsPure = options.renderAsPure || (node.renderAsPure && node.firstChild.nodeType === 3 && node.childNodes.length === 1);
- },
-
- replacement: function (content) {
- if (!content) return ''
- content = content.replace(/\r?\n|\r/g, ' ');
-
- var extraSpace = /^`|^ .*?[^ ].* $|`$/.test(content) ? ' ' : '';
- var delimiter = '`';
- var matches = content.match(/`+/gm) || [];
- while (matches.indexOf(delimiter) !== -1) delimiter = delimiter + '`';
-
- return delimiter + extraSpace + content + extraSpace + delimiter
- }
-};
-
-rules.image = {
- filter: 'img',
- pureAttributes: {alt: undefined, src: undefined, title: undefined},
-
- replacement: function (content, node) {
- var alt = cleanAttribute(node.getAttribute('alt'));
- var src = node.getAttribute('src') || '';
- var title = cleanAttribute(node.getAttribute('title'));
- var titlePart = title ? ' "' + title + '"' : '';
- return src ? '![' + alt + ']' + '(' + src + titlePart + ')' : ''
- }
-};
-
-function cleanAttribute (attribute) {
- return attribute ? attribute.replace(/(\n+\s*)+/g, '\n') : ''
-}
-
-/**
- * Manages a collection of rules used to convert HTML to Markdown
- */
-
-function Rules (options) {
- this.options = options;
- this._keep = [];
- this._remove = [];
-
- this.blankRule = {
- replacement: options.blankReplacement
- };
-
- this.keepReplacement = options.keepReplacement;
-
- this.defaultRule = {
- replacement: options.defaultReplacement
- };
-
- this.array = [];
- for (var key in options.rules) this.array.push(options.rules[key]);
-}
-
-Rules.prototype = {
- add: function (key, rule) {
- this.array.unshift(rule);
- },
-
- keep: function (filter) {
- this._keep.unshift({
- filter: filter,
- replacement: this.keepReplacement
- });
- },
-
- remove: function (filter) {
- this._remove.unshift({
- filter: filter,
- replacement: function () {
- return ''
- }
- });
- },
-
- forNode: function (node) {
- if (node.isBlank) return this.blankRule
- var rule;
-
- if ((rule = findRule(this.array, node, this.options))) return rule
- if ((rule = findRule(this._keep, node, this.options))) return rule
- if ((rule = findRule(this._remove, node, this.options))) return rule
-
- return this.defaultRule
- },
-
- forEach: function (fn) {
- for (var i = 0; i < this.array.length; i++) fn(this.array[i], i);
- }
-};
-
-function findRule (rules, node, options) {
- for (var i = 0; i < rules.length; i++) {
- var rule = rules[i];
- if (filterValue(rule, node, options)) return rule
- }
- return void 0
-}
-
-function filterValue (rule, node, options) {
- var filter = rule.filter;
- if (typeof filter === 'string') {
- if (filter === node.nodeName.toLowerCase()) return true
- } else if (Array.isArray(filter)) {
- if (filter.indexOf(node.nodeName.toLowerCase()) > -1) return true
- } else if (typeof filter === 'function') {
- if (filter.call(rule, node, options)) return true
- } else {
- throw new TypeError('`filter` needs to be a string, array, or function')
- }
-}
-
-/**
- * The collapseWhitespace function is adapted from collapse-whitespace
- * by Luc Thevenard.
- *
- * The MIT License (MIT)
- *
- * Copyright (c) 2014 Luc Thevenard
- *
- * Permission is hereby granted, free of charge, to any person obtaining a copy
- * of this software and associated documentation files (the "Software"), to deal
- * in the Software without restriction, including without limitation the rights
- * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- * copies of the Software, and to permit persons to whom the Software is
- * furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- * THE SOFTWARE.
- */
-
-/**
- * collapseWhitespace(options) removes extraneous whitespace from an the given element.
- *
- * @param {Object} options
- */
-function collapseWhitespace (options) {
- var element = options.element;
- var isBlock = options.isBlock;
- var isVoid = options.isVoid;
- var isPre = options.isPre || function (node) {
- return node.nodeName === 'PRE' || node.nodeName === 'WC-MERMAID' || node.nodeName === 'GRAPHVIZ-GRAPH'
- };
- var renderAsPure = options.renderAsPure;
-
- if (!element.firstChild || isPre(element)) return
-
- var prevText = null;
- var keepLeadingWs = false;
-
- var prev = null;
- var node = next(prev, element, isPre);
-
- while (node !== element) {
- if (node.nodeType === 3 || node.nodeType === 4) { // Node.TEXT_NODE or Node.CDATA_SECTION_NODE
- var text = node.data.replace(/[ \r\n\t]+/g, ' ');
-
- if ((!prevText || / $/.test(prevText.data)) &&
- !keepLeadingWs && text[0] === ' ') {
- text = text.substr(1);
- }
-
- // `text` might be empty at this point.
- if (!text) {
- node = remove(node);
- continue
- }
-
- node.data = text;
-
- prevText = node;
- } else if (node.nodeType === 1) { // Node.ELEMENT_NODE
- if (isBlock(node) || node.nodeName === 'BR') {
- if (prevText) {
- prevText.data = prevText.data.replace(/ $/, '');
- }
-
- prevText = null;
- keepLeadingWs = false;
- } else if (isVoid(node) || isPre(node)) {
- // Avoid trimming space around non-block, non-BR void elements and inline PRE.
- prevText = null;
- keepLeadingWs = true;
- } else if (prevText) {
- // Drop protection if set previously.
- keepLeadingWs = false;
- }
- } else if (renderAsPure) {
- node = remove(node);
- continue
- }
-
- var nextNode = next(prev, node, isPre);
- prev = node;
- node = nextNode;
- }
-
- if (prevText) {
- prevText.data = prevText.data.replace(/ $/, '');
- if (!prevText.data) {
- remove(prevText);
- }
- }
-}
-
-/**
- * remove(node) removes the given node from the DOM and returns the
- * next node in the sequence.
- *
- * @param {Node} node
- * @return {Node} node
- */
-function remove (node) {
- var next = node.nextSibling || node.parentNode;
-
- node.parentNode.removeChild(node);
-
- return next
-}
-
-/**
- * next(prev, current, isPre) returns the next node in the sequence, given the
- * current and previous nodes.
- *
- * @param {Node} prev
- * @param {Node} current
- * @param {Function} isPre
- * @return {Node}
- */
-function next (prev, current, isPre) {
- if ((prev && prev.parentNode === current) || isPre(current)) {
- return current.nextSibling || current.parentNode
- }
-
- return current.firstChild || current.nextSibling || current.parentNode
-}
-
-/*
- * Set up window for Node.js
- */
-
-var root = (typeof window !== 'undefined' ? window : {});
-
-/*
- * Parsing HTML strings
- */
-
-function canParseHTMLNatively () {
- var Parser = root.DOMParser;
- var canParse = false;
-
- // Adapted from https://gist.github.com/1129031
- // Firefox/Opera/IE throw errors on unsupported types
- try {
- // WebKit returns null on unsupported types
- if (new Parser().parseFromString('', 'text/html')) {
- canParse = true;
- }
- } catch (e) {}
-
- return canParse
-}
-
-function createHTMLParser () {
- var Parser = function () {};
-
- {
- if (shouldUseActiveX()) {
- Parser.prototype.parseFromString = function (string) {
- var doc = new window.ActiveXObject('htmlfile');
- doc.designMode = 'on'; // disable on-page scripts
- doc.open();
- doc.write(string);
- doc.close();
- return doc
- };
- } else {
- Parser.prototype.parseFromString = function (string) {
- var doc = document.implementation.createHTMLDocument('');
- doc.open();
- doc.write(string);
- doc.close();
- return doc
- };
- }
- }
- return Parser
-}
-
-function shouldUseActiveX () {
- var useActiveX = false;
- try {
- document.implementation.createHTMLDocument('').open();
- } catch (e) {
- if (root.ActiveXObject) useActiveX = true;
- }
- return useActiveX
-}
-
-var HTMLParser = canParseHTMLNatively() ? root.DOMParser : createHTMLParser();
-
-function RootNode (input, options) {
- var root;
- if (typeof input === 'string') {
- var doc = htmlParser().parseFromString(
- // DOM parsers arrange elements in the and .
- // Wrapping in a custom element ensures elements are reliably arranged in
- // a single element.
- '' + input + '',
- 'text/html'
- );
- root = doc.getElementById('turndown-root');
- } else {
- root = input.cloneNode(true);
- }
- collapseWhitespace({
- element: root,
- isBlock: isBlock,
- isVoid: isVoid,
- isPre: options.preformattedCode ? isPreOrCode : null,
- renderAsPure: options.renderAsPure
- });
-
- return root
-}
-
-var _htmlParser;
-function htmlParser () {
- _htmlParser = _htmlParser || new HTMLParser();
- return _htmlParser
-}
-
-function isPreOrCode (node) {
- return node.nodeName === 'PRE' || node.nodeName === 'CODE'
-}
-
-var reduce = Array.prototype.reduce;
-// Taken from `commonmark.js/lib/common.js`.
-var TAGNAME = '[A-Za-z][A-Za-z0-9-]*';
-var ATTRIBUTENAME = '[a-zA-Z_:][a-zA-Z0-9:._-]*';
-var UNQUOTEDVALUE = "[^\"'=<>`\\x00-\\x20]+";
-var SINGLEQUOTEDVALUE = "'[^']*'";
-var DOUBLEQUOTEDVALUE = '"[^"]*"';
-var ATTRIBUTEVALUE =
- '(?:' +
- UNQUOTEDVALUE +
- '|' +
- SINGLEQUOTEDVALUE +
- '|' +
- DOUBLEQUOTEDVALUE +
- ')';
-var ATTRIBUTEVALUESPEC = '(?:' + '\\s*=' + '\\s*' + ATTRIBUTEVALUE + ')';
-var ATTRIBUTE = '(?:' + '\\s+' + ATTRIBUTENAME + ATTRIBUTEVALUESPEC + '?)';
-var OPENTAG = '<' + TAGNAME + ATTRIBUTE + '*' + '\\s*/?>';
-var CLOSETAG = '' + TAGNAME + '\\s*[>]';
-var HTMLCOMMENT = '||';
-var PROCESSINGINSTRUCTION = '[<][?][\\s\\S]*?[?][>]';
-var DECLARATION = ']*>';
-var CDATA = '';
-var HTMLTAG =
- '(?:' +
- OPENTAG +
- '|' +
- CLOSETAG +
- '|' +
- // Note: Turndown removes comments, so this portion of the regex isn't
- // necessary, but doesn't cause problems.
- HTMLCOMMENT +
- '|' +
- PROCESSINGINSTRUCTION +
- '|' +
- DECLARATION +
- '|' +
- CDATA +
- ')';
-// End of copied commonmark code.
-var escapes = [
- [/\\/g, '\\\\'],
- [/\*/g, '\\*'],
- [/^-/g, '\\-'],
- [/^\+ /g, '\\+ '],
- [/^(=+)/g, '\\$1'],
- [/^(#{1,6}) /g, '\\$1 '],
- [/`/g, '\\`'],
- [/^~~~/g, '\\~~~'],
- [/\[/g, '\\['],
- [/\]/g, '\\]'],
- [/^>/g, '\\>'],
- [/_/g, '\\_'],
- [/^(\d+)\. /g, '$1\\. '],
- // Per
- // [section 6.6 of the CommonMark spec](https://spec.commonmark.org/0.30/#raw-html),
- // Raw HTML, CommonMark recognizes and passes through HTML-like tags and their
- // contents. Therefore, Turndown needs to escape text that would parse as an
- // HTML-like tag. This regex recognizes these tags and escapes them by
- // inserting a leading backslash.
- [new RegExp(HTMLTAG, 'g'), '\\$&'],
- // Likewise,
- // [section 4.6 of the CommonMark spec](https://spec.commonmark.org/0.30/#html-blocks),
- // HTML blocks, requires the same treatment.
- //
- // This regex was copied from `commonmark.js/lib/blocks.js`, the
- // `reHtmlBlockOpen` variable. We only need regexps for patterns not matched
- // by the previous pattern, so this doesn't need all expressions there.
- //
- // TODO: this is too aggressive; it should only recognize this pattern at the
- // beginning of a line of CommonnMark source; these will recognize the pattern
- // at the beginning of any inline or block markup. The approach I tried was to
- // put this in `commonmark-rules.js` for the `paragraph` and `heading` rules
- // (the only block beginning-of-line rules). However, text outside a
- // paragraph/heading doesn't get escaped in this case.
- [/^<(?:script|pre|textarea|style)(?:\s|>|$)/i, '\\$&'],
- [/^<[/]?(?:address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[123456]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul)(?:\s|[/]?[>]|$)/i, '\\$&']
-];
-
-function TurndownService (options) {
- if (!(this instanceof TurndownService)) return new TurndownService(options)
-
- var defaults = {
- rules: rules,
- headingStyle: 'setext',
- hr: '* * *',
- bulletListMarker: '*',
- codeBlockStyle: 'indented',
- fence: '```',
- emDelimiter: '*',
- strongDelimiter: '**',
- linkStyle: 'inlined',
- linkReferenceStyle: 'full',
- br: ' ',
- preformattedCode: false,
- // Should the output be pure (pure Markdown, with no HTML blocks; this
- // discards any HTML input that can't be represented in "pure" Markdown) or
- // faithful (any input HTML that can't be exactly duplicated using Markdwon
- // remains HTML is the resulting output)? This is `false` by default,
- // following the original author's design.
- renderAsPure: true,
- // An array of \[word wrap column, minimum word wrap width\] indicates that
- // the output should be word wrapped based on these parameters; otherwise,
- // en empty list indicates no wrapping.
- wordWrap: [],
- blankReplacement: function (content, node) {
- return node.isBlock ? '\n\n' : ''
- },
- keepReplacement: function (content, node) {
- return node.isBlock ? '\n\n' + node.outerHTML + '\n\n' : node.outerHTML
- },
- defaultReplacement: function (content, node, options) {
- // A hack: for faithful output, always produce the HTML, rather than the
- // content. To get this, tell the node it's impure.
- node.renderAsPure = options.renderAsPure;
- return node.isBlock ? '\n\n' + node.ifPure(content) + '\n\n' : node.ifPure(content)
- }
- };
- this.options = extend({}, defaults, options);
- this.rules = new Rules(this.options);
-}
-
-TurndownService.prototype = {
- /**
- * The entry point for converting a string or DOM node to Markdown
- * @public
- * @param {String|HTMLElement} input The string or DOM node to convert
- * @returns A Markdown representation of the input
- * @type String
- */
-
- turndown: function (input) {
- if (!canConvert(input)) {
- throw new TypeError(
- input + ' is not a string, or an element/document/fragment node.'
- )
- }
-
- if (input === '') return ''
-
- var output = process.call(this, new RootNode(input, this.options));
- return postProcess.call(this, output)
- },
-
- /**
- * Like `turndown`, but functions like an iterator, so that the HTML to convert
- * is delivered in a sequnce of calls this method, then a single call to `last`.
- * @public
- * @param {String|HTMLElement} input The string or DOM node to convert
- * @returns A Markdown representation of the input
- * @type String
- */
-
- next: function (input) {
- if (!canConvert(input)) {
- throw new TypeError(
- input + ' is not a string, or an element/document/fragment node.'
- )
- }
-
- if (input === '') return ''
-
- var output = process.call(this, new RootNode(input, this.options));
- return cleanEmptyLines(output)
- },
-
- /**
- * See `next`; this finalizes the Markdown output produced by call to `next`.
- * @public
- * @param {String|HTMLElement} input The string or DOM node to convert
- * @returns A Markdown representation of the input
- * @type String
- */
-
- last: function (input) {
- return this.turndown(input)
- },
-
- /**
- * Add one or more plugins
- * @public
- * @param {Function|Array} plugin The plugin or array of plugins to add
- * @returns The Turndown instance for chaining
- * @type Object
- */
-
- use: function (plugin) {
- if (Array.isArray(plugin)) {
- for (var i = 0; i < plugin.length; i++) this.use(plugin[i]);
- } else if (typeof plugin === 'function') {
- plugin(this);
- } else {
- throw new TypeError('plugin must be a Function or an Array of Functions')
- }
- return this
- },
-
- /**
- * Adds a rule
- * @public
- * @param {String} key The unique key of the rule
- * @param {Object} rule The rule
- * @returns The Turndown instance for chaining
- * @type Object
- */
-
- addRule: function (key, rule) {
- this.rules.add(key, rule);
- return this
- },
-
- /**
- * Keep a node (as HTML) that matches the filter
- * @public
- * @param {String|Array|Function} filter The unique key of the rule
- * @returns The Turndown instance for chaining
- * @type Object
- */
-
- keep: function (filter) {
- this.rules.keep(filter);
- return this
- },
-
- /**
- * Remove a node that matches the filter
- * @public
- * @param {String|Array|Function} filter The unique key of the rule
- * @returns The Turndown instance for chaining
- * @type Object
- */
-
- remove: function (filter) {
- this.rules.remove(filter);
- return this
- },
-
- /**
- * Escapes Markdown syntax
- * @public
- * @param {String} string The string to escape
- * @returns A string with Markdown syntax escaped
- * @type String
- */
-
- escape: function (string) {
- return escapes.reduce(function (accumulator, escape) {
- return accumulator.replace(escape[0], escape[1])
- }, string)
- }
-};
-
-// These HTML elements are considered block nodes, as opposed to inline nodes. It's based on the Commonmark spec's selection of [HTML blocks](https://spec.commonmark.org/0.31.2/#html-blocks).
-const blockNodeNames = new Set([
- 'PRE', 'SCRIPT', 'STYLE', 'TEXTAREA', 'ADDRESS', 'ARTICLE', 'ASIDE', 'BASE', 'BASEFONT', 'BLOCKQUOTE', 'BODY', 'CAPTION', 'CENTER', 'COL', 'COLGROUP', 'DD', 'DETAILS', 'DIALOG', 'DIR', 'DIV', 'DL', 'DT', 'FIELDSET', 'FIGCAPTION', 'FIGURE', 'FOOTER', 'FORM', 'FRAME', 'FRAMESET', 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'HEAD', 'HEADER', 'HR', 'HTML', 'IFRAME', 'LEGEND', 'LI', 'LINK', 'MAIN', 'MENU', 'MENUITEM', 'NAV', 'NOFRAMES', 'OL', 'OPTGROUP', 'OPTION', 'P', 'PARAM', 'SEARCH', 'SECTION', 'SUMMARY', 'TABLE', 'TBODY', 'TD', 'TFOOT', 'TH', 'THEAD', 'TITLE', 'TR', 'TRACK', 'UL', 'WC-MERMAID', 'GRAPHVIZ-GRAPH'
-]);
-
-/**
- * Reduces a DOM node down to its Markdown string equivalent
- * @private
- * @param {HTMLElement} parentNode The node to convert
- * @returns A Markdown representation of the node
- * @type String
- */
-
-function process (parentNode) {
- var self = this;
- const isLi = parentNode.nodeName === 'LI';
- // Note that the root node passed to Turndown isn't translated -- only its
- // children, since the root node is simply a container (a div or body tag) of
- // items to translate. Only the root node's `renderAsPure` attribute is
- // undefined; treat it as pure, since we never translate this node.
- if (parentNode.renderAsPure || parentNode.renderAsPure === undefined) {
- const output = reduce.call(parentNode.childNodes, function (output, node, currentIndex, nodes) {
- // `output` consists of [output so far, li accumulator]. For non-li nodes, this node's output is added to the output so far. Otherwise, accumulate content for wrapping. Wrap accumulation rules: accumulate any text and non-block node; wrap the accumulator when on a non-accumulating node.
- node = new Node(node, self.options);
-
- var replacement = '';
- const nodeType = node.nodeType;
- // Is this a text node?
- if (nodeType === 3) {
- replacement = node.isCode ? node.nodeValue : self.escape(node.nodeValue);
- // Is this an element node?
- } else if (nodeType === 1) {
- replacement = replacementForNode.call(self, node);
- // In faithful mode, return the contents for these special cases.
- } else if (!self.options.renderAsPure) {
- if (nodeType === 4) {
- replacement = ``;
- } else if (nodeType === 7) {
- replacement = `${node.nodeValue}?>`;
- } else if (nodeType === 8) {
- replacement = ``;
- } else if (nodeType === 10) {
- replacement = ``;
- } else {
- console.log(`Error: unexpected node type ${nodeType}.`);
- }
- }
-
- if (isLi) {
- // Is this a non-accumulating node?
- const isLast = currentIndex === nodes.length - 1;
- if (nodeType > 3 || (nodeType === 1 && blockNodeNames.has(node.nodeName))) {
- // This is a non-accumulating node. Wrap the accumulated content, then clear the accumulator.
- const wrappedAccumulator = wrapContent(output[1], node, self.options);
- return [join(join(wrappedAccumulator, output[0]), replacement), '']
- } else if (nodeType === 3 && isLast) {
- // This is the last accumulating node in a list. Wrap this plus the accumulated content, then clear the accumulator.
- const wrappedAccumulator = wrapContent(join(output[1], replacement), node, self.options);
- return [join(output[0], wrappedAccumulator), '']
- } else {
- // This is an accumulating node, so add this to the accumulator.
- return [output[0], join(output[1], replacement)]
- }
- } else {
- return [join(output[0], replacement), '']
- }
- }, ['', '']);
- return join(output[0], output[1])
- } else {
- // If the `parentNode` represented itself as raw HTML, that contains all the
- // contents of the child nodes.
- return ''
- }
-}
-
-/**
- * Appends strings as each rule requires and trims the output
- * @private
- * @param {String} output The conversion output
- * @returns A trimmed version of the output
- * @type String
- */
-
-function postProcess (output) {
- var self = this;
- this.rules.forEach(function (rule) {
- if (typeof rule.append === 'function') {
- output = join(output, rule.append(self.options));
- }
- });
-
- return cleanEmptyLines(output)
-}
-
-// Remove extraneous newlines/tabs at the beginning and end of lines. This is
-// a postprocessing method to call just before returning the converted Markdown
-// output.
-const cleanEmptyLines = (output) => output.replace(/^[\t\r\n]+/, '').replace(/[\t\r\n\s]+$/, '');
-
-/**
- * Converts an element node to its Markdown equivalent
- * @private
- * @param {HTMLElement} node The node to convert
- * @returns A Markdown representation of the node
- * @type String
- */
-
-function replacementForNode (node) {
- var rule = this.rules.forNode(node);
- node.addPureAttributes((typeof rule.pureAttributes === 'function' ? rule.pureAttributes(node, this.options) : rule.pureAttributes) || {});
- var content = process.call(this, node);
- var whitespace = node.flankingWhitespace;
- if (whitespace.leading || whitespace.trailing) content = content.trim();
- return (
- whitespace.leading +
- // If this node contains impure content, then it must be replaced with HTML.
- // In this case, the `content` doesn't matter, so it's passed as an empty
- // string.
- (node.renderAsPure ? rule.replacement(content, node, this.options) : this.options.defaultReplacement('', node, this.options)) +
- whitespace.trailing
- )
-}
-
-/**
- * Joins replacement to the current output with appropriate number of new lines
- * @private
- * @param {String} output The current conversion output
- * @param {String} replacement The string to append to the output
- * @returns Joined output
- * @type String
- */
-
-function join (output, replacement) {
- var s1 = trimTrailingNewlines(output);
- var s2 = trimLeadingNewlines(replacement);
- var nls = Math.max(output.length - s1.length, replacement.length - s2.length);
- var separator = '\n\n'.substring(0, nls);
-
- return s1 + separator + s2
-}
-
-/**
- * Determines whether an input can be converted
- * @private
- * @param {String|HTMLElement} input Describe this parameter
- * @returns Describe what it returns
- * @type String|Object|Array|Boolean|Number
- */
-
-function canConvert (input) {
- return (
- input != null && (
- typeof input === 'string' ||
- (input.nodeType && (
- input.nodeType === 1 || input.nodeType === 9 || input.nodeType === 11
- ))
- )
- )
-}
-
-export default TurndownService;
diff --git a/client/src/tinymce-config.mts b/client/src/tinymce-config.mts
index 7da80a26..9e313f3c 100644
--- a/client/src/tinymce-config.mts
+++ b/client/src/tinymce-config.mts
@@ -16,7 +16,7 @@
//
// `tinymce-config.ts` -- integrate and configure the TinyMCE editor for use
// with the CodeChat Editor
-// =========================================================================
+// =============================================================================
//
// Import TinyMCE.
import {
@@ -89,8 +89,8 @@ export const init = async (
// The imports above apply the skins; don't try to dynamically load the
// skin's CSS.
skin: false,
- // Enable the [browser-supplied
- // spellchecker](https://www.tiny.cloud/docs/tinymce/6/spelling/#browser_spellcheck),
+ // Enable the
+ // [browser-supplied spellchecker](https://www.tiny.cloud/docs/tinymce/6/spelling/#browser_spellcheck),
// since TinyMCE's spellchecker is a premium feature.
browser_spellcheck: true,
// Place the Tiny MCE menu bar at the top of the screen; otherwise, it
@@ -102,21 +102,21 @@ export const init = async (
// When true, this still prevents hyperlinks to anchors on the current
// page from working correctly. There's an onClick handler that prevents
// links in the current page from working -- need to look into this. See
- // also [a related GitHub
- // issue](https://github.com/tinymce/tinymce/issues/3836).
+ // also
+ // [a related GitHub issue](https://github.com/tinymce/tinymce/issues/3836).
//readonly: true // Per the comment above, this is commented out.
// Use relative URLs in hyperlinks.
relative_urls: true,
- // Disable the [TinyMCE toolbar
- // buttons](https://www.tiny.cloud/blog/tinymce-toolbar/) to provide
- // more real estate on the screen.
+ // Disable the
+ // [TinyMCE toolbar buttons](https://www.tiny.cloud/blog/tinymce-toolbar/)
+ // to provide more real estate on the screen.
toolbar: false,
// Don't show the file option on the
// [menu](https://www.tiny.cloud/docs/tinymce/6/menus-configuration-options/#menubar),
// which is useless.
menubar: "edit insert view format table tools help",
- // See [License
- // key](https://www.tiny.cloud/docs/tinymce/latest/license-key).
+ // See
+ // [License key](https://www.tiny.cloud/docs/tinymce/latest/license-key).
license_key: "gpl",
// ### Settings for plugins
@@ -130,11 +130,11 @@ export const init = async (
// useful, and also has the image insert, which is problematic
// currently).
quickbars_insert_toolbar: false,
- // Put more buttons on the [quick
- // toolbar](https://www.tiny.cloud/docs/tinymce/6/quickbars/) that
- // appears when text is selected. TODO: add a button for code format
- // (can't find this one -- it's only on the [list of menu
- // items](https://www.tiny.cloud/docs/tinymce/6/available-menu-items/#the-core-menu-items)
+ // Put more buttons on the
+ // [quick toolbar](https://www.tiny.cloud/docs/tinymce/6/quickbars/)
+ // that appears when text is selected. TODO: add a button for code
+ // format (can't find this one -- it's only on the
+ // [list of menu items](https://www.tiny.cloud/docs/tinymce/6/available-menu-items/#the-core-menu-items)
// as `codeformat`).
quickbars_selection_toolbar:
"bold italic underline codeformat | quicklink h2 h3",
diff --git a/client/tsconfig.json b/client/tsconfig.json
index a0c77097..5603c888 100644
--- a/client/tsconfig.json
+++ b/client/tsconfig.json
@@ -15,19 +15,19 @@
// [http://www.gnu.org/licenses](http://www.gnu.org/licenses).
//
// tsconfig.json -- TypeScript configuration
-// =========================================
+// =============================================================================
{
"compilerOptions": {
"allowJs": true,
// Required by ESBuild per their
// [docs](https://esbuild.github.io/content-types/#es-module-interop);
- // see also [the TypeScript
- // docs](https://www.typescriptlang.org/tsconfig#esModuleInterop).
+ // see also
+ // [the TypeScript docs](https://www.typescriptlang.org/tsconfig#esModuleInterop).
"esModuleInterop": true,
// Required by ESBuild per their
// [docs](https://esbuild.github.io/content-types/#isolated-modules);
- // see also [the TypeScript
- // docs](https://www.typescriptlang.org/tsconfig#isolatedModules).
+ // see also
+ // [the TypeScript docs](https://www.typescriptlang.org/tsconfig#isolatedModules).
"isolatedModules": true,
"module": "nodenext",
"outDir": "out",
diff --git a/dist-workspace.toml b/dist-workspace.toml
index 0d75623d..9a5d4fca 100644
--- a/dist-workspace.toml
+++ b/dist-workspace.toml
@@ -25,7 +25,7 @@ members = ["cargo:server/"]
# Config for 'dist'
[dist]
# The preferred dist version to use in CI (Cargo.toml SemVer syntax)
-cargo-dist-version = "0.30.0"
+cargo-dist-version = "0.30.2"
# CI backends to support
ci = "github"
# The installers to generate for each app
diff --git a/docs/design.md b/docs/design.md
index d8dbd9d8..fbe59577 100644
--- a/docs/design.md
+++ b/docs/design.md
@@ -1,136 +1,134 @@
CodeChat Editor design
-======================
+================================================================================
To build from source
---------------------
-
-1. Clone or download the repository.
-2. [Install the Rust language](https://www.rust-lang.org/tools/install). I
- recommend the 64-bit toolset for Windows.
-3. [Install
- NPM](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) (the
- Node.js package manager).
-4. In the `server/` directory:
- 1. Run `./bt install --dev`.
- 2. Run `./bt build`.
- 3. Run `cargo run -- start ../README.md`.
+--------------------------------------------------------------------------------
+
+1. Clone or download the repository.
+2. [Install the Rust language](https://www.rust-lang.org/tools/install). I
+ recommend the 64-bit toolset for Windows.
+3. [Install NPM](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm)
+ (the Node.js package manager).
+4. In the `server/` directory:
+ 1. Run `./bt install --dev`.
+ 2. Run `./bt build`.
+ 3. Run `cargo run -- start ../README.md`.
Use `./bt` tool's options update all libraries (`update`), run all tests
(`test`), and more.
Vision
--------------------------
+--------------------------------------------------------------------------------
These form a set of high-level requirements to guide the project.
-* View source code as [code
- blocks and doc blocks](index.md#code-blocks-and-doc-blocks). Doc blocks are
- lines of source which contain only correctly-formatted comments.
-
-* Provide support for a [wide
- variety of programming languages](index.md#programming-language-support).
-
-* Provide integration with a [wide variety
- of IDEs/text editors](index.md#ide-integration).
-
-* Load a document from source code, allow edits in a GUI, then save it back to
- source code.
-
- * Provide word processor GUI tools (insert hyperlink, images, headings,
- change font, etc.) for doc blocks.
- * Provide text editor/IDE tools (syntax highlighting, line numbers, show
- linter feedback) for code blocks.
-* Zero build: eliminate the traditional project build process -- make it
- almost instantaneous.
-
-* Doc block markup should be readable and well-known: markdown.
-
-* Support both a single-file mode and a project mode.
-
- * A project is a specific directory tree, identified by the presence of a
- TOC. A TOC is just a plain Markdown file with a specific name. A better
- term: not a TOC, but a navigation pane, since the TOC can contain
- anything (see below).
- * A page in a project build is a single-file page plus:
- * A TOC, along with previous/next/up navigation. The TOC is
- synchronized to the current page.
- * Numbering comes from the current page's location within the TOC.
- Pages not in the TOC aren't numbered.
-* Provide [authoring
- support](index.md#authoring-support), which allows authors to easily create
- book/project-like features. In particular:
-
- * Counters for numbering figures, tables, equations, etc. All counters are
- page-local (no global counters).
- * Auto-titled links: the link text is automatically derived from the
- link's destination (the heading text at the link's destination; a
- figure/table caption, etc.).
- * Auto-generated back links: anchors support auto-generated links back to
- all their referents, which can be used for footnotes, endnotes,
- citations, and indices. To enable this, all forward links must include
- an anchor and optionally the text to display at the target.
- * TOC support which:
- * Given some file(s), expands to a nested list of headings in the
- file(s). Authors may specify the depth of headings to include.
- * Show the filesystem, optionally not including files that are linked
- in th TOC.
- * Show a list of all links.
- * Since it's a plain Markdown file, this could include pretty much
- anything: a list of index entires; a temporally-sorted list of
- pages; an image with links based on a map/diagram; etc.
- * Tracking support: auto-scrolls the TOC to the first instance of a
- link to the currently viewed file, and tracks headings within the
- current file.
- * 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.
- * 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
- produced by executing the code.
- * Graphical code views:
- * Present a case statement as a state machine.
- * Present if/else statements as a truth table.
- * Visualize data structures.
- * More?
- * 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.)
- * Hyperlinks to identifiers in code (use
- [ctags](https://github.com/universal-ctags/ctags)); perhaps
- auto-generate headings for these identifiers?
- * An API view; show only parts of the code that's
- exported/publicly-accessible.
- * Substitutions.
- * 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.
-* 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.)
+* View source code as
+ [code blocks and doc blocks](index.md#code-blocks-and-doc-blocks).
+ Doc blocks are lines of source which contain only correctly-formatted
+ comments.
+
+* Provide support for a
+ [wide variety of programming languages](index.md#programming-language-support).
+
+* Provide integration with a
+ [wide variety of IDEs/text editors](index.md#ide-integration).
+
+* Load a document from source code, allow edits in a GUI, then save it back to
+ source code.
+
+ * Provide word processor GUI tools (insert hyperlink, images, headings, change
+ font, etc.) for doc blocks.
+ * Provide text editor/IDE tools (syntax highlighting, line numbers, show
+ linter feedback) for code blocks.
+* Zero build: eliminate the traditional project build process -- make it almost
+ instantaneous.
+
+* Doc block markup should be readable and well-known: markdown.
+
+* Support both a single-file mode and a project mode.
+
+ * A project is a specific directory tree, identified by the presence of a TOC.
+ A TOC is just a plain Markdown file with a specific name. A better term: not
+ a TOC, but a navigation pane, since the TOC can contain anything (see
+ below).
+ * A page in a project build is a single-file page plus:
+ * A TOC, along with previous/next/up navigation. The TOC is synchronized to
+ the current page.
+ * Numbering comes from the current page's location within the TOC. Pages not
+ in the TOC aren't numbered.
+* Provide
+ [authoring support](index.md#authoring-support), which allows authors to
+ easily create book/project-like features. In particular:
+
+ * Counters for numbering figures, tables, equations, etc. All counters are
+ page-local (no global counters).
+ * Auto-titled links: the link text is automatically derived from the link's
+ destination (the heading text at the link's destination; a figure/table
+ caption, etc.).
+ * Auto-generated back links: anchors support auto-generated links back to all
+ their referents, which can be used for footnotes, endnotes, citations, and
+ indices. To enable this, all forward links must include an anchor and
+ optionally the text to display at the target.
+ * TOC support which:
+ * Given some file(s), expands to a nested list of headings in the file(s).
+ Authors may specify the depth of headings to include.
+ * Show the filesystem, optionally not including files that are linked in th
+ TOC.
+ * Show a list of all links.
+ * Since it's a plain Markdown file, this could include pretty much anything:
+ a list of index entires; a temporally-sorted list of pages; an image with
+ links based on a map/diagram; etc.
+ * Tracking support: auto-scrolls the TOC to the first instance of a link to
+ the currently viewed file, and tracks headings within the current file.
+ * 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.
+ * 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
+ produced by executing the code.
+ * Graphical code views:
+ * Present a case statement as a state machine.
+ * Present if/else statements as a truth table.
+ * Visualize data structures.
+ * More?
+ * 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.)
+ * Hyperlinks to identifiers in code (use
+ [ctags](https://github.com/universal-ctags/ctags)); perhaps auto-generate
+ headings for these identifiers?
+ * An API view; show only parts of the code that's
+ exported/publicly-accessible.
+ * Substitutions.
+ * 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.
+* 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.)
### Nice to have features
-* Simple to install locally; provide a template CodeSpaces repo for web-based
- editing.
-* Support a static build: producing a set of view-only HTML files which don't
- need a server for a project, or a single HTML file outside a project.
-* An API-only view (Doxygen/Javadoc like feature).
+* Simple to install locally; provide a template CodeSpaces repo for web-based
+ editing.
+* Support a static build: producing a set of view-only HTML files which don't
+ need a server for a project, or a single HTML file outside a project.
+* An API-only view (Doxygen/Javadoc like feature).
Requirements
---------------------------------------
+--------------------------------------------------------------------------------
The requirements expand on the vision by providing additional details.
@@ -167,42 +165,40 @@ indents are combined into a single, larger doc block.
support\](index.md#programming-language-support)
Initial targets come from the Stack Overflow Developer Survey 2022's section on
-[programming, scripting, and markup
-languages](https://survey.stackoverflow.co/2022/#section-most-popular-technologies-programming-scripting-and-markup-languages)
-and IEEE Spectrum's [Top Programming Languages
-2022](https://spectrum.ieee.org/top-programming-languages-2022).
+[programming, scripting, and markup languages](https://survey.stackoverflow.co/2022/#section-most-popular-technologies-programming-scripting-and-markup-languages)
+and IEEE Spectrum's
+[Top Programming Languages 2022](https://spectrum.ieee.org/top-programming-languages-2022).
### IDE/text editor integration
Initial targets come from the Stack Overflow Developer Survey 2022's section on
-[integrated development
-environments](https://survey.stackoverflow.co/2022/#section-most-popular-technologies-integrated-development-environment).
+[integrated development environments](https://survey.stackoverflow.co/2022/#section-most-popular-technologies-integrated-development-environment).
There are two basic approaches:
-* Sync with current window (simplest): have an additional IDE window open
- that displays the file currently being edited. This requires:
- * Auto-save: the CodeChat Editor autosaves any changes made, to keep files
- synced. Have the host IDE auto-save, so that updates get pushed quickly.
- * Auto-reload: if a the currently-opened file changes, then automatically
- reload it. Have the host IDE do the same.
- * Current file sync: when the current tab changes, update the CodeChat
- Editor with the new file. Ideally, also sync the cursor position.
-* Switchable editor (better, complex): provide a command to switch the
- current editor with the CodeChat Editor and vice versa. This requires:
- * To switch from the IDE editor to CodeChat, need to send the text of the
- IDE's editor to CodeChat. For the opposite, need to get the CodeChat
- Editor text and send that to the IDE's editor.
- * Need to preserve the current cursor location across switches. This is
- harder inside a doc block. An approximate find might be a good option.
+* Sync with current window (simplest): have an additional IDE window open that
+ displays the file currently being edited. This requires:
+ * Auto-save: the CodeChat Editor autosaves any changes made, to keep files
+ synced. Have the host IDE auto-save, so that updates get pushed quickly.
+ * Auto-reload: if a the currently-opened file changes, then automatically
+ reload it. Have the host IDE do the same.
+ * Current file sync: when the current tab changes, update the CodeChat Editor
+ with the new file. Ideally, also sync the cursor position.
+* Switchable editor (better, complex): provide a command to switch the current
+ editor with the CodeChat Editor and vice versa. This requires:
+ * To switch from the IDE editor to CodeChat, need to send the text of the
+ IDE's editor to CodeChat. For the opposite, need to get the CodeChat Editor
+ text and send that to the IDE's editor.
+ * Need to preserve the current cursor location across switches. This is harder
+ inside a doc block. An approximate find might be a good option.
Additional features:
-* Smart navigation: following links to a locally-editable file will open that
- file in the current editor, saving any edits before navigating away.
- Following non-local links opens the file in an external browser.
-* Memory: the editor remembers the last cursor location for recently-opened
- files, restoring that on the next file open.
+* Smart navigation: following links to a locally-editable file will open that
+ file in the current editor, saving any edits before navigating away. Following
+ non-local links opens the file in an external browser.
+* Memory: the editor remembers the last cursor location for recently-opened
+ files, restoring that on the next file open.
### Zero-build support
@@ -219,7 +215,7 @@ When a new tag is inserted, any tag-produced content should be immediately
added.
License
--------
+--------------------------------------------------------------------------------
Copyright (C) 2025 Bryan A. Jones.
@@ -237,4 +233,4 @@ 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/).
\ No newline at end of file
+[https://www.gnu.org/licenses/](https://www.gnu.org/licenses/).
diff --git a/docs/implementation.md b/docs/implementation.md
index bd0a4067..8bd9b006 100644
--- a/docs/implementation.md
+++ b/docs/implementation.md
@@ -17,7 +17,7 @@ CodeChat Editor. If not, see
[http://www.gnu.org/licenses/](http://www.gnu.org/licenses/).
Implementation
-==============
+================================================================================
### System architecture
@@ -48,7 +48,7 @@ Implementation
}">
Architecture
-------------------------------------------
+--------------------------------------------------------------------------------
### Client/server partitioning
@@ -61,94 +61,93 @@ elements, such as a cross-reference tag, depend on information from other pages
ability to access other files, while the server has direct access to these
files. Therefore, the overall strategy is:
-* On page load, the server transforms custom tags which depend on information
- from other pages into tags which include this information. For example, a
- cross-reference tag might be transformed into a hyperlink whose link text
- comes from the cross-reference on another page.
-* The client them defines a set of [Web
- Components](https://developer.mozilla.org/en-US/docs/Web/Web_Components)
- which implement custom tags which only need local information. For example,
- a GraphViz custom tag renders graphs based on a description of the graph
- inside the tag. Likewise, MathJax interprets anything in matching math
- delimiters ($...$, for example), then transforms it back to text before
- saving.
-* On save, the client sends its text back to the server, which de-transforms
- custom tags which depend on information from other pages. If de-transforms
- disagree with the provided text, then re-load the updated text after the
- save is complete. For example, after inserting an auto-titled link, the
- auto-titled text is missing; a save/reload fixes this.
+* On page load, the server transforms custom tags which depend on information
+ from other pages into tags which include this information. For example, a
+ cross-reference tag might be transformed into a hyperlink whose link text
+ comes from the cross-reference on another page.
+* The client them defines a set of
+ [Web Components](https://developer.mozilla.org/en-US/docs/Web/Web_Components)
+ which implement custom tags which only need local information. For example, a
+ GraphViz custom tag renders graphs based on a description of the graph inside
+ the tag. Likewise, MathJax interprets anything in matching math delimiters
+ ($...$, for example), then transforms it back to text before saving.
+* On save, the client sends its text back to the server, which de-transforms
+ custom tags which depend on information from other pages. If de-transforms
+ disagree with the provided text, then re-load the updated text after the save
+ is complete. For example, after inserting an auto-titled link, the auto-titled
+ text is missing; a save/reload fixes this.
### Page processing pipeline
On load:
-* Classify the file; input 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 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.
-* (CodeChat files only) Lex the file into code and doc blocks.
-* 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.
+* Classify the file; input 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 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.
+* (CodeChat files only) Lex the file into code and doc blocks.
+* 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.
We want a clean separate between the webserver and the processing pipeline. The
webserver should provide I/O between the local file system and the client, but
do little processing. The processing pipeline should not perform I/O. Therefore:
-* On load, the webserver receives a request for a file. It should gather
- and pass the following to the page processor:
- * The loaded file as text (or an Err result).
- * The global state (empty if this isn't a project build).
- * The pathname of the file.
- * If this file should be processed as a TOC or not.
-* The page processor returns:
- * An Enum with the file's contents:
+* On load, the webserver receives a request for a file. It should gather and
+ pass the following to the page processor:
+ * The loaded file as text (or an Err result).
+ * The global state (empty if this isn't a project build).
+ * The pathname of the file.
+ * If this file should be processed as a TOC or not.
+* The page processor returns:
+ * An Enum with the file's contents:
On save:
-* Transform the CodeMirror format back to code and doc blocks.
-* Run HTML hooks:
- * Update the cache for the current file. Mark the file as "dirty" (reload
- needed) if any changes are made.
- * Check tags whose contents depend on data from other files; if the
- contents differ, mark the file as dirty.
- * Transform HTML to Markdown.
-* Run post-parse hooks; mark the file as dirty if any changes are made.
-* De-lex the file into source code.
-* Run pre-parse hooks; mark the file as dirty if any changes are made.
-* Save the file to disk.
-* If dirty, re-load the file.
+* Transform the CodeMirror format back to code and doc blocks.
+* Run HTML hooks:
+ * Update the cache for the current file. Mark the file as "dirty" (reload
+ needed) if any changes are made.
+ * Check tags whose contents depend on data from other files; if the contents
+ differ, mark the file as dirty.
+ * Transform HTML to Markdown.
+* Run post-parse hooks; mark the file as dirty if any changes are made.
+* De-lex the file into source code.
+* Run pre-parse hooks; mark the file as dirty if any changes are made.
+* Save the file to disk.
+* If dirty, re-load the file.
#### HTML to Markdown transformation
Currently, Turndown translates HTML to Markdown and word-wraps the result. This
has several problems:
-* There are several bugs/open issues in Turndown; however, this package is no
- longer maintained. I have a fork with fixes -- see the
- [turndown](https://github.com/bjones1/turndown) and
- [turndown-plugin-gfm](https://github.com/bjones1/turndown-plugin-gfm).
-* Turndown doesn't have a good way to deal with raw HTML intermingled with
- Markdown; since raw HTML can change the meaning of HTML through styles, this
- is hard to avoid. But it still produces ugly results.
-* Because both packages are written in Javascript, they run in the browser.
- However, we need to run processing at the HTML level on the server first,
- requiring some round trips between client and sever in the future.
- Therefore, the next step is to switch to the Rust `htmd` crate, then port
- fixes from Turndown to that.
+* There are several bugs/open issues in Turndown; however, this package is no
+ longer maintained. I have a fork with fixes -- see the
+ [turndown](https://github.com/bjones1/turndown) and
+ [turndown-plugin-gfm](https://github.com/bjones1/turndown-plugin-gfm).
+* Turndown doesn't have a good way to deal with raw HTML intermingled with
+ Markdown; since raw HTML can change the meaning of HTML through styles, this
+ is hard to avoid. But it still produces ugly results.
+* Because both packages are written in Javascript, they run in the browser.
+ However, we need to run processing at the HTML level on the server first,
+ requiring some round trips between client and sever in the future. Therefore,
+ the next step is to switch to the Rust `htmd` crate, then port fixes from
+ Turndown to that.
To build Turndown, simply execute `npm run build` or `npm run test`.
@@ -169,19 +168,19 @@ activity from the core processing needed to translate source code between a
CodeChat Editor Client and an IDE client. Specifically, one task handles the
receive and transmit function for the websocket:
-* The task sends a periodic ping to the CodeChat Editor Client or the IDE
- client, then waits for a pong, closing the connection if the pong isn't
- received in a timely manner. This helps detect a broken websocket connection
- produced when a computer is put to sleep then wakes back up.
-* Likewise, the task responds to a ping message from the CodeChat Editor
- Client by sending a pong in response.
-* It tracks messages sent and produces an error message if a sent message
- isn't acknowledged within a timeout window.
-* If the websocket is closed without warning, the websocket stores the
- relevant data so that it can resume when the client reconnects to it.
-* If the websocket is closed purposefully (for example, by closing a CodeChat
- Editor Client tab in a web browser), the receive task detects this and shuts
- down the websocket along with the associated IDE client tasks.
+* The task sends a periodic ping to the CodeChat Editor Client or the IDE
+ client, then waits for a pong, closing the connection if the pong isn't
+ received in a timely manner. This helps detect a broken websocket connection
+ produced when a computer is put to sleep then wakes back up.
+* Likewise, the task responds to a ping message from the CodeChat Editor Client
+ by sending a pong in response.
+* It tracks messages sent and produces an error message if a sent message isn't
+ acknowledged within a timeout window.
+* If the websocket is closed without warning, the websocket stores the relevant
+ data so that it can resume when the client reconnects to it.
+* If the websocket is closed purposefully (for example, by closing a CodeChat
+ Editor Client tab in a web browser), the receive task detects this and shuts
+ down the websocket along with the associated IDE client tasks.
To decouple these low-level websocket details from high-level processing (such
as translating between source code and its web equivalent), the websocket tasks
@@ -191,19 +190,18 @@ connection.
Simplest non-IDE integration: the file watcher.
-* On startup, it sends the current file to the CodeChat Editor.
-* It uses a file watcher to send update commands when the current file
- changes.
-* It writes a file to disk when it receives an update command.
-* It closes the editor if the file is deleted or moved.
+* On startup, it sends the current file to the CodeChat Editor.
+* It uses a file watcher to send update commands when the current file changes.
+* It writes a file to disk when it receives an update command.
+* It closes the editor if the file is deleted or moved.
Simplest IDE integration:
-* On startup, it sends the current file to the CodeChat Editor.
-* It sends update commands if edits are made in the IDE, when scrolling, or
- when the active editor changes.
-* It updates the IDE contents or opens a new file when it receives a update
- command.
+* On startup, it sends the current file to the CodeChat Editor.
+* It sends update commands if edits are made in the IDE, when scrolling, or when
+ the active editor changes.
+* It updates the IDE contents or opens a new file when it receives a update
+ command.
More complex IDE integration: everything that the simple IDE does, plus the
ability to toggle between the IDE's editor and the CodeChat Editor.
@@ -220,33 +218,33 @@ allows calling Rust from Java.
When an edit occurs, it's best to send only changed data, rather than the whole
file. The diff crate provides easy access to determining a diff. The idea:
-1. In the server, save the current file contents. Ignore diffing if the file
- name changes.
-2. When moving from IDE to client:
- 1. Code: diff the string containing code, then diff each doc block's
- contents. The new code string is now an array of insert(start, stop,
- string)/delete(start, stop) instructions.
- 2. Doc blocks: the format is \[ \[index, start?, end?, comment?,
- \[insert/delete instructions\] \].
-3. From client to IDE:
- 1. I'd like to do something similar. WASM, perhaps? Then recover changes on
- the server. If there's any way to mark doc blocks as dirty, that might
- help.
+1. In the server, save the current file contents. Ignore diffing if the file
+ name changes.
+2. When moving from IDE to client:
+ 1. Code: diff the string containing code, then diff each doc block's
+ contents. The new code string is now an array of insert(start, stop,
+ string)/delete(start, stop) instructions.
+ 2. Doc blocks: the format is \[ \[index, start?, end?, comment?,
+ \[insert/delete instructions\] \].
+3. From client to IDE:
+ 1. I'd like to do something similar. WASM, perhaps? Then recover changes on
+ the server. If there's any way to mark doc blocks as dirty, that might
+ help.
Build system
-------------
+--------------------------------------------------------------------------------
The app needs build support because of complexity:
-* The client's NPM libraries need patching and some partial copying.
-* After building a release for a platform, client/server binaries must be
- copied to the VSCode extension, then a release published for that platform.
+* The client's NPM libraries need patching and some partial copying.
+* After building a release for a platform, client/server binaries must be copied
+ to the VSCode extension, then a release published for that platform.
So, this project contains Rust code to automate this process -- see the
[builder](../builder/Cargo.toml).
Misc topics
------------
+--------------------------------------------------------------------------------
### CodeChat Editor Client Simple Viewer
@@ -259,10 +257,10 @@ support for viewing PDFs (which VSCode's built-in web browser doesn't support).
### Broken fences (Markdown challenges)
- All Markdown blocks are termined by a blank line followed by unindented
-content, except for fenced code blocks and some types of HTML blocks. To ensure
-that doc blocks containing an opening fence but no matching closing fence, or a
-start HTML tag but no closing tag, are properly closed (instead of affecting the
+All Markdown blocks are termined by a blank line followed by unindented content,
+except for fenced code blocks and some types of HTML blocks. To ensure that doc
+blocks containing an opening fence but no matching closing fence, or a start
+HTML tag but no closing tag, are properly closed (instead of affecting the
remainder of the doc blocks), the editor injects closing tags and fences after
each doc block, then reapirs them (if needed, due to a missing closing fence) or
removed them. This means that some HTML tags won't be properly closed, since the
@@ -270,37 +268,28 @@ closing tags are removed from the HTML. This is fixed by later HTML processing
steps (currently, by TinyMCE), which properly closes tags.
Future work
------------
+--------------------------------------------------------------------------------
### Table of contents
-* While the TOC file must be placed in the root of the project, it will be
- served alongside pages served from subdirectories. Therefore, place this in
- an iframe to avoid regenerating it for every page.
-* The TOC is just Markdown. Numbered sections are expressed as nested ordered
- lists, with links to each section inside these lists.
-* All numbering is stored internally as a number, instead of the
- corresponding marker (I, II, III, etc.). This allows styles to customize
- numbering easily.
- * Given an `a` element in the TOC, looking through its parents provides
- the section number. Given an array of section numbers, use CSS to style
- all the headings. Implement numbering using CSS variables, which makes
- it easy for a style sheet to include or exclude section numbers:
-
- `:root {`\
-
- `--section-counter-reset: s1 4 s2 5;`\
-
- `--section-counter-content: counter(s1, numeric) '-' counter(s2,
- numeric);`\
- `}`
-
- `h1::before {`\
-
- `counter-reset: var(--section-counter-reset);`\
-
- `content: var(--section-counter-content);`\
- `}`
+* While the TOC file must be placed in the root of the project, it will be
+ served alongside pages served from subdirectories. Therefore, place this in an
+ iframe to avoid regenerating it for every page.
+* The TOC is just Markdown. Numbered sections are expressed as nested ordered
+ lists, with links to each section inside these lists.
+* All numbering is stored internally as a number, instead of the corresponding
+ marker (I, II, III, etc.). This allows styles to customize numbering easily.
+ * Given an `a` element in the TOC, looking through its parents provides the
+ section number. Given an array of section numbers, use CSS to style all the
+ headings. Implement numbering using CSS variables, which makes it easy for a
+ style sheet to include or exclude section numbers:
+
+ `:root {` `--section-counter-reset: s1 4 s2 5;`
+ `--section-counter-content: counter(s1, numeric) '-' counter(s2, numeric);`
+ `}`
+
+ `h1::before {` `counter-reset: var(--section-counter-reset);`
+ `content: var(--section-counter-content);` `}`
### Cached state
@@ -311,41 +300,39 @@ server, all needed hydration data should be stored in the cache.
What we need to know:
-* To generate the TOC, we need a way to find the linked file, then get a
- list of all its headings.
- * Problem: files can be moved. Better would be an invariant anchor, stored
- in the file, which doesn't change. It would make sense to link to the
- only \ element...but there may not be one, or it may not be at the
- top of the file. The easy solution would be an anchor tag at the
- beginning of the file...but this would break shell scripts, for example.
- Another is including an anchor tag somewhere in each document, but need
- authors to understand what it is (and not delete it). Another
- possibility is to link to any anchor in the file with a special query
- identifying it as link to the underlying file.
-* To auto-title a link, need to look up an anchor and get its location (page
- number, section number) and title.
-* For back links, need to look up all links to the given anchor, then get the
- location and title of each link.
-* To generate the TOC containing all anchors, we need a list of all anchors on
- a given page.
+* To generate the TOC, we need a way to find the linked file, then get a list of
+ all its headings.
+ * Problem: files can be moved. Better would be an invariant anchor, stored in
+ the file, which doesn't change. It would make sense to link to the only
+ \ element...but there may not be one, or it may not be at the top of the
+ file. The easy solution would be an anchor tag at the beginning of the
+ file...but this would break shell scripts, for example. Another is including
+ an anchor tag somewhere in each document, but need authors to understand
+ what it is (and not delete it). Another possibility is to link to any anchor
+ in the file with a special query identifying it as link to the underlying
+ file.
+* To auto-title a link, need to look up an anchor and get its location (page
+ number, section number) and title.
+* For back links, need to look up all links to the given anchor, then get the
+ location and title of each link.
+* To generate the TOC containing all anchors, we need a list of all anchors on a
+ given page.
Therefore, the cache must contain a `FileAnchor`, an enum of:
-* A `PlainFileAnchor` (a non-HTML file -- an image, PDF, etc.). Generate an ID
- based on a checksum of the file. Basically, this provides some way to find
- the (unmodified) file if it's moved/renamed. Cache data: |path, ID, file's
- metadata|.
-* An `HtmlFileAnchor` (an HTML file). Store an ID as a comment in it
- somewhere, probably at the end of the file. Cache data: |path, ID,
- file's metadata|, TOC numbering, a vector of `HeadingAnchor`s, a vector
- of `NonHeadingAnchor`s:
- * A `HeadingAnchor` in an HTML file: |weak ref to the containing
- `HtmlFileAnchor`, ID, anchor's inner HTML, optional hyperlink|,
- numbering on this page, a vector of `NonHeadingAnchors` contained in
- this heading.
- * A `NonHeadingAnchor` in an HTML file: |weak ref to the containing
- `HtmlFileAnchor`, ID, anchor's inner HTML, optional hyperlink|, optional
- parent heading, snippet of surrounding text, numbering group, number.
+* A `PlainFileAnchor` (a non-HTML file -- an image, PDF, etc.). Generate an ID
+ based on a checksum of the file. Basically, this provides some way to find the
+ (unmodified) file if it's moved/renamed. Cache data: |path, ID, file's
+ metadata|.
+* An `HtmlFileAnchor` (an HTML file). Store an ID as a comment in it somewhere,
+ probably at the end of the file. Cache data: |path, ID, file's metadata|, TOC
+ numbering, a vector of `HeadingAnchor`s, a vector of `NonHeadingAnchor`s:
+ * A `HeadingAnchor` in an HTML file: |weak ref to the containing
+ `HtmlFileAnchor`, ID, anchor's inner HTML, optional hyperlink|, numbering on
+ this page, a vector of `NonHeadingAnchors` contained in this heading.
+ * A `NonHeadingAnchor` in an HTML file: |weak ref to the containing
+ `HtmlFileAnchor`, ID, anchor's inner HTML, optional hyperlink|, optional
+ parent heading, snippet of surrounding text, numbering group, number.
A `Hyperlink` consists of a path and ID the link refers to.\
An `HtmlAnchor` is an enum of `HeadingAnchor` and `NonHeadingAnchor`.\
@@ -353,8 +340,8 @@ An `Anchor` is an enum of a `FileAnchor` and an `HtmlAnchor`.
Globals:
-* A map of `PathBuf`s to `FileAnchors`.
-* A map of IDs to (`Anchor`, set of IDs of referring links)
+* A map of `PathBuf`s to `FileAnchors`.
+* A map of IDs to (`Anchor`, set of IDs of referring links)
How to keep the sets of referring links up to date? If a link is deleted, we
won't know until that file is removed. To fix, add a validate() function that
@@ -387,12 +374,14 @@ flush, simply set the date/time stamp of that file to something old/invalid.
Options:
-* Path to linked file
-* Depth of numbering
+* Path to linked file
+* Depth of numbering
#### Example of non-editable text
-
+
### Numbering
@@ -412,68 +401,67 @@ make it easy to add more config values. Settings should also be available for
plug-ins. Store the config values in a bare JSON file; provide a web-based GUI
with descriptions of each setting.
-* Files/directories to process/ignore
-* Header/footer info (name, version, copyright, etc.)
-* The programming language, markup language, and spellchecker language for
- each source file.
-* Text wrap width when saving.
-* Visual styling (theme/style sheets, color, fonts, size of TOC sidebar,
- location of sidebar, etc.).
-* HTML `` modifications: CSS/JS to add to all pages/a set of pages.
-* Depth of headings to include in the page-local TOC.
-* Auto-reload if modified externally or not
-* Tabs vs spaces; newline type
-* Substitutions
+* Files/directories to process/ignore
+* Header/footer info (name, version, copyright, etc.)
+* The programming language, markup language, and spellchecker language for each
+ source file.
+* Text wrap width when saving.
+* Visual styling (theme/style sheets, color, fonts, size of TOC sidebar,
+ location of sidebar, etc.).
+* HTML `` modifications: CSS/JS to add to all pages/a set of pages.
+* Depth of headings to include in the page-local TOC.
+* Auto-reload if modified externally or not
+* Tabs vs spaces; newline type
+* Substitutions
Core development priorities
-------------------------------------------------------------------
+--------------------------------------------------------------------------------
-1. Bug fixes
-2. Book support
+1. Bug fixes
+2. Book support
### Next steps
-1. Implement caching for all anchors/headings.
-2. Implement author support: TOC, auto-titled links.
-3. Implement a good GUI for inserting hyperlinks.
-4. Better support for template literals.
-5. Decide how to handle nested block comments.
-6. Define the architecture for IDE extensions/plug-ins. Goal: minimize
- extension/plug-in complexity.
-7. Define desired UI behavior. Priority: auto-reload; dirty document detection;
- auto-backup.
-8. Propose visual styling, dark mode, etc.
+1. Implement caching for all anchors/headings.
+2. Implement author support: TOC, auto-titled links.
+3. Implement a good GUI for inserting hyperlinks.
+4. Better support for template literals.
+5. Decide how to handle nested block comments.
+6. Define the architecture for IDE extensions/plug-ins. Goal: minimize
+ extension/plug-in complexity.
+7. Define desired UI behavior. Priority: auto-reload; dirty document detection;
+ auto-backup.
+8. Propose visual styling, dark mode, etc.
### To do
-1. Open the TOC as a single-file edit? If not, at least hide the sidebar, since
- that's redundant.
+1. Open the TOC as a single-file edit? If not, at least hide the sidebar, since
+ that's redundant.
### Open questions
-* I'd like to be able to wrap a heading and associated content in a
- `` tag. This is hard to do -- if a heading appears in the middle of
- an indented comment, then need special processing (close the section, then
- the indent, then restart a new indent and section). In addition, it requires
- that code is nested inside doc blocks, which is tricky. However, I would
- like to do this.
-* How to handle images/videos/PDFs/etc. when file are moved? Currently, we
- expect the user to move them as well. There's not an easy way to tag them
- with an unique ID, then refer to them using that ID than I can think of.
-* Config file format: I really like and prefer Python's strictyaml. Basically,
- I 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.)
+* I'd like to be able to wrap a heading and associated content in a ``
+ tag. This is hard to do -- if a heading appears in the middle of an indented
+ comment, then need special processing (close the section, then the indent,
+ then restart a new indent and section). In addition, it requires that code is
+ nested inside doc blocks, which is tricky. However, I would like to do this.
+* How to handle images/videos/PDFs/etc. when file are moved? Currently, we
+ expect the user to move them as well. There's not an easy way to tag them with
+ an unique ID, then refer to them using that ID than I can think of.
+* Config file format: I really like and prefer Python's strictyaml. Basically, I
+ 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.)
Organization
-------------
+--------------------------------------------------------------------------------
### Client
As shown in the figure below, the CodeChat Editor Client starts with
`client/package.json`, which tells
-[NPM](https://en.wikipedia.org/wiki/Npm_\(software\)) which JavaScript libraries
+[NPM](https://en.wikipedia.org/wiki/Npm_(software)) which JavaScript libraries
are used in this project. Running `npm update` copies these libraries and all
their dependencies to the `client/node_modules` directory. The CodeChat Editor
Client source code (see [CodeChatEditor.mts](../client/src/CodeChatEditor.mts))
@@ -503,47 +491,47 @@ loads the packaged dependencies to create the CodeChat Editor Client webpage.
server_HTML -> CCE_webpage
}">
-Note: to edit these diagrams, use an [HTML entity
-encoder/decoder](https://mothereff.in/html-entities) and a Graphviz editor such
-as [Edotor](https://edotor.net/).
+Note: to edit these diagrams, use an
+[HTML entity encoder/decoder](https://mothereff.in/html-entities) and a Graphviz
+editor such as [Edotor](https://edotor.net/).
-TODO: GUIs using TinyMCE. See the [how-to
-guide](https://www.tiny.cloud/docs/tinymce/6/dialog-components/#panel-components).
+TODO: GUIs using TinyMCE. See
+the [how-to guide](https://www.tiny.cloud/docs/tinymce/6/dialog-components/#panel-components).
Code style
-----------
+--------------------------------------------------------------------------------
JavaScript functions are a
[disaster](https://dmitripavlutin.com/differences-between-arrow-and-regular-functions/).
Therefore, we use only arrow functions for this codebase.
-Other than that, follow the [MDN style
-guide](https://developer.mozilla.org/en-US/docs/MDN/Writing_guidelines/Writing_style_guide/Code_style_guide/JavaScript).
+Other than that, follow the
+[MDN style guide](https://developer.mozilla.org/en-US/docs/MDN/Writing_guidelines/Writing_style_guide/Code_style_guide/JavaScript).
Client modes
-------------
+--------------------------------------------------------------------------------
The CodeChat Editor client supports four modes:
-* Edit:
- * Document only: just TinyMCE to edit a pure Markdown file.
- * Usual: the usual CodeMirror + TinyMCE editor
-* View:
- * For a ReadTheDocs / browsing experience: clicking on links navigates to
- them immediately, instead of bringing up a context menu. Still use
- CodeMirror for syntax highlighting, collapsing, etc.
-* Simple viewer:
- * For text or binary files that aren't supported by the editor. In project
- mode, this displays the TOC on the left and the file contents in the
- main area; otherwise, it's only the main area. See: \.
+* Edit:
+ * Document only: just TinyMCE to edit a pure Markdown file.
+ * Usual: the usual CodeMirror + TinyMCE editor
+* View:
+ * For a ReadTheDocs / browsing experience: clicking on links navigates to them
+ immediately, instead of bringing up a context menu. Still use CodeMirror for
+ syntax highlighting, collapsing, etc.
+* Simple viewer:
+ * For text or binary files that aren't supported by the editor. In project
+ mode, this displays the TOC on the left and the file contents in the main
+ area; otherwise, it's only the main area. See: \.
Misc
-----
+--------------------------------------------------------------------------------
Eventually, provide a read-only mode with possible auth (restrict who can view)
-using JWTs; see [one
-approach](https://auth0.com/blog/build-an-api-in-rust-with-jwt-authentication-using-actix-web/).
+using JWTs; see
+[one approach](https://auth0.com/blog/build-an-api-in-rust-with-jwt-authentication-using-actix-web/).
A better approach to make macros accessible where they're defined, instead of at
the crate root: see
-[SO](https://stackoverflow.com/questions/26731243/how-do-i-use-a-macro-across-module-files/67140319#67140319).
\ No newline at end of file
+[SO](https://stackoverflow.com/questions/26731243/how-do-i-use-a-macro-across-module-files/67140319#67140319).
diff --git a/docs/style_guide.cpp b/docs/style_guide.cpp
index e2497fe2..86e0912d 100644
--- a/docs/style_guide.cpp
+++ b/docs/style_guide.cpp
@@ -1,5 +1,5 @@
// `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
@@ -22,7 +22,7 @@
// [http://www.gnu.org/licenses](http://www.gnu.org/licenses).
//
// Introduction
-// ------------
+// -----------------------------------------------------------------------------
//
// This document provides a style guide for literate programming using the
// CodeChat Editor. For basic use, see the [user manual](../README.md).
@@ -47,7 +47,7 @@ const char* CODE_BLOCK =
// [brief overview of Markdown](https://commonmark.org/help/).
//
// Approach
-// --------
+// -----------------------------------------------------------------------------
//
// Viewing a program as a document defines the heart of the literate programming
// paradigm. A program/document -- constructed as a series of code blocks and
@@ -74,23 +74,24 @@ const char* CODE_BLOCK =
// person to review what you wrote, then implement their ideas and suggestions.
//
// Organization
-// -------------------------------------
+// -----------------------------------------------------------------------------
//
// The program should use headings to appropriately organize the contents. Near
// the top of the file, include a single level-1 heading, providing the title of
-// the file; per the HTML spec, there should be [only one level-1
-// heading](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements#avoid_using_multiple_h1_elements_on_one_page).
+// the file; per the HTML spec, there should be
+// [only one level-1 heading](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements#avoid_using_multiple_h1_elements_on_one_page).
// For source files, include the file name at the beginning of the title, in a
// monospaced font.
//
-// Following the title, include additional heading levels; [don't skip
-// levels](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements#navigation),
+// Following the title, include additional heading levels;
+// [don't skip levels](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/Heading_Elements#navigation),
// e.g. by placing a level-3 heading immediately following a level-1 heading.
-// Use headings to provide a natural outline of your program. The [end of this
-// document](#org-style) provides the recommended organizational style.
+// Use headings to provide a natural outline of your program. The
+// [end of this document](#org-style) provides the recommended organizational
+// style.
//
// Location
-// --------
+// -----------------------------------------------------------------------------
//
// In general, place documentation before the corresponding code. For example:
//
@@ -110,7 +111,7 @@ class LedBlinker {
};
// Use of mathematics
-// ------------------
+// -----------------------------------------------------------------------------
//
// Formulas should be placed near code that implements them, along with good
// explanations of the equations used. For example:
@@ -125,18 +126,17 @@ double accurate_g(
// Height above sea level, in meters.
double height_meters
) {
- // This text comes from the [SensorsOne Local Gravity
- // Calculator](https://www.sensorsone.com/local-gravity-calculator/). For
- // more detail, see [Theoretical
- // Gravity](https://en.wikipedia.org/wiki/Theoretical_gravity).
+ // This text comes from the
+ // [SensorsOne Local Gravity Calculator](https://www.sensorsone.com/local-gravity-calculator/).
+ // 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):\
@@ -152,65 +152,70 @@ double accurate_g(
return IGF + FAC;
// Symbols:
//
- // * $g$ = Theoretical local gravity, in $m/s^2$.
- // * $\\phi$ = Latitude, in decimal degrees.
- // * $h$ = Height relative to sea level, in $m$.
+ // * $g$ = Theoretical local gravity, in $m/s^2$.
+ // * $\\phi$ = Latitude, in decimal degrees.
+ // * $h$ = Height relative to sea level, in $m$.
}
// Excellence in code
-// ------------------
+// -----------------------------------------------------------------------------
//
// Literate programming should be accompanied by excellence in authoring code.
// Specifically:
//
-// * Use meaningful, descriptive names for variables, classes, functions, etc.
-// Doc blocks should only supply what [self-documenting
-// code](https://en.wikipedia.org/wiki/Self-documenting_code) cannot --
-// design choices, purpose, etc.
-// * Be consistent; preferably, use a [code
-// formatter](https://en.wikipedia.org/wiki/Prettyprint#Programming_code_formatting)
-// to ensure this consistency.
-// * Employ [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)
-// principles.
-// * 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).
+// * Use meaningful, descriptive names for variables, classes, functions, etc.
+// Doc blocks should only supply what
+// [self-documenting code](https://en.wikipedia.org/wiki/Self-documenting_code)
+// cannot -- design choices, purpose, etc.
+// * Be consistent; preferably, use a
+// [code formatter](https://en.wikipedia.org/wiki/Prettyprint#Programming_code_formatting)
+// to ensure this consistency.
+// * Employ [DRY](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)
+// principles.
+// * 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).
//
// Editor configuration
-// --------------------
+// -----------------------------------------------------------------------------
//
// Properly configuring the text editor used with the CodeChat Editor
// significantly improves the authoring process. Recommended settings:
//
-// * Enable word wrap: [vscode](https://learn.microsoft.com/en-us/visualstudio/ide/reference/how-to-manage-word-wrap-in-the-editor?view=vs-2022)
-// * Use spaces, not tabs, for indentation: [vscode](https://code.visualstudio.com/docs/editor/codebasics#_indentation)
-// * Enable auto-save: [vscode](https://code.visualstudio.com/docs/editor/codebasics#_save-auto-save)
-// * Auto-reload enabled: default in vscode
-// * On save, remove trailing whitespace: [vscode](https://stackoverflow.com/a/53663494/16038919)
-// * Use a spell checker: [vscode](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
-// * On a big monitor, place your IDE side by side with the CodeChat Editor.
+// * Enable word wrap:
+// [vscode](https://learn.microsoft.com/en-us/visualstudio/ide/reference/how-to-manage-word-wrap-in-the-editor?view=vs-2022)
+// * Use spaces, not tabs, for indentation:
+// [vscode](https://code.visualstudio.com/docs/editor/codebasics#_indentation)
+// * Enable auto-save:
+// [vscode](https://code.visualstudio.com/docs/editor/codebasics#_save-auto-save)
+// * Auto-reload enabled: default in vscode
+// * On save, remove trailing whitespace:
+// [vscode](https://stackoverflow.com/a/53663494/16038919)
+// * Use a spell checker:
+// [vscode](https://marketplace.visualstudio.com/items?itemName=streetsidesoftware.code-spell-checker)
+// * On a big monitor, place your IDE side by side with the CodeChat Editor.
//
// Common problems
-// ---------------
-//
-// * 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 image is ``.
-// * Indent your comments to match the indentation of nearby code; don't
-// purposelessly vary the comment indentation.
-// * Avoid inserting a one-line empty code block (a blank line) between
-// paragraphs in a doc block; instead, use a single doc block to store
-// multiple paragraphs.
-// * Use minimal formatting. Markdown is a simple, rather limited syntax;
-// however, it is very easy to use and read. While the CodeChat Editor will
-// happily replace simple Markdown constructs with verbose HTML to
-// accomplish the formatting you specify, avoid the resulting messy syntax produced by this process.
-// Pasting from an HTML source (such as Word or a web page) directly to the
-// CodeChat Editor likewise produces a lot of messy syntax; consider pasting
-// text only, then reformatting as necessary.
+// -----------------------------------------------------------------------------
+//
+// * 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
+// image is ``.
+// * Indent your comments to match the indentation of nearby code; don't
+// purposelessly vary the comment indentation.
+// * Avoid inserting a one-line empty code block (a blank line) between
+// paragraphs in a doc block; instead, use a single doc block to store
+// multiple paragraphs.
+// * Use minimal formatting. Markdown is a simple, rather limited syntax;
+// however, it is very easy to use and read. While the CodeChat Editor will
+// happily replace simple Markdown constructs with verbose HTML to accomplish
+// the formatting you specify, avoid the resulting
+// messy syntax produced by this process.
+// Pasting from an HTML source (such as Word or a web page) directly to the
+// CodeChat Editor likewise produces a lot of messy syntax; consider pasting
+// text only, then reformatting as necessary.
//
// ### Commenting out code
//
@@ -225,17 +230,17 @@ double accurate_g(
// C/C++.
//
// Example structure
-// -----------------
+// -----------------------------------------------------------------------------
//
// As discussed in [organization](#organization), the remainder of this document
// presents the preferred use of headings to organize source code.
//
// Includes
-// ------------------------------
+// -----------------------------------------------------------------------------
//
// Include files (in Python, imports; Rust, use statements; JavaScript,
-// require/import, etc.) should be organized by category; for example, [PEP
-// 8](https://peps.python.org/pep-0008/#imports) recommends the following
+// require/import, etc.) should be organized by category; for example,
+// [PEP 8](https://peps.python.org/pep-0008/#imports) recommends the following
// categories:
//
// ### Standard library
@@ -251,23 +256,23 @@ double accurate_g(
#include
// Global variables/constants
-// --------------------------
+// -----------------------------------------------------------------------------
//
// Use units when describing physical quantities. For example, this gives the
// acceleration due to gravity in $m/s^2$.
const double accel_m_s2 = 9.8067;
// Macros
-// ------
+// -----------------------------------------------------------------------------
#define LED1 (LATB16)
// Structures/classes
-// ------------------
+// -----------------------------------------------------------------------------
class BlinkLed {
};
// Code
-// ----
+// -----------------------------------------------------------------------------
int main(int argc, char* argv[]) {
// Here's an example of commenting code out when using the CodeChat Editor:
/**
diff --git a/extensions/VSCode/.eslintrc.yml b/extensions/VSCode/.eslintrc.yml
index ea76c368..591075ff 100644
--- a/extensions/VSCode/.eslintrc.yml
+++ b/extensions/VSCode/.eslintrc.yml
@@ -17,16 +17,16 @@
# [http://www.gnu.org/licenses/](http://www.gnu.org/licenses/).
#
# `.eslintrc.yml` - Configure ESLint for this project
-# ===================================================
+# ==============================================================================
env:
commonjs: true
node: true
extends:
- standard
- # See the [ESLint config prettier
- # docs](https://github.com/prettier/eslint-config-prettier#installation) and
- # its parent link, [integrating Prettier with
- # linters](https://prettier.io/docs/en/integrating-with-linters.html).
+ # See the
+ # [ESLint config prettier docs](https://github.com/prettier/eslint-config-prettier#installation)
+ # and its parent link,
+ # [integrating Prettier with linters](https://prettier.io/docs/en/integrating-with-linters.html).
- prettier
parser: "@typescript-eslint/parser"
parserOptions:
@@ -36,6 +36,6 @@ plugins:
rules:
camelcase: off
# TypeScript already enforces this; otherwise, eslint complains that
- # `NodeJS` is undefined. See [this GitHub
- # issue](https://github.com/Chatie/eslint-config/issues/45#issuecomment-1003990077).
+ # `NodeJS` is undefined. See
+ # [this GitHub issue](https://github.com/Chatie/eslint-config/issues/45#issuecomment-1003990077).
no-undef: off
diff --git a/extensions/VSCode/Cargo.lock b/extensions/VSCode/Cargo.lock
index 7eae2a82..bfa572b8 100644
--- a/extensions/VSCode/Cargo.lock
+++ b/extensions/VSCode/Cargo.lock
@@ -72,7 +72,7 @@ dependencies = [
"mime",
"percent-encoding",
"pin-project-lite",
- "rand",
+ "rand 0.9.2",
"sha1",
"smallvec",
"tokio",
@@ -88,7 +88,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb"
dependencies = [
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -206,7 +206,7 @@ dependencies = [
"actix-router",
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -246,9 +246,9 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "aho-corasick"
-version = "1.1.3"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
dependencies = [
"memchr",
]
@@ -268,6 +268,12 @@ dependencies = [
"alloc-no-stdlib",
]
+[[package]]
+name = "allocator-api2"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+
[[package]]
name = "android_system_properties"
version = "0.1.5"
@@ -347,7 +353,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -409,6 +415,9 @@ name = "bumpalo"
version = "3.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
+dependencies = [
+ "allocator-api2",
+]
[[package]]
name = "byteorder"
@@ -436,9 +445,9 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.2.41"
+version = "1.2.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7"
+checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe"
dependencies = [
"find-msvc-tools",
"jobserver",
@@ -473,9 +482,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.50"
+version = "4.5.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c2cfd7bf8a6017ddaa4e32ffe7403d547790db06bd171c1c53926faab501623"
+checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5"
dependencies = [
"clap_builder",
"clap_derive",
@@ -483,9 +492,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.5.50"
+version = "4.5.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a4c05b9e80c5ccd3a7ef080ad7b6ba7d6fc00a985b8b157197075677c82c7a0"
+checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a"
dependencies = [
"anstream",
"anstyle",
@@ -502,7 +511,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -513,7 +522,7 @@ checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
[[package]]
name = "codechat-editor-server"
-version = "0.1.39"
+version = "0.1.40"
dependencies = [
"actix-files",
"actix-http",
@@ -526,8 +535,10 @@ dependencies = [
"bytes",
"chrono",
"clap",
+ "dprint-plugin-markdown",
"dunce",
"futures-util",
+ "htmd",
"imara-diff",
"indoc",
"lazy_static",
@@ -541,8 +552,8 @@ dependencies = [
"path-slash",
"pest",
"pest_derive",
- "pulldown-cmark",
- "rand",
+ "pulldown-cmark 0.13.0",
+ "rand 0.9.2",
"regex",
"serde",
"serde_json",
@@ -558,7 +569,7 @@ dependencies = [
[[package]]
name = "codechat-editor-vscode-extension"
-version = "0.1.39"
+version = "0.1.40"
dependencies = [
"codechat-editor-server",
"log",
@@ -592,9 +603,9 @@ checksum = "fb58b6451e8c2a812ad979ed1d83378caa5e927eef2622017a45f251457c2c9d"
[[package]]
name = "convert_case"
-version = "0.8.0"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f"
+checksum = "db05ffb6856bf0ecdf6367558a76a0e8a77b1713044eb92845c692100ed50190"
dependencies = [
"unicode-segmentation",
]
@@ -656,9 +667,9 @@ dependencies = [
[[package]]
name = "ctor"
-version = "0.5.0"
+version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "67773048316103656a637612c4a62477603b777d91d9c62ff2290f9cde178fdb"
+checksum = "3ffc71fcdcdb40d6f087edddf7f8f1f8f79e6cf922f555a9ee8779752d4819bd"
dependencies = [
"ctor-proc-macro",
"dtor",
@@ -666,15 +677,15 @@ dependencies = [
[[package]]
name = "ctor-proc-macro"
-version = "0.0.6"
+version = "0.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2"
+checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1"
[[package]]
name = "deranged"
-version = "0.5.4"
+version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071"
+checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587"
dependencies = [
"powerfmt",
]
@@ -696,7 +707,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
"unicode-xid",
]
@@ -725,14 +736,53 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
-name = "dtor"
+name = "dprint-core"
+version = "0.67.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c1d827947704a9495f705d6aeed270fa21a67f825f22902c28f38dc3af7a9ae"
+dependencies = [
+ "anyhow",
+ "bumpalo",
+ "hashbrown 0.15.5",
+ "indexmap",
+ "rustc-hash",
+ "serde",
+ "unicode-width 0.2.2",
+]
+
+[[package]]
+name = "dprint-core-macros"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e58a0764cddb55ab28955347b45be00ade43d4d6f3ba4bf3dc354e4ec9432934"
+checksum = "1675ad2b358481f3cc46202040d64ac7a36c4ade414a696df32e0e45421a6e9f"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "dprint-plugin-markdown"
+version = "0.20.0"
+source = "git+https://github.com/bjones1/dprint-plugin-markdown.git?branch=all-fixes#b7829488bb3713b58a38a842abbee88239a2c384"
+dependencies = [
+ "anyhow",
+ "dprint-core",
+ "dprint-core-macros",
+ "pulldown-cmark 0.11.3",
+ "regex",
+ "serde",
+ "unicode-width 0.1.14",
+]
+
+[[package]]
+name = "dtor"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "404d02eeb088a82cfd873006cb713fe411306c7d182c344905e101fb1167d301"
dependencies = [
"dtor-proc-macro",
]
@@ -770,6 +820,12 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
+[[package]]
+name = "fastrand"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
+
[[package]]
name = "file-id"
version = "0.2.3"
@@ -787,9 +843,9 @@ checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127"
[[package]]
name = "flate2"
-version = "1.1.4"
+version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9"
+checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb"
dependencies = [
"crc32fast",
"miniz_oxide",
@@ -825,6 +881,31 @@ dependencies = [
"libc",
]
+[[package]]
+name = "futf"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+dependencies = [
+ "mac",
+ "new_debug_unreachable",
+]
+
+[[package]]
+name = "futures"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876"
+dependencies = [
+ "futures-channel",
+ "futures-core",
+ "futures-executor",
+ "futures-io",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+]
+
[[package]]
name = "futures-channel"
version = "0.3.31"
@@ -841,6 +922,23 @@ version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
+[[package]]
+name = "futures-executor"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f"
+dependencies = [
+ "futures-core",
+ "futures-task",
+ "futures-util",
+]
+
+[[package]]
+name = "futures-io"
+version = "0.3.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6"
+
[[package]]
name = "futures-macro"
version = "0.3.31"
@@ -849,7 +947,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -870,10 +968,13 @@ version = "0.3.31"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81"
dependencies = [
+ "futures-channel",
"futures-core",
+ "futures-io",
"futures-macro",
"futures-sink",
"futures-task",
+ "memchr",
"pin-project-lite",
"pin-utils",
"slab",
@@ -926,6 +1027,8 @@ version = "0.15.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
dependencies = [
+ "allocator-api2",
+ "equivalent",
"foldhash",
]
@@ -950,6 +1053,27 @@ dependencies = [
"digest",
]
+[[package]]
+name = "htmd"
+version = "0.3.2"
+source = "git+https://github.com/bjones1/htmd.git?branch=fix-faithful-serialization#d7e755a6c4d12a9c670bdd9236d1cea69818bcf5"
+dependencies = [
+ "html5ever",
+ "markup5ever_rcdom",
+ "phf 0.13.1",
+]
+
+[[package]]
+name = "html5ever"
+version = "0.35.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55d958c2f74b664487a2035fe1dadb032c48718a03b63f3ab0b8537db8549ed4"
+dependencies = [
+ "log",
+ "markup5ever",
+ "match_token",
+]
+
[[package]]
name = "http"
version = "0.2.12"
@@ -1011,9 +1135,9 @@ dependencies = [
[[package]]
name = "icu_collections"
-version = "2.0.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
+checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
dependencies = [
"displaydoc",
"potential_utf",
@@ -1024,9 +1148,9 @@ dependencies = [
[[package]]
name = "icu_locale_core"
-version = "2.0.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
+checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
dependencies = [
"displaydoc",
"litemap",
@@ -1037,11 +1161,10 @@ dependencies = [
[[package]]
name = "icu_normalizer"
-version = "2.0.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
+checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
dependencies = [
- "displaydoc",
"icu_collections",
"icu_normalizer_data",
"icu_properties",
@@ -1052,42 +1175,38 @@ dependencies = [
[[package]]
name = "icu_normalizer_data"
-version = "2.0.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
+checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
[[package]]
name = "icu_properties"
-version = "2.0.1"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
+checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99"
dependencies = [
- "displaydoc",
"icu_collections",
"icu_locale_core",
"icu_properties_data",
"icu_provider",
- "potential_utf",
"zerotrie",
"zerovec",
]
[[package]]
name = "icu_properties_data"
-version = "2.0.1"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
+checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899"
[[package]]
name = "icu_provider"
-version = "2.0.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
+checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
dependencies = [
"displaydoc",
"icu_locale_core",
- "stable_deref_trait",
- "tinystr",
"writeable",
"yoke",
"zerofrom",
@@ -1140,13 +1259,18 @@ checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f"
dependencies = [
"equivalent",
"hashbrown 0.16.0",
+ "serde",
+ "serde_core",
]
[[package]]
name = "indoc"
-version = "2.0.6"
+version = "2.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
+checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
+dependencies = [
+ "rustversion",
+]
[[package]]
name = "inotify"
@@ -1214,9 +1338,9 @@ dependencies = [
[[package]]
name = "js-sys"
-version = "0.3.81"
+version = "0.3.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305"
+checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65"
dependencies = [
"once_cell",
"wasm-bindgen",
@@ -1262,9 +1386,9 @@ checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976"
[[package]]
name = "libloading"
-version = "0.8.9"
+version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55"
+checksum = "754ca22de805bb5744484a5b151a9e1a8e837d5dc232c2d7d8c2e3492edc8b60"
dependencies = [
"cfg-if",
"windows-link",
@@ -1283,9 +1407,9 @@ dependencies = [
[[package]]
name = "litemap"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
+checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
[[package]]
name = "local-channel"
@@ -1345,7 +1469,7 @@ dependencies = [
"log-mdc",
"mock_instant",
"parking_lot",
- "rand",
+ "rand 0.9.2",
"serde",
"serde-value",
"serde_json",
@@ -1357,6 +1481,46 @@ dependencies = [
"winapi",
]
+[[package]]
+name = "mac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+
+[[package]]
+name = "markup5ever"
+version = "0.35.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "311fe69c934650f8f19652b3946075f0fc41ad8757dbb68f1ca14e7900ecc1c3"
+dependencies = [
+ "log",
+ "tendril",
+ "web_atoms",
+]
+
+[[package]]
+name = "markup5ever_rcdom"
+version = "0.35.0+unofficial"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8bcd53df4748257345b8bc156d620340ce0f015ec1c7ef1cff475543888a31d"
+dependencies = [
+ "html5ever",
+ "markup5ever",
+ "tendril",
+ "xml5ever",
+]
+
+[[package]]
+name = "match_token"
+version = "0.35.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac84fd3f360fcc43dc5f5d186f02a94192761a080e8bc58621ad4d12296a58cf"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.110",
+]
+
[[package]]
name = "md-5"
version = "0.10.6"
@@ -1425,12 +1589,13 @@ checksum = "dce6dd36094cac388f119d2e9dc82dc730ef91c32a6222170d630e5414b956e6"
[[package]]
name = "napi"
-version = "3.3.0"
+version = "3.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1b74e3dce5230795bb4d2821b941706dee733c7308752507254b0497f39cad7"
+checksum = "4e917a98ac74187a5d486604a269ed69cd7901dd4824453d5573fb051f69b1b3"
dependencies = [
"bitflags 2.10.0",
"ctor",
+ "futures",
"napi-build",
"napi-sys",
"nohash-hasher",
@@ -1440,42 +1605,42 @@ dependencies = [
[[package]]
name = "napi-build"
-version = "2.2.3"
+version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dcae8ad5609d14afb3a3b91dee88c757016261b151e9dcecabf1b2a31a6cab14"
+checksum = "d376940fd5b723c6893cd1ee3f33abbfd86acb1cd1ec079f3ab04a2a3bc4d3b1"
[[package]]
name = "napi-derive"
-version = "3.2.5"
+version = "3.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7552d5a579b834614bbd496db5109f1b9f1c758f08224b0dee1e408333adf0d0"
+checksum = "a258a6521951715e00568b258b8fb7a44c6087f588c371dc6b84a413f2728fdb"
dependencies = [
"convert_case",
"ctor",
"napi-derive-backend",
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
name = "napi-derive-backend"
-version = "2.2.0"
+version = "3.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f6a81ac7486b70f2532a289603340862c06eea5a1e650c1ffeda2ce1238516a"
+checksum = "77c36636292fe04366a1eec028adc25bc72f4fd7cce35bdcc310499ef74fb7de"
dependencies = [
"convert_case",
"proc-macro2",
"quote",
"semver",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
name = "napi-sys"
-version = "3.0.0"
+version = "3.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e4e7135a8f97aa0f1509cce21a8a1f9dcec1b50d8dee006b48a5adb69a9d64d"
+checksum = "50ef9c1086f16aea2417c3788dbefed7591c3bccd800b827f4dfb271adff1149"
dependencies = [
"libloading",
]
@@ -1486,6 +1651,12 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
+
[[package]]
name = "nohash-hasher"
version = "0.2.0"
@@ -1661,7 +1832,7 @@ dependencies = [
"pest_meta",
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -1674,16 +1845,78 @@ dependencies = [
"sha2",
]
+[[package]]
+name = "phf"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
+dependencies = [
+ "phf_shared 0.11.3",
+]
+
[[package]]
name = "phf"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf"
dependencies = [
- "phf_shared",
+ "phf_macros",
+ "phf_shared 0.13.1",
"serde",
]
+[[package]]
+name = "phf_codegen"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a"
+dependencies = [
+ "phf_generator 0.11.3",
+ "phf_shared 0.11.3",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
+dependencies = [
+ "phf_shared 0.11.3",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737"
+dependencies = [
+ "fastrand",
+ "phf_shared 0.13.1",
+]
+
+[[package]]
+name = "phf_macros"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef"
+dependencies = [
+ "phf_generator 0.13.1",
+ "phf_shared 0.13.1",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.110",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
+dependencies = [
+ "siphasher",
+]
+
[[package]]
name = "phf_shared"
version = "0.13.1"
@@ -1724,7 +1957,7 @@ dependencies = [
"hmac",
"md-5",
"memchr",
- "rand",
+ "rand 0.9.2",
"sha2",
"stringprep",
]
@@ -1743,9 +1976,9 @@ dependencies = [
[[package]]
name = "potential_utf"
-version = "0.1.3"
+version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a"
+checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
dependencies = [
"zerovec",
]
@@ -1765,15 +1998,32 @@ dependencies = [
"zerocopy",
]
+[[package]]
+name = "precomputed-hash"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+
[[package]]
name = "proc-macro2"
-version = "1.0.101"
+version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
+checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
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 2.10.0",
+ "memchr",
+ "unicase",
+]
+
[[package]]
name = "pulldown-cmark"
version = "0.13.0"
@@ -1794,9 +2044,9 @@ checksum = "007d8adb5ddab6f8e3f491ac63566a7d5002cc7ed73901f72057943fa71ae1ae"
[[package]]
name = "quote"
-version = "1.0.41"
+version = "1.0.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1"
+checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
dependencies = [
"proc-macro2",
]
@@ -1807,6 +2057,15 @@ version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "rand_core 0.6.4",
+]
+
[[package]]
name = "rand"
version = "0.9.2"
@@ -1814,7 +2073,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
dependencies = [
"rand_chacha",
- "rand_core",
+ "rand_core 0.9.3",
]
[[package]]
@@ -1824,9 +2083,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb"
dependencies = [
"ppv-lite86",
- "rand_core",
+ "rand_core 0.9.3",
]
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+
[[package]]
name = "rand_core"
version = "0.9.3"
@@ -1956,7 +2221,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -2084,6 +2349,31 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+[[package]]
+name = "string_cache"
+version = "0.8.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f"
+dependencies = [
+ "new_debug_unreachable",
+ "parking_lot",
+ "phf_shared 0.11.3",
+ "precomputed-hash",
+ "serde",
+]
+
+[[package]]
+name = "string_cache_codegen"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0"
+dependencies = [
+ "phf_generator 0.11.3",
+ "phf_shared 0.11.3",
+ "proc-macro2",
+ "quote",
+]
+
[[package]]
name = "stringprep"
version = "0.1.5"
@@ -2120,9 +2410,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.107"
+version = "2.0.110"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b"
+checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea"
dependencies = [
"proc-macro2",
"quote",
@@ -2137,7 +2427,18 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
+]
+
+[[package]]
+name = "tendril"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
+dependencies = [
+ "futf",
+ "mac",
+ "utf-8",
]
[[package]]
@@ -2175,7 +2476,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -2186,7 +2487,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -2232,9 +2533,9 @@ dependencies = [
[[package]]
name = "tinystr"
-version = "0.8.1"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
+checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
dependencies = [
"displaydoc",
"zerovec",
@@ -2280,7 +2581,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -2298,11 +2599,11 @@ dependencies = [
"log",
"parking_lot",
"percent-encoding",
- "phf",
+ "phf 0.13.1",
"pin-project-lite",
"postgres-protocol",
"postgres-types",
- "rand",
+ "rand 0.9.2",
"socket2 0.6.1",
"tokio",
"tokio-util",
@@ -2311,9 +2612,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.16"
+version = "0.7.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5"
+checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594"
dependencies = [
"bytes",
"futures-core",
@@ -2342,7 +2643,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -2372,7 +2673,7 @@ checksum = "ee6ff59666c9cbaec3533964505d39154dc4e0a56151fdea30a09ed0301f62e2"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
"termcolor",
]
@@ -2411,24 +2712,24 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
[[package]]
name = "unicode-ident"
-version = "1.0.20"
+version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06"
+checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]]
name = "unicode-normalization"
-version = "0.1.24"
+version = "0.1.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956"
+checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8"
dependencies = [
"tinyvec",
]
[[package]]
name = "unicode-properties"
-version = "0.1.3"
+version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0"
+checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d"
[[package]]
name = "unicode-segmentation"
@@ -2436,6 +2737,18 @@ version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
+[[package]]
+name = "unicode-width"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
+
+[[package]]
+name = "unicode-width"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
+
[[package]]
name = "unicode-xid"
version = "0.2.6"
@@ -2475,6 +2788,12 @@ version = "2.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
+[[package]]
+name = "utf-8"
+version = "0.7.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
+
[[package]]
name = "utf8_iter"
version = "1.0.4"
@@ -2532,9 +2851,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
[[package]]
name = "wasm-bindgen"
-version = "0.2.104"
+version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d"
+checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60"
dependencies = [
"cfg-if",
"once_cell",
@@ -2543,25 +2862,11 @@ dependencies = [
"wasm-bindgen-shared",
]
-[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.104"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19"
-dependencies = [
- "bumpalo",
- "log",
- "proc-macro2",
- "quote",
- "syn 2.0.107",
- "wasm-bindgen-shared",
-]
-
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.104"
+version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119"
+checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -2569,36 +2874,48 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.104"
+version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7"
+checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc"
dependencies = [
+ "bumpalo",
"proc-macro2",
"quote",
- "syn 2.0.107",
- "wasm-bindgen-backend",
+ "syn 2.0.110",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.104"
+version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1"
+checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76"
dependencies = [
"unicode-ident",
]
[[package]]
name = "web-sys"
-version = "0.3.81"
+version = "0.3.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120"
+checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1"
dependencies = [
"js-sys",
"wasm-bindgen",
]
+[[package]]
+name = "web_atoms"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57ffde1dc01240bdf9992e3205668b235e59421fd085e8a317ed98da0178d414"
+dependencies = [
+ "phf 0.11.3",
+ "phf_codegen",
+ "string_cache",
+ "string_cache_codegen",
+]
+
[[package]]
name = "webbrowser"
version = "1.0.6"
@@ -2698,7 +3015,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -2709,7 +3026,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -2991,17 +3308,26 @@ checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
[[package]]
name = "writeable"
-version = "0.6.1"
+version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
+checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
+
+[[package]]
+name = "xml5ever"
+version = "0.35.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee3f1e41afb31a75aef076563b0ad3ecc24f5bd9d12a72b132222664eb76b494"
+dependencies = [
+ "log",
+ "markup5ever",
+]
[[package]]
name = "yoke"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
+checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
dependencies = [
- "serde",
"stable_deref_trait",
"yoke-derive",
"zerofrom",
@@ -3009,13 +3335,13 @@ dependencies = [
[[package]]
name = "yoke-derive"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
+checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
"synstructure",
]
@@ -3036,7 +3362,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -3056,15 +3382,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
"synstructure",
]
[[package]]
name = "zerotrie"
-version = "0.2.2"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
+checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
dependencies = [
"displaydoc",
"yoke",
@@ -3073,9 +3399,9 @@ dependencies = [
[[package]]
name = "zerovec"
-version = "0.11.4"
+version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b"
+checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
dependencies = [
"yoke",
"zerofrom",
@@ -3084,13 +3410,13 @@ dependencies = [
[[package]]
name = "zerovec-derive"
-version = "0.11.1"
+version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
+checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
diff --git a/extensions/VSCode/Cargo.toml b/extensions/VSCode/Cargo.toml
index 2584bc4a..443fb8b1 100644
--- a/extensions/VSCode/Cargo.toml
+++ b/extensions/VSCode/Cargo.toml
@@ -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.1.39"
+version = "0.1.40"
[lib]
crate-type = ["cdylib"]
diff --git a/extensions/VSCode/README.md b/extensions/VSCode/README.md
index c30476a3..91af7fb9 100644
--- a/extensions/VSCode/README.md
+++ b/extensions/VSCode/README.md
@@ -1,45 +1,42 @@
The CodeChat Editor extension for Visual Studio Code
-====================================================
+================================================================================
This extension provides the CodeChat Editor's capabilities within the Visual
Studio Code IDE.
-
+
Installation
-------------
+--------------------------------------------------------------------------------
First, install [Visual Studio Code](https://code.visualstudio.com/). Next:
-1. [Install the CodeChat Editor
- extension](https://marketplace.visualstudio.com/items?itemName=CodeChat.codechat-editor-client).
-2. (Recommended) [switch to a light
- theme](https://code.visualstudio.com/docs/getstarted/themes), since the
- CodeChat Editor only provides a light theme.
+1. [Install the CodeChat Editor extension](https://marketplace.visualstudio.com/items?itemName=CodeChat.codechat-editor-client).
+2. (Recommended)
+ [switch to a light theme](https://code.visualstudio.com/docs/getstarted/themes),
+ since the CodeChat Editor only provides a light theme.
Running
--------
+--------------------------------------------------------------------------------
-1. Open a file that the CodeChat Editor
- [supports](https://github.com/bjones1/CodeChat_Editor/blob/main/README.md#supported-languages)
- (many source files, along with Markdown files).
+1. Open a file that the CodeChat Editor
+ [supports](https://github.com/bjones1/CodeChat_Editor/blob/main/README.md#supported-languages)
+ (many source files, along with Markdown files).
-2. Open the [Visual Studio Code command
- palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette)
- by pressing `Ctrl+Shift+P`. Type `CodeChat`, select "Enable the CodeChat
- Editor", then press enter to run the extension. After a moment, the rendered
- file should load. If it doesn't:
+2. Open the
+ [Visual Studio Code command palette](https://code.visualstudio.com/docs/getstarted/userinterface#_command-palette)
+ by pressing `Ctrl+Shift+P`. Type `CodeChat`, select "Enable the CodeChat
+ Editor", then press enter to run the extension. After a moment, the rendered
+ file should load. If it doesn't:
- 1. Open the Visual Studio Code settings for the CodeChat Editor by
- navigating to `File` > `Preferences` > `Settings` then typing `CodeChat`
- in the search box. Change the port from its default of 8080 to some
- other value.
- 2. Run the extension again (close the existing window, type `Ctrl+Shift+P`
- then select Enable the CodeChat Editor).
+ 1. Open the Visual Studio Code settings for the CodeChat Editor by navigating
+ to `File` > `Preferences` > `Settings` then typing `CodeChat` in the
+ search box. Change the port from its default of 8080 to some other value.
+ 2. Run the extension again (close the existing window, type `Ctrl+Shift+P`
+ then select Enable the CodeChat Editor).
Additional documentation
-------------------------
+--------------------------------------------------------------------------------
-See the [user
-manual](https://codechat-editor.onrender.com/fw/fsb/opt/render/project/src/README.md).
\ No newline at end of file
+See the
+[user manual](https://codechat-editor.onrender.com/fw/fsb/opt/render/project/src/README.md).
diff --git a/extensions/VSCode/package.json b/extensions/VSCode/package.json
index 0be90801..770eeeed 100644
--- a/extensions/VSCode/package.json
+++ b/extensions/VSCode/package.json
@@ -40,7 +40,7 @@
"type": "git",
"url": "https://github.com/bjones1/CodeChat_Editor"
},
- "version": "0.1.39",
+ "version": "0.1.40",
"activationEvents": [
"onCommand:extension.codeChatEditorActivate",
"onCommand:extension.codeChatEditorDeactivate"
@@ -79,19 +79,19 @@
"escape-html": "^1.0.3"
},
"devDependencies": {
- "@emnapi/core": "^1.6.0",
- "@emnapi/runtime": "^1.6.0",
- "@napi-rs/cli": "^3.3.1",
+ "@emnapi/core": "^1.7.0",
+ "@emnapi/runtime": "^1.7.0",
+ "@napi-rs/cli": "^3.4.1",
"@tybys/wasm-util": "^0.10.1",
"@types/escape-html": "^1.0.4",
- "@types/node": "^24.9.1",
+ "@types/node": "^24.10.0",
"@types/vscode": "1.61.0",
- "@typescript-eslint/eslint-plugin": "^8.46.2",
- "@typescript-eslint/parser": "^8.46.2",
- "@vscode/vsce": "^3.6.2",
+ "@typescript-eslint/eslint-plugin": "^8.46.4",
+ "@typescript-eslint/parser": "^8.46.4",
+ "@vscode/vsce": "^3.7.0",
"chalk": "^5.6.2",
- "esbuild": "^0.25.11",
- "eslint": "^9.38.0",
+ "esbuild": "^0.27.0",
+ "eslint": "^9.39.1",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-node": "^11.1.0",
diff --git a/extensions/VSCode/pnpm-lock.yaml b/extensions/VSCode/pnpm-lock.yaml
index 3126b3b9..8ec7f474 100644
--- a/extensions/VSCode/pnpm-lock.yaml
+++ b/extensions/VSCode/pnpm-lock.yaml
@@ -13,14 +13,14 @@ importers:
version: 1.0.3
devDependencies:
'@emnapi/core':
- specifier: ^1.6.0
- version: 1.6.0
+ specifier: ^1.7.0
+ version: 1.7.0
'@emnapi/runtime':
- specifier: ^1.6.0
- version: 1.6.0
+ specifier: ^1.7.0
+ version: 1.7.0
'@napi-rs/cli':
- specifier: ^3.3.1
- version: 3.3.1(@emnapi/runtime@1.6.0)(@types/node@24.9.1)
+ specifier: ^3.4.1
+ version: 3.4.1(@emnapi/runtime@1.7.0)(@types/node@24.10.0)
'@tybys/wasm-util':
specifier: ^0.10.1
version: 0.10.1
@@ -28,38 +28,38 @@ importers:
specifier: ^1.0.4
version: 1.0.4
'@types/node':
- specifier: ^24.9.1
- version: 24.9.1
+ specifier: ^24.10.0
+ version: 24.10.0
'@types/vscode':
specifier: 1.61.0
version: 1.61.0
'@typescript-eslint/eslint-plugin':
- specifier: ^8.46.2
- version: 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3)
+ specifier: ^8.46.4
+ version: 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)
'@typescript-eslint/parser':
- specifier: ^8.46.2
- version: 8.46.2(eslint@9.38.0)(typescript@5.9.3)
+ specifier: ^8.46.4
+ version: 8.46.4(eslint@9.39.1)(typescript@5.9.3)
'@vscode/vsce':
- specifier: ^3.6.2
- version: 3.6.2
+ specifier: ^3.7.0
+ version: 3.7.0
chalk:
specifier: ^5.6.2
version: 5.6.2
esbuild:
- specifier: ^0.25.11
- version: 0.25.11
+ specifier: ^0.27.0
+ version: 0.27.0
eslint:
- specifier: ^9.38.0
- version: 9.38.0
+ specifier: ^9.39.1
+ version: 9.39.1
eslint-config-prettier:
specifier: ^10.1.8
- version: 10.1.8(eslint@9.38.0)
+ version: 10.1.8(eslint@9.39.1)
eslint-plugin-import:
specifier: ^2.32.0
- version: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)
+ version: 2.32.0(@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)
eslint-plugin-node:
specifier: ^11.1.0
- version: 11.1.0(eslint@9.38.0)
+ version: 11.1.0(eslint@9.39.1)
npm-run-all2:
specifier: ^8.0.4
version: 8.0.4
@@ -97,8 +97,8 @@ packages:
resolution: {integrity: sha512-Nh5PhEOeY6PrnxNPsEHRr9eimxLwgLlpmguQaHKBinFYA/RU9+kOYVOQqOrTsCL+KSxrLLl1gD8Dk5BFW/7l/w==}
engines: {node: '>=20.0.0'}
- '@azure/core-rest-pipeline@1.22.1':
- resolution: {integrity: sha512-UVZlVLfLyz6g3Hy7GNDpooMQonUygH7ghdiSASOOHy97fKj/mPLqgDX7aidOijn+sCMU+WU8NjlPlNTgnvbcGA==}
+ '@azure/core-rest-pipeline@1.22.2':
+ resolution: {integrity: sha512-MzHym+wOi8CLUlKCQu12de0nwcq9k9Kuv43j4Wa++CsCpJwps2eeBQwD2Bu8snkxTtDKDx4GwjuR9E8yC8LNrg==}
engines: {node: '>=20.0.0'}
'@azure/core-tracing@1.3.1':
@@ -117,187 +117,187 @@ packages:
resolution: {integrity: sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA==}
engines: {node: '>=20.0.0'}
- '@azure/msal-browser@4.25.1':
- resolution: {integrity: sha512-kAdOSNjvMbeBmEyd5WnddGmIpKCbAAGj4Gg/1iURtF+nHmIfS0+QUBBO3uaHl7CBB2R1SEAbpOgxycEwrHOkFA==}
+ '@azure/msal-browser@4.26.1':
+ resolution: {integrity: sha512-GGCIsZXxyNm5QcQZ4maA9q+9UWmM+/87G+ybvPkrE32el1URSa9WYt0t67ks3/P0gspZX9RoEqyLqJ/X/JDnBQ==}
engines: {node: '>=0.8.0'}
- '@azure/msal-common@15.13.0':
- resolution: {integrity: sha512-8oF6nj02qX7eE/6+wFT5NluXRHc05AgdCC3fJnkjiJooq8u7BcLmxaYYSwc2AfEkWRMRi6Eyvvbeqk4U4412Ag==}
+ '@azure/msal-common@15.13.1':
+ resolution: {integrity: sha512-vQYQcG4J43UWgo1lj7LcmdsGUKWYo28RfEvDQAEMmQIMjSFufvb+pS0FJ3KXmrPmnWlt1vHDl3oip6mIDUQ4uA==}
engines: {node: '>=0.8.0'}
- '@azure/msal-node@3.8.0':
- resolution: {integrity: sha512-23BXm82Mp5XnRhrcd4mrHa0xuUNRp96ivu3nRatrfdAqjoeWAGyD0eEAafxAOHAEWWmdlyFK4ELFcdziXyw2sA==}
+ '@azure/msal-node@3.8.1':
+ resolution: {integrity: sha512-HszfqoC+i2C9+BRDQfuNUGp15Re7menIhCEbFCQ49D3KaqEDrgZIgQ8zSct4T59jWeUIL9N/Dwiv4o2VueTdqQ==}
engines: {node: '>=16'}
'@babel/code-frame@7.27.1':
resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-identifier@7.27.1':
- resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
engines: {node: '>=6.9.0'}
- '@emnapi/core@1.6.0':
- resolution: {integrity: sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==}
+ '@emnapi/core@1.7.0':
+ resolution: {integrity: sha512-pJdKGq/1iquWYtv1RRSljZklxHCOCAJFJrImO5ZLKPJVJlVUcs8yFwNQlqS0Lo8xT1VAXXTCZocF9n26FWEKsw==}
- '@emnapi/runtime@1.6.0':
- resolution: {integrity: sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==}
+ '@emnapi/runtime@1.7.0':
+ resolution: {integrity: sha512-oAYoQnCYaQZKVS53Fq23ceWMRxq5EhQsE0x0RdQ55jT7wagMu5k+fS39v1fiSLrtrLQlXwVINenqhLMtTrV/1Q==}
'@emnapi/wasi-threads@1.1.0':
resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==}
- '@esbuild/aix-ppc64@0.25.11':
- resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
+ '@esbuild/aix-ppc64@0.27.0':
+ resolution: {integrity: sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/android-arm64@0.25.11':
- resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==}
+ '@esbuild/android-arm64@0.27.0':
+ resolution: {integrity: sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.25.11':
- resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==}
+ '@esbuild/android-arm@0.27.0':
+ resolution: {integrity: sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.25.11':
- resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==}
+ '@esbuild/android-x64@0.27.0':
+ resolution: {integrity: sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.25.11':
- resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==}
+ '@esbuild/darwin-arm64@0.27.0':
+ resolution: {integrity: sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.25.11':
- resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==}
+ '@esbuild/darwin-x64@0.27.0':
+ resolution: {integrity: sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.25.11':
- resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==}
+ '@esbuild/freebsd-arm64@0.27.0':
+ resolution: {integrity: sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.25.11':
- resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==}
+ '@esbuild/freebsd-x64@0.27.0':
+ resolution: {integrity: sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.25.11':
- resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==}
+ '@esbuild/linux-arm64@0.27.0':
+ resolution: {integrity: sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.25.11':
- resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==}
+ '@esbuild/linux-arm@0.27.0':
+ resolution: {integrity: sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.25.11':
- resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==}
+ '@esbuild/linux-ia32@0.27.0':
+ resolution: {integrity: sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.25.11':
- resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==}
+ '@esbuild/linux-loong64@0.27.0':
+ resolution: {integrity: sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.25.11':
- resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==}
+ '@esbuild/linux-mips64el@0.27.0':
+ resolution: {integrity: sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-ppc64@0.25.11':
- resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==}
+ '@esbuild/linux-ppc64@0.27.0':
+ resolution: {integrity: sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.25.11':
- resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==}
+ '@esbuild/linux-riscv64@0.27.0':
+ resolution: {integrity: sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.25.11':
- resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==}
+ '@esbuild/linux-s390x@0.27.0':
+ resolution: {integrity: sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.25.11':
- resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==}
+ '@esbuild/linux-x64@0.27.0':
+ resolution: {integrity: sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-arm64@0.25.11':
- resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==}
+ '@esbuild/netbsd-arm64@0.27.0':
+ resolution: {integrity: sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.25.11':
- resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==}
+ '@esbuild/netbsd-x64@0.27.0':
+ resolution: {integrity: sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- '@esbuild/openbsd-arm64@0.25.11':
- resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==}
+ '@esbuild/openbsd-arm64@0.27.0':
+ resolution: {integrity: sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.25.11':
- resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==}
+ '@esbuild/openbsd-x64@0.27.0':
+ resolution: {integrity: sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- '@esbuild/openharmony-arm64@0.25.11':
- resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==}
+ '@esbuild/openharmony-arm64@0.27.0':
+ resolution: {integrity: sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openharmony]
- '@esbuild/sunos-x64@0.25.11':
- resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==}
+ '@esbuild/sunos-x64@0.27.0':
+ resolution: {integrity: sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- '@esbuild/win32-arm64@0.25.11':
- resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==}
+ '@esbuild/win32-arm64@0.27.0':
+ resolution: {integrity: sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.25.11':
- resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==}
+ '@esbuild/win32-ia32@0.27.0':
+ resolution: {integrity: sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.25.11':
- resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==}
+ '@esbuild/win32-x64@0.27.0':
+ resolution: {integrity: sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
@@ -308,36 +308,36 @@ packages:
peerDependencies:
eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
- '@eslint-community/regexpp@4.12.1':
- resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==}
+ '@eslint-community/regexpp@4.12.2':
+ resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==}
engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
'@eslint/config-array@0.21.1':
resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/config-helpers@0.4.1':
- resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==}
+ '@eslint/config-helpers@0.4.2':
+ resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/core@0.16.0':
- resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==}
+ '@eslint/core@0.17.0':
+ resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/eslintrc@3.3.1':
resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/js@9.38.0':
- resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==}
+ '@eslint/js@9.39.1':
+ resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@eslint/object-schema@2.1.7':
resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/plugin-kit@0.4.0':
- resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==}
+ '@eslint/plugin-kit@0.4.1':
+ resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@humanfs/core@0.19.1':
@@ -356,12 +356,12 @@ packages:
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
engines: {node: '>=18.18'}
- '@inquirer/ansi@1.0.1':
- resolution: {integrity: sha512-yqq0aJW/5XPhi5xOAL1xRCpe1eh8UFVgYFpFsjEqmIR8rKLyP+HINvFXwUaxYICflJrVlxnp7lLN6As735kVpw==}
+ '@inquirer/ansi@1.0.2':
+ resolution: {integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==}
engines: {node: '>=18'}
- '@inquirer/checkbox@4.3.0':
- resolution: {integrity: sha512-5+Q3PKH35YsnoPTh75LucALdAxom6xh5D1oeY561x4cqBuH24ZFVyFREPe14xgnrtmGu3EEt1dIi60wRVSnGCw==}
+ '@inquirer/checkbox@4.3.1':
+ resolution: {integrity: sha512-rOcLotrptYIy59SGQhKlU0xBg1vvcVl2FdPIEclUvKHh0wo12OfGkId/01PIMJ/V+EimJ77t085YabgnQHBa5A==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -369,8 +369,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/confirm@5.1.19':
- resolution: {integrity: sha512-wQNz9cfcxrtEnUyG5PndC8g3gZ7lGDBzmWiXZkX8ot3vfZ+/BLjR8EvyGX4YzQLeVqtAlY/YScZpW7CW8qMoDQ==}
+ '@inquirer/confirm@5.1.20':
+ resolution: {integrity: sha512-HDGiWh2tyRZa0M1ZnEIUCQro25gW/mN8ODByicQrbR1yHx4hT+IOpozCMi5TgBtUdklLwRI2mv14eNpftDluEw==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -378,8 +378,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/core@10.3.0':
- resolution: {integrity: sha512-Uv2aPPPSK5jeCplQmQ9xadnFx2Zhj9b5Dj7bU6ZeCdDNNY11nhYy4btcSdtDguHqCT2h5oNeQTcUNSGGLA7NTA==}
+ '@inquirer/core@10.3.1':
+ resolution: {integrity: sha512-hzGKIkfomGFPgxKmnKEKeA+uCYBqC+TKtRx5LgyHRCrF6S2MliwRIjp3sUaWwVzMp7ZXVs8elB0Tfe682Rpg4w==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -387,8 +387,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/editor@4.2.21':
- resolution: {integrity: sha512-MjtjOGjr0Kh4BciaFShYpZ1s9400idOdvQ5D7u7lE6VztPFoyLcVNE5dXBmEEIQq5zi4B9h2kU+q7AVBxJMAkQ==}
+ '@inquirer/editor@4.2.22':
+ resolution: {integrity: sha512-8yYZ9TCbBKoBkzHtVNMF6PV1RJEUvMlhvmS3GxH4UvXMEHlS45jFyqFy0DU+K42jBs5slOaA78xGqqqWAx3u6A==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -396,8 +396,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/expand@4.0.21':
- resolution: {integrity: sha512-+mScLhIcbPFmuvU3tAGBed78XvYHSvCl6dBiYMlzCLhpr0bzGzd8tfivMMeqND6XZiaZ1tgusbUHJEfc6YzOdA==}
+ '@inquirer/expand@4.0.22':
+ resolution: {integrity: sha512-9XOjCjvioLjwlq4S4yXzhvBmAXj5tG+jvva0uqedEsQ9VD8kZ+YT7ap23i0bIXOtow+di4+u3i6u26nDqEfY4Q==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -405,8 +405,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/external-editor@1.0.2':
- resolution: {integrity: sha512-yy9cOoBnx58TlsPrIxauKIFQTiyH+0MK4e97y4sV9ERbI+zDxw7i2hxHLCIEGIE/8PPvDxGhgzIOTSOWcs6/MQ==}
+ '@inquirer/external-editor@1.0.3':
+ resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -414,12 +414,12 @@ packages:
'@types/node':
optional: true
- '@inquirer/figures@1.0.14':
- resolution: {integrity: sha512-DbFgdt+9/OZYFM+19dbpXOSeAstPy884FPy1KjDu4anWwymZeOYhMY1mdFri172htv6mvc/uvIAAi7b7tvjJBQ==}
+ '@inquirer/figures@1.0.15':
+ resolution: {integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==}
engines: {node: '>=18'}
- '@inquirer/input@4.2.5':
- resolution: {integrity: sha512-7GoWev7P6s7t0oJbenH0eQ0ThNdDJbEAEtVt9vsrYZ9FulIokvd823yLyhQlWHJPGce1wzP53ttfdCZmonMHyA==}
+ '@inquirer/input@4.3.0':
+ resolution: {integrity: sha512-h4fgse5zeGsBSW3cRQqu9a99OXRdRsNCvHoBqVmz40cjYjYFzcfwD0KA96BHIPlT7rZw0IpiefQIqXrjbzjS4Q==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -427,8 +427,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/number@3.0.21':
- resolution: {integrity: sha512-5QWs0KGaNMlhbdhOSCFfKsW+/dcAVC2g4wT/z2MCiZM47uLgatC5N20kpkDQf7dHx+XFct/MJvvNGy6aYJn4Pw==}
+ '@inquirer/number@3.0.22':
+ resolution: {integrity: sha512-oAdMJXz++fX58HsIEYmvuf5EdE8CfBHHXjoi9cTcQzgFoHGZE+8+Y3P38MlaRMeBvAVnkWtAxMUF6urL2zYsbg==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -436,8 +436,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/password@4.0.21':
- resolution: {integrity: sha512-xxeW1V5SbNFNig2pLfetsDb0svWlKuhmr7MPJZMYuDnCTkpVBI+X/doudg4pznc1/U+yYmWFFOi4hNvGgUo7EA==}
+ '@inquirer/password@4.0.22':
+ resolution: {integrity: sha512-CbdqK1ioIr0Y3akx03k/+Twf+KSlHjn05hBL+rmubMll7PsDTGH0R4vfFkr+XrkB0FOHrjIwVP9crt49dgt+1g==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -445,8 +445,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/prompts@7.9.0':
- resolution: {integrity: sha512-X7/+dG9SLpSzRkwgG5/xiIzW0oMrV3C0HOa7YHG1WnrLK+vCQHfte4k/T80059YBdei29RBC3s+pSMvPJDU9/A==}
+ '@inquirer/prompts@7.10.0':
+ resolution: {integrity: sha512-X2HAjY9BClfFkJ2RP3iIiFxlct5JJVdaYYXhA7RKxsbc9KL+VbId79PSoUGH/OLS011NFbHHDMDcBKUj3T89+Q==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -454,8 +454,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/rawlist@4.1.9':
- resolution: {integrity: sha512-AWpxB7MuJrRiSfTKGJ7Y68imYt8P9N3Gaa7ySdkFj1iWjr6WfbGAhdZvw/UnhFXTHITJzxGUI9k8IX7akAEBCg==}
+ '@inquirer/rawlist@4.1.10':
+ resolution: {integrity: sha512-Du4uidsgTMkoH5izgpfyauTL/ItVHOLsVdcY+wGeoGaG56BV+/JfmyoQGniyhegrDzXpfn3D+LFHaxMDRygcAw==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -463,8 +463,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/search@3.2.0':
- resolution: {integrity: sha512-a5SzB/qrXafDX1Z4AZW3CsVoiNxcIYCzYP7r9RzrfMpaLpB+yWi5U8BWagZyLmwR0pKbbL5umnGRd0RzGVI8bQ==}
+ '@inquirer/search@3.2.1':
+ resolution: {integrity: sha512-cKiuUvETublmTmaOneEermfG2tI9ABpb7fW/LqzZAnSv4ZaJnbEis05lOkiBuYX5hNdnX0Q9ryOQyrNidb55WA==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -472,8 +472,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/select@4.4.0':
- resolution: {integrity: sha512-kaC3FHsJZvVyIjYBs5Ih8y8Bj4P/QItQWrZW22WJax7zTN+ZPXVGuOM55vzbdCP9zKUiBd9iEJVdesujfF+cAA==}
+ '@inquirer/select@4.4.1':
+ resolution: {integrity: sha512-E9hbLU4XsNe2SAOSsFrtYtYQDVi1mfbqJrPDvXKnGlnRiApBdWMJz7r3J2Ff38AqULkPUD3XjQMD4492TymD7Q==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -481,8 +481,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/type@3.0.9':
- resolution: {integrity: sha512-QPaNt/nmE2bLGQa9b7wwyRJoLZ7pN6rcyXvzU0YCmivmJyq1BVo94G98tStRWkoD1RgDX5C+dPlhhHzNdu/W/w==}
+ '@inquirer/type@3.0.10':
+ resolution: {integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==}
engines: {node: '>=18'}
peerDependencies:
'@types/node': '>=18'
@@ -502,8 +502,8 @@ packages:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
- '@napi-rs/cli@3.3.1':
- resolution: {integrity: sha512-KVO9tLhtOtDc8iMUJYRkj6WZcYmV6+fhXbLa1Qstrm6ZQa9McIsqjFH7PLx3BnEWwejjJrenrCX5JENwl0MpKg==}
+ '@napi-rs/cli@3.4.1':
+ resolution: {integrity: sha512-ayhm+NfrP5Hmh7vy5pfyYm/ktYtLh2PrgdLuqHTAubO7RoO2JkUE4F991AtgYxNewwXI8+guZLxU8itV7QnDrQ==}
engines: {node: '>= 16'}
hasBin: true
peerDependencies:
@@ -941,23 +941,23 @@ packages:
resolution: {integrity: sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==}
engines: {node: '>= 20'}
- '@octokit/core@7.0.5':
- resolution: {integrity: sha512-t54CUOsFMappY1Jbzb7fetWeO0n6K0k/4+/ZpkS+3Joz8I4VcvY9OiEBFRYISqaI2fq5sCiPtAjRDOzVYG8m+Q==}
+ '@octokit/core@7.0.6':
+ resolution: {integrity: sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==}
engines: {node: '>= 20'}
- '@octokit/endpoint@11.0.1':
- resolution: {integrity: sha512-7P1dRAZxuWAOPI7kXfio88trNi/MegQ0IJD3vfgC3b+LZo1Qe6gRJc2v0mz2USWWJOKrB2h5spXCzGbw+fAdqA==}
+ '@octokit/endpoint@11.0.2':
+ resolution: {integrity: sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==}
engines: {node: '>= 20'}
- '@octokit/graphql@9.0.2':
- resolution: {integrity: sha512-iz6KzZ7u95Fzy9Nt2L8cG88lGRMr/qy1Q36ih/XVzMIlPDMYwaNLE/ENhqmIzgPrlNWiYJkwmveEetvxAgFBJw==}
+ '@octokit/graphql@9.0.3':
+ resolution: {integrity: sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==}
engines: {node: '>= 20'}
- '@octokit/openapi-types@26.0.0':
- resolution: {integrity: sha512-7AtcfKtpo77j7Ts73b4OWhOZHTKo/gGY8bB3bNBQz4H+GRSWqx2yvj8TXRsbdTE0eRmYmXOEY66jM7mJ7LzfsA==}
+ '@octokit/openapi-types@27.0.0':
+ resolution: {integrity: sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==}
- '@octokit/plugin-paginate-rest@13.2.1':
- resolution: {integrity: sha512-Tj4PkZyIL6eBMYcG/76QGsedF0+dWVeLhYprTmuFVVxzDW7PQh23tM0TP0z+1MvSkxB29YFZwnUX+cXfTiSdyw==}
+ '@octokit/plugin-paginate-rest@14.0.0':
+ resolution: {integrity: sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==}
engines: {node: '>= 20'}
peerDependencies:
'@octokit/core': '>=6'
@@ -968,26 +968,26 @@ packages:
peerDependencies:
'@octokit/core': '>=6'
- '@octokit/plugin-rest-endpoint-methods@16.1.1':
- resolution: {integrity: sha512-VztDkhM0ketQYSh5Im3IcKWFZl7VIrrsCaHbDINkdYeiiAsJzjhS2xRFCSJgfN6VOcsoW4laMtsmf3HcNqIimg==}
+ '@octokit/plugin-rest-endpoint-methods@17.0.0':
+ resolution: {integrity: sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==}
engines: {node: '>= 20'}
peerDependencies:
'@octokit/core': '>=6'
- '@octokit/request-error@7.0.1':
- resolution: {integrity: sha512-CZpFwV4+1uBrxu7Cw8E5NCXDWFNf18MSY23TdxCBgjw1tXXHvTrZVsXlW8hgFTOLw8RQR1BBrMvYRtuyaijHMA==}
+ '@octokit/request-error@7.0.2':
+ resolution: {integrity: sha512-U8piOROoQQUyExw5c6dTkU3GKxts5/ERRThIauNL7yaRoeXW0q/5bgHWT7JfWBw1UyrbK8ERId2wVkcB32n0uQ==}
engines: {node: '>= 20'}
- '@octokit/request@10.0.5':
- resolution: {integrity: sha512-TXnouHIYLtgDhKo+N6mXATnDBkV05VwbR0TtMWpgTHIoQdRQfCSzmy/LGqR1AbRMbijq/EckC/E3/ZNcU92NaQ==}
+ '@octokit/request@10.0.6':
+ resolution: {integrity: sha512-FO+UgZCUu+pPnZAR+iKdUt64kPE7QW7ciqpldaMXaNzixz5Jld8dJ31LAUewk0cfSRkNSRKyqG438ba9c/qDlQ==}
engines: {node: '>= 20'}
- '@octokit/rest@22.0.0':
- resolution: {integrity: sha512-z6tmTu9BTnw51jYGulxrlernpsQYXpui1RK21vmXn8yF5bp6iX16yfTtJYGK5Mh1qDkvDOmp2n8sRMcQmR8jiA==}
+ '@octokit/rest@22.0.1':
+ resolution: {integrity: sha512-Jzbhzl3CEexhnivb1iQ0KJ7s5vvjMWcmRtq5aUsKmKDrRW6z3r84ngmiFKFvpZjpiU/9/S6ITPFRpn5s/3uQJw==}
engines: {node: '>= 20'}
- '@octokit/types@15.0.1':
- resolution: {integrity: sha512-sdiirM93IYJ9ODDCBgmRPIboLbSkpLa5i+WLuXH8b8Atg+YMLAyLvDDhNWLV4OYd08tlvYfVm/dw88cqHWtw1Q==}
+ '@octokit/types@16.0.0':
+ resolution: {integrity: sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==}
'@rtsao/scc@1.1.0':
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
@@ -1041,20 +1041,20 @@ packages:
resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==}
engines: {node: '>=18'}
- '@textlint/ast-node-types@15.2.3':
- resolution: {integrity: sha512-GEhoxfmh6TF+xC8TJmAUwOzzh0J6sVDqjKhwTTwetf7YDdhHbIv1PuUb/dTadMVIWs1H0+JD4Y27n6LWMmqn9Q==}
+ '@textlint/ast-node-types@15.3.0':
+ resolution: {integrity: sha512-y61yQXWRVEpUozPUoDUx3Qw8YO86LTU9+LMB23UbPKadM2W2XjKLkKxzzP8A/m0aw4EXozW098E+y55ZmNVZ1w==}
- '@textlint/linter-formatter@15.2.3':
- resolution: {integrity: sha512-gnFGl8MejAS4rRDPKV2OYvU0Tb0iJySOPDahf+RCK30b615UqY6CjqWxXw1FvXfT3pHPoRrefVu39j1AKm2ezg==}
+ '@textlint/linter-formatter@15.3.0':
+ resolution: {integrity: sha512-MfSgfmN4QCdgVy1s0HttpsjsfXRYpB4QWXHCsxX/OVEcNOHhwEKrDzlyS6Osb74VpQSzSiWMtX1oY++iVw0l0w==}
- '@textlint/module-interop@15.2.3':
- resolution: {integrity: sha512-dV6M3ptOFJjR5bgYUMeVqc8AqFrMtCEFaZEiLAfMufX29asYonI2K8arqivOA69S2Lh6esyij6V7qpQiXeK/cA==}
+ '@textlint/module-interop@15.3.0':
+ resolution: {integrity: sha512-SzJLo3SBd526I+RI69+DCj0TpS2C40VxgI52uv2Q31qENaa2xHCI7JXV37J26bVyYBZMA4uwRwj74GWeaZD5rA==}
- '@textlint/resolver@15.2.3':
- resolution: {integrity: sha512-Qd3udqo2sWa3u0sYgDVd9M/iybBVBJLrWGaID6Yzl9GyhdGi0E6ngo3b9r+H6psbJDIaCKi54IxvC9q5didWfA==}
+ '@textlint/resolver@15.3.0':
+ resolution: {integrity: sha512-utvrWoc9X0PaF/yzA3IpSDHWKlA/iTsuWRJ9gKzDLTz+ErgHcB2aV97YvhMDdE8qtHpOp4MGjVK1cw4BviRQBQ==}
- '@textlint/types@15.2.3':
- resolution: {integrity: sha512-i8XVmDHJwykMXcGgkSxZLjdbeqnl+voYAcIr94KIe0STwgkHIhwHJgb/tEVFawGClHo+gPczF12l1C5+TAZEzQ==}
+ '@textlint/types@15.3.0':
+ resolution: {integrity: sha512-pOlYZ0TWS5XFek2axLK2KOQJCXC4zEj57u4/YTkN3CU1DtvUsvLQUs5oGSrxTyAGtYPFCYOrSqEzER6252732A==}
'@tybys/wasm-util@0.10.1':
resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
@@ -1071,8 +1071,8 @@ packages:
'@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
- '@types/node@24.9.1':
- resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==}
+ '@types/node@24.10.0':
+ resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==}
'@types/normalize-package-data@2.4.4':
resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
@@ -1083,67 +1083,67 @@ packages:
'@types/vscode@1.61.0':
resolution: {integrity: sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg==}
- '@typescript-eslint/eslint-plugin@8.46.2':
- resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==}
+ '@typescript-eslint/eslint-plugin@8.46.4':
+ resolution: {integrity: sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.46.2
+ '@typescript-eslint/parser': ^8.46.4
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/parser@8.46.2':
- resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==}
+ '@typescript-eslint/parser@8.46.4':
+ resolution: {integrity: sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/project-service@8.46.2':
- resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==}
+ '@typescript-eslint/project-service@8.46.4':
+ resolution: {integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/scope-manager@8.46.2':
- resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==}
+ '@typescript-eslint/scope-manager@8.46.4':
+ resolution: {integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/tsconfig-utils@8.46.2':
- resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==}
+ '@typescript-eslint/tsconfig-utils@8.46.4':
+ resolution: {integrity: sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/type-utils@8.46.2':
- resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==}
+ '@typescript-eslint/type-utils@8.46.4':
+ resolution: {integrity: sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/types@8.46.2':
- resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==}
+ '@typescript-eslint/types@8.46.4':
+ resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.46.2':
- resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==}
+ '@typescript-eslint/typescript-estree@8.46.4':
+ resolution: {integrity: sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/utils@8.46.2':
- resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==}
+ '@typescript-eslint/utils@8.46.4':
+ resolution: {integrity: sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <6.0.0'
- '@typescript-eslint/visitor-keys@8.46.2':
- resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==}
+ '@typescript-eslint/visitor-keys@8.46.4':
+ resolution: {integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typespec/ts-http-runtime@0.3.1':
- resolution: {integrity: sha512-SnbaqayTVFEA6/tYumdF0UmybY0KHyKwGPBXnyckFlrrKdhWFrL3a2HIPXHjht5ZOElKGcXfD2D63P36btb+ww==}
+ '@typespec/ts-http-runtime@0.3.2':
+ resolution: {integrity: sha512-IlqQ/Gv22xUC1r/WQm4StLkYQmaaTsXAhUVsNE0+xiyf0yRFiH5++q78U3bw6bLKDCTmh0uqKB9eG9+Bt75Dkg==}
engines: {node: '>=20.0.0'}
'@vscode/vsce-sign-alpine-arm64@2.0.6':
@@ -1194,8 +1194,8 @@ packages:
'@vscode/vsce-sign@2.0.8':
resolution: {integrity: sha512-H7p8E11cZMj6mt8xIi3QXZ7dSU/2MH3Y7c+5JfUhHAV4xfaPNc8ozwLVK282c6ah596KoIJIdPUlNHV7Qs/5JA==}
- '@vscode/vsce@3.6.2':
- resolution: {integrity: sha512-gvBfarWF+Ii20ESqjA3dpnPJpQJ8fFJYtcWtjwbRADommCzGg1emtmb34E+DKKhECYvaVyAl+TF9lWS/3GSPvg==}
+ '@vscode/vsce@3.7.0':
+ resolution: {integrity: sha512-LY9r2T4joszRjz4d92ZPl6LTBUPS4IWH9gG/3JUv+1QyBJrveZlcVISuiaq0EOpmcgFh0GgVgKD4rD/21Tu8sA==}
engines: {node: '>= 20'}
hasBin: true
@@ -1219,8 +1219,8 @@ packages:
ajv@8.17.1:
resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
- ansi-escapes@7.1.1:
- resolution: {integrity: sha512-Zhl0ErHcSRUaVfGUeUdDuLgpkEo8KIFjB4Y9uAc46ScOpdDiU1Dbyplh7qWJeJ/ZHpbyMSM26+X3BySgnIz40Q==}
+ ansi-escapes@7.2.0:
+ resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==}
engines: {node: '>=18'}
ansi-regex@5.0.1:
@@ -1360,8 +1360,8 @@ packages:
resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
- chardet@2.1.0:
- resolution: {integrity: sha512-bNFETTG/pM5ryzQ9Ad0lJOTa6HWD/YsScAR3EnCPZRPlQh77JocYktSHOUHelyhm8IARL+o4c4F1bP5KVOjiRA==}
+ chardet@2.1.1:
+ resolution: {integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ==}
cheerio-select@2.1.0:
resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
@@ -1524,8 +1524,8 @@ packages:
resolution: {integrity: sha512-UgGlf8IW75je7HZjNDpJdCv4cGJWIi6yumFdZ0R7A8/CIhQiWUjyGLCxdHpd8bmyD1gnkfUNK0oeOXqUS2cpfQ==}
engines: {ecmascript: '>= es5', node: '>=4'}
- emnapi@1.6.0:
- resolution: {integrity: sha512-Hx0FqhPchuwkDauQdgamWAn6MHbOX1CPIFfObXqxTEmngZUYM9mZLcPS/civeVT5x73xkBV1ZIwKWfessIFTgQ==}
+ emnapi@1.7.0:
+ resolution: {integrity: sha512-d/RB4oJJu56sOxx+ooK4978jUvnoUo3iRob1/U3N+QnCr91IRQ2QNpAGa3/ZSEZqDWgdhfB1Er5jarfYzjvghg==}
peerDependencies:
node-addon-api: '>= 6.1.0'
peerDependenciesMeta:
@@ -1584,11 +1584,11 @@ packages:
resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
engines: {node: '>= 0.4'}
- es-toolkit@1.40.0:
- resolution: {integrity: sha512-8o6w0KFmU0CiIl0/Q/BCEOabF2IJaELM1T2PWj6e8KqzHv1gdx+7JtFnDwOx1kJH/isJ5NwlDG1nCr1HrRF94Q==}
+ es-toolkit@1.41.0:
+ resolution: {integrity: sha512-bDd3oRmbVgqZCJS6WmeQieOrzpl3URcWBUVDXxOELlUW2FuW+0glPOz1n0KnRie+PdyvUZcXz2sOn00c6pPRIA==}
- esbuild@0.25.11:
- resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
+ esbuild@0.27.0:
+ resolution: {integrity: sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==}
engines: {node: '>=18'}
hasBin: true
@@ -1671,8 +1671,8 @@ packages:
resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- eslint@9.38.0:
- resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==}
+ eslint@9.39.1:
+ resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
hasBin: true
peerDependencies:
@@ -2231,8 +2231,8 @@ packages:
resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
engines: {node: '>=10'}
- minimatch@10.0.3:
- resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==}
+ minimatch@10.1.1:
+ resolution: {integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==}
engines: {node: 20 || >=22}
minimatch@3.1.2:
@@ -2258,9 +2258,9 @@ packages:
mute-stream@0.0.8:
resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==}
- mute-stream@2.0.0:
- resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==}
- engines: {node: ^18.17.0 || >=20.5.0}
+ mute-stream@3.0.0:
+ resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==}
+ engines: {node: ^20.17.0 || >=22.9.0}
napi-build-utils@2.0.0:
resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==}
@@ -2268,8 +2268,8 @@ packages:
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
- node-abi@3.78.0:
- resolution: {integrity: sha512-E2wEyrgX/CqvicaQYU3Ze1PFGjc4QYPGsjUrlYkqAE0WjHEZwgOsGMPMzkMse4LjJbDmaEuDX3CM036j5K2DSQ==}
+ node-abi@3.80.0:
+ resolution: {integrity: sha512-LyPuZJcI9HVwzXK1GPxWNzrr+vr8Hp/3UqlmWxxh8p54U1ZbclOqbSog9lWHaCX+dBaiGi6n/hIX+mKu74GmPA==}
engines: {node: '>=10'}
node-addon-api@4.3.0:
@@ -2389,8 +2389,8 @@ packages:
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
- path-scurry@2.0.0:
- resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==}
+ path-scurry@2.0.1:
+ resolution: {integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA==}
engines: {node: 20 || >=22}
path-type@6.0.0:
@@ -2536,8 +2536,8 @@ packages:
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
- sax@1.4.1:
- resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
+ sax@1.4.3:
+ resolution: {integrity: sha512-yqYn1JhPczigF94DMS+shiDMjDowYO6y9+wB/4WgO0Y19jWYk0lQ4tuG5KI7kj4FTp1wxPj5IFfcrz/s1c3jjQ==}
secretlint@10.2.2:
resolution: {integrity: sha512-xVpkeHV/aoWe4vP4TansF622nBEImzCY73y/0042DuJ29iKIaqgoJ8fGxre3rVSHHbxar4FdJobmTnLp9AU0eg==}
@@ -2942,7 +2942,7 @@ snapshots:
dependencies:
'@azure/abort-controller': 2.1.2
'@azure/core-auth': 1.10.1
- '@azure/core-rest-pipeline': 1.22.1
+ '@azure/core-rest-pipeline': 1.22.2
'@azure/core-tracing': 1.3.1
'@azure/core-util': 1.13.1
'@azure/logger': 1.3.0
@@ -2950,14 +2950,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@azure/core-rest-pipeline@1.22.1':
+ '@azure/core-rest-pipeline@1.22.2':
dependencies:
'@azure/abort-controller': 2.1.2
'@azure/core-auth': 1.10.1
'@azure/core-tracing': 1.3.1
'@azure/core-util': 1.13.1
'@azure/logger': 1.3.0
- '@typespec/ts-http-runtime': 0.3.1
+ '@typespec/ts-http-runtime': 0.3.2
tslib: 2.8.1
transitivePeerDependencies:
- supports-color
@@ -2969,7 +2969,7 @@ snapshots:
'@azure/core-util@1.13.1':
dependencies:
'@azure/abort-controller': 2.1.2
- '@typespec/ts-http-runtime': 0.3.1
+ '@typespec/ts-http-runtime': 0.3.2
tslib: 2.8.1
transitivePeerDependencies:
- supports-color
@@ -2979,12 +2979,12 @@ snapshots:
'@azure/abort-controller': 2.1.2
'@azure/core-auth': 1.10.1
'@azure/core-client': 1.10.1
- '@azure/core-rest-pipeline': 1.22.1
+ '@azure/core-rest-pipeline': 1.22.2
'@azure/core-tracing': 1.3.1
'@azure/core-util': 1.13.1
'@azure/logger': 1.3.0
- '@azure/msal-browser': 4.25.1
- '@azure/msal-node': 3.8.0
+ '@azure/msal-browser': 4.26.1
+ '@azure/msal-node': 3.8.1
open: 10.2.0
tslib: 2.8.1
transitivePeerDependencies:
@@ -2992,37 +2992,37 @@ snapshots:
'@azure/logger@1.3.0':
dependencies:
- '@typespec/ts-http-runtime': 0.3.1
+ '@typespec/ts-http-runtime': 0.3.2
tslib: 2.8.1
transitivePeerDependencies:
- supports-color
- '@azure/msal-browser@4.25.1':
+ '@azure/msal-browser@4.26.1':
dependencies:
- '@azure/msal-common': 15.13.0
+ '@azure/msal-common': 15.13.1
- '@azure/msal-common@15.13.0': {}
+ '@azure/msal-common@15.13.1': {}
- '@azure/msal-node@3.8.0':
+ '@azure/msal-node@3.8.1':
dependencies:
- '@azure/msal-common': 15.13.0
+ '@azure/msal-common': 15.13.1
jsonwebtoken: 9.0.2
uuid: 8.3.2
'@babel/code-frame@7.27.1':
dependencies:
- '@babel/helper-validator-identifier': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
js-tokens: 4.0.0
picocolors: 1.1.1
- '@babel/helper-validator-identifier@7.27.1': {}
+ '@babel/helper-validator-identifier@7.28.5': {}
- '@emnapi/core@1.6.0':
+ '@emnapi/core@1.7.0':
dependencies:
'@emnapi/wasi-threads': 1.1.0
tslib: 2.8.1
- '@emnapi/runtime@1.6.0':
+ '@emnapi/runtime@1.7.0':
dependencies:
tslib: 2.8.1
@@ -3030,90 +3030,90 @@ snapshots:
dependencies:
tslib: 2.8.1
- '@esbuild/aix-ppc64@0.25.11':
+ '@esbuild/aix-ppc64@0.27.0':
optional: true
- '@esbuild/android-arm64@0.25.11':
+ '@esbuild/android-arm64@0.27.0':
optional: true
- '@esbuild/android-arm@0.25.11':
+ '@esbuild/android-arm@0.27.0':
optional: true
- '@esbuild/android-x64@0.25.11':
+ '@esbuild/android-x64@0.27.0':
optional: true
- '@esbuild/darwin-arm64@0.25.11':
+ '@esbuild/darwin-arm64@0.27.0':
optional: true
- '@esbuild/darwin-x64@0.25.11':
+ '@esbuild/darwin-x64@0.27.0':
optional: true
- '@esbuild/freebsd-arm64@0.25.11':
+ '@esbuild/freebsd-arm64@0.27.0':
optional: true
- '@esbuild/freebsd-x64@0.25.11':
+ '@esbuild/freebsd-x64@0.27.0':
optional: true
- '@esbuild/linux-arm64@0.25.11':
+ '@esbuild/linux-arm64@0.27.0':
optional: true
- '@esbuild/linux-arm@0.25.11':
+ '@esbuild/linux-arm@0.27.0':
optional: true
- '@esbuild/linux-ia32@0.25.11':
+ '@esbuild/linux-ia32@0.27.0':
optional: true
- '@esbuild/linux-loong64@0.25.11':
+ '@esbuild/linux-loong64@0.27.0':
optional: true
- '@esbuild/linux-mips64el@0.25.11':
+ '@esbuild/linux-mips64el@0.27.0':
optional: true
- '@esbuild/linux-ppc64@0.25.11':
+ '@esbuild/linux-ppc64@0.27.0':
optional: true
- '@esbuild/linux-riscv64@0.25.11':
+ '@esbuild/linux-riscv64@0.27.0':
optional: true
- '@esbuild/linux-s390x@0.25.11':
+ '@esbuild/linux-s390x@0.27.0':
optional: true
- '@esbuild/linux-x64@0.25.11':
+ '@esbuild/linux-x64@0.27.0':
optional: true
- '@esbuild/netbsd-arm64@0.25.11':
+ '@esbuild/netbsd-arm64@0.27.0':
optional: true
- '@esbuild/netbsd-x64@0.25.11':
+ '@esbuild/netbsd-x64@0.27.0':
optional: true
- '@esbuild/openbsd-arm64@0.25.11':
+ '@esbuild/openbsd-arm64@0.27.0':
optional: true
- '@esbuild/openbsd-x64@0.25.11':
+ '@esbuild/openbsd-x64@0.27.0':
optional: true
- '@esbuild/openharmony-arm64@0.25.11':
+ '@esbuild/openharmony-arm64@0.27.0':
optional: true
- '@esbuild/sunos-x64@0.25.11':
+ '@esbuild/sunos-x64@0.27.0':
optional: true
- '@esbuild/win32-arm64@0.25.11':
+ '@esbuild/win32-arm64@0.27.0':
optional: true
- '@esbuild/win32-ia32@0.25.11':
+ '@esbuild/win32-ia32@0.27.0':
optional: true
- '@esbuild/win32-x64@0.25.11':
+ '@esbuild/win32-x64@0.27.0':
optional: true
- '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0)':
+ '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)':
dependencies:
- eslint: 9.38.0
+ eslint: 9.39.1
eslint-visitor-keys: 3.4.3
- '@eslint-community/regexpp@4.12.1': {}
+ '@eslint-community/regexpp@4.12.2': {}
'@eslint/config-array@0.21.1':
dependencies:
@@ -3123,11 +3123,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@eslint/config-helpers@0.4.1':
+ '@eslint/config-helpers@0.4.2':
dependencies:
- '@eslint/core': 0.16.0
+ '@eslint/core': 0.17.0
- '@eslint/core@0.16.0':
+ '@eslint/core@0.17.0':
dependencies:
'@types/json-schema': 7.0.15
@@ -3145,13 +3145,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@eslint/js@9.38.0': {}
+ '@eslint/js@9.39.1': {}
'@eslint/object-schema@2.1.7': {}
- '@eslint/plugin-kit@0.4.0':
+ '@eslint/plugin-kit@0.4.1':
dependencies:
- '@eslint/core': 0.16.0
+ '@eslint/core': 0.17.0
levn: 0.4.1
'@humanfs/core@0.19.1': {}
@@ -3165,130 +3165,130 @@ snapshots:
'@humanwhocodes/retry@0.4.3': {}
- '@inquirer/ansi@1.0.1': {}
+ '@inquirer/ansi@1.0.2': {}
- '@inquirer/checkbox@4.3.0(@types/node@24.9.1)':
+ '@inquirer/checkbox@4.3.1(@types/node@24.10.0)':
dependencies:
- '@inquirer/ansi': 1.0.1
- '@inquirer/core': 10.3.0(@types/node@24.9.1)
- '@inquirer/figures': 1.0.14
- '@inquirer/type': 3.0.9(@types/node@24.9.1)
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.1(@types/node@24.10.0)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@24.10.0)
yoctocolors-cjs: 2.1.3
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
- '@inquirer/confirm@5.1.19(@types/node@24.9.1)':
+ '@inquirer/confirm@5.1.20(@types/node@24.10.0)':
dependencies:
- '@inquirer/core': 10.3.0(@types/node@24.9.1)
- '@inquirer/type': 3.0.9(@types/node@24.9.1)
+ '@inquirer/core': 10.3.1(@types/node@24.10.0)
+ '@inquirer/type': 3.0.10(@types/node@24.10.0)
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
- '@inquirer/core@10.3.0(@types/node@24.9.1)':
+ '@inquirer/core@10.3.1(@types/node@24.10.0)':
dependencies:
- '@inquirer/ansi': 1.0.1
- '@inquirer/figures': 1.0.14
- '@inquirer/type': 3.0.9(@types/node@24.9.1)
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@24.10.0)
cli-width: 4.1.0
- mute-stream: 2.0.0
+ mute-stream: 3.0.0
signal-exit: 4.1.0
wrap-ansi: 6.2.0
yoctocolors-cjs: 2.1.3
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
- '@inquirer/editor@4.2.21(@types/node@24.9.1)':
+ '@inquirer/editor@4.2.22(@types/node@24.10.0)':
dependencies:
- '@inquirer/core': 10.3.0(@types/node@24.9.1)
- '@inquirer/external-editor': 1.0.2(@types/node@24.9.1)
- '@inquirer/type': 3.0.9(@types/node@24.9.1)
+ '@inquirer/core': 10.3.1(@types/node@24.10.0)
+ '@inquirer/external-editor': 1.0.3(@types/node@24.10.0)
+ '@inquirer/type': 3.0.10(@types/node@24.10.0)
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
- '@inquirer/expand@4.0.21(@types/node@24.9.1)':
+ '@inquirer/expand@4.0.22(@types/node@24.10.0)':
dependencies:
- '@inquirer/core': 10.3.0(@types/node@24.9.1)
- '@inquirer/type': 3.0.9(@types/node@24.9.1)
+ '@inquirer/core': 10.3.1(@types/node@24.10.0)
+ '@inquirer/type': 3.0.10(@types/node@24.10.0)
yoctocolors-cjs: 2.1.3
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
- '@inquirer/external-editor@1.0.2(@types/node@24.9.1)':
+ '@inquirer/external-editor@1.0.3(@types/node@24.10.0)':
dependencies:
- chardet: 2.1.0
+ chardet: 2.1.1
iconv-lite: 0.7.0
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
- '@inquirer/figures@1.0.14': {}
+ '@inquirer/figures@1.0.15': {}
- '@inquirer/input@4.2.5(@types/node@24.9.1)':
+ '@inquirer/input@4.3.0(@types/node@24.10.0)':
dependencies:
- '@inquirer/core': 10.3.0(@types/node@24.9.1)
- '@inquirer/type': 3.0.9(@types/node@24.9.1)
+ '@inquirer/core': 10.3.1(@types/node@24.10.0)
+ '@inquirer/type': 3.0.10(@types/node@24.10.0)
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
- '@inquirer/number@3.0.21(@types/node@24.9.1)':
+ '@inquirer/number@3.0.22(@types/node@24.10.0)':
dependencies:
- '@inquirer/core': 10.3.0(@types/node@24.9.1)
- '@inquirer/type': 3.0.9(@types/node@24.9.1)
+ '@inquirer/core': 10.3.1(@types/node@24.10.0)
+ '@inquirer/type': 3.0.10(@types/node@24.10.0)
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
- '@inquirer/password@4.0.21(@types/node@24.9.1)':
+ '@inquirer/password@4.0.22(@types/node@24.10.0)':
dependencies:
- '@inquirer/ansi': 1.0.1
- '@inquirer/core': 10.3.0(@types/node@24.9.1)
- '@inquirer/type': 3.0.9(@types/node@24.9.1)
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.1(@types/node@24.10.0)
+ '@inquirer/type': 3.0.10(@types/node@24.10.0)
optionalDependencies:
- '@types/node': 24.9.1
-
- '@inquirer/prompts@7.9.0(@types/node@24.9.1)':
- dependencies:
- '@inquirer/checkbox': 4.3.0(@types/node@24.9.1)
- '@inquirer/confirm': 5.1.19(@types/node@24.9.1)
- '@inquirer/editor': 4.2.21(@types/node@24.9.1)
- '@inquirer/expand': 4.0.21(@types/node@24.9.1)
- '@inquirer/input': 4.2.5(@types/node@24.9.1)
- '@inquirer/number': 3.0.21(@types/node@24.9.1)
- '@inquirer/password': 4.0.21(@types/node@24.9.1)
- '@inquirer/rawlist': 4.1.9(@types/node@24.9.1)
- '@inquirer/search': 3.2.0(@types/node@24.9.1)
- '@inquirer/select': 4.4.0(@types/node@24.9.1)
+ '@types/node': 24.10.0
+
+ '@inquirer/prompts@7.10.0(@types/node@24.10.0)':
+ dependencies:
+ '@inquirer/checkbox': 4.3.1(@types/node@24.10.0)
+ '@inquirer/confirm': 5.1.20(@types/node@24.10.0)
+ '@inquirer/editor': 4.2.22(@types/node@24.10.0)
+ '@inquirer/expand': 4.0.22(@types/node@24.10.0)
+ '@inquirer/input': 4.3.0(@types/node@24.10.0)
+ '@inquirer/number': 3.0.22(@types/node@24.10.0)
+ '@inquirer/password': 4.0.22(@types/node@24.10.0)
+ '@inquirer/rawlist': 4.1.10(@types/node@24.10.0)
+ '@inquirer/search': 3.2.1(@types/node@24.10.0)
+ '@inquirer/select': 4.4.1(@types/node@24.10.0)
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
- '@inquirer/rawlist@4.1.9(@types/node@24.9.1)':
+ '@inquirer/rawlist@4.1.10(@types/node@24.10.0)':
dependencies:
- '@inquirer/core': 10.3.0(@types/node@24.9.1)
- '@inquirer/type': 3.0.9(@types/node@24.9.1)
+ '@inquirer/core': 10.3.1(@types/node@24.10.0)
+ '@inquirer/type': 3.0.10(@types/node@24.10.0)
yoctocolors-cjs: 2.1.3
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
- '@inquirer/search@3.2.0(@types/node@24.9.1)':
+ '@inquirer/search@3.2.1(@types/node@24.10.0)':
dependencies:
- '@inquirer/core': 10.3.0(@types/node@24.9.1)
- '@inquirer/figures': 1.0.14
- '@inquirer/type': 3.0.9(@types/node@24.9.1)
+ '@inquirer/core': 10.3.1(@types/node@24.10.0)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@24.10.0)
yoctocolors-cjs: 2.1.3
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
- '@inquirer/select@4.4.0(@types/node@24.9.1)':
+ '@inquirer/select@4.4.1(@types/node@24.10.0)':
dependencies:
- '@inquirer/ansi': 1.0.1
- '@inquirer/core': 10.3.0(@types/node@24.9.1)
- '@inquirer/figures': 1.0.14
- '@inquirer/type': 3.0.9(@types/node@24.9.1)
+ '@inquirer/ansi': 1.0.2
+ '@inquirer/core': 10.3.1(@types/node@24.10.0)
+ '@inquirer/figures': 1.0.15
+ '@inquirer/type': 3.0.10(@types/node@24.10.0)
yoctocolors-cjs: 2.1.3
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
- '@inquirer/type@3.0.9(@types/node@24.9.1)':
+ '@inquirer/type@3.0.10(@types/node@24.10.0)':
optionalDependencies:
- '@types/node': 24.9.1
+ '@types/node': 24.10.0
'@isaacs/balanced-match@4.0.1': {}
@@ -3305,22 +3305,22 @@ snapshots:
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
- '@napi-rs/cli@3.3.1(@emnapi/runtime@1.6.0)(@types/node@24.9.1)':
+ '@napi-rs/cli@3.4.1(@emnapi/runtime@1.7.0)(@types/node@24.10.0)':
dependencies:
- '@inquirer/prompts': 7.9.0(@types/node@24.9.1)
+ '@inquirer/prompts': 7.10.0(@types/node@24.10.0)
'@napi-rs/cross-toolchain': 1.0.3
'@napi-rs/wasm-tools': 1.0.1
- '@octokit/rest': 22.0.0
+ '@octokit/rest': 22.0.1
clipanion: 4.0.0-rc.4(typanion@3.14.0)
colorette: 2.0.20
debug: 4.4.3
- emnapi: 1.6.0
- es-toolkit: 1.40.0
+ emnapi: 1.7.0
+ es-toolkit: 1.41.0
js-yaml: 4.1.0
semver: 7.7.3
typanion: 3.14.0
optionalDependencies:
- '@emnapi/runtime': 1.6.0
+ '@emnapi/runtime': 1.7.0
transitivePeerDependencies:
- '@napi-rs/cross-toolchain-arm64-target-aarch64'
- '@napi-rs/cross-toolchain-arm64-target-armv7'
@@ -3488,15 +3488,15 @@ snapshots:
'@napi-rs/wasm-runtime@0.2.12':
dependencies:
- '@emnapi/core': 1.6.0
- '@emnapi/runtime': 1.6.0
+ '@emnapi/core': 1.7.0
+ '@emnapi/runtime': 1.7.0
'@tybys/wasm-util': 0.10.1
optional: true
'@napi-rs/wasm-runtime@1.0.7':
dependencies:
- '@emnapi/core': 1.6.0
- '@emnapi/runtime': 1.6.0
+ '@emnapi/core': 1.7.0
+ '@emnapi/runtime': 1.7.0
'@tybys/wasm-util': 0.10.1
optional: true
@@ -3632,65 +3632,65 @@ snapshots:
'@octokit/auth-token@6.0.0': {}
- '@octokit/core@7.0.5':
+ '@octokit/core@7.0.6':
dependencies:
'@octokit/auth-token': 6.0.0
- '@octokit/graphql': 9.0.2
- '@octokit/request': 10.0.5
- '@octokit/request-error': 7.0.1
- '@octokit/types': 15.0.1
+ '@octokit/graphql': 9.0.3
+ '@octokit/request': 10.0.6
+ '@octokit/request-error': 7.0.2
+ '@octokit/types': 16.0.0
before-after-hook: 4.0.0
universal-user-agent: 7.0.3
- '@octokit/endpoint@11.0.1':
+ '@octokit/endpoint@11.0.2':
dependencies:
- '@octokit/types': 15.0.1
+ '@octokit/types': 16.0.0
universal-user-agent: 7.0.3
- '@octokit/graphql@9.0.2':
+ '@octokit/graphql@9.0.3':
dependencies:
- '@octokit/request': 10.0.5
- '@octokit/types': 15.0.1
+ '@octokit/request': 10.0.6
+ '@octokit/types': 16.0.0
universal-user-agent: 7.0.3
- '@octokit/openapi-types@26.0.0': {}
+ '@octokit/openapi-types@27.0.0': {}
- '@octokit/plugin-paginate-rest@13.2.1(@octokit/core@7.0.5)':
+ '@octokit/plugin-paginate-rest@14.0.0(@octokit/core@7.0.6)':
dependencies:
- '@octokit/core': 7.0.5
- '@octokit/types': 15.0.1
+ '@octokit/core': 7.0.6
+ '@octokit/types': 16.0.0
- '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.5)':
+ '@octokit/plugin-request-log@6.0.0(@octokit/core@7.0.6)':
dependencies:
- '@octokit/core': 7.0.5
+ '@octokit/core': 7.0.6
- '@octokit/plugin-rest-endpoint-methods@16.1.1(@octokit/core@7.0.5)':
+ '@octokit/plugin-rest-endpoint-methods@17.0.0(@octokit/core@7.0.6)':
dependencies:
- '@octokit/core': 7.0.5
- '@octokit/types': 15.0.1
+ '@octokit/core': 7.0.6
+ '@octokit/types': 16.0.0
- '@octokit/request-error@7.0.1':
+ '@octokit/request-error@7.0.2':
dependencies:
- '@octokit/types': 15.0.1
+ '@octokit/types': 16.0.0
- '@octokit/request@10.0.5':
+ '@octokit/request@10.0.6':
dependencies:
- '@octokit/endpoint': 11.0.1
- '@octokit/request-error': 7.0.1
- '@octokit/types': 15.0.1
+ '@octokit/endpoint': 11.0.2
+ '@octokit/request-error': 7.0.2
+ '@octokit/types': 16.0.0
fast-content-type-parse: 3.0.0
universal-user-agent: 7.0.3
- '@octokit/rest@22.0.0':
+ '@octokit/rest@22.0.1':
dependencies:
- '@octokit/core': 7.0.5
- '@octokit/plugin-paginate-rest': 13.2.1(@octokit/core@7.0.5)
- '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.5)
- '@octokit/plugin-rest-endpoint-methods': 16.1.1(@octokit/core@7.0.5)
+ '@octokit/core': 7.0.6
+ '@octokit/plugin-paginate-rest': 14.0.0(@octokit/core@7.0.6)
+ '@octokit/plugin-request-log': 6.0.0(@octokit/core@7.0.6)
+ '@octokit/plugin-rest-endpoint-methods': 17.0.0(@octokit/core@7.0.6)
- '@octokit/types@15.0.1':
+ '@octokit/types@16.0.0':
dependencies:
- '@octokit/openapi-types': 26.0.0
+ '@octokit/openapi-types': 27.0.0
'@rtsao/scc@1.1.0': {}
@@ -3722,9 +3722,9 @@ snapshots:
dependencies:
'@secretlint/resolver': 10.2.2
'@secretlint/types': 10.2.2
- '@textlint/linter-formatter': 15.2.3
- '@textlint/module-interop': 15.2.3
- '@textlint/types': 15.2.3
+ '@textlint/linter-formatter': 15.3.0
+ '@textlint/module-interop': 15.3.0
+ '@textlint/types': 15.3.0
chalk: 5.6.2
debug: 4.4.3
pluralize: 8.0.0
@@ -3770,15 +3770,15 @@ snapshots:
'@sindresorhus/merge-streams@2.3.0': {}
- '@textlint/ast-node-types@15.2.3': {}
+ '@textlint/ast-node-types@15.3.0': {}
- '@textlint/linter-formatter@15.2.3':
+ '@textlint/linter-formatter@15.3.0':
dependencies:
'@azu/format-text': 1.0.2
'@azu/style-format': 1.0.1
- '@textlint/module-interop': 15.2.3
- '@textlint/resolver': 15.2.3
- '@textlint/types': 15.2.3
+ '@textlint/module-interop': 15.3.0
+ '@textlint/resolver': 15.3.0
+ '@textlint/types': 15.3.0
chalk: 4.1.2
debug: 4.4.3
js-yaml: 3.14.1
@@ -3791,13 +3791,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@textlint/module-interop@15.2.3': {}
+ '@textlint/module-interop@15.3.0': {}
- '@textlint/resolver@15.2.3': {}
+ '@textlint/resolver@15.3.0': {}
- '@textlint/types@15.2.3':
+ '@textlint/types@15.3.0':
dependencies:
- '@textlint/ast-node-types': 15.2.3
+ '@textlint/ast-node-types': 15.3.0
'@tybys/wasm-util@0.10.1':
dependencies:
@@ -3811,7 +3811,7 @@ snapshots:
'@types/json5@0.0.29': {}
- '@types/node@24.9.1':
+ '@types/node@24.10.0':
dependencies:
undici-types: 7.16.0
@@ -3821,15 +3821,15 @@ snapshots:
'@types/vscode@1.61.0': {}
- '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0)(typescript@5.9.3)':
+ '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1)(typescript@5.9.3)':
dependencies:
- '@eslint-community/regexpp': 4.12.1
- '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3)
- '@typescript-eslint/scope-manager': 8.46.2
- '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3)
- '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3)
- '@typescript-eslint/visitor-keys': 8.46.2
- eslint: 9.38.0
+ '@eslint-community/regexpp': 4.12.2
+ '@typescript-eslint/parser': 8.46.4(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/scope-manager': 8.46.4
+ '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.46.4(eslint@9.39.1)(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.46.4
+ eslint: 9.39.1
graphemer: 1.4.0
ignore: 7.0.5
natural-compare: 1.4.0
@@ -3838,56 +3838,56 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3)':
+ '@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/scope-manager': 8.46.2
- '@typescript-eslint/types': 8.46.2
- '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3)
- '@typescript-eslint/visitor-keys': 8.46.2
+ '@typescript-eslint/scope-manager': 8.46.4
+ '@typescript-eslint/types': 8.46.4
+ '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3)
+ '@typescript-eslint/visitor-keys': 8.46.4
debug: 4.4.3
- eslint: 9.38.0
+ eslint: 9.39.1
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)':
+ '@typescript-eslint/project-service@8.46.4(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3)
- '@typescript-eslint/types': 8.46.2
+ '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3)
+ '@typescript-eslint/types': 8.46.4
debug: 4.4.3
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.46.2':
+ '@typescript-eslint/scope-manager@8.46.4':
dependencies:
- '@typescript-eslint/types': 8.46.2
- '@typescript-eslint/visitor-keys': 8.46.2
+ '@typescript-eslint/types': 8.46.4
+ '@typescript-eslint/visitor-keys': 8.46.4
- '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)':
+ '@typescript-eslint/tsconfig-utils@8.46.4(typescript@5.9.3)':
dependencies:
typescript: 5.9.3
- '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)':
+ '@typescript-eslint/type-utils@8.46.4(eslint@9.39.1)(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/types': 8.46.2
- '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3)
- '@typescript-eslint/utils': 8.46.2(eslint@9.38.0)(typescript@5.9.3)
+ '@typescript-eslint/types': 8.46.4
+ '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3)
+ '@typescript-eslint/utils': 8.46.4(eslint@9.39.1)(typescript@5.9.3)
debug: 4.4.3
- eslint: 9.38.0
+ eslint: 9.39.1
ts-api-utils: 2.1.0(typescript@5.9.3)
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.46.2': {}
+ '@typescript-eslint/types@8.46.4': {}
- '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)':
+ '@typescript-eslint/typescript-estree@8.46.4(typescript@5.9.3)':
dependencies:
- '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3)
- '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3)
- '@typescript-eslint/types': 8.46.2
- '@typescript-eslint/visitor-keys': 8.46.2
+ '@typescript-eslint/project-service': 8.46.4(typescript@5.9.3)
+ '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3)
+ '@typescript-eslint/types': 8.46.4
+ '@typescript-eslint/visitor-keys': 8.46.4
debug: 4.4.3
fast-glob: 3.3.3
is-glob: 4.0.3
@@ -3898,23 +3898,23 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.46.2(eslint@9.38.0)(typescript@5.9.3)':
+ '@typescript-eslint/utils@8.46.4(eslint@9.39.1)(typescript@5.9.3)':
dependencies:
- '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0)
- '@typescript-eslint/scope-manager': 8.46.2
- '@typescript-eslint/types': 8.46.2
- '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3)
- eslint: 9.38.0
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
+ '@typescript-eslint/scope-manager': 8.46.4
+ '@typescript-eslint/types': 8.46.4
+ '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3)
+ eslint: 9.39.1
typescript: 5.9.3
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.46.2':
+ '@typescript-eslint/visitor-keys@8.46.4':
dependencies:
- '@typescript-eslint/types': 8.46.2
+ '@typescript-eslint/types': 8.46.4
eslint-visitor-keys: 4.2.1
- '@typespec/ts-http-runtime@0.3.1':
+ '@typespec/ts-http-runtime@0.3.2':
dependencies:
http-proxy-agent: 7.0.2
https-proxy-agent: 7.0.6
@@ -3961,7 +3961,7 @@ snapshots:
'@vscode/vsce-sign-win32-arm64': 2.0.6
'@vscode/vsce-sign-win32-x64': 2.0.6
- '@vscode/vsce@3.6.2':
+ '@vscode/vsce@3.7.0':
dependencies:
'@azure/identity': 4.13.0
'@secretlint/node': 10.2.2
@@ -4019,7 +4019,7 @@ snapshots:
json-schema-traverse: 1.0.0
require-from-string: 2.0.2
- ansi-escapes@7.1.1:
+ ansi-escapes@7.2.0:
dependencies:
environment: 1.1.0
@@ -4184,7 +4184,7 @@ snapshots:
chalk@5.6.2: {}
- chardet@2.1.0: {}
+ chardet@2.1.1: {}
cheerio-select@2.1.0:
dependencies:
@@ -4356,7 +4356,7 @@ snapshots:
dependencies:
version-range: 4.15.0
- emnapi@1.6.0: {}
+ emnapi@1.7.0: {}
emoji-regex@8.0.0: {}
@@ -4460,44 +4460,44 @@ snapshots:
is-date-object: 1.1.0
is-symbol: 1.1.1
- es-toolkit@1.40.0: {}
+ es-toolkit@1.41.0: {}
- esbuild@0.25.11:
+ esbuild@0.27.0:
optionalDependencies:
- '@esbuild/aix-ppc64': 0.25.11
- '@esbuild/android-arm': 0.25.11
- '@esbuild/android-arm64': 0.25.11
- '@esbuild/android-x64': 0.25.11
- '@esbuild/darwin-arm64': 0.25.11
- '@esbuild/darwin-x64': 0.25.11
- '@esbuild/freebsd-arm64': 0.25.11
- '@esbuild/freebsd-x64': 0.25.11
- '@esbuild/linux-arm': 0.25.11
- '@esbuild/linux-arm64': 0.25.11
- '@esbuild/linux-ia32': 0.25.11
- '@esbuild/linux-loong64': 0.25.11
- '@esbuild/linux-mips64el': 0.25.11
- '@esbuild/linux-ppc64': 0.25.11
- '@esbuild/linux-riscv64': 0.25.11
- '@esbuild/linux-s390x': 0.25.11
- '@esbuild/linux-x64': 0.25.11
- '@esbuild/netbsd-arm64': 0.25.11
- '@esbuild/netbsd-x64': 0.25.11
- '@esbuild/openbsd-arm64': 0.25.11
- '@esbuild/openbsd-x64': 0.25.11
- '@esbuild/openharmony-arm64': 0.25.11
- '@esbuild/sunos-x64': 0.25.11
- '@esbuild/win32-arm64': 0.25.11
- '@esbuild/win32-ia32': 0.25.11
- '@esbuild/win32-x64': 0.25.11
+ '@esbuild/aix-ppc64': 0.27.0
+ '@esbuild/android-arm': 0.27.0
+ '@esbuild/android-arm64': 0.27.0
+ '@esbuild/android-x64': 0.27.0
+ '@esbuild/darwin-arm64': 0.27.0
+ '@esbuild/darwin-x64': 0.27.0
+ '@esbuild/freebsd-arm64': 0.27.0
+ '@esbuild/freebsd-x64': 0.27.0
+ '@esbuild/linux-arm': 0.27.0
+ '@esbuild/linux-arm64': 0.27.0
+ '@esbuild/linux-ia32': 0.27.0
+ '@esbuild/linux-loong64': 0.27.0
+ '@esbuild/linux-mips64el': 0.27.0
+ '@esbuild/linux-ppc64': 0.27.0
+ '@esbuild/linux-riscv64': 0.27.0
+ '@esbuild/linux-s390x': 0.27.0
+ '@esbuild/linux-x64': 0.27.0
+ '@esbuild/netbsd-arm64': 0.27.0
+ '@esbuild/netbsd-x64': 0.27.0
+ '@esbuild/openbsd-arm64': 0.27.0
+ '@esbuild/openbsd-x64': 0.27.0
+ '@esbuild/openharmony-arm64': 0.27.0
+ '@esbuild/sunos-x64': 0.27.0
+ '@esbuild/win32-arm64': 0.27.0
+ '@esbuild/win32-ia32': 0.27.0
+ '@esbuild/win32-x64': 0.27.0
escape-html@1.0.3: {}
escape-string-regexp@4.0.0: {}
- eslint-config-prettier@10.1.8(eslint@9.38.0):
+ eslint-config-prettier@10.1.8(eslint@9.39.1):
dependencies:
- eslint: 9.38.0
+ eslint: 9.39.1
eslint-import-resolver-node@0.3.9:
dependencies:
@@ -4507,23 +4507,23 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0):
+ eslint-module-utils@2.12.1(@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1):
dependencies:
debug: 3.2.7
optionalDependencies:
- '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3)
- eslint: 9.38.0
+ '@typescript-eslint/parser': 8.46.4(eslint@9.39.1)(typescript@5.9.3)
+ eslint: 9.39.1
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
- supports-color
- eslint-plugin-es@3.0.1(eslint@9.38.0):
+ eslint-plugin-es@3.0.1(eslint@9.39.1):
dependencies:
- eslint: 9.38.0
+ eslint: 9.39.1
eslint-utils: 2.1.0
regexpp: 3.2.0
- eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint@9.38.0):
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3))(eslint@9.39.1):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.9
@@ -4532,9 +4532,9 @@ snapshots:
array.prototype.flatmap: 1.3.3
debug: 3.2.7
doctrine: 2.1.0
- eslint: 9.38.0
+ eslint: 9.39.1
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.38.0)
+ eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.46.4(eslint@9.39.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.1)
hasown: 2.0.2
is-core-module: 2.16.1
is-glob: 4.0.3
@@ -4546,16 +4546,16 @@ snapshots:
string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 8.46.2(eslint@9.38.0)(typescript@5.9.3)
+ '@typescript-eslint/parser': 8.46.4(eslint@9.39.1)(typescript@5.9.3)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
- eslint-plugin-node@11.1.0(eslint@9.38.0):
+ eslint-plugin-node@11.1.0(eslint@9.39.1):
dependencies:
- eslint: 9.38.0
- eslint-plugin-es: 3.0.1(eslint@9.38.0)
+ eslint: 9.39.1
+ eslint-plugin-es: 3.0.1(eslint@9.39.1)
eslint-utils: 2.1.0
ignore: 5.3.2
minimatch: 3.1.2
@@ -4577,16 +4577,16 @@ snapshots:
eslint-visitor-keys@4.2.1: {}
- eslint@9.38.0:
+ eslint@9.39.1:
dependencies:
- '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0)
- '@eslint-community/regexpp': 4.12.1
+ '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1)
+ '@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.21.1
- '@eslint/config-helpers': 0.4.1
- '@eslint/core': 0.16.0
+ '@eslint/config-helpers': 0.4.2
+ '@eslint/core': 0.17.0
'@eslint/eslintrc': 3.3.1
- '@eslint/js': 9.38.0
- '@eslint/plugin-kit': 0.4.0
+ '@eslint/js': 9.39.1
+ '@eslint/plugin-kit': 0.4.1
'@humanfs/node': 0.16.7
'@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.3
@@ -4767,10 +4767,10 @@ snapshots:
dependencies:
foreground-child: 3.3.1
jackspeak: 4.1.1
- minimatch: 10.0.3
+ minimatch: 10.1.1
minipass: 7.1.2
package-json-from-dist: 1.0.1
- path-scurry: 2.0.0
+ path-scurry: 2.0.1
globals@14.0.0: {}
@@ -5170,7 +5170,7 @@ snapshots:
mimic-response@3.1.0:
optional: true
- minimatch@10.0.3:
+ minimatch@10.1.1:
dependencies:
'@isaacs/brace-expansion': 5.0.0
@@ -5193,14 +5193,14 @@ snapshots:
mute-stream@0.0.8: {}
- mute-stream@2.0.0: {}
+ mute-stream@3.0.0: {}
napi-build-utils@2.0.0:
optional: true
natural-compare@1.4.0: {}
- node-abi@3.78.0:
+ node-abi@3.80.0:
dependencies:
semver: 7.7.3
optional: true
@@ -5295,7 +5295,7 @@ snapshots:
ovsx@0.10.6:
dependencies:
- '@vscode/vsce': 3.6.2
+ '@vscode/vsce': 3.7.0
commander: 6.2.1
follow-redirects: 1.15.11
is-ci: 2.0.0
@@ -5358,7 +5358,7 @@ snapshots:
path-parse@1.0.7: {}
- path-scurry@2.0.0:
+ path-scurry@2.0.1:
dependencies:
lru-cache: 11.2.2
minipass: 7.1.2
@@ -5389,7 +5389,7 @@ snapshots:
minimist: 1.2.8
mkdirp-classic: 0.5.3
napi-build-utils: 2.0.0
- node-abi: 3.78.0
+ node-abi: 3.80.0
pump: 3.0.3
rc: 1.2.8
simple-get: 4.0.1
@@ -5521,7 +5521,7 @@ snapshots:
safer-buffer@2.1.2: {}
- sax@1.4.1: {}
+ sax@1.4.3: {}
secretlint@10.2.2:
dependencies:
@@ -5739,7 +5739,7 @@ snapshots:
terminal-link@4.0.0:
dependencies:
- ansi-escapes: 7.1.1
+ ansi-escapes: 7.2.0
supports-hyperlinks: 3.2.0
text-table@0.2.0: {}
@@ -5948,7 +5948,7 @@ snapshots:
xml2js@0.5.0:
dependencies:
- sax: 1.4.1
+ sax: 1.4.3
xmlbuilder: 11.0.1
xmlbuilder@11.0.1: {}
diff --git a/extensions/VSCode/src/extension.ts b/extensions/VSCode/src/extension.ts
index cc6eaa76..ce5362ca 100644
--- a/extensions/VSCode/src/extension.ts
+++ b/extensions/VSCode/src/extension.ts
@@ -15,13 +15,13 @@
// [http://www.gnu.org/licenses](http://www.gnu.org/licenses).
//
// `extension.ts` - The CodeChat Editor Visual Studio Code extension
-// =================================================================
+// =============================================================================
//
// This extension creates a webview, then uses a websocket connection to the
// CodeChat Editor Server and Client to render editor text in that webview.
//
// Imports
-// -------
+// -----------------------------------------------------------------------------
//
// ### Node.js packages
import assert from "assert";
@@ -44,17 +44,17 @@ import {
MessageResult,
UpdateMessageContents,
} from "../../../client/src/shared_types.mjs";
+import {
+ DEBUG_ENABLED,
+ MAX_MESSAGE_LENGTH,
+} from "../../../client/src/debug_enabled.mjs";
// Globals
-// -------
+// -----------------------------------------------------------------------------
enum CodeChatEditorClientLocation {
html,
browser,
}
-// The max length of a message to show in the console.
-const MAX_MESSAGE_LENGTH = 200;
-// True to enable additional debug logging.
-const DEBUG_ENABLED = true;
// True on Windows, false on OS X / Linux.
const is_windows = process.platform === "win32";
@@ -106,7 +106,7 @@ let codeChatEditorServer: CodeChatEditorServer | undefined;
}
// Activation/deactivation
-// -----------------------
+// -----------------------------------------------------------------------------
//
// This is invoked when the extension is activated. It either creates a new
// CodeChat Editor Server instance or reveals the currently running one.
@@ -445,8 +445,8 @@ export const activate = (context: vscode.ExtensionContext) => {
// [openCustomDocument](https://code.visualstudio.com/api/references/vscode-api#CustomEditorProvider.openCustomDocument),
// which can evidently be called
// [indirectly](https://stackoverflow.com/a/65101181/4374935).
- // See also [Built-in
- // Commands](https://code.visualstudio.com/api/references/commands).
+ // See also
+ // [Built-in Commands](https://code.visualstudio.com/api/references/commands).
// For now, simply respond with an OK, since the
// following doesn't work.
if (false) {
@@ -535,7 +535,7 @@ export const deactivate = async () => {
};
// Supporting functions
-// --------------------
+// -----------------------------------------------------------------------------
//
// Format a complex data structure as a string when in debug mode.
const format_struct = (complex_data_structure: any): string =>
@@ -679,8 +679,8 @@ const get_document = (file_path: string) => {
// are case-insensitive; I don't know how to easily determine the
// case-sensitivity of the current filesystem without extra probing code
// (write a file in mixed case, try to open it in another mixed case.)
- // Per [How to Work with Different
- // Filesystems](https://nodejs.org/en/learn/manipulating-files/working-with-different-filesystems#filesystem-behavior),
+ // Per
+ // [How to Work with Different Filesystems](https://nodejs.org/en/learn/manipulating-files/working-with-different-filesystems#filesystem-behavior),
// "Be wary of inferring filesystem behavior from `process.platform`.
// For example, do not assume that because your program is running on
// Darwin that you are therefore working on a case-insensitive
diff --git a/server/.cargo/config.toml b/server/.cargo/config.toml
index 0a352f1a..c5dd86a9 100644
--- a/server/.cargo/config.toml
+++ b/server/.cargo/config.toml
@@ -1,15 +1,15 @@
# `config` - a Cargo configuration file
-# =====================================
+# ==============================================================================
#
# See the [docs](https://doc.rust-lang.org/cargo/reference/config.html) for this
# file.
#
# ts\_rs config
-# -------------
+# ------------------------------------------------------------------------------
#
# Configure the directory where `ts-rs` places the generated files per the docs.
-# See also the [cargo config
-# docs](https://doc.rust-lang.org/cargo/reference/config.html#configuration-format)
+# See also the
+# [cargo config docs](https://doc.rust-lang.org/cargo/reference/config.html#configuration-format)
# for environment variable setting.
[env]
TS_RS_EXPORT_DIR = { value = "../client/src/rust-types", relative = true }
@@ -19,23 +19,22 @@ TS_RS_IMPORT_EXTENSION = "ts"
# Code coverage, the manual way:
#
-# 1. Run `cargo install rustfilt` per the [code coverage
-# docs](https://doc.rust-lang.org/rustc/instrument-coverage.html#building-the-demangler).
-# 2. You must manually run `rustup component add llvm-tools-preview` following
-# the [coverge
-# docs](https://doc.rust-lang.org/rustc/instrument-coverage.html#installing-llvm-coverage-tools).
-# Per some searching, also run `cargo install cargo-binutils` to put these
-# tools in the path.
-# 3. In Powershell, `$Env:RUSTFLAGS = "-C instrument-coverage"` then `cargo
-# test`. When the tests run, record the name of the test binary.
-# 4. `rust-profdata merge -sparse default_*.profraw -o default.profdata`.
-# 5. `rust-cov show --Xdemangler=rustfilt
-# target\debug\deps\code_chat_editor-4dbe5c7815a53cd9.exe
-# --instr-profile=default.profdata
-# --ignore-filename-regex=\\.cargo\\registry --format=html
-# --output-dir=coverage`, replacing the binary path with the one recorded in
-# step 3.
-# 6. Open the file `coverage\index.html`.
+# 1. Run `cargo install rustfilt` per the
+# [code coverage docs](https://doc.rust-lang.org/rustc/instrument-coverage.html#building-the-demangler).
+# 2. You must manually run `rustup component add llvm-tools-preview` following
+# the
+# [coverge docs](https://doc.rust-lang.org/rustc/instrument-coverage.html#installing-llvm-coverage-tools).
+# Per some searching, also run `cargo install cargo-binutils` to put these
+# tools in the path.
+# 3. In Powershell, `$Env:RUSTFLAGS = "-C instrument-coverage"` then `cargo
+# test`. When the tests run, record the name of the test binary.
+# 4. `rust-profdata merge -sparse default_*.profraw -o default.profdata`.
+# 5. `rust-cov show --Xdemangler=rustfilt
+# target\debug\deps\code_chat_editor-4dbe5c7815a53cd9.exe
+# --instr-profile=default.profdata --ignore-filename-regex=\\.cargo\\registry
+# --format=html --output-dir=coverage`, replacing the binary path with the
+# one recorded in step 3.
+# 6. Open the file `coverage\index.html`.
#
# Or, `cargo install cargo-tarpaulin` then `cargo tarpaulin --ignore-panics
# --out=html --skip-clean`.
diff --git a/server/Cargo.lock b/server/Cargo.lock
index 79c8f18c..e0a40f43 100644
--- a/server/Cargo.lock
+++ b/server/Cargo.lock
@@ -88,7 +88,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb"
dependencies = [
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -206,7 +206,7 @@ dependencies = [
"actix-router",
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -255,9 +255,9 @@ checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa"
[[package]]
name = "aho-corasick"
-version = "1.1.3"
+version = "1.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
+checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301"
dependencies = [
"memchr",
]
@@ -277,6 +277,12 @@ dependencies = [
"alloc-no-stdlib",
]
+[[package]]
+name = "allocator-api2"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+
[[package]]
name = "android_system_properties"
version = "0.1.5"
@@ -419,13 +425,12 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
[[package]]
name = "assert_cmd"
-version = "2.0.17"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2bd389a4b2970a01282ee455294913c0a43724daedcd1a24c3eb0ec1c1320b66"
+checksum = "bcbb6924530aa9e0432442af08bbcafdad182db80d2e560da42a6d442535bf85"
dependencies = [
"anstyle",
"bstr",
- "doc-comment",
"libc",
"predicates",
"predicates-core",
@@ -462,7 +467,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -573,9 +578,9 @@ dependencies = [
[[package]]
name = "bstr"
-version = "1.12.0"
+version = "1.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "234113d19d0d7d613b40e86fb654acf958910802bcceab913a4f9e7cda03b1a4"
+checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab"
dependencies = [
"memchr",
"regex-automata",
@@ -587,6 +592,9 @@ name = "bumpalo"
version = "3.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43"
+dependencies = [
+ "allocator-api2",
+]
[[package]]
name = "byteorder"
@@ -643,9 +651,9 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.2.41"
+version = "1.2.45"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7"
+checksum = "35900b6c8d709fb1d854671ae27aeaa9eec2f8b01b364e1619a40da3e6fe2afe"
dependencies = [
"find-msvc-tools",
"jobserver",
@@ -698,9 +706,9 @@ dependencies = [
[[package]]
name = "clap"
-version = "4.5.50"
+version = "4.5.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c2cfd7bf8a6017ddaa4e32ffe7403d547790db06bd171c1c53926faab501623"
+checksum = "4c26d721170e0295f191a69bd9a1f93efcdb0aff38684b61ab5750468972e5f5"
dependencies = [
"clap_builder",
"clap_derive",
@@ -708,9 +716,9 @@ dependencies = [
[[package]]
name = "clap_builder"
-version = "4.5.50"
+version = "4.5.51"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0a4c05b9e80c5ccd3a7ef080ad7b6ba7d6fc00a985b8b157197075677c82c7a0"
+checksum = "75835f0c7bf681bfd05abe44e965760fea999a5286c6eb2d59883634fd02011a"
dependencies = [
"anstream",
"anstyle",
@@ -727,7 +735,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -738,7 +746,7 @@ checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
[[package]]
name = "codechat-editor-server"
-version = "0.1.39"
+version = "0.1.40"
dependencies = [
"actix-files",
"actix-http",
@@ -754,9 +762,11 @@ dependencies = [
"bytes",
"chrono",
"clap",
+ "dprint-plugin-markdown",
"dunce",
"futures",
"futures-util",
+ "htmd",
"imara-diff",
"indoc",
"lazy_static",
@@ -772,7 +782,7 @@ dependencies = [
"pest_derive",
"predicates",
"pretty_assertions",
- "pulldown-cmark",
+ "pulldown-cmark 0.13.0",
"rand 0.9.2",
"regex",
"serde",
@@ -997,9 +1007,9 @@ dependencies = [
[[package]]
name = "deranged"
-version = "0.5.4"
+version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071"
+checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587"
dependencies = [
"powerfmt",
]
@@ -1012,7 +1022,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -1032,7 +1042,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
"unicode-xid",
]
@@ -1094,14 +1104,53 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
name = "doc-comment"
-version = "0.3.3"
+version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10"
+checksum = "780955b8b195a21ab8e4ac6b60dd1dbdcec1dc6c51c0617964b08c81785e12c9"
+
+[[package]]
+name = "dprint-core"
+version = "0.67.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2c1d827947704a9495f705d6aeed270fa21a67f825f22902c28f38dc3af7a9ae"
+dependencies = [
+ "anyhow",
+ "bumpalo",
+ "hashbrown 0.15.5",
+ "indexmap 2.12.0",
+ "rustc-hash",
+ "serde",
+ "unicode-width 0.2.2",
+]
+
+[[package]]
+name = "dprint-core-macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1675ad2b358481f3cc46202040d64ac7a36c4ade414a696df32e0e45421a6e9f"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "dprint-plugin-markdown"
+version = "0.20.0"
+source = "git+https://github.com/bjones1/dprint-plugin-markdown.git?branch=all-fixes#b7829488bb3713b58a38a842abbee88239a2c384"
+dependencies = [
+ "anyhow",
+ "dprint-core",
+ "dprint-core-macros",
+ "pulldown-cmark 0.11.3",
+ "regex",
+ "serde",
+ "unicode-width 0.1.14",
+]
[[package]]
name = "dunce"
@@ -1221,9 +1270,9 @@ checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127"
[[package]]
name = "flate2"
-version = "1.1.4"
+version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9"
+checksum = "bfe33edd8e85a12a67454e37f8c75e730830d83e313556ab9ebf9ee7fbeb3bfb"
dependencies = [
"crc32fast",
"libz-rs-sys",
@@ -1285,6 +1334,16 @@ dependencies = [
"libc",
]
+[[package]]
+name = "futf"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
+dependencies = [
+ "mac",
+ "new_debug_unreachable",
+]
+
[[package]]
name = "futures"
version = "0.3.31"
@@ -1341,7 +1400,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -1419,9 +1478,9 @@ checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7"
[[package]]
name = "globset"
-version = "0.4.17"
+version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eab69130804d941f8075cfd713bf8848a2c3b3f201a9457a11e6f87e1ab62305"
+checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3"
dependencies = [
"aho-corasick",
"bstr",
@@ -1472,6 +1531,8 @@ version = "0.15.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
dependencies = [
+ "allocator-api2",
+ "equivalent",
"foldhash",
]
@@ -1502,6 +1563,27 @@ dependencies = [
"digest",
]
+[[package]]
+name = "htmd"
+version = "0.3.2"
+source = "git+https://github.com/bjones1/htmd.git?branch=fix-faithful-serialization#d7e755a6c4d12a9c670bdd9236d1cea69818bcf5"
+dependencies = [
+ "html5ever",
+ "markup5ever_rcdom",
+ "phf 0.13.1",
+]
+
+[[package]]
+name = "html5ever"
+version = "0.35.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55d958c2f74b664487a2035fe1dadb032c48718a03b63f3ab0b8537db8549ed4"
+dependencies = [
+ "log",
+ "markup5ever",
+ "match_token",
+]
+
[[package]]
name = "http"
version = "0.2.12"
@@ -1659,9 +1741,9 @@ dependencies = [
[[package]]
name = "icu_collections"
-version = "2.0.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47"
+checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43"
dependencies = [
"displaydoc",
"potential_utf",
@@ -1672,9 +1754,9 @@ dependencies = [
[[package]]
name = "icu_locale_core"
-version = "2.0.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a"
+checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6"
dependencies = [
"displaydoc",
"litemap",
@@ -1685,11 +1767,10 @@ dependencies = [
[[package]]
name = "icu_normalizer"
-version = "2.0.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979"
+checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599"
dependencies = [
- "displaydoc",
"icu_collections",
"icu_normalizer_data",
"icu_properties",
@@ -1700,42 +1781,38 @@ dependencies = [
[[package]]
name = "icu_normalizer_data"
-version = "2.0.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3"
+checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a"
[[package]]
name = "icu_properties"
-version = "2.0.1"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b"
+checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99"
dependencies = [
- "displaydoc",
"icu_collections",
"icu_locale_core",
"icu_properties_data",
"icu_provider",
- "potential_utf",
"zerotrie",
"zerovec",
]
[[package]]
name = "icu_properties_data"
-version = "2.0.1"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632"
+checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899"
[[package]]
name = "icu_provider"
-version = "2.0.0"
+version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af"
+checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614"
dependencies = [
"displaydoc",
"icu_locale_core",
- "stable_deref_trait",
- "tinystr",
"writeable",
"yoke",
"zerofrom",
@@ -1766,9 +1843,9 @@ dependencies = [
[[package]]
name = "ignore"
-version = "0.4.24"
+version = "0.4.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81776e6f9464432afcc28d03e52eb101c93b6f0566f52aef2427663e700f0403"
+checksum = "d3d782a365a015e0f5c04902246139249abf769125006fbe7649e2ee88169b4a"
dependencies = [
"crossbeam-deque",
"globset",
@@ -1814,13 +1891,18 @@ checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f"
dependencies = [
"equivalent",
"hashbrown 0.16.0",
+ "serde",
+ "serde_core",
]
[[package]]
name = "indoc"
-version = "2.0.6"
+version = "2.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
+checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
+dependencies = [
+ "rustversion",
+]
[[package]]
name = "infer"
@@ -1868,9 +1950,9 @@ checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
[[package]]
name = "iri-string"
-version = "0.7.8"
+version = "0.7.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2"
+checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397"
dependencies = [
"memchr",
"serde",
@@ -1899,26 +1981,26 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c"
[[package]]
name = "jiff"
-version = "0.2.15"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be1f93b8b1eb69c77f24bbb0afdf66f54b632ee39af40ca21c4365a1d7347e49"
+checksum = "49cce2b81f2098e7e3efc35bc2e0a6b7abec9d34128283d7a26fa8f32a6dbb35"
dependencies = [
"jiff-static",
"log",
"portable-atomic",
"portable-atomic-util",
- "serde",
+ "serde_core",
]
[[package]]
name = "jiff-static"
-version = "0.2.15"
+version = "0.2.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4"
+checksum = "980af8b43c3ad5d8d349ace167ec8170839f753a42d233ba19e08afe1850fa69"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -1955,9 +2037,9 @@ dependencies = [
[[package]]
name = "js-sys"
-version = "0.3.81"
+version = "0.3.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305"
+checksum = "b011eec8cc36da2aab2d5cff675ec18454fad408585853910a202391cf9f8e65"
dependencies = [
"once_cell",
"wasm-bindgen",
@@ -2035,9 +2117,9 @@ checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039"
[[package]]
name = "litemap"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
+checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77"
[[package]]
name = "local-channel"
@@ -2135,6 +2217,46 @@ dependencies = [
"pkg-config",
]
+[[package]]
+name = "mac"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
+
+[[package]]
+name = "markup5ever"
+version = "0.35.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "311fe69c934650f8f19652b3946075f0fc41ad8757dbb68f1ca14e7900ecc1c3"
+dependencies = [
+ "log",
+ "tendril",
+ "web_atoms",
+]
+
+[[package]]
+name = "markup5ever_rcdom"
+version = "0.35.0+unofficial"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8bcd53df4748257345b8bc156d620340ce0f015ec1c7ef1cff475543888a31d"
+dependencies = [
+ "html5ever",
+ "markup5ever",
+ "tendril",
+ "xml5ever",
+]
+
+[[package]]
+name = "match_token"
+version = "0.35.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac84fd3f360fcc43dc5f5d186f02a94192761a080e8bc58621ad4d12296a58cf"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.110",
+]
+
[[package]]
name = "md-5"
version = "0.10.6"
@@ -2207,6 +2329,12 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b"
+[[package]]
+name = "new_debug_unreachable"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
+
[[package]]
name = "normalize-line-endings"
version = "0.3.0"
@@ -2417,7 +2545,7 @@ dependencies = [
"pest_meta",
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -2430,16 +2558,78 @@ dependencies = [
"sha2",
]
+[[package]]
+name = "phf"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078"
+dependencies = [
+ "phf_shared 0.11.3",
+]
+
[[package]]
name = "phf"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf"
dependencies = [
- "phf_shared",
+ "phf_macros",
+ "phf_shared 0.13.1",
"serde",
]
+[[package]]
+name = "phf_codegen"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aef8048c789fa5e851558d709946d6d79a8ff88c0440c587967f8e94bfb1216a"
+dependencies = [
+ "phf_generator 0.11.3",
+ "phf_shared 0.11.3",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d"
+dependencies = [
+ "phf_shared 0.11.3",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "phf_generator"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737"
+dependencies = [
+ "fastrand",
+ "phf_shared 0.13.1",
+]
+
+[[package]]
+name = "phf_macros"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef"
+dependencies = [
+ "phf_generator 0.13.1",
+ "phf_shared 0.13.1",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.110",
+]
+
+[[package]]
+name = "phf_shared"
+version = "0.11.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5"
+dependencies = [
+ "siphasher",
+]
+
[[package]]
name = "phf_shared"
version = "0.13.1"
@@ -2514,9 +2704,9 @@ dependencies = [
[[package]]
name = "potential_utf"
-version = "0.1.3"
+version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a"
+checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77"
dependencies = [
"zerovec",
]
@@ -2536,6 +2726,12 @@ dependencies = [
"zerocopy",
]
+[[package]]
+name = "precomputed-hash"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
+
[[package]]
name = "predicates"
version = "3.1.3"
@@ -2578,13 +2774,24 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.101"
+version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de"
+checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8"
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 2.10.0",
+ "memchr",
+ "unicase",
+]
+
[[package]]
name = "pulldown-cmark"
version = "0.13.0"
@@ -2660,9 +2867,9 @@ dependencies = [
[[package]]
name = "quote"
-version = "1.0.41"
+version = "1.0.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1"
+checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f"
dependencies = [
"proc-macro2",
]
@@ -2868,9 +3075,9 @@ dependencies = [
[[package]]
name = "rustls"
-version = "0.23.33"
+version = "0.23.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "751e04a496ca00bb97a5e043158d23d66b5aabf2e1d5aa2a0aaebb1aafe6f82c"
+checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f"
dependencies = [
"once_cell",
"ring",
@@ -2882,9 +3089,9 @@ dependencies = [
[[package]]
name = "rustls-pki-types"
-version = "1.12.0"
+version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79"
+checksum = "94182ad936a0c91c324cd46c6511b9510ed16af436d7b5bab34beab0afd55f7a"
dependencies = [
"web-time",
"zeroize",
@@ -2892,9 +3099,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
-version = "0.103.7"
+version = "0.103.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf"
+checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52"
dependencies = [
"ring",
"rustls-pki-types",
@@ -2945,7 +3152,7 @@ checksum = "1783eabc414609e28a5ba76aee5ddd52199f7107a0b24c2e9746a1ecc34a683d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -3031,7 +3238,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -3056,7 +3263,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -3222,6 +3429,31 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+[[package]]
+name = "string_cache"
+version = "0.8.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf776ba3fa74f83bf4b63c3dcbbf82173db2632ed8452cb2d891d33f459de70f"
+dependencies = [
+ "new_debug_unreachable",
+ "parking_lot",
+ "phf_shared 0.11.3",
+ "precomputed-hash",
+ "serde",
+]
+
+[[package]]
+name = "string_cache_codegen"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c711928715f1fe0fe509c53b43e993a9a557babc2d0a3567d0a3006f1ac931a0"
+dependencies = [
+ "phf_generator 0.11.3",
+ "phf_shared 0.11.3",
+ "proc-macro2",
+ "quote",
+]
+
[[package]]
name = "stringmatch"
version = "0.4.0"
@@ -3267,9 +3499,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "2.0.107"
+version = "2.0.110"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2a26dbd934e5451d21ef060c018dae56fc073894c5a7896f882928a76e6d081b"
+checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea"
dependencies = [
"proc-macro2",
"quote",
@@ -3293,7 +3525,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -3320,6 +3552,17 @@ dependencies = [
"windows-sys 0.61.2",
]
+[[package]]
+name = "tendril"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
+dependencies = [
+ "futf",
+ "mac",
+ "utf-8",
+]
+
[[package]]
name = "termcolor"
version = "1.4.1"
@@ -3371,7 +3614,7 @@ source = "git+https://github.com/bjones1/thirtyfour.git?branch=selenium_manager#
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -3400,7 +3643,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -3411,7 +3654,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -3457,9 +3700,9 @@ dependencies = [
[[package]]
name = "tinystr"
-version = "0.8.1"
+version = "0.8.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b"
+checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869"
dependencies = [
"displaydoc",
"zerovec",
@@ -3505,7 +3748,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -3523,7 +3766,7 @@ dependencies = [
"log",
"parking_lot",
"percent-encoding",
- "phf",
+ "phf 0.13.1",
"pin-project-lite",
"postgres-protocol",
"postgres-types",
@@ -3558,9 +3801,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.16"
+version = "0.7.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5"
+checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594"
dependencies = [
"bytes",
"futures-core",
@@ -3673,7 +3916,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -3709,7 +3952,7 @@ checksum = "ee6ff59666c9cbaec3533964505d39154dc4e0a56151fdea30a09ed0301f62e2"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
"termcolor",
]
@@ -3765,24 +4008,24 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
[[package]]
name = "unicode-ident"
-version = "1.0.20"
+version = "1.0.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06"
+checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
[[package]]
name = "unicode-normalization"
-version = "0.1.24"
+version = "0.1.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956"
+checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8"
dependencies = [
"tinyvec",
]
[[package]]
name = "unicode-properties"
-version = "0.1.3"
+version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0"
+checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d"
[[package]]
name = "unicode-segmentation"
@@ -3790,6 +4033,18 @@ version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
+[[package]]
+name = "unicode-width"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
+
+[[package]]
+name = "unicode-width"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
+
[[package]]
name = "unicode-xid"
version = "0.2.6"
@@ -3926,9 +4181,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
[[package]]
name = "wasm-bindgen"
-version = "0.2.104"
+version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d"
+checksum = "da95793dfc411fbbd93f5be7715b0578ec61fe87cb1a42b12eb625caa5c5ea60"
dependencies = [
"cfg-if",
"once_cell",
@@ -3937,25 +4192,11 @@ dependencies = [
"wasm-bindgen-shared",
]
-[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.104"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19"
-dependencies = [
- "bumpalo",
- "log",
- "proc-macro2",
- "quote",
- "syn 2.0.107",
- "wasm-bindgen-shared",
-]
-
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.54"
+version = "0.4.55"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c"
+checksum = "551f88106c6d5e7ccc7cd9a16f312dd3b5d36ea8b4954304657d5dfba115d4a0"
dependencies = [
"cfg-if",
"js-sys",
@@ -3966,9 +4207,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.104"
+version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119"
+checksum = "04264334509e04a7bf8690f2384ef5265f05143a4bff3889ab7a3269adab59c2"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -3976,31 +4217,31 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.104"
+version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7"
+checksum = "420bc339d9f322e562942d52e115d57e950d12d88983a14c79b86859ee6c7ebc"
dependencies = [
+ "bumpalo",
"proc-macro2",
"quote",
- "syn 2.0.107",
- "wasm-bindgen-backend",
+ "syn 2.0.110",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.104"
+version = "0.2.105"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1"
+checksum = "76f218a38c84bcb33c25ec7059b07847d465ce0e0a76b995e134a45adcb6af76"
dependencies = [
"unicode-ident",
]
[[package]]
name = "web-sys"
-version = "0.3.81"
+version = "0.3.82"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120"
+checksum = "3a1f95c0d03a47f4ae1f7a64643a6bb97465d9b740f0fa8f90ea33915c99a9a1"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -4016,6 +4257,18 @@ dependencies = [
"wasm-bindgen",
]
+[[package]]
+name = "web_atoms"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57ffde1dc01240bdf9992e3205668b235e59421fd085e8a317ed98da0178d414"
+dependencies = [
+ "phf 0.11.3",
+ "phf_codegen",
+ "string_cache",
+ "string_cache_codegen",
+]
+
[[package]]
name = "webbrowser"
version = "1.0.6"
@@ -4034,9 +4287,9 @@ dependencies = [
[[package]]
name = "webpki-roots"
-version = "1.0.3"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8"
+checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e"
dependencies = [
"rustls-pki-types",
]
@@ -4135,7 +4388,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -4146,7 +4399,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -4440,9 +4693,9 @@ checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59"
[[package]]
name = "writeable"
-version = "0.6.1"
+version = "0.6.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb"
+checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9"
[[package]]
name = "x509-certificate"
@@ -4475,9 +4728,19 @@ dependencies = [
[[package]]
name = "xml-rs"
-version = "0.8.27"
+version = "0.8.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f"
+
+[[package]]
+name = "xml5ever"
+version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7"
+checksum = "ee3f1e41afb31a75aef076563b0ad3ecc24f5bd9d12a72b132222664eb76b494"
+dependencies = [
+ "log",
+ "markup5ever",
+]
[[package]]
name = "xz2"
@@ -4496,11 +4759,10 @@ checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049"
[[package]]
name = "yoke"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc"
+checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954"
dependencies = [
- "serde",
"stable_deref_trait",
"yoke-derive",
"zerofrom",
@@ -4508,13 +4770,13 @@ dependencies = [
[[package]]
name = "yoke-derive"
-version = "0.8.0"
+version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
+checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
"synstructure",
]
@@ -4535,7 +4797,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -4555,7 +4817,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
"synstructure",
]
@@ -4576,14 +4838,14 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
name = "zerotrie"
-version = "0.2.2"
+version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595"
+checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851"
dependencies = [
"displaydoc",
"yoke",
@@ -4592,9 +4854,9 @@ dependencies = [
[[package]]
name = "zerovec"
-version = "0.11.4"
+version = "0.11.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b"
+checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002"
dependencies = [
"yoke",
"zerofrom",
@@ -4603,13 +4865,13 @@ dependencies = [
[[package]]
name = "zerovec-derive"
-version = "0.11.1"
+version = "0.11.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
+checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3"
dependencies = [
"proc-macro2",
"quote",
- "syn 2.0.107",
+ "syn 2.0.110",
]
[[package]]
@@ -4634,9 +4896,9 @@ checksum = "2f06ae92f42f5e5c42443fd094f245eb656abf56dd7cce9b8b263236565e00f2"
[[package]]
name = "zopfli"
-version = "0.8.2"
+version = "0.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edfc5ee405f504cd4984ecc6f14d02d55cfda60fa4b689434ef4102aae150cd7"
+checksum = "f05cd8797d63865425ff89b5c4a48804f35ba0ce8d125800027ad6017d2b5249"
dependencies = [
"bumpalo",
"crc32fast",
diff --git a/server/Cargo.toml b/server/Cargo.toml
index b8e9f9e9..bd85b385 100644
--- a/server/Cargo.toml
+++ b/server/Cargo.toml
@@ -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.1.39"
+version = "0.1.40"
# This library allows other packages to use core CodeChat Editor features.
[lib]
@@ -69,10 +69,12 @@ assertables = { version = "9", optional = true }
bytes = { version = "1", features = ["serde"] }
chrono = "0.4"
clap = { version = "4.5.19", features = ["derive"] }
+dprint-plugin-markdown = { git = "https://github.com/bjones1/dprint-plugin-markdown.git", branch = "all-fixes", version = "0.20.0" }
dunce = "1.0.5"
# This is also for integration testing.
futures = { version = "0.3.31", optional = true }
futures-util = "0.3.29"
+htmd = { git = "https://github.com/bjones1/htmd.git", branch = "fix-faithful-serialization", version = "0.3.2" }
imara-diff = { version = "0.2", features = [] }
indoc = "2.0.5"
lazy_static = "1"
diff --git a/server/log4rs.yml b/server/log4rs.yml
index ff3752ed..544068f2 100644
--- a/server/log4rs.yml
+++ b/server/log4rs.yml
@@ -34,6 +34,11 @@ appenders:
encoder:
pattern: "{d} {l} {t} {L} - {m}{n}"
+loggers:
+ # This produces a massive amount of logging at the debug level. Avoid this.
+ html5ever:
+ level: warn
+
root:
level: info
appenders:
diff --git a/server/src/ide/filewatcher.rs b/server/src/ide/filewatcher.rs
index 8d990387..042717f8 100644
--- a/server/src/ide/filewatcher.rs
+++ b/server/src/ide/filewatcher.rs
@@ -58,7 +58,7 @@ use crate::{
queue_send,
webserver::{
INITIAL_IDE_MESSAGE_ID, MESSAGE_ID_INCREMENT, ResultOkTypes, WebAppState,
- filesystem_endpoint, get_test_mode, url_to_path,
+ filesystem_endpoint, get_test_mode,
},
};
use crate::{
@@ -604,34 +604,30 @@ async fn processing_task(
send_response(&from_ide_tx, m.id, result).await;
}
- EditorMessageContents::CurrentFile(url_string, _is_text) => {
- let result = match url_to_path(&url_string, FILEWATCHER_PATH_PREFIX) {
- Err(err) => Err(err),
- Ok(ref file_path) => 'err_exit: {
- // We finally have the desired path! First,
- // unwatch the old path.
- if let Some(cfp) = ¤t_filepath
- && let Err(err) = debounced_watcher.unwatch(cfp)
- {
- break 'err_exit Err(format!(
- "Unable to unwatch file '{}': {err}.",
- cfp.to_string_lossy()
- ));
- }
- // Update to the new path.
- current_filepath = Some(file_path.to_path_buf());
-
- // Watch the new file.
- if let Err(err) = debounced_watcher.watch(file_path, RecursiveMode::NonRecursive) {
- break 'err_exit Err(format!(
- "Unable to watch file '{}': {err}.",
- file_path.to_string_lossy()
- ));
- }
- // Indicate there was no error in the
- // `Result` message.
- Ok(ResultOkTypes::Void)
+ EditorMessageContents::CurrentFile(file_path_str, _is_text) => {
+ let file_path = PathBuf::from(file_path_str.clone());
+ let result = 'err_exit: {
+ // Unwatch the old path.
+ if let Some(cfp) = ¤t_filepath
+ && let Err(err) = debounced_watcher.unwatch(cfp)
+ {
+ break 'err_exit Err(format!(
+ "Unable to unwatch file '{}': {err}.",
+ cfp.to_string_lossy()
+ ));
}
+ // Update to the new path.
+ current_filepath = Some(file_path.to_path_buf());
+
+ // Watch the new file.
+ if let Err(err) = debounced_watcher.watch(file_path, RecursiveMode::NonRecursive) {
+ break 'err_exit Err(format!(
+ "Unable to watch file '{file_path_str}': {err}.",
+ ));
+ }
+ // Indicate there was no error in the `Result`
+ // message.
+ Ok(ResultOkTypes::Void)
};
send_response(&from_ide_tx, m.id, result).await;
},
diff --git a/server/src/ide/vscode/tests.rs b/server/src/ide/vscode/tests.rs
index f9541181..fd3e109b 100644
--- a/server/src/ide/vscode/tests.rs
+++ b/server/src/ide/vscode/tests.rs
@@ -1045,7 +1045,7 @@ async fn test_vscode_ide_websocket4() {
to: 6,
indent: "".to_string(),
delimiter: "#".to_string(),
- contents: "test.py".to_string(),
+ contents: "test.py
".to_string(),
}],
}),
}),
diff --git a/server/src/lexer/lexer-walkthrough.md b/server/src/lexer/lexer-walkthrough.md
index a3d78817..261ece09 100644
--- a/server/src/lexer/lexer-walkthrough.md
+++ b/server/src/lexer/lexer-walkthrough.md
@@ -17,7 +17,7 @@ License along with the CodeChat Editor. If not, see
[https://www.gnu.org/licenses/](https://www.gnu.org/licenses/).
Lexer walkthrough
-=================
+================================================================================
This walkthrough shows how the lexer parses the following Python code fragment:
@@ -31,28 +31,25 @@ Paragraph marks (the ¶ character) are included to show how the lexer handles
newlines. To explain the operation of the lexer, the code will be highlighted in
yellow to represent the unlexed source
code, represented by the contents of the variable
-`source_code[source_code_unlexed_index..]` and in green for the current code block, defined by
+`source_code[source_code_unlexed_index..]` and in green for the
+current code block, defined by
`source_code[current_code_block_index..source_code_unlexed_index]`. Code that is
classified by the lexer will be placed in the `classified_code` array.
Start of parse
---------------
+--------------------------------------------------------------------------------
The unlexed source code holds
-all the code (everything is highlighted in yellow); the current code block is empty (there is
-no green highlight).
+all the code (everything is highlighted in yellow); the
+current code block is empty
+(there is no green highlight).
-print("""¶\
+print("""¶\
#
This is not a comment! It's a multi-line string.¶\
-""")¶\
-
- # This is a comment.
+""")¶\
+
+# This is a comment.
```
classified_code = [
@@ -60,23 +57,20 @@ classified_code = [
```
Search for a token
-------------------
+--------------------------------------------------------------------------------
The lexer begins by searching for the regex in
`language_lexer_compiled.next_token`, which is `(\#)|(""")|(''')|(")|(')`. The
-first token found is """.
-Everything up to the match is moved from the unlexed source code to the current
-code block, giving:
+first token found is `"""`. Everything up
+to the match is moved from the unlexed source code to the current code block,
+giving:
-print("""¶\
+print("""¶\
#
This is not a comment! It's a multi-line string.¶\
-""")¶\
-
- # This is a comment.
+""")¶\
+
+# This is a comment.
```
classified_code = [
@@ -84,7 +78,7 @@ classified_code = [
```
String processing
------------------
+--------------------------------------------------------------------------------
The regex is accompanied by a map named `language_lexer_compiled.map`, which
connects the mapped group to which token it matched (see `struct
@@ -98,21 +92,18 @@ Group: 1 2 3 4 5
Since group 2 matched, looking up this group in the map tells the lexer it’s a
string, and also gives a regex which identifies the end of the string . This
-regex identifies the end of the string, moving it from the (unclassified) source code to the
-(classified) current code block.
-It correctly skips what looks like a comment but is not a comment. After this
-step, the lexer’s state is:
-
-print("""¶\
+regex identifies the end of the string, moving it from the
+(unclassified) source code to
+the (classified) current code
+block. It correctly skips what looks like a comment but is not a comment.
+After this step, the lexer’s state is:
+
+print("""¶\
#
This is not a comment! It's a multi-line string.¶\
-""")¶\
-
- # This is a comment.
+""")¶\
+
+# This is a comment.
```
classified_code = [
@@ -120,24 +111,21 @@ classified_code = [
```
Search for a token (second time)
---------------------------------
+--------------------------------------------------------------------------------
Now, the lexer is back to its state of looking through code (as opposed to
looking inside a string, comment, etc.). It uses the `next_token` regex as
-before to identify the next token # and moves all the preceding characters from
-source code to the current code block. The lexer state is now:
+before to identify the next token `#` and
+moves all the preceding characters from source code to the current code block.
+The lexer state is now:
-print("""¶\
+print("""¶\
#
This is not a comment! It's a multi-line string.¶\
-""")¶\
-
- # This is a
-comment.
+""")¶\
+
+`#
+This is a comment.`
```
classified_code = [
@@ -145,30 +133,26 @@ classified_code = [
```
Inline comment lex
-------------------
+--------------------------------------------------------------------------------
Based on the map, the lexer identifies this as an inline comment. The inline
comment lexer first identifies the end of the comment (the next newline or, as
in this case, the end of the file), putting the entire inline comment except for
-the comment opening delimiter # into full_comment. It then splits the current code
-block into two groups: code_lines_before_comment (lines in the current
-code block which come before the current line) and the comment_line_prefix (the
+the comment opening delimiter `#` into
+`full_comment`. It then splits
+the current code block into two
+groups: `code_lines_before_comment`
+(lines in the current code block which come before the current line) and the
+`comment_line_prefix` (the
current line up to the start of the comment). The classification is:
-print("""¶\
+print("""¶\
#
This is not a comment! It's a multi-line string.¶\
-""")¶\
-
- # This is a
-comment.
+""")¶\
+
+#
+This is a comment.
```
classified_code = [
@@ -176,14 +160,15 @@ classified_code = [
```
Code/doc block classification
------------------------------
+--------------------------------------------------------------------------------
-Because comment_line_prefix contains only whitespace and full_comment has a space after the
-comment delimiter, the lexer classifies this as a doc block. It adds code_lines_before_comment as a code
-block, then the text of the comment as a doc block:
+Because
+comment_line_prefix
+contains only whitespace and
+full\_comment has a space after
+the comment delimiter, the lexer classifies this as a doc block. It
+adds code\_lines\_before\_comment
+as a code block, then the text of the comment as a doc block:
```
classified_code = [
@@ -199,7 +184,7 @@ classified_code = [
```
Done
-----
+--------------------------------------------------------------------------------
After this, the unlexed source code is empty since the inline comment classified
-moved the remainder of its contents into `classified_code`. The function exits.
\ No newline at end of file
+moved the remainder of its contents into `classified_code`. The function exits.
diff --git a/server/src/lexer/pest_parser.rs b/server/src/lexer/pest_parser.rs
index f3c0c536..4b1a43e9 100644
--- a/server/src/lexer/pest_parser.rs
+++ b/server/src/lexer/pest_parser.rs
@@ -15,10 +15,10 @@
// [http://www.gnu.org/licenses](http://www.gnu.org/licenses).
//
// `pest_parser.rs` -- Lex source code into code and doc blocks
-// ============================================================
+// =============================================================================
//
// Imports
-// -------
+// -----------------------------------------------------------------------------
//
// ### Standard library
//
@@ -32,7 +32,7 @@
//
// None.
/// Parser generator
-/// ----------------
+/// ----------------------------------------------------------------------------
///
/// This macro generates a parser function that converts the provided string
/// into a series of code and doc blocks. I'd prefer to use traits, but don't
@@ -251,7 +251,7 @@ macro_rules! make_parse_block_comment {
}
// Parsers
-// -------
+// -----------------------------------------------------------------------------
//
// Each parser is kept in a separate module to avoid name conflicts, since Pest
// generates a `Rule` enum for each grammar.
@@ -280,7 +280,7 @@ pub mod python {
}
// Tests
-// -----
+// -----------------------------------------------------------------------------
#[cfg(test)]
mod test {
use indoc::indoc;
diff --git a/server/src/lexer/supported_languages.rs b/server/src/lexer/supported_languages.rs
index c77045b8..f8450a9a 100644
--- a/server/src/lexer/supported_languages.rs
+++ b/server/src/lexer/supported_languages.rs
@@ -15,13 +15,13 @@
/// [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
@@ -45,7 +45,7 @@
/// 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
-// -------
+// -----------------------------------------------------------------------------
//
// ### Standard library
use std::sync::Arc;
@@ -57,7 +57,7 @@ use super::{
};
// Helper functions
-// ----------------
+// -----------------------------------------------------------------------------
//
// These functions simplify the syntax needed to create a `LanguageLexer`.
#[allow(clippy::too_many_arguments)]
@@ -123,7 +123,7 @@ fn make_block_comment_delim(opening: &str, closing: &str, is_nestable: bool) ->
}
// Define lexers for each supported language.
-// ------------------------------------------
+// -----------------------------------------------------------------------------
pub fn get_language_lexer_vec() -> Vec {
vec. TODO:
- // Pest doesn't support line continuations and allows multiline
- // strings, so this is a inaccurate.
+ // * The `.ino` extension is for Arduino source files.
+ // * The `.pest` extension is for
+ // [Pest grammars](https://docs.rs/pest/latest/pest/#grammar).
+ // TODO: Pest doesn't support line continuations and allows
+ // multiline strings, so this is a inaccurate.
&["c", "cc", "cpp", "h", "hh", "hpp", "ino", "pest"],
&["//"],
&[make_block_comment_delim("/*", "*/", false)],
@@ -164,9 +164,8 @@ pub fn get_language_lexer_vec() -> Vec {
// Note: the C/C++ support expects C++11 or newer. Don't worry about
// supporting C or older C++ using another lexer entry, since the
// raw string syntax in C++11 and newer is IMHO so rare we won't
- // encounter it in older code. See the C++ [string literals docs for
- // the reasoning behind the start body
- // regex.](https://en.cppreference.com/w/cpp/language/string_literal)
+ // encounter it in older code. See the C++
+ // [string literals docs for the reasoning behind the start body regex.](https://en.cppreference.com/w/cpp/language/string_literal)
make_heredoc_delim("R\"", "[^()\\\\[[:space:]]]*", "(", ")", "\""),
SpecialCase::None,
Some(pest_parser::c::parse_to_code_doc_blocks),
@@ -175,18 +174,18 @@ pub fn get_language_lexer_vec() -> Vec {
make_language_lexer(
"csharp",
&["cs"],
- // See [6.3.3
- // Comments](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#633-comments).
- // Also provide support for [documentation
- // comments](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/documentation-comments).
+ // See
+ // [6.3.3 Comments](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#633-comments).
+ // Also provide support for
+ // [documentation comments](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/documentation-comments).
&["//", "///"],
&[
make_block_comment_delim("/*", "*/", false),
make_block_comment_delim("/**", "*/", false),
],
&[make_string_delimiter_spec(
- // See [6.4.5.6 String
- // literals](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#6456-string-literals).
+ // See
+ // [6.4.5.6 String literals](https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/lexical-structure#6456-string-literals).
"\"",
"\\",
NewlineSupport::None,
@@ -213,9 +212,9 @@ pub fn get_language_lexer_vec() -> Vec {
make_language_lexer(
"golang",
&["go"],
- // See [The Go Programming Language
- // Specification](https://go.dev/ref/spec) on
- // [Comments](https://go.dev/ref/spec#Comments).
+ // See
+ // [The Go Programming Language Specification](https://go.dev/ref/spec)
+ // on [Comments](https://go.dev/ref/spec#Comments).
&[],
&[make_block_comment_delim("/*", "*/", false)],
// See [String literals](https://go.dev/ref/spec#String_literals).
@@ -245,17 +244,16 @@ pub fn get_language_lexer_vec() -> Vec {
make_language_lexer(
"java",
&["java", "kt"],
- // See the [Java Language Specification, Java SE 19
- // edition](https://docs.oracle.com/javase/specs/jls/se19/html/index.html),
- // [§3.7.
- // Comments](https://docs.oracle.com/javase/specs/jls/se19/html/jls-3.html#jls-3.7).
+ // See the
+ // [Java Language Specification, Java SE 19 edition](https://docs.oracle.com/javase/specs/jls/se19/html/index.html),
+ // [§3.7. Comments](https://docs.oracle.com/javase/specs/jls/se19/html/jls-3.html#jls-3.7).
// The end of this section notes that comments do not occur
// within character literals, string literals, or text blocks,
// which describes the approach of this lexer nicely.
&["//"],
&[make_block_comment_delim("/*", "*/", false)],
- // See [§3.10.5. String
- // Literals](https://docs.oracle.com/javase/specs/jls/se19/html/jls-3.html#jls-3.10.5).
+ // See
+ // [§3.10.5. String Literals](https://docs.oracle.com/javase/specs/jls/se19/html/jls-3.html#jls-3.10.5).
&[
make_string_delimiter_spec(
"\"",
@@ -265,8 +263,8 @@ pub fn get_language_lexer_vec() -> Vec {
// and before the matching closing "."
NewlineSupport::None,
),
- // See [§3.10.6. Text
- // Blocks](https://docs.oracle.com/javase/specs/jls/se19/html/jls-3.html#jls-3.10.6).
+ // See
+ // [§3.10.6. Text Blocks](https://docs.oracle.com/javase/specs/jls/se19/html/jls-3.html#jls-3.10.6).
make_string_delimiter_spec("\"\"\"", "\\", NewlineSupport::Unescaped),
],
None,
@@ -278,19 +276,19 @@ pub fn get_language_lexer_vec() -> Vec {
"javascript",
&[
"js", "mjs",
- // Note that [Qt's QML
- // language](https://doc.qt.io/qt-6/qtqml-syntax-basics.html) is
- // basically JSON with some embedded JavaScript. Treat it as
+ // Note that
+ // [Qt's QML language](https://doc.qt.io/qt-6/qtqml-syntax-basics.html)
+ // is basically JSON with some embedded JavaScript. Treat it as
// JavaScript, since those rules include template literals.
"qml",
],
- // See [§12.4
- // Comments](https://262.ecma-international.org/13.0/#sec-comments)
+ // See
+ // [§12.4 Comments](https://262.ecma-international.org/13.0/#sec-comments)
&["//"],
&[make_block_comment_delim("/*", "*/", false)],
&[
- // See [§12.8.4 String
- // Literals](https://262.ecma-international.org/13.0/#prod-StringLiteral).
+ // See
+ // [§12.8.4 String Literals](https://262.ecma-international.org/13.0/#prod-StringLiteral).
make_string_delimiter_spec("\"", "\\", NewlineSupport::Escaped),
make_string_delimiter_spec("'", "\\", NewlineSupport::Escaped),
],
@@ -316,16 +314,15 @@ pub fn get_language_lexer_vec() -> Vec {
make_language_lexer(
"matlab",
&["m"],
- // See the [MATLAB docs on
- // comments](https://www.mathworks.com/help/matlab/matlab_prog/comments.html).
+ // See the
+ // [MATLAB docs on comments](https://www.mathworks.com/help/matlab/matlab_prog/comments.html).
// Block comments are a special case, so they're not included here.
&["%", "..."],
&[],
- // Per the [MATLAB
- // docs](https://www.mathworks.com/help/matlab/matlab_prog/represent-text-with-character-and-string-arrays.html),
+ // Per the
+ // [MATLAB docs](https://www.mathworks.com/help/matlab/matlab_prog/represent-text-with-character-and-string-arrays.html),
// there are two types of strings. Although MATLAB supports
- // [standard escape
- // sequences](https://www.mathworks.com/help/matlab/matlab_prog/matlab-operators-and-special-characters.html#bvg44q6)
+ // [standard escape sequences](https://www.mathworks.com/help/matlab/matlab_prog/matlab-operators-and-special-characters.html#bvg44q6)
// (scroll to the bottom of the page), these don't affect quotes;
// instead, doubled quotes are used to insert a single quote. See
// [string delimiter doubling](#string_delimiter_doubling).
@@ -345,8 +342,8 @@ pub fn get_language_lexer_vec() -> Vec {
&[],
&[
// Note that raw strings still allow escaping the single/double
- // quote. See the [language
- // reference](https://docs.python.org/3/reference/lexical_analysis.html#literals).
+ // quote. See the
+ // [language reference](https://docs.python.org/3/reference/lexical_analysis.html#literals).
make_string_delimiter_spec("\"\"\"", "\\", NewlineSupport::Unescaped),
make_string_delimiter_spec("'''", "\\", NewlineSupport::Unescaped),
make_string_delimiter_spec("\"", "\\", NewlineSupport::Escaped),
@@ -379,11 +376,10 @@ pub fn get_language_lexer_vec() -> Vec {
&["sql"],
// See
// [Wikipedia](https://en.wikipedia.org/wiki/SQL_syntax#Comments).
- // The [SQL specification isn't
- // free](https://en.wikipedia.org/wiki/SQL#Standardization_history),
+ // The
+ // [SQL specification isn't free](https://en.wikipedia.org/wiki/SQL#Standardization_history),
// sadly. Oracle publishes their flavor of the 2016 spec; see
- // [Comments within SQL
- // statements](https://docs.oracle.com/database/121/SQLRF/sql_elements006.htm#SQLRF51099).
+ // [Comments within SQL statements](https://docs.oracle.com/database/121/SQLRF/sql_elements006.htm#SQLRF51099).
// Postgresql defines
// [comments](https://www.postgresql.org/docs/15/sql-syntax-lexical.html#SQL-SYNTAX-COMMENTS)
// as well.
@@ -391,11 +387,11 @@ pub fn get_language_lexer_vec() -> Vec {
&[make_block_comment_delim("/*", "*/", false)],
&[
// SQL standard strings allow newlines and don't provide an
- // escape character. This language uses [string delimiter
- // doubling](#string_delimiter_doubling). Unfortunately, each
- // variant of SQL also supports their custom definition of
- // strings; these must be handled by vendor-specific flavors of
- // this basic lexer definition.
+ // escape character. This language uses
+ // [string delimiter doubling](#string_delimiter_doubling).
+ // Unfortunately, each variant of SQL also supports their custom
+ // definition of strings; these must be handled by
+ // vendor-specific flavors of this basic lexer definition.
make_string_delimiter_spec("'", "", NewlineSupport::Unescaped),
],
None,
@@ -410,8 +406,8 @@ pub fn get_language_lexer_vec() -> Vec {
// [comments](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/thebasics#Comments).
&["//"],
&[make_block_comment_delim("/*", "*/", true)],
- // See [Strings and
- // Characters](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/stringsandcharacters).
+ // See
+ // [Strings and Characters](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/stringsandcharacters).
&[
// Technically, this would include optional whitespace after the
// triple quotes then a newlines then end with a newline before
@@ -420,8 +416,8 @@ pub fn get_language_lexer_vec() -> Vec {
make_string_delimiter_spec("\"\"\"", "\\", NewlineSupport::Unescaped),
make_string_delimiter_spec("\"", "\\", NewlineSupport::None),
],
- // Swift supports [extended string
- // delimiters](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/stringsandcharacters#Extended-String-Delimiters)
+ // Swift supports
+ // [extended string delimiters](https://docs.swift.org/swift-book/documentation/the-swift-programming-language/stringsandcharacters#Extended-String-Delimiters)
// in both string literal and multiline string flavors. Since this
// parser only supports a single heredoc type, we ignore the string
// literal flavor. This is a bug: consider the string `#"Not a
@@ -477,8 +473,8 @@ pub fn get_language_lexer_vec() -> Vec {
&["--"],
&[make_block_comment_delim("/*", "*/", false)],
// Per section 15.7 of the standard, strings may not contain
- // newlines. This language uses [string delimiter
- // doubling](#string_delimiter_doubling).
+ // newlines. This language uses
+ // [string delimiter doubling](#string_delimiter_doubling).
&[make_string_delimiter_spec("\"", "", NewlineSupport::None)],
None,
SpecialCase::None,
@@ -525,14 +521,14 @@ pub fn get_language_lexer_vec() -> Vec {
&["#"],
&[],
&[
- // See [double-quoted
- // style](https://yaml.org/spec/1.2.2/#double-quoted-style).
+ // See
+ // [double-quoted style](https://yaml.org/spec/1.2.2/#double-quoted-style).
// Something I don't understand and will probably ignore:
// "Single- and double-quoted scalars are restricted to a single
// line when contained inside an implicit key."
make_string_delimiter_spec("\"", "\\", NewlineSupport::Unescaped),
- // See [single-quoted
- // style](https://yaml.org/spec/1.2.2/#single-quoted-style).
+ // See
+ // [single-quoted style](https://yaml.org/spec/1.2.2/#single-quoted-style).
// Single-quoted strings escape a single quote by repeating it
// twice: `'That''s unusual.'` Rather than try to parse this,
// treat it as two back-to-back strings: `'That'` and `'s
diff --git a/server/src/lib.rs b/server/src/lib.rs
index abc0933c..9e336c1e 100644
--- a/server/src/lib.rs
+++ b/server/src/lib.rs
@@ -15,7 +15,7 @@
/// [http://www.gnu.org/licenses](http://www.gnu.org/licenses).
///
/// `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).
diff --git a/server/src/main.rs b/server/src/main.rs
index a019b471..85236dd7 100644
--- a/server/src/main.rs
+++ b/server/src/main.rs
@@ -14,9 +14,9 @@
// the CodeChat Editor. If not, see
// [http://www.gnu.org/licenses](http://www.gnu.org/licenses).
/// `main.rs` -- Entrypoint for the CodeChat Editor Server
-/// ======================================================
+/// ============================================================================
// Imports
-// -------
+// -----------------------------------------------------------------------------
//
// ### Standard library
use std::{
@@ -39,7 +39,7 @@ use log::LevelFilter;
use code_chat_editor::webserver::{self, Credentials, GetServerUrlError, path_to_url};
// Data structures
-// ---------------
+// -----------------------------------------------------------------------------
//
// ### Command-line interface
//
@@ -94,7 +94,7 @@ enum Commands {
}
// Code
-// ----
+// -----------------------------------------------------------------------------
//
// The following code implements the command-line interface for the CodeChat
// Editor.
@@ -306,8 +306,8 @@ impl Cli {
const PORT_RANGE: RangeInclusive = 1..=65535;
-// Copied from the [clap
-// docs](https://docs.rs/clap/latest/clap/_derive/_tutorial/index.html#validated-values).
+// Copied from the
+// [clap docs](https://docs.rs/clap/latest/clap/_derive/_tutorial/index.html#validated-values).
fn port_in_range(s: &str) -> Result {
let port: usize = s
.parse()
diff --git a/server/src/processing.rs b/server/src/processing.rs
index f5a080a7..79757a11 100644
--- a/server/src/processing.rs
+++ b/server/src/processing.rs
@@ -15,9 +15,9 @@
// [http://www.gnu.org/licenses](http://www.gnu.org/licenses).
/// `processing.rs` -- Transform source code to its web-editable equivalent and
/// back
-/// ===========================================================================
+/// ============================================================================
// Imports
-// -------
+// -----------------------------------------------------------------------------
//
// ### Standard library
//
@@ -31,7 +31,7 @@ use std::rc::{Rc, Weak};
*/
use std::{
borrow::Cow,
- cmp::max,
+ cmp::{max, min},
ffi::OsStr,
iter::Map,
ops::Range,
@@ -40,6 +40,17 @@ use std::{
};
// ### Third-party
+use dprint_plugin_markdown::{
+ configuration::{
+ Configuration, ConfigurationBuilder, EmphasisKind, HeadingKind, StrongKind, TextWrap,
+ UnorderedListKind,
+ },
+ format_text,
+};
+use htmd::{
+ HtmlToMarkdown,
+ options::{LinkStyle, TranslationMode},
+};
use imara_diff::{Algorithm, Diff, Hunk, InternedInput, TokenSource};
use lazy_static::lazy_static;
use pulldown_cmark::{Options, Parser, html};
@@ -51,17 +62,17 @@ use ts_rs::TS;
use crate::lexer::{CodeDocBlock, DocBlock, LEXERS, LanguageLexerCompiled, source_lexer};
// Data structures
-// ---------------
+// -----------------------------------------------------------------------------
//
// ### Translation between a local (traditional) source file and its web-editable, client-side representation
//
// There are three ways that a source file is represented:
//
-// 1. As traditional source code, in a plain text file.
-// 2. As a alternating series of code and doc blocks, produced by the lexer.
-// See `lexer.rs\CodeDocBlock`.
-// 3. As a CodeMirror data structure, which consists of a single block of text,
-// to which are attached doc blocks at specific character offsets.
+// 1. As traditional source code, in a plain text file.
+// 2. As a alternating series of code and doc blocks, produced by the lexer. See
+// `lexer.rs\CodeDocBlock`.
+// 3. As a CodeMirror data structure, which consists of a single block of text,
+// to which are attached doc blocks at specific character offsets.
//
// The lexer translates between items 1 and 2; `processing.rs` translates
// between 2 and 3. The following data structures define the format for item 3.
@@ -172,8 +183,7 @@ pub struct CodeMirrorDocBlockDelete {
}
/// Store the difference between a previous and current string; this is based on
-/// [CodeMirror's
-/// ChangeSpec](https://codemirror.net/docs/ref/#state.ChangeSpec).
+/// [CodeMirror's ChangeSpec](https://codemirror.net/docs/ref/#state.ChangeSpec).
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, TS)]
#[ts(export, optional_fields)]
pub struct StringDiff {
@@ -181,9 +191,10 @@ pub struct StringDiff {
/// change.
pub from: usize,
/// The index of the end of the change; defined for deletions and
- /// replacements. See the [skip serializing field
- /// docs](https://serde.rs/attr-skip-serializing.html); this must be
- /// excluded from the JSON output if it's `None` to avoid CodeMirror errors.
+ /// replacements. See the
+ /// [skip serializing field docs](https://serde.rs/attr-skip-serializing.html);
+ /// this must be excluded from the JSON output if it's `None` to avoid
+ /// CodeMirror errors.
#[serde(skip_serializing_if = "Option::is_none")]
pub to: Option,
/// The text to insert/replace; an empty string indicates deletion.
@@ -227,7 +238,7 @@ pub enum TranslationResultsString {
// On save, the process is CodeChatForWeb -> Vec\ -> source code.
//
// Globals
-// -------
+// -----------------------------------------------------------------------------
lazy_static! {
/// Match the lexer directive in a source file.
static ref LEXER_DIRECTIVE: Regex = Regex::new(r"CodeChat Editor lexer: (\w+)").unwrap();
@@ -250,8 +261,8 @@ lazy_static! {
// of HTML blocks. (The remaining types of HTML blocks are terminated by a blank
// line, which this also provides.)
const DOC_BLOCK_SEPARATOR_STRING: &str = concat!(
- // If an HTML block with specific start conditions (see the [section 4.6 of
- // the commonmark spec](https://spec.commonmark.org/0.31.2/#html-blocks),
+ // If an HTML block with specific start conditions (see the
+ // [section 4.6 of the commonmark spec](https://spec.commonmark.org/0.31.2/#html-blocks),
// items 1-5) doesn't have a matching end condition, provide one here.
// Otherwise, hide these end conditions inside a raw HTML block, so that it
// doesn't get processed by the Markdown parser. Note that this only
@@ -296,8 +307,14 @@ const DOC_BLOCK_SEPARATOR_REMOVE_FENCE: &str = r#"
const DOC_BLOCK_SEPARATOR_MENDED_FENCE: &str = "\n\n";
//
+// 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
+// little space for word wrapping.
+const WORD_WRAP_MIN_WIDTH: usize = 40;
+
// Serialization for `CodeMirrorDocBlock`
-// --------------------------------------
+// -----------------------------------------------------------------------------
#[derive(Serialize, Deserialize, TS)]
#[ts(export)]
struct CodeMirrorDocBlockTuple<'a>(
@@ -349,7 +366,7 @@ impl<'de> Deserialize<'de> for CodeMirrorDocBlock {
}
// Determine if the provided file is part of a project
-// ---------------------------------------------------
+// -----------------------------------------------------------------------------
pub fn find_path_to_toc(file_path: &Path) -> Option {
// To determine if this source code is part of a project, look for a project
// file by searching the current directory, then all its parents, for a file
@@ -373,7 +390,7 @@ pub fn find_path_to_toc(file_path: &Path) -> Option {
}
// Transform `CodeChatForWeb` to source code
-// -----------------------------------------
+// -----------------------------------------------------------------------------
/// This function takes in a source file in web-editable format (the
/// `CodeChatForWeb` struct) and transforms it into source code.
pub fn codechat_for_web_to_source(
@@ -389,11 +406,26 @@ pub fn codechat_for_web_to_source(
None => return Err("Invalid mode".to_string()),
};
- // Convert from `CodeMirror` to a `SortaCodeDocBlocks`.
+ // Extract the plain (not diffed) CodeMirror contents.
let CodeMirrorDiffable::Plain(ref code_mirror) = codechat_for_web.source else {
panic!("No diff!");
};
- let code_doc_block_vec = code_mirror_to_code_doc_blocks(code_mirror);
+
+ // If this is a Markdown-only document, handle this special case.
+ if *lexer.language_lexer.lexer_name == "markdown" {
+ // There should be no doc blocks.
+ if !code_mirror.doc_blocks.is_empty() {
+ return Err("Doc blocks not allowed in Markdown documents.".to_string());
+ }
+ // Translate the HTML document to Markdown.
+ let converter = HtmlToMarkdownWrapped::new();
+ return converter
+ .convert(&code_mirror.doc)
+ .map_err(|e| e.to_string());
+ }
+ let code_doc_block_vec_html = code_mirror_to_code_doc_blocks(code_mirror);
+ let code_doc_block_vec =
+ doc_block_html_to_markdown(code_doc_block_vec_html).map_err(|e| e.to_string())?;
code_doc_block_vec_to_source(&code_doc_block_vec, lexer)
}
@@ -467,6 +499,85 @@ fn code_mirror_to_code_doc_blocks(code_mirror: &CodeMirror) -> Vec
code_doc_block_arr
}
+/// This converts HTML to Markdown then word wraps the result.
+struct HtmlToMarkdownWrapped {
+ html_to_markdown: HtmlToMarkdown,
+ word_wrap_config: Configuration,
+}
+
+impl HtmlToMarkdownWrapped {
+ fn new() -> Self {
+ HtmlToMarkdownWrapped {
+ // Most of the options don't need to be specified here, since the
+ // line wrapper will override them.
+ html_to_markdown: HtmlToMarkdown::builder()
+ .options(htmd::options::Options {
+ link_style: LinkStyle::Inlined,
+ translation_mode: TranslationMode::Faithful,
+ ..Default::default()
+ })
+ .build(),
+ // TODO: numbered list formatting should be improved in the dprint
+ // library.
+ word_wrap_config: ConfigurationBuilder::new()
+ .emphasis_kind(EmphasisKind::Asterisks)
+ .strong_kind(StrongKind::Asterisks)
+ .unordered_list_kind(UnorderedListKind::Asterisks)
+ .text_wrap(TextWrap::Always)
+ .heading_kind(HeadingKind::Setext)
+ .build(),
+ }
+ }
+ fn set_line_width(&mut self, line_width: usize) {
+ self.word_wrap_config.line_width = line_width as u32;
+ }
+
+ fn convert(&self, html: &str) -> std::io::Result {
+ println!("Before:\n{html}");
+ let converted = self.html_to_markdown.convert(html)?;
+ println!("Unwrapped:\n{converted}");
+ Ok(
+ format_text(&converted, &self.word_wrap_config, |_, _, _| Ok(None))
+ .map_err(std::io::Error::other)?
+ // A return value of `None` means the text was unchanged or
+ // ignored (by an
+ // [ignoreFileDirective](https://dprint.dev/plugins/markdown/config/)).
+ // Simply return the unchanged text in this case.
+ .unwrap_or_else(|| html.to_string()),
+ )
+ }
+}
+
+// Transform HTML in doc blocks to Markdown.
+fn doc_block_html_to_markdown(
+ mut code_doc_block_vec: Vec,
+) -> std::io::Result> {
+ let mut converter = HtmlToMarkdownWrapped::new();
+ for code_doc_block in &mut code_doc_block_vec {
+ if let CodeDocBlock::DocBlock(doc_block) = code_doc_block {
+ // Compute a line wrap width based on the current indent. Set a
+ // minimum of half the line wrap width, to prevent ridiculous
+ // wrapping with large indents.
+ converter.set_line_width(max(
+ WORD_WRAP_MIN_WIDTH,
+ // The +1 factor is for the space separating the delimiter and
+ // the comment text. Use `min` to avoid overflow with unsigned
+ // subtraction.
+ WORD_WRAP_COLUMN
+ - min(
+ doc_block.delimiter.chars().count() + 1 + doc_block.indent.chars().count(),
+ WORD_WRAP_COLUMN,
+ ),
+ ));
+ doc_block.contents = converter
+ .convert(&doc_block.contents)
+ .map_err(std::io::Error::other)?;
+ }
+ }
+
+ Ok(code_doc_block_vec)
+}
+
// Turn this vec of CodeDocBlocks into a string of source code.
fn code_doc_block_vec_to_source(
code_doc_block_vec: &Vec,
@@ -508,8 +619,8 @@ fn code_doc_block_vec_to_source(
// `split_inclusive` becomes an empty list, not `[""]`. Note
// that this mirrors what Python's
// [splitlines](https://docs.python.org/3/library/stdtypes.html#str.splitlines)
- // does, and is also the subject of a [Rust bug
- // report](https://github.com/rust-lang/rust/issues/111457).
+ // does, and is also the subject of a
+ // [Rust bug report](https://github.com/rust-lang/rust/issues/111457).
let lines: Vec<_> = doc_block.contents.split_inclusive('\n').collect();
let lines_fixed = if lines.is_empty() { vec![""] } else { lines };
for content_line in lines_fixed {
@@ -585,12 +696,12 @@ fn code_doc_block_vec_to_source(
);
// Since this isn't a first line:
} else {
- // * If this line is just a newline, include just
- // the newline.
+ // * If this line is just a newline, include just
+ // the newline.
if *content_line == "\n" {
append_doc_block("", "", "\n");
- // * Otherwise, include spaces in place of the
- // delimiter.
+ // * Otherwise, include spaces in place of the
+ // delimiter.
} else {
append_doc_block(
&doc_block.indent,
@@ -615,7 +726,7 @@ fn code_doc_block_vec_to_source(
}
// Transform from source code to `CodeChatForWeb`
-// ----------------------------------------------
+// -----------------------------------------------------------------------------
//
// Given the contents of a file, classify it and (for CodeChat Editor files)
// convert it to the `CodeChatForWeb` format.
@@ -684,8 +795,8 @@ pub fn source_to_codechat_for_web(
// Combine all the doc blocks into a single string, separated by a
// delimiter. Transform this to markdown, then split the transformed
// content back into the doc blocks they came from. This is
- // necessary to allow [link reference
- // definitions](https://spec.commonmark.org/0.31.2/#link-reference-definitions)
+ // necessary to allow
+ // [link reference definitions](https://spec.commonmark.org/0.31.2/#link-reference-definitions)
// between doc blocks to work; for example, `[Link][1]` in one doc
// block, then `[1]: http:/foo.org` in another doc block requires
// both to be in the same Markdown document to translate correctly.
@@ -711,12 +822,12 @@ pub fn source_to_codechat_for_web(
// Break it back into doc blocks:
//
- // 1. Mend broken fences.
+ // 1. Mend broken fences.
let html = DOC_BLOCK_SEPARATOR_BROKEN_FENCE
.replace_all(&html, DOC_BLOCK_SEPARATOR_MENDED_FENCE);
- // 2. Remove good fences.
+ // 2. Remove good fences.
let html = html.replace(DOC_BLOCK_SEPARATOR_REMOVE_FENCE, "");
- // 3. Split on the separator.
+ // 3. Split on the separator.
let mut doc_block_contents_iter = html.split(DOC_BLOCK_SEPARATOR_SPLIT_STRING);
//
@@ -837,16 +948,15 @@ fn markdown_to_html(markdown: &str) -> String {
// Fundamentally, diffs of a string and diff of this vector require different
// approaches:
//
-// * The `CodeMirrorDocBlock` is a structure, with several fields. In
-// particular, the contents is usually the largest element; the indent can
-// also be large.
-// * It should handle the following common cases well:
-// 1. An update of a code block. This causes the from and to field of all
-// following doc blocks to change, without changing the other fields.
-// 2. An update to the contents of a doc block. For large doc blocks, this
-// is more efficiently stored as a diff rather than the full doc block
-// text.
-// 3. Inserting or deleting a doc block.
+// * The `CodeMirrorDocBlock` is a structure, with several fields. In
+// particular, the contents is usually the largest element; the indent can
+// also be large.
+// * It should handle the following common cases well:
+// 1. An update of a code block. This causes the from and to field of all
+// following doc blocks to change, without changing the other fields.
+// 2. An update to the contents of a doc block. For large doc blocks, this is
+// more efficiently stored as a diff rather than the full doc block text.
+// 3. Inserting or deleting a doc block.
//
// The diff algorithm simply looks for equality between elements contained in
// the before and after vectors provided it. However, this requires something
@@ -856,14 +966,14 @@ fn markdown_to_html(markdown: &str) -> String {
//
// #### Overall approach
//
-// 1. Use the diff algorithm to find the minimal change set between a before
-// and after `CodeMirrorDocBlocksVec`, which only looks at the `contents`.
-// This avoids "noise" from changes in from/to fields from obscuring changes
-// only to the `contents`.
-// 2. For all before and after blocks whose `contents` were identical, compare
-// the other fields, adding these to the change set, but not attempting to
-// use the diff algorithm.
-// 3. Represent changes to the `contents` as a `StringDiff`.
+// 1. Use the diff algorithm to find the minimal change set between a before and
+// after `CodeMirrorDocBlocksVec`, which only looks at the `contents`. This
+// avoids "noise" from changes in from/to fields from obscuring changes only
+// to the `contents`.
+// 2. For all before and after blocks whose `contents` were identical, compare
+// the other fields, adding these to the change set, but not attempting to
+// use the diff algorithm.
+// 3. Represent changes to the `contents` as a `StringDiff`.
//
// #### String diff
/// Given two strings, return a list of changes between them.
@@ -884,8 +994,7 @@ pub fn diff_str(before: &str, after: &str) -> Vec {
input.interner[line].chars().fold(
// Count offsets into the string in UTF-16 code units,
// since the offsets produced are used by the Client
- // ([JavaScript uses
- // UTF-16](https://developer.mozilla.org/en-US/docs/Glossary/UTF-16#utf-16_in_javascript),
+ // ([JavaScript uses UTF-16](https://developer.mozilla.org/en-US/docs/Glossary/UTF-16#utf-16_in_javascript),
// as does
// [CodeMirror](https://codemirror.net/docs/guide/#document-offsets))
// and VSCode (also JavaScript).
@@ -1153,61 +1262,59 @@ pub fn diff_code_mirror_doc_blocks(
// Goal: make it easy to update the data structure. We update on every
// load/save, then do some accesses during those processes.
//
-// Top-level data structures: a file HashSet and an id
-// HashMap}>. Some FileAnchors in the file
+// Top-level data structures: a file HashSet\ and an id
+// HashMap\}>. Some FileAnchors in the file
// HashSet are also in a pending load list..
//
-// * To update a file:
-// * Remove the old file from the file HasHMap. Add an empty FileAnchor to
-// the file HashMap.
-// * For each id, see if that id already exists.
-// * If the id exists: if it refers to an id in the old FileAnchor,
-// replace it with the new one. If not, need to perform resolution
-// on this id (we have a non-unique id; how to fix?).
-// * If the id doesn't exist: create a new one.
-// * For each hyperlink, see if that id already exists.
-// * If so, upsert the referring id. Check the metadata on the id to
-// make sure that data is current. If not, add this to the pending
-// hyperlinks list. If the file is missing, delete it from the
-// cache.
-// * If not, create a new entry in the id HashSet and add the
-// referring id to the HashSet. Add the file to a pending hyperlinks
-// list.
-// * When the file is processed:
-// * Look for all entries in the pending file list that refer to the
-// current file and resolve these. Start another task to load in all
-// pending files.
-// * Look at the old file; remove each id that's still in the id
-// HashMap. If the id was in the HashMap and it also was a
-// Hyperlink, remove that from the HashSet.
-// * To remove a file from the HashMap:
-// * Remove it from the file HashMap.
-// * For each hyperlink, remove it from the HashSet of referring links (if
-// that id still exists).
-// * For each id, remove it from the id HashMap.
-// * To add a file from the HashSet:
-// * Perform an update with an empty FileAnchor.
+// * To update a file:
+// * Remove the old file from the file HasHMap. Add an empty FileAnchor to the
+// file HashMap.
+// * For each id, see if that id already exists.
+// * If the id exists: if it refers to an id in the old FileAnchor, replace
+// it with the new one. If not, need to perform resolution on this id (we
+// have a non-unique id; how to fix?).
+// * If the id doesn't exist: create a new one.
+// * For each hyperlink, see if that id already exists.
+// * If so, upsert the referring id. Check the metadata on the id to make
+// sure that data is current. If not, add this to the pending hyperlinks
+// list. If the file is missing, delete it from the cache.
+// * If not, create a new entry in the id HashSet and add the referring id
+// to the HashSet. Add the file to a pending hyperlinks list.
+// * When the file is processed:
+// * Look for all entries in the pending file list that refer to the current
+// file and resolve these. Start another task to load in all pending
+// files.
+// * Look at the old file; remove each id that's still in the id HashMap. If
+// the id was in the HashMap and it also was a Hyperlink, remove that from
+// the HashSet.
+// * To remove a file from the HashMap:
+// * Remove it from the file HashMap.
+// * For each hyperlink, remove it from the HashSet of referring links (if
+// that id still exists).
+// * For each id, remove it from the id HashMap.
+// * To add a file from the HashSet:
+// * Perform an update with an empty FileAnchor.
//
// Pending hyperlinks list: for each hyperlink,
//
-// * check if the id is now current in the cache. If so, add the referring id
-// to the HashSet then move to the next hyperlink.
-// * check if the file is now current in the cache. If not, load the file and
-// update the cache, then go to step 1.
-// * The id was not found, even in the expected file. Add the hyperlink to a
-// broken links set?
+// * check if the id is now current in the cache. If so, add the referring id to
+// the HashSet then move to the next hyperlink.
+// * check if the file is now current in the cache. If not, load the file and
+// update the cache, then go to step 1.
+// * The id was not found, even in the expected file. Add the hyperlink to a
+// broken links set?
//
// Global operations:
//
-// * Scan all files, then perform add/upsert/removes based on differences with
-// the cache.
+// * Scan all files, then perform add/upsert/removes based on differences with
+// the cache.
//
// Functions:
//
-// * Upsert an Anchor.
-// * Upsert a Hyperlink.
-// * Upsert a file.
-// * Remove a file.
+// * Upsert an Anchor.
+// * Upsert a Hyperlink.
+// * Upsert a file.
+// * Remove a file.
/*x
/// There are two types of files that can serve as an anchor: these are file
/// anchor targets.
@@ -1363,6 +1470,6 @@ fn html_analyze(
*/
// Tests
-// -----
+// -----------------------------------------------------------------------------
#[cfg(test)]
mod tests;
diff --git a/server/src/translation.rs b/server/src/translation.rs
index ff1dee02..d4d1ec1f 100644
--- a/server/src/translation.rs
+++ b/server/src/translation.rs
@@ -442,6 +442,13 @@ pub async fn translation_task(
// blocks, but Markdown. When Turndown is moved from JavaScript to
// Rust, this can be changed, since both sides will have HTML in the
// doc blocks.
+ //
+ // Another approach: use revision numbers. Both the IDE and Client
+ // start with the same revision number. When either makes an edit,
+ // it sends a new revision number along with a diff. If the receiver
+ // doesn't have the previous version, it returns a result of error,
+ // which prompts the sender to re-send with the full text instead of
+ // a diff.
let mut sync_state = SyncState::OutOfSync;
loop {
select! {
diff --git a/server/src/webserver/tests.rs b/server/src/webserver/tests.rs
index 634a1e10..b79dac8f 100644
--- a/server/src/webserver/tests.rs
+++ b/server/src/webserver/tests.rs
@@ -32,8 +32,19 @@ use crate::prep_test_dir;
// Support functions
// -----------------
+//
+// The lint on using `cargo_bin` doesn't apply, since this is only available for
+// integration tests per the
+// [docs](https://docs.rs/assert_cmd/latest/assert_cmd/cargo/macro.cargo_bin_cmd.html).
+// Text of the warning:
+//
+// ```
+// warning: use of deprecated associated function `assert_cmd::Command::cargo_bin`:
+// incompatible with a custom cargo build-dir, see instead `cargo::cargo_bin_cmd!`
+// ```
+#[allow(deprecated)]
fn get_server() -> Command {
- Command::cargo_bin("codechat-editor-server").unwrap()
+ Command::cargo_bin(assert_cmd::pkg_name!()).unwrap()
}
// Tests
diff --git a/server/tests/cli.rs b/server/tests/cli.rs
index 5d8e1ac2..4d94ade5 100644
--- a/server/tests/cli.rs
+++ b/server/tests/cli.rs
@@ -13,10 +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
/// =================================
-//
// Imports
// -------
//
@@ -34,8 +32,19 @@ use tokio::task::spawn_blocking;
// Support functions
// -----------------
+//
+// The lint on using `cargo_bin` doesn't apply, since this is only available for
+// integration tests per the
+// [docs](https://docs.rs/assert_cmd/latest/assert_cmd/cargo/macro.cargo_bin_cmd.html).
+// Text of the warning:
+//
+// ```
+// warning: use of deprecated associated function `assert_cmd::Command::cargo_bin`:
+// incompatible with a custom cargo build-dir, see instead `cargo::cargo_bin_cmd!`
+// ```
+#[allow(deprecated)]
fn get_server() -> Command {
- Command::cargo_bin("codechat-editor-server").unwrap()
+ Command::cargo_bin(assert_cmd::pkg_name!()).unwrap()
}
// Tests
@@ -51,8 +60,7 @@ fn test_start_not_found() {
#[test]
fn test_start_no_start() {
- let mut cmd = get_server();
- let assert = cmd
+ let assert = get_server()
.args(["--test-mode", "sleep", "--port", "8081", "start"])
.assert();
assert
@@ -74,8 +82,7 @@ async fn test_start_no_response() {
// The test must be run in a separate thread to avoid blocking the main
// thread; otherwise, the webserver will not respond.
let test = spawn_blocking(move || {
- let mut cmd = Command::cargo_bin("codechat-editor-server").unwrap();
- let assert = cmd
+ let assert = get_server()
.args(["--test-mode", "sleep", "--port", "8082", "start"])
.assert();
assert
diff --git a/server/tests/fixtures/code_chat_editor/ide/vscode/tests/test_vscode_ide_websocket4/test.py b/server/tests/fixtures/code_chat_editor/ide/vscode/tests/test_vscode_ide_websocket4/test.py
index 36a317ed..658cc2e9 100644
--- a/server/tests/fixtures/code_chat_editor/ide/vscode/tests/test_vscode_ide_websocket4/test.py
+++ b/server/tests/fixtures/code_chat_editor/ide/vscode/tests/test_vscode_ide_websocket4/test.py
@@ -1 +1 @@
-# test.py
\ No newline at end of file
+# test.py
diff --git a/server/tests/fixtures/overall/overall_core/test_client_updates/test.py b/server/tests/fixtures/overall/overall_core/test_client_updates/test.py
new file mode 100644
index 00000000..9d935e6c
--- /dev/null
+++ b/server/tests/fixtures/overall/overall_core/test_client_updates/test.py
@@ -0,0 +1,4 @@
+# Test updates in the client that modify the client after appending to a line.
+def foo():
+ A comment
+ print()
\ No newline at end of file
diff --git a/server/tests/fixtures/overall/overall_core/test_client_updates/toc.md b/server/tests/fixtures/overall/overall_core/test_client_updates/toc.md
new file mode 100644
index 00000000..904fb597
--- /dev/null
+++ b/server/tests/fixtures/overall/overall_core/test_client_updates/toc.md
@@ -0,0 +1,4 @@
+Test TOC
+========
+
+* [test.py](test.py?test)
\ No newline at end of file
diff --git a/server/tests/overall_core/mod.rs b/server/tests/overall_core/mod.rs
index 35fe82b5..cdc33cb9 100644
--- a/server/tests/overall_core/mod.rs
+++ b/server/tests/overall_core/mod.rs
@@ -649,7 +649,10 @@ async fn test_server_core(
doc: vec![StringDiff {
from: 0,
to: Some(20),
- insert: "foo A **markdown** file.".to_string(),
+ insert: format!(
+ "foo A **markdown** file.{}",
+ if cfg!(windows) { "\r\n" } else { "\n" }
+ ),
}],
doc_blocks: vec![]
})
@@ -994,3 +997,180 @@ async fn test_client_core(
Ok(())
}
+
+/* TODO: fails until self-updates work.
+mod test3 {
+ use super::*;
+ use pretty_assertions::assert_eq;
+ harness!(test_client_updates_core);
+}
+
+#[tokio::test]
+async fn test_client_updates() -> Result<(), Box> {
+ // If both thirtyfour tests start at the same time, both fail; perhaps
+ // there's some confusion when two requests care made to the same webserver
+ // from two clients within the same process? In order to avoid then, insert
+ // a delay to hopefully start this test at a different time than
+ // `test_server_core`.
+ sleep(Duration::from_millis(100)).await;
+ test3::harness(test_client_updates_core, prep_test_dir!()).await
+}
+
+// Some of the thirtyfour calls are marked as deprecated, though they aren't
+// marked that way in the Selenium docs.
+#[allow(deprecated)]
+async fn test_client_updates_core(
+ codechat_server: CodeChatEditorServer,
+ driver_ref: &WebDriver,
+ test_dir: PathBuf,
+) -> Result<(), WebDriverError> {
+ let mut expected_messages = ExpectedMessages::new();
+ let path = canonicalize(test_dir.join("test.py")).unwrap();
+ let path_str = path.to_str().unwrap().to_string();
+ let current_file_id = codechat_server
+ .send_message_current_file(path_str.clone())
+ .await
+ .unwrap();
+ // The ordering of these messages isn't fixed -- one can come first, or the
+ // other.
+ expected_messages.insert(EditorMessage {
+ id: current_file_id,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)),
+ });
+ let mut server_id = 6.0;
+ expected_messages.insert(EditorMessage {
+ id: server_id,
+ message: EditorMessageContents::LoadFile(path.clone()),
+ });
+ expected_messages
+ .assert_all_messages(&codechat_server, TIMEOUT)
+ .await;
+
+ // Respond to the load request.
+ codechat_server
+ .send_result_loadfile(server_id, None)
+ .await
+ .unwrap();
+
+ // Respond to the load request for the TOC.
+ let toc_path = canonicalize(test_dir.join("toc.md")).unwrap();
+ server_id += MESSAGE_ID_INCREMENT * 2.0;
+ assert_eq!(
+ codechat_server.get_message_timeout(TIMEOUT).await.unwrap(),
+ EditorMessage {
+ id: server_id,
+ message: EditorMessageContents::LoadFile(toc_path.clone()),
+ }
+ );
+ codechat_server
+ .send_result_loadfile(server_id, None)
+ .await
+ .unwrap();
+
+ // The loadfile produces a message to the client, which comes back here. We
+ // don't need to acknowledge it.
+ server_id -= MESSAGE_ID_INCREMENT;
+ assert_eq!(
+ codechat_server.get_message_timeout(TIMEOUT).await.unwrap(),
+ EditorMessage {
+ id: server_id,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::Void))
+ }
+ );
+
+ // Target the iframe containing the Client.
+ let codechat_iframe = driver_ref.find(By::Css("#CodeChat-iframe")).await.unwrap();
+ driver_ref
+ .switch_to()
+ .frame_element(&codechat_iframe)
+ .await
+ .unwrap();
+
+ // Select the doc block and add to the line, causing a word wrap.
+ let contents_css = ".CodeChat-CodeMirror .CodeChat-doc-contents";
+ let doc_block_contents = driver_ref.find(By::Css(contents_css)).await.unwrap();
+ doc_block_contents
+ .send_keys("" + Key::End + " testing")
+ .await
+ .unwrap();
+
+ // Verify the updated text.
+ let mut client_id = INITIAL_CLIENT_MESSAGE_ID;
+ assert_eq!(
+ codechat_server.get_message_timeout(TIMEOUT).await.unwrap(),
+ EditorMessage {
+ id: client_id,
+ message: EditorMessageContents::Update(UpdateMessageContents {
+ file_path: path_str.clone(),
+ contents: Some(CodeChatForWeb {
+ metadata: SourceFileMetadata {
+ mode: "python".to_string(),
+ },
+ source: CodeMirrorDiffable::Diff(CodeMirrorDiff {
+ doc: vec![StringDiff {
+ from: 79,
+ to: None,
+ insert: "# testing\n".to_string()
+ }],
+ doc_blocks: vec![]
+ })
+ }),
+ cursor_position: Some(1),
+ scroll_position: Some(0.0)
+ })
+ }
+ );
+ codechat_server.send_result(client_id, None).await.unwrap();
+
+ // Move the cursor to code, then check that the position is correct. TODO:
+ // need access to codemirror in test mode.
+
+ // Insert a character to check the insertion point.
+ let code_line_css = ".CodeChat-CodeMirror .cm-line";
+ let code_line = driver_ref.find(By::Css(code_line_css)).await.unwrap();
+ code_line
+ .send_keys(Key::Alt + Key::Control + "g")
+ .await
+ .unwrap();
+ // Enter a line in the dialog that pops up.
+ driver_ref
+ .find(By::Css("input.cm-textfield"))
+ .await
+ .unwrap()
+ .send_keys("4" + Key::Enter)
+ .await
+ .unwrap();
+ // Add an indented comment.
+ code_line.send_keys(Key::Home + "# ").await.unwrap();
+ // This should edit the (new) third line of the file after word wrap: `def
+ // foo():`.
+ client_id += MESSAGE_ID_INCREMENT;
+ assert_eq!(
+ codechat_server.get_message_timeout(TIMEOUT).await.unwrap(),
+ EditorMessage {
+ id: client_id,
+ message: EditorMessageContents::Update(UpdateMessageContents {
+ file_path: path_str.clone(),
+ contents: Some(CodeChatForWeb {
+ metadata: SourceFileMetadata {
+ mode: "python".to_string(),
+ },
+ source: CodeMirrorDiffable::Diff(CodeMirrorDiff {
+ doc: vec![StringDiff {
+ from: 115,
+ to: Some(131),
+ insert: " # A comment\n".to_string()
+ }],
+ doc_blocks: vec![]
+ })
+ }),
+ cursor_position: Some(4),
+ scroll_position: Some(0.0)
+ })
+ }
+ );
+ codechat_server.send_result(client_id, None).await.unwrap();
+
+ Ok(())
+}
+ */