diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6a946614..13cc1bd6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -24,6 +24,12 @@ Changelog
* No changes.
+Version 0.3.0 -- 2026-Oct-09
+----------------------------
+
+* Full cache implementation -- cache scans all files in project and watches for
+ changes.
+
Version 0.2.6-beta1 -- 2026-Sep-22
----------------------------------
diff --git a/Cargo.lock b/Cargo.lock
index ac3e110f..40f2d991 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -44,9 +44,9 @@ dependencies = [
[[package]]
name = "actix-http"
-version = "3.13.6"
+version = "3.18.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c4f07a021937af76abef4c458a0d6b25f63f82eec5394354deeb7de0551f523"
+checksum = "e2ab7d72c0bb26f10df574ea560177b4de2f27ee8f421b2c1e9b75628bd9db23"
dependencies = [
"actix-codec",
"actix-service",
@@ -88,7 +88,7 @@ checksum = "367f814ad4afbac74f07df5001214da65f65e185c90ef56c4dd8df23f8695b9b"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -119,9 +119,9 @@ dependencies = [
[[package]]
name = "actix-server"
-version = "2.9.5"
+version = "2.9.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aec21d555b23ee78a1c0e4ed61667935de7d61664caba878226a081b1ac20a74"
+checksum = "c5c8e46e9b40172e4cc67adcd172bd42e932a5a0aa7f603eee88e60f70452f22"
dependencies = [
"actix-rt",
"actix-service",
@@ -205,7 +205,7 @@ dependencies = [
"actix-router",
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -290,9 +290,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
[[package]]
name = "ammonia"
-version = "4.2.0"
+version = "4.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f7ed3ac4252be4d3e36fb589ed5659356842587b21a31596a9dc89d3b2f5e2a"
+checksum = "850babe4998b8b9e2dad65a56be4ee1bb977bc3cb3934fa2b28feb2297c30a55"
dependencies = [
"cssparser 0.38.0",
"html5ever 0.40.1",
@@ -421,7 +421,7 @@ checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -566,9 +566,9 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.4.7"
+version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "54413ede23c2daf518f35156dfde027feb2374004d63bd497f983c8db9c0e313"
+checksum = "50a649af8a827553c29fb0cb4bd4a6f1a0dd695bd3232b9bc98bd9c8a3ffbb8b"
dependencies = [
"find-msvc-tools",
"jobserver",
@@ -650,7 +650,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -674,12 +674,12 @@ version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1"
dependencies = [
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
]
[[package]]
name = "codechat-editor-server"
-version = "0.2.6-beta1"
+version = "0.3.0"
dependencies = [
"actix-files",
"actix-rt",
@@ -699,16 +699,19 @@ dependencies = [
"htmd",
"html5ever 0.39.0",
"htmlize",
+ "ignore",
"imara-diff",
"indoc",
"log",
"log4rs",
+ "lru",
"markup5ever_rcdom",
"mime",
"mime_guess",
"minify-html",
"minreq",
"normalize-line-endings",
+ "notify-debouncer-full",
"path-slash",
"pest",
"pest_derive",
@@ -723,7 +726,7 @@ dependencies = [
"sha2",
"test_utils",
"thirtyfour",
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
"tokio",
"tokio-tungstenite",
"tracing",
@@ -737,7 +740,7 @@ dependencies = [
[[package]]
name = "codechat-editor-standalone"
-version = "0.2.6-beta1"
+version = "0.3.0"
dependencies = [
"actix-http",
"actix-rt",
@@ -765,7 +768,7 @@ dependencies = [
[[package]]
name = "codechat-editor-vscode-extension"
-version = "0.2.6-beta1"
+version = "0.3.0"
dependencies = [
"codechat-editor-server",
"log",
@@ -996,7 +999,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d045de693cb712d0b22c6a64be5b953f67b3ce00ab5ad3dd5d8b441886ab8e1a"
dependencies = [
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -1108,7 +1111,7 @@ checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -1143,7 +1146,7 @@ dependencies = [
"dprint-core",
"dprint-core-macros",
"serde",
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
"unicode-width",
]
@@ -1176,9 +1179,9 @@ checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813"
[[package]]
name = "either"
-version = "1.18.0"
+version = "1.19.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34"
+checksum = "0e9c71c2167ca323c882b99918929403426e2373ea17242ff5653e0d5e1058be"
[[package]]
name = "embedded-io"
@@ -1194,13 +1197,12 @@ checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d"
[[package]]
name = "encoding_rs"
-version = "0.8.41"
+version = "0.8.42"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b5ef0006ac9ab233c38522f5ae99cae3625151de8f706cacee1cba4b8e2832a"
+checksum = "8e985e0451871ad22fb8d2b6b076e2028a502a0d3950998c2c5c0a4f9b5d9679"
dependencies = [
"cfg-if",
"core_detect",
- "multiversion",
"multiversion_no_op",
"rustversion",
"scopeguard",
@@ -1256,9 +1258,9 @@ dependencies = [
[[package]]
name = "find-msvc-tools"
-version = "0.1.13"
+version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef25905e51abafe4dcea6c15fec58c57b601cdbd0ee53d22ea1d3016c587d39b"
+checksum = "aedcfb3409746eddb02b9e19ebda1c3394f759a152e48ee875a0844d1b955484"
[[package]]
name = "flate2"
@@ -1389,7 +1391,7 @@ checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -1521,6 +1523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
dependencies = [
"allocator-api2",
+ "foldhash 0.2.0",
]
[[package]]
@@ -1649,13 +1652,12 @@ dependencies = [
[[package]]
name = "hyper"
-version = "1.11.1"
+version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43"
+checksum = "2c3e324da4c95177d6291d4c8730197c0d1822f8a9766814a4a44fa5ab797c9c"
dependencies = [
"atomic-waker",
"bytes",
- "futures-channel",
"futures-core",
"http 1.5.0",
"http-body",
@@ -1684,16 +1686,17 @@ dependencies = [
[[package]]
name = "hyper-util"
-version = "0.1.20"
+version = "0.1.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0"
+checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff"
dependencies = [
- "base64 0.22.1",
+ "base64 0.23.1",
"bytes",
"futures-channel",
"futures-util",
"http 1.5.0",
"http-body",
+ "httparse",
"hyper",
"ipnet",
"libc",
@@ -1924,9 +1927,9 @@ dependencies = [
[[package]]
name = "indoc"
-version = "2.0.7"
+version = "2.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706"
+checksum = "a37b2691796cffeb8a8cd305ac66e65841559f147f4e63231d0eafa4db5384d1"
dependencies = [
"rustversion",
]
@@ -2015,7 +2018,7 @@ dependencies = [
"jni-sys 0.4.1",
"log",
"simd_cesu8",
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
"walkdir",
"windows-link",
]
@@ -2073,9 +2076,9 @@ dependencies = [
[[package]]
name = "js-sys"
-version = "0.3.105"
+version = "0.3.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e"
+checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5"
dependencies = [
"cfg-if",
"futures-util",
@@ -2134,15 +2137,15 @@ checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388"
[[package]]
name = "lazy_static"
-version = "1.5.0"
+version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+checksum = "20870f649af7073d53e38067b2a84312175d56ea15217e1b15bc83506ec50afb"
[[package]]
name = "libc"
-version = "0.2.189"
+version = "0.2.190"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
+checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78"
[[package]]
name = "libloading"
@@ -2273,13 +2276,22 @@ dependencies = [
"serde-value",
"serde_json",
"serde_yaml",
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
"thread-id",
"typemap-ors",
"unicode-segmentation",
"winapi",
]
+[[package]]
+name = "lru"
+version = "0.18.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef9ac18847474e638e3702b76c65d4eb93428471a74778ef0f1be711717f89b5"
+dependencies = [
+ "hashbrown 0.17.1",
+]
+
[[package]]
name = "lru-slab"
version = "0.1.3"
@@ -2412,9 +2424,9 @@ dependencies = [
[[package]]
name = "mio"
-version = "1.2.3"
+version = "1.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8"
+checksum = "1788edb87fdc09c7e26304471e2f5be8cdefb1b6930d6e3985fc02ff53bf86ee"
dependencies = [
"libc",
"log",
@@ -2428,27 +2440,6 @@ version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9bb517913cfcfb9eeda59f36020269075a152701a01606c612f547e4890be399"
-[[package]]
-name = "multiversion"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b4ca4bea16ffc3f443cf7d866912118196bfef4c6a1556ca00f9f9b00bb43f7c"
-dependencies = [
- "multiversion-macros",
-]
-
-[[package]]
-name = "multiversion-macros"
-version = "0.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0d416831a7317ef4b08bee00b69cbbb9c8763da7959a7026244d6266869f9c83"
-dependencies = [
- "proc-macro2",
- "quote",
- "rustversion",
- "syn 3.0.6",
-]
-
[[package]]
name = "multiversion_no_op"
version = "1.0.0"
@@ -2457,9 +2448,9 @@ checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d"
[[package]]
name = "napi"
-version = "3.12.7"
+version = "3.14.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b7d3c1107f2fda46a7bd2676d65221b7b8160054494b38554b0e055c731714db"
+checksum = "a4e2cf85c02d9b057898c485b824c3c416b65193689e2b7f517efc94b86ed24c"
dependencies = [
"bitflags",
"ctor",
@@ -2474,42 +2465,42 @@ dependencies = [
[[package]]
name = "napi-build"
-version = "2.4.4"
+version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9befcb51d87271051c0c11aaf625d09340266b7f1ac3fef5975e62274dc2813f"
+checksum = "b899b545d3aa6dca985939059f258c5488d34e4ecf39c274e20009748f4b846d"
[[package]]
name = "napi-derive"
-version = "3.6.8"
+version = "3.6.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7e332e701386d8101b093203e296059ad8aeef58ddd4c75594f3c84ce637405e"
+checksum = "92cec6048ac04041ac8055bdce1ec4f353416cd443ba9222bf73af790c3d4495"
dependencies = [
"convert_case 0.12.0",
"ctor",
"napi-derive-backend",
"proc-macro2",
"quote",
- "syn 2.0.119",
+ "syn 3.0.7",
]
[[package]]
name = "napi-derive-backend"
-version = "6.1.4"
+version = "6.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd6856fe1686867da90ed0dc292d7c0c87a695eb7c578b913360f33619ee01e3"
+checksum = "fae2444f4ba7333754bb73414ff8059dec2cb23b83a95bd1a0bf08169eed1be0"
dependencies = [
"convert_case 0.12.0",
"proc-macro2",
"quote",
"semver",
- "syn 2.0.119",
+ "syn 3.0.7",
]
[[package]]
name = "napi-sys"
-version = "3.3.2"
+version = "3.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6801fc65ba4d7035636e93635e281113f00410401a237dcd4f55b1565ead2115"
+checksum = "e22a4f25c16a5c5411d987cd6fbd48313522ae1789ade2d6dd3efdc6d40a0fc8"
dependencies = [
"libloading",
]
@@ -2629,9 +2620,9 @@ dependencies = [
[[package]]
name = "objc2"
-version = "0.6.4"
+version = "0.6.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f"
+checksum = "08849bbd4767dfae9457696856ae1c84fe4e0281bbe4a7abff2d0e06fb7981f8"
dependencies = [
"objc2-encode",
]
@@ -2730,7 +2721,7 @@ dependencies = [
"postcard",
"rustc-hash",
"serde",
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
]
[[package]]
@@ -2743,7 +2734,7 @@ dependencies = [
"owo-colors",
"oxc-miette-derive",
"textwrap",
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
"unicode-segmentation",
"unicode-width",
]
@@ -3152,19 +3143,21 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "pest"
-version = "2.9.2"
+version = "2.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "45d3aca230fad2e6f6317ca0a72724338c4960cb97168a85cdee66df4a9a21a8"
+checksum = "b568374ba38b33a6c627141f891faf16902b08d2db26b8ede1bcb0a15b1919fa"
dependencies = [
"memchr",
+ "psm",
+ "stacker",
"ucd-trie",
]
[[package]]
name = "pest_derive"
-version = "2.9.2"
+version = "2.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "284b60557f2c4a2e72ad3f2d34d42685a2fa4a6a61d0d2a10c0ae2a5e916c2cf"
+checksum = "b66e184b924cebaaff20ab2256ca52f12332d528a39aa76553b5d96f92aacf7f"
dependencies = [
"pest",
"pest_generator",
@@ -3172,22 +3165,22 @@ dependencies = [
[[package]]
name = "pest_generator"
-version = "2.9.2"
+version = "2.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d9d1f08a115309ee99268cf85e5228e0e56aa9caf8841ec12866b6be07c3109"
+checksum = "a87478d267e4de54a626af9754f2f0f58e927aac6ed0575fe89bc05ad6851694"
dependencies = [
"pest",
"pest_meta",
"proc-macro2",
"quote",
- "syn 2.0.119",
+ "syn 3.0.7",
]
[[package]]
name = "pest_meta"
-version = "2.9.2"
+version = "2.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed93ba1a9ffcca32130a5188701c81c0c49cf00d4b7c5007d5148951d743adcb"
+checksum = "4f986f248b4241ac359b831f6139aaa34e03b08a37b6caf7e201a33f95c869e1"
dependencies = [
"pest",
]
@@ -3373,9 +3366,9 @@ dependencies = [
[[package]]
name = "powerfmt"
-version = "0.2.0"
+version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
+checksum = "4a6394b9e965e73d0a289ee54f589087e2c676aedf60885baf52c76b771e4958"
[[package]]
name = "ppv-lite86"
@@ -3441,6 +3434,15 @@ dependencies = [
"unicode-ident",
]
+[[package]]
+name = "psm"
+version = "0.1.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "200b9ff220857e53e184257720a14553b2f4aa02577d2ed9842d45d4b9654810"
+dependencies = [
+ "cc",
+]
+
[[package]]
name = "pulldown-cmark"
version = "0.13.4"
@@ -3473,7 +3475,7 @@ dependencies = [
"rustc-hash",
"rustls",
"socket2",
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
"tokio",
"tracing",
"web-time",
@@ -3481,9 +3483,9 @@ dependencies = [
[[package]]
name = "quinn-proto"
-version = "0.11.18"
+version = "0.11.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a9746dbde176634f4f2f1faf2404e30a31b2bc1e9cafb5329c95d8177a18c9fc"
+checksum = "0e750cca55fe4f0439a15d0bb529da9651e79993e8e72c61a899a36d462befbe"
dependencies = [
"aws-lc-rs",
"bytes",
@@ -3496,7 +3498,7 @@ dependencies = [
"rustls",
"rustls-pki-types",
"slab",
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
"tinyvec",
"tracing",
"web-time",
@@ -3504,9 +3506,9 @@ dependencies = [
[[package]]
name = "quinn-udp"
-version = "0.5.15"
+version = "0.5.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694"
+checksum = "af66907df18639dcf4db56ca65490cabc4b27a97dbadd96f2926cca73298f016"
dependencies = [
"cfg_aliases",
"libc",
@@ -3623,7 +3625,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0"
dependencies = [
"libredox",
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
]
[[package]]
@@ -3684,7 +3686,7 @@ dependencies = [
"quinn",
"rustls",
"rustls-pki-types",
- "rustls-platform-verifier 0.7.0",
+ "rustls-platform-verifier 0.7.1",
"serde",
"serde_json",
"sync_wrapper",
@@ -3793,7 +3795,7 @@ dependencies = [
"once_cell",
"rustls",
"rustls-native-certs",
- "rustls-platform-verifier-android",
+ "rustls-platform-verifier-android 0.1.1",
"rustls-webpki",
"security-framework",
"security-framework-sys",
@@ -3803,9 +3805,9 @@ dependencies = [
[[package]]
name = "rustls-platform-verifier"
-version = "0.7.0"
+version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "26d1e2536ce4f35f4846aa13bff16bd0ff40157cdb14cc056c7b14ba41233ba0"
+checksum = "1167586491e2b18b8bfbb293e8180ec17c201c4f076d7cb3070ca964e7598f98"
dependencies = [
"core-foundation",
"core-foundation-sys",
@@ -3814,7 +3816,7 @@ dependencies = [
"once_cell",
"rustls",
"rustls-native-certs",
- "rustls-platform-verifier-android",
+ "rustls-platform-verifier-android 0.2.0",
"rustls-webpki",
"security-framework",
"security-framework-sys",
@@ -3828,6 +3830,12 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f87165f0995f63a9fbeea62b64d10b4d9d8e78ec6d7d51fb2125fda7bb36788f"
+[[package]]
+name = "rustls-platform-verifier-android"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eec689c0bc40ff2458a5977b6619cb718087084a18e02a131c599b62d05e1a5f"
+
[[package]]
name = "rustls-webpki"
version = "0.103.15"
@@ -3954,7 +3962,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -3979,7 +3987,7 @@ checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -4078,9 +4086,9 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e"
[[package]]
name = "siphasher"
-version = "1.0.3"
+version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649"
+checksum = "33f4fe9184a62d842c9ef383018f3306d8ba224fd9d836f56d7288308847c256"
[[package]]
name = "slab"
@@ -4090,9 +4098,9 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
[[package]]
name = "smallvec"
-version = "1.16.1"
+version = "1.16.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891"
+checksum = "5b3dc8af474f516a851ff4bd12db780f948b9250ad37211e4eec0bccea54e01b"
[[package]]
name = "smawk"
@@ -4116,6 +4124,19 @@ version = "1.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
+[[package]]
+name = "stacker"
+version = "0.1.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "707f49d46706bacf8a2b00d51dace3f9de527c13eec3778f570c411f89e69967"
+dependencies = [
+ "cc",
+ "cfg-if",
+ "libc",
+ "psm",
+ "windows-sys 0.61.2",
+]
+
[[package]]
name = "static_assertions"
version = "1.1.0"
@@ -4216,9 +4237,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "3.0.6"
+version = "3.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee"
+checksum = "d62a2e0561533f2ca2561d0cf27fd9fedb640a1bf2616ff5d5c80d99017faadc"
dependencies = [
"proc-macro2",
"quote",
@@ -4242,7 +4263,7 @@ checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -4314,9 +4335,9 @@ dependencies = [
[[package]]
name = "thirtyfour"
-version = "0.37.5"
+version = "0.37.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28b596eb866a1a2bac3e8e17080b8f21739e1bdb0b5479fe5c70d14375362a92"
+checksum = "8df97330642045e09a763b839ebedc6e76eb77bf202dad474898f5a631b4dc46"
dependencies = [
"arc-swap",
"async-trait",
@@ -4338,7 +4359,7 @@ dependencies = [
"stringmatch",
"tar",
"thirtyfour-macros",
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
"tokio",
"tokio-stream",
"tracing",
@@ -4368,11 +4389,11 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "2.0.20"
+version = "2.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f"
+checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e"
dependencies = [
- "thiserror-impl 2.0.20",
+ "thiserror-impl 2.0.21",
]
[[package]]
@@ -4388,13 +4409,13 @@ dependencies = [
[[package]]
name = "thiserror-impl"
-version = "2.0.20"
+version = "2.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af"
+checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -4465,9 +4486,9 @@ checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee"
[[package]]
name = "tokio"
-version = "1.53.1"
+version = "1.53.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed"
+checksum = "e95f91fcc7a621e8b030f6aa23c71fe9838ae2fb4d8118b75602a328f5144044"
dependencies = [
"bytes",
"libc",
@@ -4488,14 +4509,14 @@ checksum = "78773a2a397f451582ce068015985c33193cf6dea8b74d2a639fe457b2f07b0e"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
name = "tokio-rustls"
-version = "0.26.5"
+version = "0.26.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67"
+checksum = "c9cc2678c2cdd569ef8215e2afd7954ada2ae20b4fdd2c5fe6139a3b02d105db"
dependencies = [
"rustls",
"tokio",
@@ -4527,9 +4548,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.19"
+version = "0.7.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52"
+checksum = "e464cf451ba96ebfc6f9b6542f17ee8b8956e33f1e40d9690624e59d7a7f8a4b"
dependencies = [
"bytes",
"futures-core",
@@ -4659,7 +4680,7 @@ version = "12.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "756050066659291d47a554a9f558125db17428b073c5ffce1daf5dcb0f7231d8"
dependencies = [
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
"ts-rs-macros",
]
@@ -4688,7 +4709,7 @@ dependencies = [
"log",
"rand 0.10.3",
"sha1",
- "thiserror 2.0.20",
+ "thiserror 2.0.21",
]
[[package]]
@@ -4720,9 +4741,9 @@ checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971"
[[package]]
name = "unicase"
-version = "2.9.0"
+version = "2.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
+checksum = "357cc3acc6a036009fd6c973ed009037c732d60d0b4f6c673e9041497482a28f"
[[package]]
name = "unicode-id-start"
@@ -4859,9 +4880,9 @@ dependencies = [
[[package]]
name = "want"
-version = "0.3.1"
+version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+checksum = "ec4cdd0dd910afe868b7ef477227d8d538b46b3075031afee8a9f2acb0a2ed0b"
dependencies = [
"try-lock",
]
@@ -4883,9 +4904,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen"
-version = "0.2.128"
+version = "0.2.129"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf"
+checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409"
dependencies = [
"cfg-if",
"once_cell",
@@ -4896,19 +4917,20 @@ dependencies = [
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.78"
+version = "0.4.79"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928"
+checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e"
dependencies = [
"js-sys",
+ "tokio",
"wasm-bindgen",
]
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.128"
+version = "0.2.129"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed"
+checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -4916,22 +4938,22 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.128"
+version = "0.2.129"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a"
+checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7"
dependencies = [
"bumpalo",
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
"wasm-bindgen-shared",
]
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.128"
+version = "0.2.129"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e"
+checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6"
dependencies = [
"unicode-ident",
]
@@ -4951,9 +4973,9 @@ dependencies = [
[[package]]
name = "web-sys"
-version = "0.3.105"
+version = "0.3.106"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8"
+checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -5432,30 +5454,30 @@ dependencies = [
[[package]]
name = "yoke-derive"
-version = "0.8.3"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78"
+checksum = "ec8ebde2db3681e8c9980cc27822030e68752690ddfa9473e739aeb4dbde6d71"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
"synstructure",
]
[[package]]
name = "zerocopy"
-version = "0.8.57"
+version = "0.8.62"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d35102a9f36d089ccae9e4c6802bc118be4487b80aaffc0ab4e0cf5ce92d2873"
+checksum = "86502bf56ac7c77571a32e2647bb2a15894565e981fb2a48d7bde2d91c965a9d"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
-version = "0.8.57"
+version = "0.8.62"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "146c01f5ab44258da43cf276c74a2763db2ff3969c9c652c3f2de07041d0b2bc"
+checksum = "5457206954b06561e2608c7e19cf58b1926586d999c246eebe4502f7e2039d1a"
dependencies = [
"proc-macro2",
"quote",
@@ -5479,15 +5501,15 @@ checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
"synstructure",
]
[[package]]
name = "zeroize"
-version = "1.9.0"
+version = "1.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e"
+checksum = "e13084392c5e4bc371903e2935a5eaeed24905a7511356b883835e18a78f6879"
[[package]]
name = "zerotrie"
@@ -5521,7 +5543,7 @@ checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -5582,9 +5604,9 @@ dependencies = [
[[package]]
name = "zstd-sys"
-version = "2.1.0+zstd.1.5.7"
+version = "2.1.1+zstd.1.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ef0a8027ec3ee71300ab3bcbcd0393f434aa72b91ca6d635a39941deae8eea0"
+checksum = "aeec9eaf2dffbbd09201e23bd0ffcbaa33bb8e9266a10734fd7ed90a85eca078"
dependencies = [
"cc",
"pkg-config",
diff --git a/Cargo.toml b/Cargo.toml
index 57472a0b..78661501 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -64,7 +64,7 @@ homepage = "https://codechat-editor.onrender.com/fw/fsb/opt/render/project/src/R
keywords = ["literate programming"]
license = "GPL-3.0-only"
repository = "https://github.com/bjones1/CodeChat_Editor"
-version = "0.2.6-beta1"
+version = "0.3.0"
# Shared dependencies
# -------------------
diff --git a/README.md b/README.md
index 047b884e..5f254b2d 100644
--- a/README.md
+++ b/README.md
@@ -119,9 +119,6 @@ cross-reference. For example:
| `[Style guide](#cc-nNZ6Gs2uWD)` | [Style guide](#cc-nNZ6Gs2uWD) |
| `` | |
-Alpha feature: first view the [style guide](docs/style_guide.cpp) to make the
-link above work. Opening the link doesn't (yet) work.
-
In projects, each id must be unique throughout the entire project. To simplify
the creation of unique ids, items assigned an `id="*"` with be replaced with a
unique id, such as `id=cc-DscjSxRZHF`. This autogenerated id isn't automatically
@@ -155,10 +152,6 @@ To do so:
Starting websocket ID
-Alpha feature: first view [webserver.rs](server/src/webserver.rs) and
-[CodeChatEditorFramework.mts](client/src/CodeChatEditorFramework.mts). Opening
-the link doesn't (yet) work.
-
Images
------
@@ -326,7 +319,7 @@ Contributions to the code are welcome and encouraged!
License
-------
-Copyright (C) 2025 Bryan A. Jones.
+Copyright (C) 2026 Bryan A. Jones.
This file is part of the CodeChat Editor.
diff --git a/builder/Cargo.lock b/builder/Cargo.lock
index 73b3f890..d1a211de 100644
--- a/builder/Cargo.lock
+++ b/builder/Cargo.lock
@@ -128,7 +128,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -258,9 +258,9 @@ checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
[[package]]
name = "jiff"
-version = "0.2.37"
+version = "0.2.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ab1baf72f08796de0260609515130699b890ac25f30e610ad894bc5856cafdb"
+checksum = "b2b005715dcbeb0089a3c0dab99f2ff1cc3b2525323552703d648585d342a383"
dependencies = [
"defmt",
"jiff-core",
@@ -283,9 +283,9 @@ dependencies = [
[[package]]
name = "jiff-static"
-version = "0.2.37"
+version = "0.2.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "378268a1116ad67ae6228701118ac9f491d78fda38a40a1f1a9e1348de6f7212"
+checksum = "2cc9817253cf7c7ee4684451bd327e88d6f3658014e54a29198625590650695c"
dependencies = [
"jiff-core",
"proc-macro2",
@@ -295,9 +295,9 @@ dependencies = [
[[package]]
name = "libc"
-version = "0.2.189"
+version = "0.2.190"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2"
+checksum = "ce5d3ddc6d3fa000eb1536d85e147bfe31aacaba692ed6a876f95cb7c855be78"
[[package]]
name = "log"
@@ -440,7 +440,7 @@ checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
@@ -462,9 +462,9 @@ dependencies = [
[[package]]
name = "syn"
-version = "3.0.6"
+version = "3.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee"
+checksum = "d62a2e0561533f2ca2561d0cf27fd9fedb640a1bf2616ff5d5c80d99017faadc"
dependencies = [
"proc-macro2",
"quote",
@@ -473,22 +473,22 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "2.0.20"
+version = "2.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec86235f5fcc2a73650310756d2ac5b138a5780bbbdfae3eeccec992c435ba4f"
+checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "2.0.20"
+version = "2.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bc04cd3e1236dd4a98afca4569f2deb3f120e5422a4023be2cb683f8486292af"
+checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524"
dependencies = [
"proc-macro2",
"quote",
- "syn 3.0.6",
+ "syn 3.0.7",
]
[[package]]
diff --git a/builder/src/main.rs b/builder/src/main.rs
index 263be2d0..6d45c646 100644
--- a/builder/src/main.rs
+++ b/builder/src/main.rs
@@ -724,21 +724,8 @@ fn run_extensions_build(
let esbuild = PathBuf::from_slash("node_modules/.bin/esbuild");
let distflag = if dist { "--minify" } else { "--sourcemap" };
- // The NAPI build. `--js` aims the generated loader at
- // `src/index-generated.js` instead of its default `src/index.js`, which
- // is a tracked file carrying hand-written load tracing. The generated
- // loader is therefore unused at run time; it's kept, and ignored by Git,
- // as the reference to re-derive `src/index.js` from after a NAPI-RS
- // upgrade changes what NAPI-RS emits.
- let mut napi_args = vec![
- "napi",
- "build",
- "--platform",
- "--output-dir",
- "src",
- "--js",
- "index-generated.js",
- ];
+ // The NAPI build.
+ let mut napi_args = vec!["napi", "build", "--platform", "--output-dir", "src"];
if dist {
napi_args.push("--release");
}
diff --git a/client/package.json5 b/client/package.json5
index d60bd809..b399b07b 100644
--- a/client/package.json5
+++ b/client/package.json5
@@ -43,7 +43,7 @@
url: 'https://github.com/bjones1/CodeChat_editor',
},
type: 'module',
- version: '0.2.6-beta1',
+ version: '0.3.0',
dependencies: {
'@codemirror/commands': '^6.11.1',
'@codemirror/lang-cpp': '^6.0.3',
@@ -57,18 +57,18 @@
'@codemirror/lang-rust': '^6.0.2',
'@codemirror/lang-sql': '^6.10.0',
'@codemirror/lang-yaml': '^6.1.3',
- '@codemirror/language': '^6.12.4',
- '@codemirror/legacy-modes': '^6.5.4',
+ '@codemirror/language': '^6.13.1',
+ '@codemirror/legacy-modes': '^6.5.5',
'@codemirror/lint': '^6.9.7',
- '@codemirror/state': '^6.7.5',
- '@codemirror/view': '^6.43.12',
- '@hpcc-js/wasm-graphviz': '^1.29.1',
+ '@codemirror/state': '^6.7.6',
+ '@codemirror/view': '^6.43.14',
+ '@hpcc-js/wasm-graphviz': '^1.29.2',
'@mathjax/mathjax-newcm-font': '^4.1.3',
codemirror: '^6.0.2',
mathjax: '^4.1.3',
- mermaid: '^11.17.2',
- 'pdfjs-dist': '^6.3.289',
- tinymce: '^8.9.1',
+ mermaid: '^12.1.0',
+ 'pdfjs-dist': '^6.4.299',
+ tinymce: '^8.9.3',
'toastify-js': '^1.12.0',
},
devDependencies: {
@@ -76,31 +76,31 @@
'@eslint/js': '^10.0.1',
'@types/chai': '^5.2.3',
'@types/mocha': '^10.0.10',
- '@types/node': '^26.6.2',
+ '@types/node': '^26.6.4',
'@types/toastify-js': '^1.12.4',
- '@typescript-eslint/eslint-plugin': '^8.70.0',
- '@typescript-eslint/parser': '^8.70.0',
+ '@typescript-eslint/eslint-plugin': '^8.71.1',
+ '@typescript-eslint/parser': '^8.71.1',
'@typescript/native': 'npm:typescript@^7.0.2',
/* The accessibility audit engine driven by the Server's `overall_a11y`
browser tests. */
- 'axe-core': '^4.13.0',
- chai: '^6.2.2',
+ 'axe-core': '^4.14.0',
+ chai: '^6.3.0',
esbuild: '^0.28.2',
- eslint: '^10.11.0',
+ eslint: '^10.12.0',
'eslint-config-prettier': '^10.1.8',
'eslint-plugin-import': '^2.32.0',
'eslint-plugin-prettier': '^5.5.6',
- globals: '^17.12.0',
- mocha: '^12.0.2',
+ globals: '^17.13.0',
+ mocha: '^12.0.3',
'npm-check-updates': '^23.1.0',
- prettier: '^3.9.8',
+ prettier: '^3.9.9',
/* Typescript 7 support for eslint is blocked per
[this issue](https://github.com/typescript-eslint/typescript-eslint/issues/10940).
Instead, see
[Running Typescript 7.0 Side-by-Side with TypeScript 6.0](https://devblogs.microsoft.com/typescript/announcing-typescript-7-0/#running-side-by-side-with-typescript-6.0)
for a workaround. */
typescript: 'npm:@typescript/typescript6@^6.0.2',
- 'typescript-eslint': '^8.70.0',
+ 'typescript-eslint': '^8.71.1',
},
scripts: {
test: 'echo "Error: no test specified" && exit 1',
diff --git a/client/pnpm-lock.yaml b/client/pnpm-lock.yaml
index 2ec250f5..69d8f88d 100644
--- a/client/pnpm-lock.yaml
+++ b/client/pnpm-lock.yaml
@@ -45,23 +45,23 @@ importers:
specifier: ^6.1.3
version: 6.1.3
'@codemirror/language':
- specifier: ^6.12.4
- version: 6.12.4
+ specifier: ^6.13.1
+ version: 6.13.1
'@codemirror/legacy-modes':
- specifier: ^6.5.4
- version: 6.5.4
+ specifier: ^6.5.5
+ version: 6.5.5
'@codemirror/lint':
specifier: ^6.9.7
version: 6.9.7
'@codemirror/state':
- specifier: ^6.7.5
- version: 6.7.5
+ specifier: ^6.7.6
+ version: 6.7.6
'@codemirror/view':
- specifier: ^6.43.12
- version: 6.43.12
+ specifier: ^6.43.14
+ version: 6.43.14
'@hpcc-js/wasm-graphviz':
- specifier: ^1.29.1
- version: 1.29.1
+ specifier: ^1.29.2
+ version: 1.29.2
'@mathjax/mathjax-newcm-font':
specifier: ^4.1.3
version: 4.1.3
@@ -72,14 +72,14 @@ importers:
specifier: ^4.1.3
version: 4.1.3
mermaid:
- specifier: ^11.17.2
- version: 11.17.2
+ specifier: ^12.1.0
+ version: 12.1.0
pdfjs-dist:
- specifier: ^6.3.289
- version: 6.3.289
+ specifier: ^6.4.299
+ version: 6.4.299
tinymce:
- specifier: ^8.9.1
- version: 8.9.1
+ specifier: ^8.9.3
+ version: 8.9.3
toastify-js:
specifier: ^1.12.0
version: 1.12.0
@@ -89,7 +89,7 @@ importers:
version: 2.0.0
'@eslint/js':
specifier: ^10.0.1
- version: 10.0.1(eslint@10.11.0(supports-color@8.1.1))
+ version: 10.0.1(eslint@10.12.0(supports-color@8.1.1))
'@types/chai':
specifier: ^5.2.3
version: 5.2.3
@@ -97,59 +97,59 @@ importers:
specifier: ^10.0.10
version: 10.0.10
'@types/node':
- specifier: ^26.6.2
- version: 26.6.2
+ specifier: ^26.6.4
+ version: 26.6.4
'@types/toastify-js':
specifier: ^1.12.4
version: 1.12.4
'@typescript-eslint/eslint-plugin':
- specifier: ^8.70.0
- version: 8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1))(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
+ specifier: ^8.71.1
+ version: 8.71.1(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1))(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
'@typescript-eslint/parser':
- specifier: ^8.70.0
- version: 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
+ specifier: ^8.71.1
+ version: 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
'@typescript/native':
specifier: npm:typescript@^7.0.2
version: typescript@7.0.2
axe-core:
- specifier: ^4.13.0
- version: 4.13.0
+ specifier: ^4.14.0
+ version: 4.14.0
chai:
- specifier: ^6.2.2
- version: 6.2.2
+ specifier: ^6.3.0
+ version: 6.3.0
esbuild:
specifier: ^0.28.2
version: 0.28.2
eslint:
- specifier: ^10.11.0
- version: 10.11.0(supports-color@8.1.1)
+ specifier: ^10.12.0
+ version: 10.12.0(supports-color@8.1.1)
eslint-config-prettier:
specifier: ^10.1.8
- version: 10.1.8(eslint@10.11.0(supports-color@8.1.1))
+ version: 10.1.8(eslint@10.12.0(supports-color@8.1.1))
eslint-plugin-import:
specifier: ^2.32.0
- version: 2.32.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
+ version: 2.32.0(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
eslint-plugin-prettier:
specifier: ^5.5.6
- version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.11.0(supports-color@8.1.1)))(eslint@10.11.0(supports-color@8.1.1))(prettier@3.9.8)
+ version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.12.0(supports-color@8.1.1)))(eslint@10.12.0(supports-color@8.1.1))(prettier@3.9.9)
globals:
- specifier: ^17.12.0
- version: 17.12.0
+ specifier: ^17.13.0
+ version: 17.13.0
mocha:
- specifier: ^12.0.2
- version: 12.0.2
+ specifier: ^12.0.3
+ version: 12.0.3
npm-check-updates:
specifier: ^23.1.0
version: 23.1.0
prettier:
- specifier: ^3.9.8
- version: 3.9.8
+ specifier: ^3.9.9
+ version: 3.9.9
typescript:
specifier: npm:@typescript/typescript6@^6.0.2
version: '@typescript/typescript6@6.0.2'
typescript-eslint:
- specifier: ^8.70.0
- version: 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
+ specifier: ^8.71.1
+ version: 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
packages:
@@ -165,8 +165,20 @@ packages:
'@cacheable/utils@2.5.0':
resolution: {integrity: sha512-buipgOVDkkPXNR5+xBpDw7Zk2n1EvU7qBJCNUcL7rhQ//kfpOXPAvQ511Os0vpLYJ1pZnvudNytkQt2hst3wqA==}
- '@chevrotain/types@11.1.2':
- resolution: {integrity: sha512-U+HFai5+zmJCkK86QsaJtoITlboZHBqrVketcO2ROv865xfCMSFpELQoz1GkX5GzME8pTa+3kbKrZHQtI0gdbw==}
+ '@chevrotain/cst-dts-gen@13.2.0':
+ resolution: {integrity: sha512-bA9dvWlhAUcHkNwU+8w9yiUxJPlj/Lm3VqS7MD+NbIR/7LmpNLuK/AWNFdCo/T3SK5ND0/UHf3IJvl/Jn/i6yg==}
+
+ '@chevrotain/gast@13.2.0':
+ resolution: {integrity: sha512-bCARdAsG+eEbOveSXcOAC7pVxA04I1ionzeMOwIYf5NX7SaS7zgn4Dgug2BSqoL+iyKeMNSorQjsFSHJHsCNwg==}
+
+ '@chevrotain/regexp-to-ast@13.2.0':
+ resolution: {integrity: sha512-kxpUkLtiaK09ph+dib+Yvm+3sWSnuwlo25gqfKRgTPNmF6H7uW4gVkMjaRdtnN783S9sM6vUNWh9CsxYX4QwKw==}
+
+ '@chevrotain/types@13.2.0':
+ resolution: {integrity: sha512-7qrYHRlKfWf2AvBfJi5eVOrKAkbxvMFsy/iIHTGIiApNcEecCaVIdR+mIQhyCBsTDJxBz4JWXHMo6krbhR9hVg==}
+
+ '@chevrotain/utils@13.2.0':
+ resolution: {integrity: sha512-SzKYY68rseOrb9KILVzPsl6SjkQtdWw01SRGB5aCVI5kFcHltQsOYV3JB0Ffst72DgkvHCyDQ0NLwxtmCCf97Q==}
'@codemirror/autocomplete@6.20.3':
resolution: {integrity: sha512-tlosUqb+3BbxCxZdu4tKeRghPFC+QM7q4X5YhKV2eCmPG+1r2F3f4AaSz5sCrFqUtX4Jh20VFTKecl16MgiV9g==}
@@ -207,11 +219,11 @@ packages:
'@codemirror/lang-yaml@6.1.3':
resolution: {integrity: sha512-AZ8DJBuXGVHybpBQhmZtgew5//4hv3tdkXnr3vDmOUMJRuB6vn/uuwtmTOTlqEaQFg3hQSVeA90NmvIQyUV6FQ==}
- '@codemirror/language@6.12.4':
- resolution: {integrity: sha512-1q4PaT+o6PbgpkJt4Q8Fv5XJxTy4FUZ4MWETtyiDw3J0Pyr9E2vqcKL+k9wcvjNTIsauxvE7OfmWj3FRPHQ76A==}
+ '@codemirror/language@6.13.1':
+ resolution: {integrity: sha512-zfvU2r3TyylQLMj/te+5CnQ0rSqZi8B1oTCBbQkagcLW4Xc6imab6qN+pEJhsuNOLaJqiRyBXp9UhWA1DhVvDw==}
- '@codemirror/legacy-modes@6.5.4':
- resolution: {integrity: sha512-/cZr6qZyl08iYNLGsJ862CXXNI51LryRFRE40ejgoIjXZz0C1rGkD3/Ek5jM/8w1ceRjqtt4qx/KLMh4zBTgew==}
+ '@codemirror/legacy-modes@6.5.5':
+ resolution: {integrity: sha512-9ltT214oMb3Y1w5eAZMSigzrjzZnMI2Wa3Feq73rU/i4C56MkwrpfswfQYOr28C5pXr6dWwspNTMyeHXlzWMxg==}
'@codemirror/lint@6.9.7':
resolution: {integrity: sha512-28/+iWLYxKxsvGYhSYL7zaCZqLz5+FFFDq9tVsvGv9kv8RY4fFAchJ5WX9M3YrrRlTIsECjsXPqeNgnSmNP2dg==}
@@ -219,11 +231,14 @@ packages:
'@codemirror/search@6.7.2':
resolution: {integrity: sha512-gUYkYhT2+n/+VGZ+8EzE5WFkYZUZYm1VOKDudIsNqh42uRVQJ0a6Yss9sdKT3MeOYfuL1N6AZA57oza0Oyr0LA==}
- '@codemirror/state@6.7.5':
- resolution: {integrity: sha512-QjLbZmY1Au3JiRrDVYFLRD0BZ3SOKS9pR3yjIkd7u27YY8TFD9/Q9fhPnLV5l1mHFSo3hHU/N31vpwEJOx4owQ==}
+ '@codemirror/state@6.7.6':
+ resolution: {integrity: sha512-kAz+AncRtKuIknedxT1bq4XwXv4UowhbkHU1myPrtVb/jZtImWuV5BXzv5vK6i3kYACsdiZiQKFQQ5Mq7elW8w==}
+
+ '@codemirror/streamparser@6.0.0':
+ resolution: {integrity: sha512-JTFPF6xrfjt0mnfGPgzcLiMwYmvIyNaoizp8BYzv8FE8KrT6GBGDZ190rtt+O7Wke3gG/MFHyiY9YGNeimof4w==}
- '@codemirror/view@6.43.12':
- resolution: {integrity: sha512-Nv0vxQ19NAqvB/c2pFzjIzFlzzJl7jmdtNkwOwGbn0Ks9mFAzibvumz7cQem5cRsFA2cEw2fg+uHZGbcHupLQQ==}
+ '@codemirror/view@6.43.14':
+ resolution: {integrity: sha512-hC45YnmJNR1rz42OF57BLoQNFMV12/13drnvibDsR2quNDmldcb4WvYVV81hFQg56i9lcqQMEDqilhX2QDcGQQ==}
'@esbuild/aix-ppc64@0.28.2':
resolution: {integrity: sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==}
@@ -428,8 +443,8 @@ packages:
resolution: {integrity: sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
- '@hpcc-js/wasm-graphviz@1.29.1':
- resolution: {integrity: sha512-koAQL0wlryEMeBs4/cQC3GB5ziITv66gR9DU/SWYjjup+iQ+Nbjcqxeaef+sffN4F4cBYZ3P31B5z7+cbSABbw==}
+ '@hpcc-js/wasm-graphviz@1.29.2':
+ resolution: {integrity: sha512-AkArBAZERT5OxH52/+kvCHB07cZ6ZNd9GnOvjw+S880bR88D6i27XfK6xj4dBhUDxNA2QPPMdgEcky3x4TJ3KA==}
'@humanfs/core@0.19.2':
resolution: {integrity: sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==}
@@ -466,35 +481,35 @@ packages:
'@keyv/serialize@1.1.1':
resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
- '@lezer/common@1.5.2':
- resolution: {integrity: sha512-sxQE460fPZyU3sdc8lafxiPwJHBzZRy/udNFynGQky1SePYBdhkBl1kOagA9uT3pxR8K09bOrmTUqA9wb/PjSQ==}
+ '@lezer/common@1.5.3':
+ resolution: {integrity: sha512-H0iErY4e43LpXbYDyBci5W4v/RwTgGV3YzYOlJPiGZ8RY8w51kVE+xLn1tg3Z6UmSfyETvtsUK3r7YsgDQEI7Q==}
'@lezer/cpp@1.1.6':
resolution: {integrity: sha512-vh9gWWJOXFVY8HBHK3Twzq8MgwG2iN4GSyzBP9sCGTe37P15x2R14VaBQk0VA0ezTRN1KHYBBsHhvpGZ2Xy/pA==}
- '@lezer/css@1.3.7':
- resolution: {integrity: sha512-ZuliDOBDNr/WPUL87qyN1BOeAv/ZuF2UxG8xJnlTp+R6ltQo/ybXyIqMK4j3H9bhOCq56mD+yL+dwWdrNOp+oA==}
+ '@lezer/css@1.3.9':
+ resolution: {integrity: sha512-ZmzgvTOBdJWGIsY/ItAfN7UW8DV802oZG+jeG6E508SwEzz5YhuAajptpWPICvIyqYAD2+VjMdOS40GgGkyEOQ==}
'@lezer/go@1.0.1':
resolution: {integrity: sha512-xToRsYxwsgJNHTgNdStpcvmbVuKxTapV0dM0wey1geMMRc9aggoVyKgzYp41D2/vVOx+Ii4hmE206kvxIXBVXQ==}
- '@lezer/highlight@1.2.3':
- resolution: {integrity: sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==}
+ '@lezer/highlight@1.2.5':
+ resolution: {integrity: sha512-O1GMVKgtf5YspFaRzpmqkVgMtIk2HG9uMAbH6wdAIdNh3TVzCsch/+cRi+6l2//UGDKe6NB9BW3cvuR5ezMQ0w==}
'@lezer/html@1.3.13':
resolution: {integrity: sha512-oI7n6NJml729m7pjm9lvLvmXbdoMoi2f+1pwSDJkl9d68zGr7a9Btz8NdHTGQZtW2DA25ybeuv/SyDb9D5tseg==}
- '@lezer/java@1.1.4':
- resolution: {integrity: sha512-gQylJ2xHV2xXsVqtnAcJrcROvLZJaQiC0tR//+q0k961BxqvyYttusPkJ8d9T1fPDJKHJW2etUH8XbIn9jhVUg==}
+ '@lezer/java@1.1.5':
+ resolution: {integrity: sha512-JppTd1iKHpeNlLYw/Zl8JX7zSY5HqAzK4zZ05lpn8l8Sk7Fo5KAKiDiMiezKoT5lfeC2xZf8HeKp1tSctj4G6Q==}
- '@lezer/javascript@1.5.5':
- resolution: {integrity: sha512-sWg4yX1J6XW67AaAynVt0iwF0M5c+np36TEu+P2ifAJ8haRYvHnWDV28r1jdwnJehWCwXECutAUy56K4RBZIyg==}
+ '@lezer/javascript@1.5.6':
+ resolution: {integrity: sha512-sEvOqpl4vJQca0NugSQK02vQPbc5KrvoojnYGoqqFgFO0MtcYhwGiHKVEB+LuXYJnfyXo4QPA8ztbrEa4Fw5NA==}
'@lezer/json@1.0.3':
resolution: {integrity: sha512-BP9KzdF9Y35PDpv04r0VeSTKDeox5vVr3efE7eBbx3r4s3oNLfunchejZhjArmeieBH+nVOpgIiBJpEAv8ilqQ==}
- '@lezer/lr@1.4.10':
- resolution: {integrity: sha512-rnCpTIBafOx4mRp43xOxDJbFipJm/c0cia/V5TiGlhmMa+wsSdoGmUN3w5Bqrks/09Q/D4tNAmWaT8p6NRi77A==}
+ '@lezer/lr@1.4.11':
+ resolution: {integrity: sha512-UwgZcl1R66H2hDzBrA7kWyYmX6s8p5TQ+e/t7CuvgCtBEPxbEPaHYHu+pJBvTvDotEJpuQkJjbXuHiw5Cixxgw==}
'@lezer/python@1.1.19':
resolution: {integrity: sha512-MhQIURHRytsNzP/YXnqpYKW6la6voAH3kyplTOOiCdjyFY6cWWGFVmYVdHIPrElqSDf4iCDktQCockB9FxuhzQ==}
@@ -511,82 +526,83 @@ packages:
'@mathjax/mathjax-newcm-font@4.1.3':
resolution: {integrity: sha512-gzAB3dFHilHX1l5x2xUqRL+1jDQt3Fyza1DkEMVXWC4E8SvsGdlgEza47HYi2WhVcgfkvf4zgUGzuhbq3Pjlew==}
- '@mermaid-js/parser@1.2.1':
- resolution: {integrity: sha512-n12NohV3mrUyUL2o93IgG/ifeW9FTyeJn3zDxkhwa8MJ9Fxg3HQMlA3RiGmD/3UnJvheztkjjQAjA2T4LmUcpw==}
+ '@mermaid-js/parser@2.0.1':
+ resolution: {integrity: sha512-j37dj/h6p6pots1L7pLPPNuABEEu9WP4OYg9pW1g+nYG331j0+3canE9OagtYdytYvdSAMG+2fKU5cxep6LgjA==}
+ engines: {node: '>=22.12.0'}
- '@napi-rs/canvas-android-arm64@1.0.9':
- resolution: {integrity: sha512-4LGXk2/0HVzE29K8SzML5WubgCp++B1FH3qgl35XmSZE+lLdr6P9VRQEnZ0MCLZMTSuJP41yyhtoiVNEuvrTIA==}
+ '@napi-rs/canvas-android-arm64@1.0.10':
+ resolution: {integrity: sha512-0sDMvme+7fj6bHERUaBs5SvEyWaORc91VUkaB4RrtG7p6dBrBNGy1of8cyEKDxygd1FlHtW+Thunj8lSixzY7A==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [android]
- '@napi-rs/canvas-darwin-arm64@1.0.9':
- resolution: {integrity: sha512-YNdfLBzY0W/Pep9fo2L6RmoNlNksnn05LRnX66W63R3ij58S25QOTcjdtEt2v8+PnCESzqZsYzUo+QPeIR44NA==}
+ '@napi-rs/canvas-darwin-arm64@1.0.10':
+ resolution: {integrity: sha512-pdHL1TEfFMrnchRYqmPWXKN7hR4XtOYmzJqnh4XhpfWD4/eeSokOGVzrdFP/iQ3sfr2rf0939gOGq9uCp8BGmg==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [darwin]
- '@napi-rs/canvas-darwin-x64@1.0.9':
- resolution: {integrity: sha512-ceZQSknTEcy3dOXoekv59LTCkXjvnLsq+VW5PeNNDHEPQbRS5Ervkm1EaDa7WLAjiYWMLuSQTRTHao1dEX4prg==}
+ '@napi-rs/canvas-darwin-x64@1.0.10':
+ resolution: {integrity: sha512-iuuk5plGxAcxurxv2ycF2yR20y5zvaBZ4heQdhPpg3EMFD21PhlY1V+YwSRmYRWzbvKL474UYdw3WIg2qfafyw==}
engines: {node: '>= 10'}
cpu: [x64]
os: [darwin]
- '@napi-rs/canvas-linux-arm-gnueabihf@1.0.9':
- resolution: {integrity: sha512-XhfI0Wwv4llhd6nnWDtY3kQKjq0r+y1i91PlJlJI24ag2U9WrnwbG1qS3+fDLEyouwEVFchiKkTEHozK+5iUNA==}
+ '@napi-rs/canvas-linux-arm-gnueabihf@1.0.10':
+ resolution: {integrity: sha512-kH7GFR5Unpm77pKSEsmkqvzeQCRD7/MQ7upmeLLjg4XpQ62dX/R6THFsp6vkF1Pkco2aKUq9KhoLM4W5twdk7g==}
engines: {node: '>= 10'}
cpu: [arm]
os: [linux]
- '@napi-rs/canvas-linux-arm64-gnu@1.0.9':
- resolution: {integrity: sha512-012oiYtKaE7i9oxc8q7nraT7kDOpLcaCmFLzVe9Ty34RHDdoDzbWLrVh827CNxYh/EADX1eSikA3ymLjo/nNuw==}
+ '@napi-rs/canvas-linux-arm64-gnu@1.0.10':
+ resolution: {integrity: sha512-0/Hj7IwM9pmzdwxiqkp4YLJ8dKqASBrWQ3Y7dWUSU/4dgvCL9O6YNvX7xVUJjonQvdD3IE9ESS/nXa5srQqoVw==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [glibc]
- '@napi-rs/canvas-linux-arm64-musl@1.0.9':
- resolution: {integrity: sha512-Ls5UWYFFn63casTZEczbeyEg3vRDRkv9lscuGwfchtY5yLLQhgOB8SN4YGxmfJ5vTaBwZ2YUxBS3NtmjJmFXdA==}
+ '@napi-rs/canvas-linux-arm64-musl@1.0.10':
+ resolution: {integrity: sha512-fmjKM0P2MLF9O6XzCQsRjhB+jlLzaf6tFQU36hMPMsYup+VThYvpjjhqNLOc/Ee3tHUE3r13H2BSJx/yXz4pFA==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [linux]
libc: [musl]
- '@napi-rs/canvas-linux-riscv64-gnu@1.0.9':
- resolution: {integrity: sha512-hLKEGxV7ZiRHqndePTokgDMdBlo/rDfzg7P4p4QIv9pUhuYobnu3R2NIFLCRghG0nwfo+s2sw+c1xZFeCmEAsw==}
+ '@napi-rs/canvas-linux-riscv64-gnu@1.0.10':
+ resolution: {integrity: sha512-O/BUrGwrs3pVP9PpD/3++ZiOpjHMJlmiB7aBgswP8rbe4egPfiFkFxmcCczoLvZa72TaQX5lJ8Udedb6rc/Hvg==}
engines: {node: '>= 10'}
cpu: [riscv64]
os: [linux]
libc: [glibc]
- '@napi-rs/canvas-linux-x64-gnu@1.0.9':
- resolution: {integrity: sha512-6kaz3w0QMy77PDWk6rJ1ksIihdad3qzEyX2o2oGT8GwCaypfT5mhjr8buOO5hstyLxcWXDScuz56RsINLtBPIQ==}
+ '@napi-rs/canvas-linux-x64-gnu@1.0.10':
+ resolution: {integrity: sha512-48HkZPQeAN/R+9NPpY64tceoyCUW5xYYtHKZnC+BG11qiihXJCbH+xfbgGU+OdYp1Q4s84HDl9ILU0KBK6SBOQ==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [glibc]
- '@napi-rs/canvas-linux-x64-musl@1.0.9':
- resolution: {integrity: sha512-xrGvmS3v55hmZ86ls/kBLVNMUTYio3f6Ik0DireemG994VfPAwiA3ZXA0Uf1bByctkB3NQ1Sfb+H5bkdUnnzfQ==}
+ '@napi-rs/canvas-linux-x64-musl@1.0.10':
+ resolution: {integrity: sha512-QYHVi7WZ9v+Wm9OQyHLMTnJ8QiBPVX94BgbCHFJC/4bCFMfvX7fRzo4FJPgkRP0ISz3ulYNow/FCbQOPjzhYjg==}
engines: {node: '>= 10'}
cpu: [x64]
os: [linux]
libc: [musl]
- '@napi-rs/canvas-win32-arm64-msvc@1.0.9':
- resolution: {integrity: sha512-yjmVS3ArZeRVCP7jqbPq4rpZa/BhTeI7ELE2XqJg3snICQBDevLZyArxswHkiTnT34KRic33/4fLirrHI+SY8A==}
+ '@napi-rs/canvas-win32-arm64-msvc@1.0.10':
+ resolution: {integrity: sha512-bWK+YajM/8sL0mMgLtug2s063FVBPzFV4QAn987CQomMKlmzrBY6Trz43KY+24hq7IOa3qNhUAgP/XMEF50ZEQ==}
engines: {node: '>= 10'}
cpu: [arm64]
os: [win32]
- '@napi-rs/canvas-win32-x64-msvc@1.0.9':
- resolution: {integrity: sha512-QlSYQdMQslB81nlABo9wNfQ6npFhE7/O+saCZdqVGueGanyRk4jCogD5EwQenfP3kIq9e+mm6GreQBjX5MrA8g==}
+ '@napi-rs/canvas-win32-x64-msvc@1.0.10':
+ resolution: {integrity: sha512-9WtzW85PaIhtB27iXaR/9RrLCqHLbqD3Z8Q+kh17NjFxwQXFXU5vWbYH4vEH+drM307TTyK3hidZgpt09G5T3g==}
engines: {node: '>= 10'}
cpu: [x64]
os: [win32]
- '@napi-rs/canvas@1.0.9':
- resolution: {integrity: sha512-QviPdJImDi/jMAvBfqaw+19BndMd/sizXVW3NnpMd3VJGz++QXkOHcP9kWR/smHG0hNjHeyuHFyrx/5lD0oNcQ==}
+ '@napi-rs/canvas@1.0.10':
+ resolution: {integrity: sha512-V+qptzsGnPMFxEbhwc6eDNMe5eDrfiBIp8qGpuRjAVIX4Kn2zxvwQ1Xco6Fwe+3tYIe3iLW8LM9D+SvjyJhqbQ==}
engines: {node: '>= 10'}
'@pkgr/core@0.3.6':
@@ -686,8 +702,8 @@ packages:
'@types/d3-transition@3.0.9':
resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==}
- '@types/d3-zoom@3.0.8':
- resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==}
+ '@types/d3-zoom@3.0.9':
+ resolution: {integrity: sha512-0sE1406XBYJGiqD3AusTl9ZqC//2mIXix51tbom25gDCA8ri4xnSZg28CaSE8Srl6FClqABUKfsn0qghgdepMA==}
'@types/d3@7.4.3':
resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==}
@@ -713,8 +729,8 @@ packages:
'@types/mocha@10.0.10':
resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==}
- '@types/node@26.6.2':
- resolution: {integrity: sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==}
+ '@types/node@26.6.4':
+ resolution: {integrity: sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg==}
'@types/toastify-js@1.12.4':
resolution: {integrity: sha512-zfZHU4tKffPCnZRe7pjv/eFKzTVHozKewFCKaCjZ4gFinKgJRz/t0bkZiMCXJxPhv/ZoeDGNOeRD09R0kQZ/nw==}
@@ -722,63 +738,63 @@ packages:
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
- '@typescript-eslint/eslint-plugin@8.70.0':
- resolution: {integrity: sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==}
+ '@typescript-eslint/eslint-plugin@8.71.1':
+ resolution: {integrity: sha512-nNlBf6HuotqMgZvSkWD5hNdemiBIxQ2NmrlgfcUIeZRs+BbakjscCQRq/Hb74EFVnFiSWWdL12JruqwBy3ERDw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.70.0
+ '@typescript-eslint/parser': ^8.71.1
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/parser@8.70.0':
- resolution: {integrity: sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==}
+ '@typescript-eslint/parser@8.71.1':
+ resolution: {integrity: sha512-oM/5sAqz/l1v/zYK1qTOPrn2+JIrBGC1V6uNYucRO5gh6eT9vWJ/RhPbGE59byvZEUQ4VP6XkLBaS5Jti5jpvw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/project-service@8.70.0':
- resolution: {integrity: sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==}
+ '@typescript-eslint/project-service@8.71.1':
+ resolution: {integrity: sha512-Oijc9RUsohHjncg6iGi7gCtjnEjYt9FWv9u6ygK8uKcHK5eLjLAkqERQ9BaytbpceOFdk6kifPCS/zAZE+A99g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/scope-manager@8.70.0':
- resolution: {integrity: sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==}
+ '@typescript-eslint/scope-manager@8.71.1':
+ resolution: {integrity: sha512-1YUDZXdTnXLlob03SFHBipdyMBsDVm7zoSz0ytTJ39dk5J1TgsTK03VlR/dLXG/RLLUrPcYbD4rp23BmHxHP0w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/tsconfig-utils@8.70.0':
- resolution: {integrity: sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==}
+ '@typescript-eslint/tsconfig-utils@8.71.1':
+ resolution: {integrity: sha512-oTvkml5SxXhgg+WWKhod5qWQICDXtOB+/Hi9VdPKFAANJ2b7YOgMffgvzXuqog7R6A/JtrzRf128dsxummyWhg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/type-utils@8.70.0':
- resolution: {integrity: sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==}
+ '@typescript-eslint/type-utils@8.71.1':
+ resolution: {integrity: sha512-kH3t3jZCYv2PZSBEWPKTariLrCaoF1CLoPitYFBJOhAGEwWnSRAtGEifrfrpBa4K9JlwWNZotgA5w3/wLSk/FQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/types@8.70.0':
- resolution: {integrity: sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==}
+ '@typescript-eslint/types@8.71.1':
+ resolution: {integrity: sha512-ybYnPTUwg3VQQOFEiBPLs8Jxl1ry2vXdn1kVKguomBbvxpetdu3MKTNDqFNUrlG8ylP9MpZosmXMFYlGQHk1oQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.70.0':
- resolution: {integrity: sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==}
+ '@typescript-eslint/typescript-estree@8.71.1':
+ resolution: {integrity: sha512-pSKSEK1JJpHs6KiKVtABCE4iJK5d7FLFzDXQNBQ2oRY7LEd3UwOt3TZemTgu9syTIf56dJWlTn/pdmrO9oKUXQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/utils@8.70.0':
- resolution: {integrity: sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==}
+ '@typescript-eslint/utils@8.71.1':
+ resolution: {integrity: sha512-CBjT6gfAz3DW2j9Q4moFnqt208Aq+506sVGXfpRcyAeqn0EpayL0mjdWoCO2t3RC7GewNrFxdeehuEaPg6DMzQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/visitor-keys@8.70.0':
- resolution: {integrity: sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==}
+ '@typescript-eslint/visitor-keys@8.71.1':
+ resolution: {integrity: sha512-0GxiUGqMU0qXJt58cBsiG3DP8lUmBaFo2vChtUX+CT7PnR3v/VGLLrzVP4K9r1lNiZXjHYefMBbPunplr09v6w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript/typescript-aix-ppc64@7.0.2':
@@ -913,8 +929,8 @@ packages:
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
- acorn@8.18.0:
- resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==}
+ acorn@8.19.0:
+ resolution: {integrity: sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==}
engines: {node: '>=0.4.0'}
hasBin: true
@@ -960,8 +976,8 @@ packages:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
- axe-core@4.13.0:
- resolution: {integrity: sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A==}
+ axe-core@4.14.0:
+ resolution: {integrity: sha512-9WTZxEjsZ7b13TH8JPmbV2z8CHbl80/2hm3XPEG4JgNdQLK81IBRXmSxHfMAOkSqQeRxT/0dwNDz2GOm3zzpcQ==}
engines: {node: '>=4'}
balanced-match@1.0.2:
@@ -996,10 +1012,14 @@ packages:
resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
engines: {node: '>= 0.4'}
- chai@6.2.2:
- resolution: {integrity: sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==}
+ chai@6.3.0:
+ resolution: {integrity: sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==}
engines: {node: '>=18'}
+ chevrotain@13.2.0:
+ resolution: {integrity: sha512-GTouk5YzgBxlTPCaDn5q0q2EJKkrYmnPF+HmF8v0Qo4r3iyPG7HJivkN1wthCXZcm3sIcZFpGTRovLPNdJNRCA==}
+ engines: {node: '>=22.0.0'}
+
chokidar@5.0.0:
resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
engines: {node: '>= 20.19.0'}
@@ -1241,13 +1261,16 @@ packages:
resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
engines: {node: '>=0.10.0'}
- dompurify@3.4.15:
- resolution: {integrity: sha512-EUBjM+B+lkDE41iE82DDSCfkoPGfXx8IxFxPMjNzm/Uk4xDet77rTN9wqlxlVg71kK7XGuUMv6wUxJUwwv+Xyw==}
+ dompurify@3.4.16:
+ resolution: {integrity: sha512-sqo+pNp3qRhCIpbgRi1y8Tgk27Bo2Ry7w0dC1NBeNTdZChWjz9Xb/KOoZbRP/R6pQZ80Qw8YhXw13hWWBbMRnQ==}
dunder-proto@1.0.1:
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
engines: {node: '>= 0.4'}
+ elkjs@0.9.3:
+ resolution: {integrity: sha512-f/ZeWvW/BCXbhGEf1Ujp29EASo/lk1FDnETgNKwJrsVvGZhUWCZyg3xLJjAsxfOmt8KjswHmI5EwCQcPMpOYhQ==}
+
es-abstract-get@1.0.0:
resolution: {integrity: sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==}
engines: {node: '>= 0.4'}
@@ -1358,8 +1381,8 @@ packages:
resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
- eslint@10.11.0:
- resolution: {integrity: sha512-P7a6UEEqb9G95MYAtqkmsTbVXIYyzIfl6NGOIJk162PaahFxFyeGcrlXYFSiagECg4sEm8IseJdZBKR3rx6MsQ==}
+ eslint@10.12.0:
+ resolution: {integrity: sha512-npHjrHb2o4ehH3mE+YuxABR+0gyb0aVWCIolgJDArwCiHEIsonBm3ZKjel5b0U5+a+MbEvIyRCGCzD3eKKK2NA==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
hasBin: true
peerDependencies:
@@ -1400,9 +1423,6 @@ packages:
fast-levenshtein@2.0.6:
resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
- fastdom@1.0.12:
- resolution: {integrity: sha512-LB+xjSTEbjHE1cWsxu+tN2Xqr1kpi+V9aADI7sVM5ZMaXyYGPHULQMzpJMYqOTULK/73pUkWVzzObFRBkPr+hg==}
-
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
engines: {node: '>=12.0.0'}
@@ -1467,8 +1487,8 @@ packages:
resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==}
engines: {node: 18 || 20 || >=22}
- globals@17.12.0:
- resolution: {integrity: sha512-cezEd/DTyyht9cvSSURyygXPfy04GtWO/5e6ZPvH7fCtjKz9PYOmuawphw1Ctd1f6C+5JypXfGD7ahNMXvevBA==}
+ globals@17.13.0:
+ resolution: {integrity: sha512-RwMTC61u7hrG3ZJMkZQOK4JLJrKS8QtoTii63EmWvFXHqycY9FObBJQCbsLxSO8kjKhWE5kV1GC+Vb1g3RI0Zg==}
engines: {node: '>=18'}
globalthis@1.0.4:
@@ -1527,8 +1547,8 @@ packages:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
- ignore@7.0.9:
- resolution: {integrity: sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==}
+ ignore@7.0.12:
+ resolution: {integrity: sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg==}
engines: {node: '>= 4'}
import-meta-resolve@4.2.0:
@@ -1663,8 +1683,8 @@ packages:
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
- js-yaml@5.4.2:
- resolution: {integrity: sha512-m+aqu+LwO1O6sIopafj8HUVl5aawITwZQe/yHpMCKjaWBaA/d07B/QdMb3529REftiU+RMMHL3Vlsw3hON7vWg==}
+ js-yaml@5.4.3:
+ resolution: {integrity: sha512-yzzNtgczwgoVHNigCyKTXcQJU4Y8t/ikU4UxXW0BvrLfHTGWZhsNcOT2s/a7vn81/4KqVnNmHjaUEPlvWnNwVw==}
hasBin: true
json-schema-traverse@0.4.1:
@@ -1723,8 +1743,9 @@ packages:
mdn-data@2.35.0:
resolution: {integrity: sha512-k+1+dEIm2z/BEfdvYzT/fIyAGeDBo/1AJNJI4ilFXJRYoxP/3Ds+GP8shAOIq8jYXY9N5nGB3Ag104NsagmLAA==}
- mermaid@11.17.2:
- resolution: {integrity: sha512-V6K3C8EBdEsPFZXSKMJe6ppQOENxuHARr9GvHX4hh47lAbhMRD9qf4oEK7LoaRQxULMa80/qt5gHO73aCleBBg==}
+ mermaid@12.1.0:
+ resolution: {integrity: sha512-wlVCp+8eTupfCeeFvoZNNiTuHrvag0P2jz/ILgb/f/6jkVokUefOcujefi8qUe/j2asHiSePncVsz/xzzA80LQ==}
+ engines: {node: '>=22.12.0'}
minimatch@10.2.6:
resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==}
@@ -1740,8 +1761,8 @@ packages:
resolution: {integrity: sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==}
engines: {node: '>=16 || 14 >=14.17'}
- mocha@12.0.2:
- resolution: {integrity: sha512-SjAulGHxlMJLCD1bhvJBAiYwYxglydRzA9PDQ5MALq1oLRMMtIhxSQJ0olCFgA7c9YbTdxC0KOV0wl8JEDYVhA==}
+ mocha@12.0.3:
+ resolution: {integrity: sha512-beammieDdiWdkjANWeWPpkxUROYGi5FN88fPOkLiticz7HTg3Y+Pho3EYE6SUdcuWnZ3h2WD8EXCA55JF4o6wg==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
@@ -1804,8 +1825,8 @@ packages:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
- package-manager-detector@1.8.0:
- resolution: {integrity: sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==}
+ package-manager-detector@1.9.0:
+ resolution: {integrity: sha512-zAMfbta9nPA8AKkA4WdmNAT8R8s6Dk0/xwPsqNnRidMFcLo1YkLuPDTgs2f64XdzS8vbLNnoJ+uUIkgbz7oRHA==}
path-data-parser@0.1.0:
resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==}
@@ -1825,8 +1846,8 @@ packages:
resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==}
engines: {node: 18 || 20 || >=22}
- pdfjs-dist@6.3.289:
- resolution: {integrity: sha512-ZHjSVpDa3D6izMq8/04lvkhkATUmL9px6ChPaXc1k6nU2Mrhlg1/7F0bdUqCwUjw3NsPTfPZsMDUU6ZIcRaeQw==}
+ pdfjs-dist@6.4.299:
+ resolution: {integrity: sha512-AVl138zALtfaAPvADulE0PZThbYzCBS79nL4pOSL/6Sm/4AH5A21BD9VHt97OlCuzJuCpmeZtAtkinisF4Vb1g==}
engines: {node: '>=22.13.0 || >=24'}
picocolors@1.1.1:
@@ -1854,8 +1875,8 @@ packages:
resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==}
engines: {node: '>=6.0.0'}
- prettier@3.9.8:
- resolution: {integrity: sha512-WRFq3Wn3WId7LLROfMLdH7xaFr2jR62wU8nLO6rQUOLOxNZUviyJQs1M0iIhLexSFy+L+w0ch66wtoO2jRjG0A==}
+ prettier@3.9.9:
+ resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==}
engines: {node: '>=14'}
hasBin: true
@@ -1917,8 +1938,8 @@ packages:
engines: {node: '>=10'}
hasBin: true
- serialize-javascript@7.1.1:
- resolution: {integrity: sha512-k3CMsaIvvdSwm8oLB4MXSl0wH2/cwlH7xGcnRd2DaeRmBkbzYmyT8j0tsX60DwD1eRwHTpNpH8ljKu9oUT1MeQ==}
+ serialize-javascript@7.1.2:
+ resolution: {integrity: sha512-GL2BWwVa6JydKO6l/ljVgjAZF4QJ3S7dWDWi53s5GZT8PJzD2fNxi67HANQGKAqPrwEpL5ba7gUBGi0Ls/sEoQ==}
engines: {node: '>=20.0.0'}
set-function-length@1.2.2:
@@ -1957,17 +1978,14 @@ packages:
resolution: {integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==}
engines: {node: '>= 0.4'}
- source-map-js@1.2.1:
- resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ source-map-js@1.2.2:
+ resolution: {integrity: sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==}
engines: {node: '>=0.10.0'}
stop-iteration-iterator@1.1.0:
resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==}
engines: {node: '>= 0.4'}
- strictdom@1.0.1:
- resolution: {integrity: sha512-cEmp9QeXXRmjj/rVp9oyiqcvyocWab/HaoN4+bwFeZ7QzykJD6L3yD4v12K1x0tHpqRqVpJevN3gW7kyM39Bqg==}
-
string.prototype.trim@1.2.11:
resolution: {integrity: sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==}
engines: {node: '>= 0.4'}
@@ -2014,8 +2032,8 @@ packages:
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
engines: {node: '>=12.0.0'}
- tinymce@8.9.1:
- resolution: {integrity: sha512-5KrFiuKri2sPQW3ERWodsx3R0RZiw0cJJDr61qaMQiXO1ir3ZYaf6gVVaao+T29spZ9L9waaeE/co8Ov2Rn3vQ==}
+ tinymce@8.9.3:
+ resolution: {integrity: sha512-T6Z541dm8R34/rgotB40/j2lwrE3eKARbaoet37/I4d3jq+S7Ul3Q7bNZUQY2WtXOvD9P5aTVbgcYI1nKQoGqg==}
toastify-js@1.12.0:
resolution: {integrity: sha512-HeMHCO9yLPvP9k0apGSdPUWrUbLnxUKNFzgUoZp1PHCLploIX/4DSQ7V8H25ef+h4iO9n0he7ImfcndnN6nDrQ==}
@@ -2053,8 +2071,8 @@ packages:
resolution: {integrity: sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==}
engines: {node: '>= 0.4'}
- typescript-eslint@8.70.0:
- resolution: {integrity: sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==}
+ typescript-eslint@8.71.1:
+ resolution: {integrity: sha512-oiNVPC3/NbV1FpaHU07l8O6ynqG9v4PAiW2WvTrAmZdR0f2HI/gE668ElMLCK7Xbsu5k2fK5C4fXNiq05j7/nQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
@@ -2123,7 +2141,7 @@ snapshots:
'@antfu/install-pkg@2.1.0':
dependencies:
- package-manager-detector: 1.8.0
+ package-manager-detector: 1.9.0
tinyexec: 1.3.1
'@braintree/sanitize-url@7.1.2': {}
@@ -2140,41 +2158,54 @@ snapshots:
hashery: 1.5.1
keyv: 5.6.0
- '@chevrotain/types@11.1.2': {}
+ '@chevrotain/cst-dts-gen@13.2.0':
+ dependencies:
+ '@chevrotain/gast': 13.2.0
+ '@chevrotain/types': 13.2.0
+
+ '@chevrotain/gast@13.2.0':
+ dependencies:
+ '@chevrotain/types': 13.2.0
+
+ '@chevrotain/regexp-to-ast@13.2.0': {}
+
+ '@chevrotain/types@13.2.0': {}
+
+ '@chevrotain/utils@13.2.0': {}
'@codemirror/autocomplete@6.20.3':
dependencies:
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.5
- '@codemirror/view': 6.43.12
- '@lezer/common': 1.5.2
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.14
+ '@lezer/common': 1.5.3
'@codemirror/commands@6.11.1':
dependencies:
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.5
- '@codemirror/view': 6.43.12
- '@lezer/common': 1.5.2
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.14
+ '@lezer/common': 1.5.3
'@codemirror/lang-cpp@6.0.3':
dependencies:
- '@codemirror/language': 6.12.4
+ '@codemirror/language': 6.13.1
'@lezer/cpp': 1.1.6
'@codemirror/lang-css@6.3.1':
dependencies:
'@codemirror/autocomplete': 6.20.3
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.5
- '@lezer/common': 1.5.2
- '@lezer/css': 1.3.7
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@lezer/common': 1.5.3
+ '@lezer/css': 1.3.9
'@codemirror/lang-go@6.0.1':
dependencies:
'@codemirror/autocomplete': 6.20.3
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.5
- '@lezer/common': 1.5.2
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@lezer/common': 1.5.3
'@lezer/go': 1.0.1
'@codemirror/lang-html@6.4.12':
@@ -2182,97 +2213,100 @@ snapshots:
'@codemirror/autocomplete': 6.20.3
'@codemirror/lang-css': 6.3.1
'@codemirror/lang-javascript': 6.2.5
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.5
- '@codemirror/view': 6.43.12
- '@lezer/common': 1.5.2
- '@lezer/css': 1.3.7
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.14
+ '@lezer/common': 1.5.3
+ '@lezer/css': 1.3.9
'@lezer/html': 1.3.13
'@codemirror/lang-java@6.0.2':
dependencies:
- '@codemirror/language': 6.12.4
- '@lezer/java': 1.1.4
+ '@codemirror/language': 6.13.1
+ '@lezer/java': 1.1.5
'@codemirror/lang-javascript@6.2.5':
dependencies:
'@codemirror/autocomplete': 6.20.3
- '@codemirror/language': 6.12.4
+ '@codemirror/language': 6.13.1
'@codemirror/lint': 6.9.7
- '@codemirror/state': 6.7.5
- '@codemirror/view': 6.43.12
- '@lezer/common': 1.5.2
- '@lezer/javascript': 1.5.5
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.14
+ '@lezer/common': 1.5.3
+ '@lezer/javascript': 1.5.6
'@codemirror/lang-json@6.0.2':
dependencies:
- '@codemirror/language': 6.12.4
+ '@codemirror/language': 6.13.1
'@lezer/json': 1.0.3
'@codemirror/lang-python@6.2.1':
dependencies:
'@codemirror/autocomplete': 6.20.3
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.5
- '@lezer/common': 1.5.2
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@lezer/common': 1.5.3
'@lezer/python': 1.1.19
'@codemirror/lang-rust@6.0.2':
dependencies:
- '@codemirror/language': 6.12.4
+ '@codemirror/language': 6.13.1
'@lezer/rust': 1.0.3
'@codemirror/lang-sql@6.10.0':
dependencies:
'@codemirror/autocomplete': 6.20.3
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.5
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
'@codemirror/lang-yaml@6.1.3':
dependencies:
'@codemirror/autocomplete': 6.20.3
- '@codemirror/language': 6.12.4
- '@codemirror/state': 6.7.5
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@codemirror/language': 6.13.1
+ '@codemirror/state': 6.7.6
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
'@lezer/yaml': 1.0.4
- '@codemirror/language@6.12.4':
+ '@codemirror/language@6.13.1':
dependencies:
- '@codemirror/state': 6.7.5
- '@codemirror/view': 6.43.12
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@codemirror/state': 6.7.6
+ '@codemirror/streamparser': 6.0.0
+ '@codemirror/view': 6.43.14
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
style-mod: 4.1.4
- '@codemirror/legacy-modes@6.5.4':
+ '@codemirror/legacy-modes@6.5.5':
dependencies:
- '@codemirror/language': 6.12.4
+ '@codemirror/streamparser': 6.0.0
'@codemirror/lint@6.9.7':
dependencies:
- '@codemirror/state': 6.7.5
- '@codemirror/view': 6.43.12
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.14
crelt: 1.0.7
'@codemirror/search@6.7.2':
dependencies:
- '@codemirror/state': 6.7.5
- '@codemirror/view': 6.43.12
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.14
crelt: 1.0.7
- '@codemirror/state@6.7.5':
+ '@codemirror/state@6.7.6':
dependencies:
'@marijn/find-cluster-break': 1.0.4
- '@codemirror/view@6.43.12':
+ '@codemirror/streamparser@6.0.0': {}
+
+ '@codemirror/view@6.43.14':
dependencies:
- '@codemirror/state': 6.7.5
+ '@codemirror/state': 6.7.6
crelt: 1.0.7
style-mod: 4.1.4
w3c-keyname: 2.2.8
@@ -2355,9 +2389,9 @@ snapshots:
'@esbuild/win32-x64@0.28.2':
optional: true
- '@eslint-community/eslint-utils@4.10.1(eslint@10.11.0(supports-color@8.1.1))':
+ '@eslint-community/eslint-utils@4.10.1(eslint@10.12.0(supports-color@8.1.1))':
dependencies:
- eslint: 10.11.0(supports-color@8.1.1)
+ eslint: 10.12.0(supports-color@8.1.1)
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.2': {}
@@ -2381,7 +2415,7 @@ snapshots:
'@eslint/css-tree@4.1.1':
dependencies:
mdn-data: 2.35.0
- source-map-js: 1.2.1
+ source-map-js: 1.2.2
'@eslint/css@2.0.0':
dependencies:
@@ -2389,9 +2423,9 @@ snapshots:
'@eslint/css-tree': 4.1.1
'@eslint/plugin-kit': 0.7.3
- '@eslint/js@10.0.1(eslint@10.11.0(supports-color@8.1.1))':
+ '@eslint/js@10.0.1(eslint@10.12.0(supports-color@8.1.1))':
optionalDependencies:
- eslint: 10.11.0(supports-color@8.1.1)
+ eslint: 10.12.0(supports-color@8.1.1)
'@eslint/object-schema@3.0.5': {}
@@ -2400,7 +2434,7 @@ snapshots:
'@eslint/core': 1.2.1
levn: 0.4.1
- '@hpcc-js/wasm-graphviz@1.29.1': {}
+ '@hpcc-js/wasm-graphviz@1.29.2': {}
'@humanfs/core@0.19.2':
dependencies:
@@ -2434,130 +2468,130 @@ snapshots:
'@keyv/serialize@1.1.1': {}
- '@lezer/common@1.5.2': {}
+ '@lezer/common@1.5.3': {}
'@lezer/cpp@1.1.6':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
- '@lezer/css@1.3.7':
+ '@lezer/css@1.3.9':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
'@lezer/go@1.0.1':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
- '@lezer/highlight@1.2.3':
+ '@lezer/highlight@1.2.5':
dependencies:
- '@lezer/common': 1.5.2
+ '@lezer/common': 1.5.3
'@lezer/html@1.3.13':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
- '@lezer/java@1.1.4':
+ '@lezer/java@1.1.5':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
- '@lezer/javascript@1.5.5':
+ '@lezer/javascript@1.5.6':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
'@lezer/json@1.0.3':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
- '@lezer/lr@1.4.10':
+ '@lezer/lr@1.4.11':
dependencies:
- '@lezer/common': 1.5.2
+ '@lezer/common': 1.5.3
'@lezer/python@1.1.19':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
'@lezer/rust@1.0.3':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
'@lezer/yaml@1.0.4':
dependencies:
- '@lezer/common': 1.5.2
- '@lezer/highlight': 1.2.3
- '@lezer/lr': 1.4.10
+ '@lezer/common': 1.5.3
+ '@lezer/highlight': 1.2.5
+ '@lezer/lr': 1.4.11
'@marijn/find-cluster-break@1.0.4': {}
'@mathjax/mathjax-newcm-font@4.1.3': {}
- '@mermaid-js/parser@1.2.1':
+ '@mermaid-js/parser@2.0.1':
dependencies:
- '@chevrotain/types': 11.1.2
+ '@chevrotain/types': 13.2.0
- '@napi-rs/canvas-android-arm64@1.0.9':
+ '@napi-rs/canvas-android-arm64@1.0.10':
optional: true
- '@napi-rs/canvas-darwin-arm64@1.0.9':
+ '@napi-rs/canvas-darwin-arm64@1.0.10':
optional: true
- '@napi-rs/canvas-darwin-x64@1.0.9':
+ '@napi-rs/canvas-darwin-x64@1.0.10':
optional: true
- '@napi-rs/canvas-linux-arm-gnueabihf@1.0.9':
+ '@napi-rs/canvas-linux-arm-gnueabihf@1.0.10':
optional: true
- '@napi-rs/canvas-linux-arm64-gnu@1.0.9':
+ '@napi-rs/canvas-linux-arm64-gnu@1.0.10':
optional: true
- '@napi-rs/canvas-linux-arm64-musl@1.0.9':
+ '@napi-rs/canvas-linux-arm64-musl@1.0.10':
optional: true
- '@napi-rs/canvas-linux-riscv64-gnu@1.0.9':
+ '@napi-rs/canvas-linux-riscv64-gnu@1.0.10':
optional: true
- '@napi-rs/canvas-linux-x64-gnu@1.0.9':
+ '@napi-rs/canvas-linux-x64-gnu@1.0.10':
optional: true
- '@napi-rs/canvas-linux-x64-musl@1.0.9':
+ '@napi-rs/canvas-linux-x64-musl@1.0.10':
optional: true
- '@napi-rs/canvas-win32-arm64-msvc@1.0.9':
+ '@napi-rs/canvas-win32-arm64-msvc@1.0.10':
optional: true
- '@napi-rs/canvas-win32-x64-msvc@1.0.9':
+ '@napi-rs/canvas-win32-x64-msvc@1.0.10':
optional: true
- '@napi-rs/canvas@1.0.9':
+ '@napi-rs/canvas@1.0.10':
optionalDependencies:
- '@napi-rs/canvas-android-arm64': 1.0.9
- '@napi-rs/canvas-darwin-arm64': 1.0.9
- '@napi-rs/canvas-darwin-x64': 1.0.9
- '@napi-rs/canvas-linux-arm-gnueabihf': 1.0.9
- '@napi-rs/canvas-linux-arm64-gnu': 1.0.9
- '@napi-rs/canvas-linux-arm64-musl': 1.0.9
- '@napi-rs/canvas-linux-riscv64-gnu': 1.0.9
- '@napi-rs/canvas-linux-x64-gnu': 1.0.9
- '@napi-rs/canvas-linux-x64-musl': 1.0.9
- '@napi-rs/canvas-win32-arm64-msvc': 1.0.9
- '@napi-rs/canvas-win32-x64-msvc': 1.0.9
+ '@napi-rs/canvas-android-arm64': 1.0.10
+ '@napi-rs/canvas-darwin-arm64': 1.0.10
+ '@napi-rs/canvas-darwin-x64': 1.0.10
+ '@napi-rs/canvas-linux-arm-gnueabihf': 1.0.10
+ '@napi-rs/canvas-linux-arm64-gnu': 1.0.10
+ '@napi-rs/canvas-linux-arm64-musl': 1.0.10
+ '@napi-rs/canvas-linux-riscv64-gnu': 1.0.10
+ '@napi-rs/canvas-linux-x64-gnu': 1.0.10
+ '@napi-rs/canvas-linux-x64-musl': 1.0.10
+ '@napi-rs/canvas-win32-arm64-msvc': 1.0.10
+ '@napi-rs/canvas-win32-x64-msvc': 1.0.10
optional: true
'@pkgr/core@0.3.6': {}
@@ -2648,7 +2682,7 @@ snapshots:
dependencies:
'@types/d3-selection': 3.0.12
- '@types/d3-zoom@3.0.8':
+ '@types/d3-zoom@3.0.9':
dependencies:
'@types/d3-interpolate': 3.0.4
'@types/d3-selection': 3.0.12
@@ -2684,7 +2718,7 @@ snapshots:
'@types/d3-time-format': 4.0.3
'@types/d3-timer': 3.0.2
'@types/d3-transition': 3.0.9
- '@types/d3-zoom': 3.0.8
+ '@types/d3-zoom': 3.0.9
'@types/deep-eql@4.0.2': {}
@@ -2700,7 +2734,7 @@ snapshots:
'@types/mocha@10.0.10': {}
- '@types/node@26.6.2':
+ '@types/node@26.6.4':
dependencies:
undici-types: 8.9.0
@@ -2709,72 +2743,72 @@ snapshots:
'@types/trusted-types@2.0.7':
optional: true
- '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1))(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)':
+ '@typescript-eslint/eslint-plugin@8.71.1(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1))(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
- '@typescript-eslint/scope-manager': 8.70.0
- '@typescript-eslint/type-utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
- '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
- '@typescript-eslint/visitor-keys': 8.70.0
- eslint: 10.11.0(supports-color@8.1.1)
- ignore: 7.0.9
+ '@typescript-eslint/parser': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
+ '@typescript-eslint/scope-manager': 8.71.1
+ '@typescript-eslint/type-utils': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
+ '@typescript-eslint/utils': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
+ '@typescript-eslint/visitor-keys': 8.71.1
+ eslint: 10.12.0(supports-color@8.1.1)
+ ignore: 7.0.12
natural-compare: 1.4.0
ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2)
typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)':
+ '@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)':
dependencies:
- '@typescript-eslint/scope-manager': 8.70.0
- '@typescript-eslint/types': 8.70.0
- '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)
- '@typescript-eslint/visitor-keys': 8.70.0
+ '@typescript-eslint/scope-manager': 8.71.1
+ '@typescript-eslint/types': 8.71.1
+ '@typescript-eslint/typescript-estree': 8.71.1(@typescript/typescript6@6.0.2)(supports-color@8.1.1)
+ '@typescript-eslint/visitor-keys': 8.71.1
debug: 4.4.3(supports-color@8.1.1)
- eslint: 10.11.0(supports-color@8.1.1)
+ eslint: 10.12.0(supports-color@8.1.1)
typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)':
+ '@typescript-eslint/project-service@8.71.1(@typescript/typescript6@6.0.2)(supports-color@8.1.1)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.70.0(@typescript/typescript6@6.0.2)
- '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/tsconfig-utils': 8.71.1(@typescript/typescript6@6.0.2)
+ '@typescript-eslint/types': 8.71.1
debug: 4.4.3(supports-color@8.1.1)
typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.70.0':
+ '@typescript-eslint/scope-manager@8.71.1':
dependencies:
- '@typescript-eslint/types': 8.70.0
- '@typescript-eslint/visitor-keys': 8.70.0
+ '@typescript-eslint/types': 8.71.1
+ '@typescript-eslint/visitor-keys': 8.71.1
- '@typescript-eslint/tsconfig-utils@8.70.0(@typescript/typescript6@6.0.2)':
+ '@typescript-eslint/tsconfig-utils@8.71.1(@typescript/typescript6@6.0.2)':
dependencies:
typescript: '@typescript/typescript6@6.0.2'
- '@typescript-eslint/type-utils@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)':
+ '@typescript-eslint/type-utils@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)':
dependencies:
- '@typescript-eslint/types': 8.70.0
- '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)
- '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
+ '@typescript-eslint/types': 8.71.1
+ '@typescript-eslint/typescript-estree': 8.71.1(@typescript/typescript6@6.0.2)(supports-color@8.1.1)
+ '@typescript-eslint/utils': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
debug: 4.4.3(supports-color@8.1.1)
- eslint: 10.11.0(supports-color@8.1.1)
+ eslint: 10.12.0(supports-color@8.1.1)
ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2)
typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.70.0': {}
+ '@typescript-eslint/types@8.71.1': {}
- '@typescript-eslint/typescript-estree@8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)':
+ '@typescript-eslint/typescript-estree@8.71.1(@typescript/typescript6@6.0.2)(supports-color@8.1.1)':
dependencies:
- '@typescript-eslint/project-service': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)
- '@typescript-eslint/tsconfig-utils': 8.70.0(@typescript/typescript6@6.0.2)
- '@typescript-eslint/types': 8.70.0
- '@typescript-eslint/visitor-keys': 8.70.0
+ '@typescript-eslint/project-service': 8.71.1(@typescript/typescript6@6.0.2)(supports-color@8.1.1)
+ '@typescript-eslint/tsconfig-utils': 8.71.1(@typescript/typescript6@6.0.2)
+ '@typescript-eslint/types': 8.71.1
+ '@typescript-eslint/visitor-keys': 8.71.1
debug: 4.4.3(supports-color@8.1.1)
minimatch: 10.2.6
semver: 7.8.5
@@ -2784,20 +2818,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)':
+ '@typescript-eslint/utils@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)':
dependencies:
- '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(supports-color@8.1.1))
- '@typescript-eslint/scope-manager': 8.70.0
- '@typescript-eslint/types': 8.70.0
- '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)
- eslint: 10.11.0(supports-color@8.1.1)
+ '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0(supports-color@8.1.1))
+ '@typescript-eslint/scope-manager': 8.71.1
+ '@typescript-eslint/types': 8.71.1
+ '@typescript-eslint/typescript-estree': 8.71.1(@typescript/typescript6@6.0.2)(supports-color@8.1.1)
+ eslint: 10.12.0(supports-color@8.1.1)
typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.70.0':
+ '@typescript-eslint/visitor-keys@8.71.1':
dependencies:
- '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/types': 8.71.1
eslint-visitor-keys: 5.0.1
'@typescript/typescript-aix-ppc64@7.0.2':
@@ -2869,11 +2903,11 @@ snapshots:
d3-selection: 3.0.0
d3-transition: 3.0.1(d3-selection@3.0.0)
- acorn-jsx@5.3.2(acorn@8.18.0):
+ acorn-jsx@5.3.2(acorn@8.19.0):
dependencies:
- acorn: 8.18.0
+ acorn: 8.19.0
- acorn@8.18.0: {}
+ acorn@8.19.0: {}
ajv@6.15.0:
dependencies:
@@ -2942,7 +2976,7 @@ snapshots:
dependencies:
possible-typed-array-names: 1.1.0
- axe-core@4.13.0: {}
+ axe-core@4.14.0: {}
balanced-match@1.0.2: {}
@@ -2984,7 +3018,15 @@ snapshots:
call-bind-apply-helpers: 1.0.2
get-intrinsic: 1.3.0
- chai@6.2.2: {}
+ chai@6.3.0: {}
+
+ chevrotain@13.2.0:
+ dependencies:
+ '@chevrotain/cst-dts-gen': 13.2.0
+ '@chevrotain/gast': 13.2.0
+ '@chevrotain/regexp-to-ast': 13.2.0
+ '@chevrotain/types': 13.2.0
+ '@chevrotain/utils': 13.2.0
chokidar@5.0.0:
dependencies:
@@ -2994,11 +3036,11 @@ snapshots:
dependencies:
'@codemirror/autocomplete': 6.20.3
'@codemirror/commands': 6.11.1
- '@codemirror/language': 6.12.4
+ '@codemirror/language': 6.13.1
'@codemirror/lint': 6.9.7
'@codemirror/search': 6.7.2
- '@codemirror/state': 6.7.5
- '@codemirror/view': 6.43.12
+ '@codemirror/state': 6.7.6
+ '@codemirror/view': 6.43.14
commander@7.2.0: {}
@@ -3262,7 +3304,7 @@ snapshots:
dependencies:
esutils: 2.0.3
- dompurify@3.4.15:
+ dompurify@3.4.16:
optionalDependencies:
'@types/trusted-types': 2.0.7
@@ -3272,6 +3314,8 @@ snapshots:
es-errors: 1.3.0
gopd: 1.2.0
+ elkjs@0.9.3: {}
+
es-abstract-get@1.0.0:
dependencies:
es-errors: 1.3.0
@@ -3397,9 +3441,9 @@ snapshots:
escape-string-regexp@4.0.0: {}
- eslint-config-prettier@10.1.8(eslint@10.11.0(supports-color@8.1.1)):
+ eslint-config-prettier@10.1.8(eslint@10.12.0(supports-color@8.1.1)):
dependencies:
- eslint: 10.11.0(supports-color@8.1.1)
+ eslint: 10.12.0(supports-color@8.1.1)
eslint-import-resolver-node@0.3.10(supports-color@8.1.1):
dependencies:
@@ -3409,17 +3453,17 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.14.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1):
+ eslint-module-utils@2.14.0(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1):
dependencies:
debug: 3.2.7(supports-color@8.1.1)
optionalDependencies:
- '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
- eslint: 10.11.0(supports-color@8.1.1)
+ '@typescript-eslint/parser': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
+ eslint: 10.12.0(supports-color@8.1.1)
eslint-import-resolver-node: 0.3.10(supports-color@8.1.1)
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1):
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.2.0
@@ -3428,9 +3472,9 @@ snapshots:
array.prototype.flatmap: 1.3.3
debug: 3.2.7(supports-color@8.1.1)
doctrine: 2.1.0
- eslint: 10.11.0(supports-color@8.1.1)
+ eslint: 10.12.0(supports-color@8.1.1)
eslint-import-resolver-node: 0.3.10(supports-color@8.1.1)
- eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
+ eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1))(eslint-import-resolver-node@0.3.10(supports-color@8.1.1))(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
hasown: 2.0.4
is-core-module: 2.17.0
is-glob: 4.0.3
@@ -3442,20 +3486,20 @@ snapshots:
string.prototype.trimend: 1.0.10
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
+ '@typescript-eslint/parser': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
- eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.11.0(supports-color@8.1.1)))(eslint@10.11.0(supports-color@8.1.1))(prettier@3.9.8):
+ eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.12.0(supports-color@8.1.1)))(eslint@10.12.0(supports-color@8.1.1))(prettier@3.9.9):
dependencies:
- eslint: 10.11.0(supports-color@8.1.1)
- prettier: 3.9.8
+ eslint: 10.12.0(supports-color@8.1.1)
+ prettier: 3.9.9
prettier-linter-helpers: 1.0.1
synckit: 0.11.13
optionalDependencies:
- eslint-config-prettier: 10.1.8(eslint@10.11.0(supports-color@8.1.1))
+ eslint-config-prettier: 10.1.8(eslint@10.12.0(supports-color@8.1.1))
eslint-scope@9.1.2:
dependencies:
@@ -3468,9 +3512,9 @@ snapshots:
eslint-visitor-keys@5.0.1: {}
- eslint@10.11.0(supports-color@8.1.1):
+ eslint@10.12.0(supports-color@8.1.1):
dependencies:
- '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0(supports-color@8.1.1))
+ '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0(supports-color@8.1.1))
'@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.23.5(supports-color@8.1.1)
'@eslint/config-helpers': 0.7.0
@@ -3505,8 +3549,8 @@ snapshots:
espree@11.2.0:
dependencies:
- acorn: 8.18.0
- acorn-jsx: 5.3.2(acorn@8.18.0)
+ acorn: 8.19.0
+ acorn-jsx: 5.3.2(acorn@8.19.0)
eslint-visitor-keys: 5.0.1
esquery@1.7.0:
@@ -3529,10 +3573,6 @@ snapshots:
fast-levenshtein@2.0.6: {}
- fastdom@1.0.12:
- dependencies:
- strictdom: 1.0.1
-
fdir@6.5.0(picomatch@4.0.7):
optionalDependencies:
picomatch: 4.0.7
@@ -3612,7 +3652,7 @@ snapshots:
minipass: 7.1.3
path-scurry: 2.0.2
- globals@17.12.0: {}
+ globals@17.13.0: {}
globalthis@1.0.4:
dependencies:
@@ -3659,7 +3699,7 @@ snapshots:
ignore@5.3.2: {}
- ignore@7.0.9: {}
+ ignore@7.0.12: {}
import-meta-resolve@4.2.0: {}
@@ -3793,7 +3833,7 @@ snapshots:
isexe@2.0.0: {}
- js-yaml@5.4.2:
+ js-yaml@5.4.3:
dependencies:
argparse: 2.0.1
@@ -3842,13 +3882,14 @@ snapshots:
mdn-data@2.35.0: {}
- mermaid@11.17.2:
+ mermaid@12.1.0:
dependencies:
'@braintree/sanitize-url': 7.1.2
'@iconify/utils': 3.1.7
- '@mermaid-js/parser': 1.2.1
+ '@mermaid-js/parser': 2.0.1
'@types/d3': 7.4.3
'@upsetjs/venn.js': 2.0.0
+ chevrotain: 13.2.0
cytoscape: 3.34.3
cytoscape-cose-bilkent: 4.1.0(cytoscape@3.34.3)
cytoscape-fcose: 2.2.0(cytoscape@3.34.3)
@@ -3856,9 +3897,9 @@ snapshots:
d3-sankey: 0.12.3
dagre-d3-es: 7.0.14
dayjs: 1.11.23
- dompurify: 3.4.15
+ dompurify: 3.4.16
+ elkjs: 0.9.3
es-toolkit: 1.52.0
- fastdom: 1.0.12
katex: 0.16.47
khroma: 2.1.0
marked: 16.4.2
@@ -3879,7 +3920,7 @@ snapshots:
minipass@7.1.3: {}
- mocha@12.0.2:
+ mocha@12.0.3:
dependencies:
browser-stdout: 1.3.1
chokidar: 5.0.0
@@ -3889,11 +3930,11 @@ snapshots:
glob: 13.0.6
is-path-inside: 4.0.0
is-unicode-supported: 0.1.0
- js-yaml: 5.4.2
+ js-yaml: 5.4.3
minimatch: 10.2.6
ms: 2.1.3
picocolors: 1.1.1
- serialize-javascript: 7.1.1
+ serialize-javascript: 7.1.2
strip-json-comments: 5.0.3
supports-color: 8.1.1
workerpool: 10.0.3
@@ -3975,7 +4016,7 @@ snapshots:
dependencies:
p-limit: 3.1.0
- package-manager-detector@1.8.0: {}
+ package-manager-detector@1.9.0: {}
path-data-parser@0.1.0: {}
@@ -3990,9 +4031,9 @@ snapshots:
lru-cache: 11.5.3
minipass: 7.1.3
- pdfjs-dist@6.3.289:
+ pdfjs-dist@6.4.299:
optionalDependencies:
- '@napi-rs/canvas': 1.0.9
+ '@napi-rs/canvas': 1.0.10
picocolors@1.1.1: {}
@@ -4013,7 +4054,7 @@ snapshots:
dependencies:
fast-diff: 1.3.0
- prettier@3.9.8: {}
+ prettier@3.9.9: {}
punycode@2.3.1: {}
@@ -4088,7 +4129,7 @@ snapshots:
semver@7.8.5: {}
- serialize-javascript@7.1.1: {}
+ serialize-javascript@7.1.2: {}
set-function-length@1.2.2:
dependencies:
@@ -4146,15 +4187,13 @@ snapshots:
side-channel-map: 1.0.1
side-channel-weakmap: 1.0.2
- source-map-js@1.2.1: {}
+ source-map-js@1.2.2: {}
stop-iteration-iterator@1.1.0:
dependencies:
es-errors: 1.3.0
internal-slot: 1.1.0
- strictdom@1.0.1: {}
-
string.prototype.trim@1.2.11:
dependencies:
call-bind: 1.0.9
@@ -4204,7 +4243,7 @@ snapshots:
fdir: 6.5.0(picomatch@4.0.7)
picomatch: 4.0.7
- tinymce@8.9.1: {}
+ tinymce@8.9.3: {}
toastify-js@1.12.0: {}
@@ -4257,13 +4296,13 @@ snapshots:
possible-typed-array-names: 1.1.0
reflect.getprototypeof: 1.0.10
- typescript-eslint@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1):
+ typescript-eslint@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1))(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
- '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
- '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)(supports-color@8.1.1)
- '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0(supports-color@8.1.1))(supports-color@8.1.1)
- eslint: 10.11.0(supports-color@8.1.1)
+ '@typescript-eslint/eslint-plugin': 8.71.1(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1))(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
+ '@typescript-eslint/parser': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
+ '@typescript-eslint/typescript-estree': 8.71.1(@typescript/typescript6@6.0.2)(supports-color@8.1.1)
+ '@typescript-eslint/utils': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0(supports-color@8.1.1))(supports-color@8.1.1)
+ eslint: 10.12.0(supports-color@8.1.1)
typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- supports-color
diff --git a/client/src/CodeChatEditor.mts b/client/src/CodeChatEditor.mts
index e6d2a280..055f63a3 100644
--- a/client/src/CodeChatEditor.mts
+++ b/client/src/CodeChatEditor.mts
@@ -263,13 +263,9 @@ const _openLp = async (
// changes due to re-translation, not due to updates to IDE content.
// 2. If this is the full text, discard changes made in the Client since the
// last autosave, overwriting them with the provided update.
- // 3. If this is a diff:
- // 1. In document-only mode, we have a backup copy of the full text
- // before it was modified by the Client. Apply the diff to this,
- // overwriting changes made in the Client.
- // 2. In normal mode, we don't have a backup copy of the full text.
- // Report an `OutOfSync` error, which causes the IDE to send the full
- // text which will then overwrite changes made in the Client.
+ // 3. If this is a diff, report an `OutOfSync` error, which causes the IDE
+ // to send the full text which will then overwrite changes made in the
+ // Client.
if (getIsDirty() && isReTranslation) {
consoleLog(`Ignoring re-translation because Client is dirty.`);
return;
@@ -297,7 +293,18 @@ const _openLp = async (
const source = codechatForWeb["source"];
const codechatBody = document.getElementById("CodeChat-body");
assert(codechatBody instanceof HTMLDivElement);
- if (isDocOnly()) {
+ if (getIsDirty() && "Diff" in source) {
+ // Send an `OutOfSync` response, so that the IDE will send the full
+ // text to overwrite these changes with.
+ webSocketComm().sendResult(
+ // Pick a rarely-used ID, since we're not responding to a
+ // specific message.
+ 0,
+ // There's not a version that matters. TODO: replace this with a
+ // more suitable error.
+ { OutOfSync: [0, 0] },
+ );
+ } else if (isDocOnly()) {
// 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
@@ -371,26 +378,13 @@ const _openLp = async (
await mathJaxTypeset(codechatBody);
scrollToLine(cursorPosition, scrollLine);
} else {
- if (getIsDirty() && "Diff" in source) {
- // Send an `OutOfSync` response, so that the IDE will send the
- // full text to overwrite these changes with.
- webSocketComm().sendResult(
- // Pick a rarely-used ID, since we're not responding to a
- // specific message.
- 0,
- // There's not a version that matters. TODO: replace this
- // with a more suitable error.
- { OutOfSync: [0, 0] },
- );
- } else {
- await codeMirrorLoad(
- codechatBody,
- codechatForWeb,
- [],
- cursorPosition,
- scrollLine,
- );
- }
+ await codeMirrorLoad(
+ codechatBody,
+ codechatForWeb,
+ [],
+ cursorPosition,
+ scrollLine,
+ );
}
} finally {
// Use a `finally` block to ensure the cleanup code always runs.
diff --git a/client/src/CodeChatEditorFramework.mts b/client/src/CodeChatEditorFramework.mts
index fb2b021c..699d5f9f 100644
--- a/client/src/CodeChatEditorFramework.mts
+++ b/client/src/CodeChatEditorFramework.mts
@@ -186,9 +186,18 @@ class WebSocketComm {
this.version
) {
if (currentUpdate.is_re_translation) {
+ // An edit from this Client, still in
+ // flight to the Server, supersedes
+ // this re-translation; the Server
+ // re-translates that edit when it
+ // arrives. Reply anyway: the Server
+ // reports an unanswered message as a
+ // timeout error, which the IDE then
+ // shows.
consoleLog(
`Ignoring out-of-sync re-translation update.`,
);
+ this.sendResult(id);
} else {
reportError(
`Out of sync: Client version ${this.version} !== incoming version ${contents.source.Diff.version}.`,
@@ -293,6 +302,17 @@ class WebSocketComm {
break;
}
+ case "UpdateToc": {
+ const html = value as string;
+ // Execute this after all other messages have been
+ // processed.
+ this.promise = this.promise.finally(() => {
+ setSidebarToc(html);
+ this.sendResult(id);
+ });
+ break;
+ }
+
case "Result": {
// If the result has the magic ID, then call a debug
// routine.
@@ -439,8 +459,19 @@ class WebSocketComm {
// otherwise, this is `undefined`.
const getClient = () => rootIframe?.contentWindow?.CodeChatEditor;
-// Assign content to either the Client (if it's loaded) or the webpage (if not)
-// in the `rootIframe`.
+// Return the iframe with the given id in the page in the `rootIframe`, or
+// `undefined` if the page has none. The page belongs to the `rootIframe`'s
+// window, whose `HTMLIFrameElement` differs from this window's, so `instanceof`
+// can't identify the iframe.
+const getPageIframe = (id: string) => {
+ const element = rootIframe!.contentDocument?.getElementById(id);
+ return element?.tagName === "IFRAME"
+ ? (element as HTMLIFrameElement)
+ : undefined;
+};
+
+// Show the current file's new contents in the `rootIframe`: in the Client, if
+// it's loaded; otherwise, by reloading the document which shows the file.
const setContent = async (
contents: CodeChatForWeb,
isReTranslation: boolean,
@@ -449,18 +480,18 @@ const setContent = async (
) => {
const client = getClient();
if (client === undefined) {
- // See if this is the [simple viewer](#Client-simple-viewer). Otherwise,
- // it's just the bare document to replace.
- const contentsElement =
- rootIframe!.contentDocument?.getElementById("CodeChat-contents");
- const cw =
- (contentsElement instanceof HTMLIFrameElement
- ? contentsElement.contentWindow
- : undefined) ?? rootIframe!.contentWindow!;
- cw.document.open();
- assert("Plain" in contents.source);
- cw.document.write(contents.source.Plain.doc);
- cw.document.close();
+ // The browser itself renders this file. The page shows it either in the
+ // contents iframe of the [simple viewer](#Client-simple-viewer) or,
+ // outside a project, as the page itself. Reload that document, rather
+ // than writing `contents` to it: the Server serves the IDE's latest
+ // contents, which the browser renders according to the file's type.
+ // Writing them instead would parse them as HTML, collapsing a text
+ // file's line breaks, and would throw for an XML document such as an
+ // SVG image, since only an HTML document supports `document.open`.
+ (
+ getPageIframe("CodeChat-contents")?.contentWindow ??
+ rootIframe!.contentWindow!
+ ).location.reload();
} else {
await rootIframe!.contentWindow!.CodeChatEditor.openLp(
contents,
@@ -471,6 +502,40 @@ const setContent = async (
}
};
+// Replace the contents of the TOC in the sidebar of the page in the
+// `rootIframe` -- the Client or the simple viewer. Replacing them in place,
+// rather than reloading the sidebar, preserves its scroll position, along with
+// the `navigate` listener which the page attached to the sidebar's window to
+// intercept clicks on the TOC's links.
+const setSidebarToc = (html: string) => {
+ const sidebarIframe = getPageIframe("CodeChat-sidebar");
+ // A page outside a project has no sidebar.
+ if (sidebarIframe === undefined) {
+ return;
+ }
+ const replaceToc = () => {
+ // Until the sidebar loads, its document is the initial `about:blank`
+ // or a partially-parsed TOC.
+ const tocDocument = sidebarIframe.contentDocument;
+ if (tocDocument === null || tocDocument.readyState === "loading") {
+ return false;
+ }
+ const toc = tocDocument.querySelector(".CodeChat-TOC");
+ if (toc === null) {
+ return false;
+ }
+ toc.innerHTML = html;
+ return true;
+ };
+ // The Server sends this only after serving the sidebar its TOC, so a
+ // sidebar which is still loading shows an older rendering; replace that
+ // once it loads. Waiting here instead would stall every message behind
+ // this one if the sidebar never finishes loading.
+ if (!replaceToc()) {
+ sidebarIframe.addEventListener("load", replaceToc, { once: true });
+ }
+};
+
// The iframe element which composes this page.
let rootIframe: HTMLIFrameElement | undefined;
diff --git a/docs/design.md b/docs/design.md
index 9ff88e05..3997f3ba 100644
--- a/docs/design.md
+++ b/docs/design.md
@@ -274,7 +274,7 @@ added.
License
-------
-Copyright (C) 2025 Bryan A. Jones.
+Copyright (C) 2026 Bryan A. Jones.
This file is part of the CodeChat Editor.
diff --git a/extensions/VSCode/.gitignore b/extensions/VSCode/.gitignore
index ce72840b..8dc0c274 100644
--- a/extensions/VSCode/.gitignore
+++ b/extensions/VSCode/.gitignore
@@ -29,11 +29,9 @@ log4rs.yml
hashLocations.json
static/
-# NAPI-RS. `src/index.js` is tracked rather than generated -- see the
-# comment at the top of that file, and the `--js` flag in the builder's
-# NAPI build.
+# NAPI-RS
src/index.d.ts
-src/index-generated.js
+src/index.js
src/codechat-editor-client.win32-x64-msvc.node
.windows/
*.log
diff --git a/extensions/VSCode/package.json b/extensions/VSCode/package.json
index ff33b0e6..215d8c4a 100644
--- a/extensions/VSCode/package.json
+++ b/extensions/VSCode/package.json
@@ -41,7 +41,7 @@
"type": "git",
"url": "https://github.com/bjones1/CodeChat_Editor"
},
- "version": "0.2.6",
+ "version": "0.3.0",
"activationEvents": [
"onCommand:extension.codeChatEditorActivate",
"onCommand:extension.codeChatEditorDeactivate",
@@ -118,26 +118,26 @@
"@emnapi/core": "^1.11.3",
"@emnapi/runtime": "^1.11.3",
"@eslint/js": "^10.0.1",
- "@napi-rs/cli": "^3.10.4",
+ "@napi-rs/cli": "^3.10.8",
"@tybys/wasm-util": "^0.10.4",
"@types/escape-html": "^1.0.4",
- "@types/node": "^26.6.2",
+ "@types/node": "^26.6.4",
"@types/vscode": "1.61.0",
- "@typescript-eslint/eslint-plugin": "^8.70.0",
- "@typescript-eslint/parser": "^8.70.0",
+ "@typescript-eslint/eslint-plugin": "^8.71.1",
+ "@typescript-eslint/parser": "^8.71.1",
"@typescript/native": "npm:typescript@^7.0.2",
"@vscode/vsce": "^4.0.0",
- "chalk": "^6.0.0",
+ "chalk": "^6.0.1",
"esbuild": "^0.28.2",
- "eslint": "^10.11.0",
+ "eslint": "^10.12.0",
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-import": "^2.32.0",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-prettier": "^5.5.6",
"npm-run-all2": "^9.0.3",
- "prettier": "^3.9.8",
+ "prettier": "^3.9.9",
"typescript": "npm:@typescript/typescript6@^6.0.2",
- "typescript-eslint": "^8.70.0"
+ "typescript-eslint": "^8.71.1"
},
"optionalDependencies": {
"bufferutil": "^4.1.0"
diff --git a/extensions/VSCode/pnpm-lock.yaml b/extensions/VSCode/pnpm-lock.yaml
index bbe9cf17..594ee514 100644
--- a/extensions/VSCode/pnpm-lock.yaml
+++ b/extensions/VSCode/pnpm-lock.yaml
@@ -20,10 +20,10 @@ importers:
version: 1.11.3
'@eslint/js':
specifier: ^10.0.1
- version: 10.0.1(eslint@10.11.0)
+ version: 10.0.1(eslint@10.12.0)
'@napi-rs/cli':
- specifier: ^3.10.4
- version: 3.10.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@26.6.2)
+ specifier: ^3.10.8
+ version: 3.10.8(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@26.6.4)
'@tybys/wasm-util':
specifier: ^0.10.4
version: 0.10.4
@@ -31,17 +31,17 @@ importers:
specifier: ^1.0.4
version: 1.0.4
'@types/node':
- specifier: ^26.6.2
- version: 26.6.2
+ specifier: ^26.6.4
+ version: 26.6.4
'@types/vscode':
specifier: 1.61.0
version: 1.61.0
'@typescript-eslint/eslint-plugin':
- specifier: ^8.70.0
- version: 8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0))(@typescript/typescript6@6.0.2)(eslint@10.11.0)
+ specifier: ^8.71.1
+ version: 8.71.1(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0))(@typescript/typescript6@6.0.2)(eslint@10.12.0)
'@typescript-eslint/parser':
- specifier: ^8.70.0
- version: 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)
+ specifier: ^8.71.1
+ version: 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)
'@typescript/native':
specifier: npm:typescript@^7.0.2
version: typescript@7.0.2
@@ -49,38 +49,38 @@ importers:
specifier: ^4.0.0
version: 4.0.0
chalk:
- specifier: ^6.0.0
- version: 6.0.0
+ specifier: ^6.0.1
+ version: 6.0.1
esbuild:
specifier: ^0.28.2
version: 0.28.2
eslint:
- specifier: ^10.11.0
- version: 10.11.0
+ specifier: ^10.12.0
+ version: 10.12.0
eslint-config-prettier:
specifier: ^10.1.8
- version: 10.1.8(eslint@10.11.0)
+ version: 10.1.8(eslint@10.12.0)
eslint-plugin-import:
specifier: ^2.32.0
- version: 2.32.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0))(eslint@10.11.0)
+ version: 2.32.0(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0))(eslint@10.12.0)
eslint-plugin-node:
specifier: ^11.1.0
- version: 11.1.0(eslint@10.11.0)
+ version: 11.1.0(eslint@10.12.0)
eslint-plugin-prettier:
specifier: ^5.5.6
- version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.11.0))(eslint@10.11.0)(prettier@3.9.8)
+ version: 5.5.6(eslint-config-prettier@10.1.8(eslint@10.12.0))(eslint@10.12.0)(prettier@3.9.9)
npm-run-all2:
specifier: ^9.0.3
version: 9.0.3
prettier:
- specifier: ^3.9.8
- version: 3.9.8
+ specifier: ^3.9.9
+ version: 3.9.9
typescript:
specifier: npm:@typescript/typescript6@^6.0.2
version: '@typescript/typescript6@6.0.2'
typescript-eslint:
- specifier: ^8.70.0
- version: 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)
+ specifier: ^8.71.1
+ version: 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)
optionalDependencies:
bufferutil:
specifier: ^4.1.0
@@ -124,14 +124,18 @@ packages:
resolution: {integrity: sha512-rbAE25KUfjU/s3XHUdJgceoCP5dEOpMx85J04kF+QMdta73XkuG9JGHHinch+XIoKpBdqljin+KqURpJriSzLA==}
engines: {node: '>=22.0.0'}
- '@azure/msal-browser@5.22.0':
- resolution: {integrity: sha512-5kgu9xeEKgGc2JeidxAtU15NJTqiH/CMCRRQAJ4Rac56kB7KVg91vbNmn+z3RO1vNomPN69UvjKG9h1Pghx6dQ==}
+ '@azure/msal-browser@5.25.0':
+ resolution: {integrity: sha512-7GyXzDUrdLG5zPDCYJbQdJqbl9a2U9SWUSC4lxr7cXjkBq6diTfWcJsi0UjdGWlqy+EevQg9dSC4g3s3BEp19g==}
engines: {node: '>=0.8.0'}
'@azure/msal-common@16.14.1':
resolution: {integrity: sha512-Or6xhPNyi4zHW25158yxBoyxuCqNSPa5YBVqfF1J5Ks4MJWBo/USXdp05DQIPu1Zli00YZu6t0+h6KvHJealxQ==}
engines: {node: '>=0.8.0'}
+ '@azure/msal-common@16.14.2':
+ resolution: {integrity: sha512-HOBR0Gfo39TMrkxNG8k6cfjRkrRjXZc3JQs3ebMWQc9S4cihuknMYra3sgmzbZB752oQBqBN9+WF7c826p2vIQ==}
+ engines: {node: '>=0.8.0'}
+
'@azure/msal-node@6.0.1':
resolution: {integrity: sha512-ixSO1Y/kCVRthRs+hSx/5qkwaunX1/RAePhlMN0wIpIQ4WEZ6AREGGnGd1AP0qspHVsAwzWQKGubpjh50JyJIQ==}
engines: {node: '>=20'}
@@ -384,12 +388,12 @@ packages:
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
engines: {node: '>=18.18'}
- '@inquirer/ansi@2.0.8':
- resolution: {integrity: sha512-WpQM+Ti6Z40EFwwt+uL2p4UabT+W179zHp6HhLVOzfbwnVn05IPO/eXIZXGNqcT1jbQ15SujNLzQ39k4QPPxBQ==}
+ '@inquirer/ansi@2.0.9':
+ resolution: {integrity: sha512-0Ywt3S8tqM6TWUcsRlBFQ1x+X3/o8kktX0ZiKAnByYb9GFDknnOhse1PVtfiD2BXPI8ar+BWx9PV9R0lQIcygw==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- '@inquirer/checkbox@5.2.5':
- resolution: {integrity: sha512-bRt8J8m+Fot9CXv+zNQGXUq2ET0MggR1fPz7v6edN6MFYmsbfGnMmkmWZJEegMKqrAC8ej/o1sqisHZXZJMAfQ==}
+ '@inquirer/checkbox@5.2.6':
+ resolution: {integrity: sha512-XkOardciF3tow2NUlY6/Qjk1QqYa+6WpmVLTpxXl97Uv4erczDEZ+xg1j6LqBf0ekcRSUiICQA4nQXHHkVKQ9w==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -397,8 +401,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/confirm@6.3.2':
- resolution: {integrity: sha512-Xvr/0HggjddPtGppuqVmxhTw+Hr8PvsZ/k0HmOEaAqQEt80OITNkFWnsdNmyT0/eM4Ab+iJLx2R8rctlEyfSVg==}
+ '@inquirer/confirm@6.3.3':
+ resolution: {integrity: sha512-ImOBgpl/sJTFp8naeSkNu4S0Sf8F8pxv3/CUx+LoBAdQvCVqFz6rSB2A/oZYsJge3+yphbEDxEkfaRNYq1OU0A==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -406,8 +410,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/core@12.0.3':
- resolution: {integrity: sha512-wsSy0sznmXwkty+2PzZwx00Cazc/E0r0B7mAzdGROz2Ct+DFZXaK7WDjGZvgjRldxH5ZhFVfF2lgkYrqgOw2KA==}
+ '@inquirer/core@12.0.4':
+ resolution: {integrity: sha512-M5fB67y7jPObI45vhD82RskWwCSm0scOvenV/I6K8tIi2gfr9DXqQqJ+iw+Wi6SgapikdOiJibYzz1gW47fsDg==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -415,8 +419,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/editor@5.3.3':
- resolution: {integrity: sha512-YsKkS2q63IiLtaDK/9nqzdComN97SDQrmKiyNggN+ceP4ty+Z6VwyTz3FpjeUWeW1Efss2xHFKCC9sx7hnrsxg==}
+ '@inquirer/editor@5.3.4':
+ resolution: {integrity: sha512-imzxQDfw26NpcJAubMj/dE5RjU9Mp80IcT+FzsD6YoxXmL8L1QYnAFdCNv7ccGWh//73+0YP+1kfhwnExdl2VQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -424,8 +428,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/expand@5.1.5':
- resolution: {integrity: sha512-uHuXLmXW+TtIfT/9vSBotypAkqn1n34Ul+CLGPos/xANyO4Ff5xZzkYhbKR4NEcfVK4a9mHQOpwVZzluSHFRGw==}
+ '@inquirer/expand@5.1.6':
+ resolution: {integrity: sha512-JfiLKi7qGuHmcQO/DqR10UFEp054Y1FXZaszP5ZEfHhgHeuFoT5nNFQIXFhed/5/p07SbsV2tIJFwG/dg5+NmQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -433,8 +437,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/external-editor@3.0.5':
- resolution: {integrity: sha512-f3QQJRIX5ZEneBHNUIuPjmbdzHnmRFJA8r2dkcb8q+OM5Uv5KtnuAttQumnrjcBVBM3mcTX1CkmtAkU58VRZxg==}
+ '@inquirer/external-editor@3.0.6':
+ resolution: {integrity: sha512-rWmw6WG8JZ7LMn/srXEylYGhL6EXXJeROE7/4x4GREh6NgzqJBDbIgpNGsYoLPfobeb4VZtEYzPGnT5EFNYhiQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -446,8 +450,8 @@ packages:
resolution: {integrity: sha512-EAWgUTGQ/Umgga51dE3B2PUHbufuXarDfg86uVgoSgNHNNQnyFKcOrQLWVqYMghuSyHh8+2HUH0Js9cTC1WAdg==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
- '@inquirer/input@5.1.6':
- resolution: {integrity: sha512-HtcJhB2QFVXbLuJ5S3syhNbTUVxYvwqV4VRBDkQceBloC9bmTViUoRFP5PbSaDZb3HzfPmpuU/gG4ybVBz4FHA==}
+ '@inquirer/input@5.1.7':
+ resolution: {integrity: sha512-Icrs9tuMBCxGI+lFYNO71VFOnqGO8IIrLIGqnTGh07X8jZ2la9QLAYxXcikHZQjjVhIZUtU2xyH89DVN/pPhVg==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -455,8 +459,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/number@4.2.3':
- resolution: {integrity: sha512-6Yuwh1NGSbu1Lo4N1EWjXs1jKRntLg/ZCwhmeorEHde90v1XxAozdbd4Iu30eOQLW+6h1hp2O9ujNfLSbTPJnA==}
+ '@inquirer/number@4.2.4':
+ resolution: {integrity: sha512-C6g80U4U2+w2Vxa1CB0MN3a2WnQIfzLSUG0lduO3Au9GsirJsKATZkOwZPK+vZ1BlAlz+/Z5ParfQCS9E0svmg==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -464,8 +468,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/password@5.2.2':
- resolution: {integrity: sha512-W9zYdyzogK+6110mqwaSJWCBu2yA5Q/OfnGSjjZB1bNpHlmUozXxTl0+QOZBNeVd6Qo81/qT75gW05gLAtITxw==}
+ '@inquirer/password@5.2.3':
+ resolution: {integrity: sha512-1Uo2qfI2K3wXbfunMpvwAzoZPIUf5iEETwDGqRVbswoorXGqYQJ/bfIJFeLj+pxjq+e2UFPNOmx+fsIl4Urigw==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -473,8 +477,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/prompts@8.7.2':
- resolution: {integrity: sha512-QoRB4wFIjgH5iOhSjoIKMkTvSHDuV+O3OITlIqAYO0oK5x364GJILXiMBvlPiE+klg7Xx9tq5XVqQHcGUDYYPA==}
+ '@inquirer/prompts@8.7.3':
+ resolution: {integrity: sha512-DHK20kO+H5k/XcJQpHQUpVQbMYHHhZchlGWhZVMUV4WIuRuBW5744hipOtriE1vMqPLgnIyXFMHWKkIbTepa4Q==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -482,8 +486,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/rawlist@5.3.5':
- resolution: {integrity: sha512-1oHky1ONfCOwNrnkQGDE1oaSij/3fI6HFMSf2H/WsGO2lEyDX9My82iggITSy9ddSZ8yk8j9v41OI0fVoSIoaA==}
+ '@inquirer/rawlist@5.3.6':
+ resolution: {integrity: sha512-2exExhQ5xTBqfN/rRlZkvM1Gm3b0eiLcWe2NqxWxe7qYmnU4M3j/n9TwzfPUb+Q7dAAz9TmBtDWWdF3jbp4ZLA==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -491,8 +495,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/search@4.3.3':
- resolution: {integrity: sha512-fyuIU1Nbpvwlikjg3gXwJFDI11+EFjqQ7P+iByfmivIKQ1vmaykNrD/vy5unHuUqUpsOsnvJ25//tPF7E/RBRA==}
+ '@inquirer/search@4.3.4':
+ resolution: {integrity: sha512-xsk0UeFP04jsbEeFMzghjUaH2aHXyt+WykSajQzq/8qyBNHsgGYHea/sFwv5T08kW7Sp+KDX8aF124zPUIs1Ww==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -500,8 +504,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/select@5.2.5':
- resolution: {integrity: sha512-9kc15hr8r/kI+3DO/xLog5nOzTz1jqsHXa6JBFzmQKhkoJ8Slda1I1L/uD8ZSZ9tF1yp79wwXe7mclvX1rqR2Q==}
+ '@inquirer/select@5.2.6':
+ resolution: {integrity: sha512-jFu7CFghlr0vpi/326a4wz6BGkJH9X3H/iIu+ahyV2Ja52ktqQE3fC9BYP47JKeSPQYGUv5xquE2Vp9PbepZ3g==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -509,8 +513,8 @@ packages:
'@types/node':
optional: true
- '@inquirer/type@4.1.1':
- resolution: {integrity: sha512-yJoHYrMnxIsJZCY+0Vb66Dy3he3kL3e2wOBKhoSwWWAzZAY82emlxwgprCtp6yRixvNRNq9ztfRWQYPNr3Go7A==}
+ '@inquirer/type@4.2.0':
+ resolution: {integrity: sha512-2rnHX8RPo4glJYqnFc/v3nQeIhDcjyRRyaT7MGcfL/8xv/8K03SXYoA2tX06WVSKywWOE/ncbG3dtuzLjR5TCQ==}
engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'}
peerDependencies:
'@types/node': '>=18'
@@ -527,8 +531,8 @@ packages:
'@keyv/serialize@1.1.1':
resolution: {integrity: sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==}
- '@napi-rs/cli@3.10.4':
- resolution: {integrity: sha512-7yvXpu/m4p1Re1/DViAooSYAyivYEhqDrjuq66a6haXLEAKrZSzndG7B850g1irngI1pAdZS5xL4tsu0xQ8P9Q==}
+ '@napi-rs/cli@3.10.8':
+ resolution: {integrity: sha512-hg7m8VwECTIIHxNzajDG8QgtTOEVAKiIVLCLCW90Th6Z5R/ijWjh16iaQrRvXj4ve/S2fcXYo5cctCWJ8aVxIg==}
engines: {node: ^20.17.0 || ^22.13.0 || >= 23.5.0}
hasBin: true
peerDependencies:
@@ -876,8 +880,8 @@ packages:
resolution: {integrity: sha512-p6q2HhUc5vwH1CNwfOcrhLoxfgn8ust8Sqlfx+sA4VzAcp1cMbvbkl99tZZlDqOjCHgQNSiTfk/yWPjl/D42qA==}
engines: {node: '>= 10'}
- '@napi-rs/wasm-runtime@1.2.4':
- resolution: {integrity: sha512-AJxoUD2/15ESHbvpcyjU274nsAPLuOtPHCk0vKJM5pj//Fg/B1FXNWjPnXTT9PymCYYiHo4zPj0ZomXBKhoy7g==}
+ '@napi-rs/wasm-runtime@1.2.5':
+ resolution: {integrity: sha512-HshSvXzmBxNzqejd3k/KemgQ3hdREUYFRRrgxOZ+gPljDIsO2SDZrVZMd4Z/HsxudQbE62OVyVFE8z9BCurfjA==}
engines: {node: ^20.19.0 || ^22.13.0 || >=23.5.0}
peerDependencies:
'@emnapi/core': ^1.7.1 || ^2.0.0-alpha.4
@@ -1074,69 +1078,69 @@ packages:
'@types/json5@0.0.29':
resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
- '@types/node@26.6.2':
- resolution: {integrity: sha512-X1P21scMv4zGKLYqjdGjaKa7COa0RKVYYZZN/NfvLQ1JegxFhdhpZG/Lyn8AXx6CDUavKAd11v6BvfpkDByK8g==}
+ '@types/node@26.6.4':
+ resolution: {integrity: sha512-ldVPDCzj7fsaGZrLB0NuHuTvJcsNasysBAqMolr/cgxrLd1xbqxIr3XJiPnHHJUCxj5sNF1vnRj9aWnrVh5Jcg==}
'@types/vscode@1.61.0':
resolution: {integrity: sha512-9k5Nwq45hkRwdfCFY+eKXeQQSbPoA114mF7U/4uJXRBJeGIO7MuJdhF1PnaDN+lllL9iKGQtd6FFXShBXMNaFg==}
- '@typescript-eslint/eslint-plugin@8.70.0':
- resolution: {integrity: sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA==}
+ '@typescript-eslint/eslint-plugin@8.71.1':
+ resolution: {integrity: sha512-nNlBf6HuotqMgZvSkWD5hNdemiBIxQ2NmrlgfcUIeZRs+BbakjscCQRq/Hb74EFVnFiSWWdL12JruqwBy3ERDw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- '@typescript-eslint/parser': ^8.70.0
+ '@typescript-eslint/parser': ^8.71.1
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/parser@8.70.0':
- resolution: {integrity: sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q==}
+ '@typescript-eslint/parser@8.71.1':
+ resolution: {integrity: sha512-oM/5sAqz/l1v/zYK1qTOPrn2+JIrBGC1V6uNYucRO5gh6eT9vWJ/RhPbGE59byvZEUQ4VP6XkLBaS5Jti5jpvw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/project-service@8.70.0':
- resolution: {integrity: sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ==}
+ '@typescript-eslint/project-service@8.71.1':
+ resolution: {integrity: sha512-Oijc9RUsohHjncg6iGi7gCtjnEjYt9FWv9u6ygK8uKcHK5eLjLAkqERQ9BaytbpceOFdk6kifPCS/zAZE+A99g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/scope-manager@8.70.0':
- resolution: {integrity: sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ==}
+ '@typescript-eslint/scope-manager@8.71.1':
+ resolution: {integrity: sha512-1YUDZXdTnXLlob03SFHBipdyMBsDVm7zoSz0ytTJ39dk5J1TgsTK03VlR/dLXG/RLLUrPcYbD4rp23BmHxHP0w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/tsconfig-utils@8.70.0':
- resolution: {integrity: sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw==}
+ '@typescript-eslint/tsconfig-utils@8.71.1':
+ resolution: {integrity: sha512-oTvkml5SxXhgg+WWKhod5qWQICDXtOB+/Hi9VdPKFAANJ2b7YOgMffgvzXuqog7R6A/JtrzRf128dsxummyWhg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/type-utils@8.70.0':
- resolution: {integrity: sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw==}
+ '@typescript-eslint/type-utils@8.71.1':
+ resolution: {integrity: sha512-kH3t3jZCYv2PZSBEWPKTariLrCaoF1CLoPitYFBJOhAGEwWnSRAtGEifrfrpBa4K9JlwWNZotgA5w3/wLSk/FQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/types@8.70.0':
- resolution: {integrity: sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ==}
+ '@typescript-eslint/types@8.71.1':
+ resolution: {integrity: sha512-ybYnPTUwg3VQQOFEiBPLs8Jxl1ry2vXdn1kVKguomBbvxpetdu3MKTNDqFNUrlG8ylP9MpZosmXMFYlGQHk1oQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.70.0':
- resolution: {integrity: sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA==}
+ '@typescript-eslint/typescript-estree@8.71.1':
+ resolution: {integrity: sha512-pSKSEK1JJpHs6KiKVtABCE4iJK5d7FLFzDXQNBQ2oRY7LEd3UwOt3TZemTgu9syTIf56dJWlTn/pdmrO9oKUXQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/utils@8.70.0':
- resolution: {integrity: sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA==}
+ '@typescript-eslint/utils@8.71.1':
+ resolution: {integrity: sha512-CBjT6gfAz3DW2j9Q4moFnqt208Aq+506sVGXfpRcyAeqn0EpayL0mjdWoCO2t3RC7GewNrFxdeehuEaPg6DMzQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
typescript: '>=4.8.4 <6.1.0'
- '@typescript-eslint/visitor-keys@8.70.0':
- resolution: {integrity: sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ==}
+ '@typescript-eslint/visitor-keys@8.71.1':
+ resolution: {integrity: sha512-0GxiUGqMU0qXJt58cBsiG3DP8lUmBaFo2vChtUX+CT7PnR3v/VGLLrzVP4K9r1lNiZXjHYefMBbPunplr09v6w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript/typescript-aix-ppc64@7.0.2':
@@ -1325,8 +1329,8 @@ packages:
peerDependencies:
acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
- acorn@8.18.0:
- resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==}
+ acorn@8.19.0:
+ resolution: {integrity: sha512-oJlA3XiRm7Cyk6qFD2Jn8ak9B7jSy0qy00ADO3+8dpT0LSjFihQYv4C02LFCSYJV3Q37xYwwRy5m+IpIiUzqWw==}
engines: {node: '>=0.4.0'}
hasBin: true
@@ -1413,8 +1417,8 @@ packages:
resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==}
engines: {node: '>=6.14.2'}
- bundle-name@4.1.0:
- resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==}
+ bundle-name@4.1.1:
+ resolution: {integrity: sha512-DdH81/zPLVS11EUgWq3tEu/xn+EzljlMYooDNdzWEnFha3R3NBMpMV1UqYIpjYHV/SgpFKMIX1Oh7o06SjM/oA==}
engines: {node: '>=18'}
cacheable@2.5.0:
@@ -1432,8 +1436,8 @@ packages:
resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==}
engines: {node: '>= 0.4'}
- chalk@6.0.0:
- resolution: {integrity: sha512-2uNTXIuTTxk7ciZgAU1BQcgnchcG0xXnrs6jzkQfj9SsRa9M2s5zE8WT96hS6KmG4MzWHSrvH43DF1m4XRkrFg==}
+ chalk@6.0.1:
+ resolution: {integrity: sha512-/Ce6KNm3vIbWdMlNna6RVIZ/ICQxnJxCicet5LBKK9ZffBkqzDw0xh9EiKSljdRtiIQ1S1z4YgcscUUGzNCWrA==}
engines: {node: '>=22'}
chardet@2.2.0:
@@ -1674,8 +1678,8 @@ packages:
resolution: {integrity: sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
- eslint@10.11.0:
- resolution: {integrity: sha512-P7a6UEEqb9G95MYAtqkmsTbVXIYyzIfl6NGOIJk162PaahFxFyeGcrlXYFSiagECg4sEm8IseJdZBKR3rx6MsQ==}
+ eslint@10.12.0:
+ resolution: {integrity: sha512-npHjrHb2o4ehH3mE+YuxABR+0gyb0aVWCIolgJDArwCiHEIsonBm3ZKjel5b0U5+a+MbEvIyRCGCzD3eKKK2NA==}
engines: {node: ^20.19.0 || ^22.13.0 || >=24}
hasBin: true
peerDependencies:
@@ -1845,8 +1849,8 @@ packages:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
- ignore@7.0.9:
- resolution: {integrity: sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw==}
+ ignore@7.0.12:
+ resolution: {integrity: sha512-/8UvqAPU9DGTI9k4mxtf49U37Isfwr8Uts96+SBHIkFxPJnHS0Ew4f00sM4Scd8V8EjM0jUNtVDdv1kPdt35lg==}
engines: {node: '>= 4'}
imurmurhash@0.1.4:
@@ -1985,8 +1989,8 @@ packages:
resolution: {integrity: sha512-5mbUj3SiZXCuRf9fT3ibzbSSEWiy63gFfksmGfdOzujPjW3k+z8WvIBxcJHBoQNlaZaiyB25deviif2+osLmLw==}
engines: {node: '>=4'}
- js-yaml@5.4.2:
- resolution: {integrity: sha512-m+aqu+LwO1O6sIopafj8HUVl5aawITwZQe/yHpMCKjaWBaA/d07B/QdMb3529REftiU+RMMHL3Vlsw3hON7vWg==}
+ js-yaml@5.4.3:
+ resolution: {integrity: sha512-yzzNtgczwgoVHNigCyKTXcQJU4Y8t/ikU4UxXW0BvrLfHTGWZhsNcOT2s/a7vn81/4KqVnNmHjaUEPlvWnNwVw==}
hasBin: true
json-parse-even-better-errors@6.0.0:
@@ -2055,8 +2059,8 @@ packages:
resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
engines: {node: '>=10'}
- marked@18.0.13:
- resolution: {integrity: sha512-xTxVzZsBFwunP6HDmtBkabUQEYArnP7/rMDGmPj9SlrKlQ4i8MdYVow+nJL0eOqwpUqhzBoTBRADGN6uYwPyOw==}
+ marked@18.1.0:
+ resolution: {integrity: sha512-PamYXWWWg2nboG3oX5Ffzpy3EFZROqZJK9hSlMmUnekp7TxPs5DcT95vwd46m73/exfKCRVMtgXoPMI4FEJL6w==}
engines: {node: '>= 20'}
hasBin: true
@@ -2203,8 +2207,8 @@ packages:
resolution: {integrity: sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==}
engines: {node: '>=6.0.0'}
- prettier@3.9.8:
- resolution: {integrity: sha512-WRFq3Wn3WId7LLROfMLdH7xaFr2jR62wU8nLO6rQUOLOxNZUviyJQs1M0iIhLexSFy+L+w0ch66wtoO2jRjG0A==}
+ prettier@3.9.9:
+ resolution: {integrity: sha512-Z/CJHIkdujO/OtN7nXUii0Rf3VT5SRuhjBA82Xvu2XhBUgX3nhP67T0LHceBdQLex7OOFGTox+Q5Yg8Jk2Qivg==}
engines: {node: '>=14'}
hasBin: true
@@ -2243,8 +2247,8 @@ packages:
resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
engines: {node: '>=8'}
- resolve@1.22.12:
- resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==}
+ resolve@1.22.13:
+ resolution: {integrity: sha512-Dj/cW9zBV2aRj6XzCxuGIs3ESZKv02jixne3q6jFZYZ3/Tg09gHHviSMDL4kObh9pqSahdRHEnDoaP2gn8YLhA==}
engines: {node: '>= 0.4'}
hasBin: true
@@ -2312,8 +2316,8 @@ packages:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
- shell-quote@1.10.0:
- resolution: {integrity: sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==}
+ shell-quote@1.12.0:
+ resolution: {integrity: sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q==}
engines: {node: '>= 0.4'}
side-channel-list@1.0.1:
@@ -2420,8 +2424,8 @@ packages:
typed-rest-client@1.8.11:
resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==}
- typescript-eslint@8.70.0:
- resolution: {integrity: sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw==}
+ typescript-eslint@8.71.1:
+ resolution: {integrity: sha512-oiNVPC3/NbV1FpaHU07l8O6ynqG9v4PAiW2WvTrAmZdR0f2HI/gE668ElMLCK7Xbsu5k2fK5C4fXNiq05j7/nQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0 || ^10.0.0
@@ -2578,7 +2582,7 @@ snapshots:
'@azure/core-tracing': 1.4.0
'@azure/core-util': 1.14.0
'@azure/logger': 1.4.0
- '@azure/msal-browser': 5.22.0
+ '@azure/msal-browser': 5.25.0
'@azure/msal-node': 6.0.1
open: 10.2.0
tslib: 2.8.1
@@ -2592,12 +2596,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@azure/msal-browser@5.22.0':
+ '@azure/msal-browser@5.25.0':
dependencies:
- '@azure/msal-common': 16.14.1
+ '@azure/msal-common': 16.14.2
'@azure/msal-common@16.14.1': {}
+ '@azure/msal-common@16.14.2': {}
+
'@azure/msal-node@6.0.1':
dependencies:
'@azure/msal-common': 16.14.1
@@ -2738,9 +2744,9 @@ snapshots:
'@esbuild/win32-x64@0.28.2':
optional: true
- '@eslint-community/eslint-utils@4.10.1(eslint@10.11.0)':
+ '@eslint-community/eslint-utils@4.10.1(eslint@10.12.0)':
dependencies:
- eslint: 10.11.0
+ eslint: 10.12.0
eslint-visitor-keys: 3.4.3
'@eslint-community/regexpp@4.12.2': {}
@@ -2761,9 +2767,9 @@ snapshots:
dependencies:
'@types/json-schema': 7.0.15
- '@eslint/js@10.0.1(eslint@10.11.0)':
+ '@eslint/js@10.0.1(eslint@10.12.0)':
optionalDependencies:
- eslint: 10.11.0
+ eslint: 10.12.0
'@eslint/object-schema@3.0.5': {}
@@ -2788,124 +2794,124 @@ snapshots:
'@humanwhocodes/retry@0.4.3': {}
- '@inquirer/ansi@2.0.8': {}
+ '@inquirer/ansi@2.0.9': {}
- '@inquirer/checkbox@5.2.5(@types/node@26.6.2)':
+ '@inquirer/checkbox@5.2.6(@types/node@26.6.4)':
dependencies:
- '@inquirer/ansi': 2.0.8
- '@inquirer/core': 12.0.3(@types/node@26.6.2)
+ '@inquirer/ansi': 2.0.9
+ '@inquirer/core': 12.0.4(@types/node@26.6.4)
'@inquirer/figures': 2.0.9
- '@inquirer/type': 4.1.1(@types/node@26.6.2)
+ '@inquirer/type': 4.2.0(@types/node@26.6.4)
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
- '@inquirer/confirm@6.3.2(@types/node@26.6.2)':
+ '@inquirer/confirm@6.3.3(@types/node@26.6.4)':
dependencies:
- '@inquirer/core': 12.0.3(@types/node@26.6.2)
- '@inquirer/type': 4.1.1(@types/node@26.6.2)
+ '@inquirer/core': 12.0.4(@types/node@26.6.4)
+ '@inquirer/type': 4.2.0(@types/node@26.6.4)
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
- '@inquirer/core@12.0.3(@types/node@26.6.2)':
+ '@inquirer/core@12.0.4(@types/node@26.6.4)':
dependencies:
- '@inquirer/ansi': 2.0.8
+ '@inquirer/ansi': 2.0.9
'@inquirer/figures': 2.0.9
- '@inquirer/type': 4.1.1(@types/node@26.6.2)
+ '@inquirer/type': 4.2.0(@types/node@26.6.4)
cli-width: 4.1.0
fast-wrap-ansi: 0.2.2
mute-stream: 3.0.0
signal-exit: 4.1.0
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
- '@inquirer/editor@5.3.3(@types/node@26.6.2)':
+ '@inquirer/editor@5.3.4(@types/node@26.6.4)':
dependencies:
- '@inquirer/core': 12.0.3(@types/node@26.6.2)
- '@inquirer/external-editor': 3.0.5(@types/node@26.6.2)
- '@inquirer/type': 4.1.1(@types/node@26.6.2)
+ '@inquirer/core': 12.0.4(@types/node@26.6.4)
+ '@inquirer/external-editor': 3.0.6(@types/node@26.6.4)
+ '@inquirer/type': 4.2.0(@types/node@26.6.4)
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
- '@inquirer/expand@5.1.5(@types/node@26.6.2)':
+ '@inquirer/expand@5.1.6(@types/node@26.6.4)':
dependencies:
- '@inquirer/core': 12.0.3(@types/node@26.6.2)
- '@inquirer/type': 4.1.1(@types/node@26.6.2)
+ '@inquirer/core': 12.0.4(@types/node@26.6.4)
+ '@inquirer/type': 4.2.0(@types/node@26.6.4)
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
- '@inquirer/external-editor@3.0.5(@types/node@26.6.2)':
+ '@inquirer/external-editor@3.0.6(@types/node@26.6.4)':
dependencies:
chardet: 2.2.0
iconv-lite: 0.7.3
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
'@inquirer/figures@2.0.9': {}
- '@inquirer/input@5.1.6(@types/node@26.6.2)':
+ '@inquirer/input@5.1.7(@types/node@26.6.4)':
dependencies:
- '@inquirer/core': 12.0.3(@types/node@26.6.2)
- '@inquirer/type': 4.1.1(@types/node@26.6.2)
+ '@inquirer/core': 12.0.4(@types/node@26.6.4)
+ '@inquirer/type': 4.2.0(@types/node@26.6.4)
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
- '@inquirer/number@4.2.3(@types/node@26.6.2)':
+ '@inquirer/number@4.2.4(@types/node@26.6.4)':
dependencies:
- '@inquirer/core': 12.0.3(@types/node@26.6.2)
- '@inquirer/type': 4.1.1(@types/node@26.6.2)
+ '@inquirer/core': 12.0.4(@types/node@26.6.4)
+ '@inquirer/type': 4.2.0(@types/node@26.6.4)
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
- '@inquirer/password@5.2.2(@types/node@26.6.2)':
+ '@inquirer/password@5.2.3(@types/node@26.6.4)':
dependencies:
- '@inquirer/ansi': 2.0.8
- '@inquirer/core': 12.0.3(@types/node@26.6.2)
- '@inquirer/type': 4.1.1(@types/node@26.6.2)
+ '@inquirer/ansi': 2.0.9
+ '@inquirer/core': 12.0.4(@types/node@26.6.4)
+ '@inquirer/type': 4.2.0(@types/node@26.6.4)
optionalDependencies:
- '@types/node': 26.6.2
-
- '@inquirer/prompts@8.7.2(@types/node@26.6.2)':
- dependencies:
- '@inquirer/checkbox': 5.2.5(@types/node@26.6.2)
- '@inquirer/confirm': 6.3.2(@types/node@26.6.2)
- '@inquirer/editor': 5.3.3(@types/node@26.6.2)
- '@inquirer/expand': 5.1.5(@types/node@26.6.2)
- '@inquirer/input': 5.1.6(@types/node@26.6.2)
- '@inquirer/number': 4.2.3(@types/node@26.6.2)
- '@inquirer/password': 5.2.2(@types/node@26.6.2)
- '@inquirer/rawlist': 5.3.5(@types/node@26.6.2)
- '@inquirer/search': 4.3.3(@types/node@26.6.2)
- '@inquirer/select': 5.2.5(@types/node@26.6.2)
+ '@types/node': 26.6.4
+
+ '@inquirer/prompts@8.7.3(@types/node@26.6.4)':
+ dependencies:
+ '@inquirer/checkbox': 5.2.6(@types/node@26.6.4)
+ '@inquirer/confirm': 6.3.3(@types/node@26.6.4)
+ '@inquirer/editor': 5.3.4(@types/node@26.6.4)
+ '@inquirer/expand': 5.1.6(@types/node@26.6.4)
+ '@inquirer/input': 5.1.7(@types/node@26.6.4)
+ '@inquirer/number': 4.2.4(@types/node@26.6.4)
+ '@inquirer/password': 5.2.3(@types/node@26.6.4)
+ '@inquirer/rawlist': 5.3.6(@types/node@26.6.4)
+ '@inquirer/search': 4.3.4(@types/node@26.6.4)
+ '@inquirer/select': 5.2.6(@types/node@26.6.4)
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
- '@inquirer/rawlist@5.3.5(@types/node@26.6.2)':
+ '@inquirer/rawlist@5.3.6(@types/node@26.6.4)':
dependencies:
- '@inquirer/core': 12.0.3(@types/node@26.6.2)
- '@inquirer/type': 4.1.1(@types/node@26.6.2)
+ '@inquirer/core': 12.0.4(@types/node@26.6.4)
+ '@inquirer/type': 4.2.0(@types/node@26.6.4)
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
- '@inquirer/search@4.3.3(@types/node@26.6.2)':
+ '@inquirer/search@4.3.4(@types/node@26.6.4)':
dependencies:
- '@inquirer/core': 12.0.3(@types/node@26.6.2)
+ '@inquirer/core': 12.0.4(@types/node@26.6.4)
'@inquirer/figures': 2.0.9
- '@inquirer/type': 4.1.1(@types/node@26.6.2)
+ '@inquirer/type': 4.2.0(@types/node@26.6.4)
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
- '@inquirer/select@5.2.5(@types/node@26.6.2)':
+ '@inquirer/select@5.2.6(@types/node@26.6.4)':
dependencies:
- '@inquirer/ansi': 2.0.8
- '@inquirer/core': 12.0.3(@types/node@26.6.2)
+ '@inquirer/ansi': 2.0.9
+ '@inquirer/core': 12.0.4(@types/node@26.6.4)
'@inquirer/figures': 2.0.9
- '@inquirer/type': 4.1.1(@types/node@26.6.2)
+ '@inquirer/type': 4.2.0(@types/node@26.6.4)
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
- '@inquirer/type@4.1.1(@types/node@26.6.2)':
+ '@inquirer/type@4.2.0(@types/node@26.6.4)':
optionalDependencies:
- '@types/node': 26.6.2
+ '@types/node': 26.6.4
'@keyv/bigmap@1.3.1(keyv@5.6.0)':
dependencies:
@@ -2915,16 +2921,16 @@ snapshots:
'@keyv/serialize@1.1.1': {}
- '@napi-rs/cli@3.10.4(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@26.6.2)':
+ '@napi-rs/cli@3.10.8(@emnapi/core@1.11.3)(@emnapi/runtime@1.11.3)(@types/node@26.6.4)':
dependencies:
- '@inquirer/prompts': 8.7.2(@types/node@26.6.2)
+ '@inquirer/prompts': 8.7.3(@types/node@26.6.4)
'@napi-rs/cross-toolchain': 1.0.3
'@napi-rs/wasm-tools': 1.1.0
'@octokit/rest': 22.0.1
clipanion: 4.0.0-rc.4(typanion@3.14.0)
colorette: 2.0.20
es-toolkit: 1.52.0
- js-yaml: 5.4.2
+ js-yaml: 5.4.3
obug: 3.0.0
semver: 7.8.5
typanion: 3.14.0
@@ -3048,7 +3054,7 @@ snapshots:
dependencies:
'@emnapi/core': 1.11.2
'@emnapi/runtime': 1.11.2
- '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)
+ '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)
optional: true
'@napi-rs/lzma-win32-arm64-msvc@1.5.1':
@@ -3120,7 +3126,7 @@ snapshots:
dependencies:
'@emnapi/core': 1.11.2
'@emnapi/runtime': 1.11.2
- '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)
+ '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)
optional: true
'@napi-rs/tar-win32-arm64-msvc@1.1.1':
@@ -3151,14 +3157,14 @@ snapshots:
'@napi-rs/tar-win32-ia32-msvc': 1.1.1
'@napi-rs/tar-win32-x64-msvc': 1.1.1
- '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)':
+ '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)':
dependencies:
'@emnapi/core': 1.11.2
'@emnapi/runtime': 1.11.2
'@tybys/wasm-util': 0.10.4
optional: true
- '@napi-rs/wasm-runtime@1.2.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)':
+ '@napi-rs/wasm-runtime@1.2.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)':
dependencies:
'@emnapi/core': 1.9.2
'@emnapi/runtime': 1.9.2
@@ -3196,7 +3202,7 @@ snapshots:
dependencies:
'@emnapi/core': 1.9.2
'@emnapi/runtime': 1.9.2
- '@napi-rs/wasm-runtime': 1.2.4(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)
+ '@napi-rs/wasm-runtime': 1.2.5(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)
optional: true
'@napi-rs/wasm-tools-win32-arm64-msvc@1.1.0':
@@ -3335,78 +3341,78 @@ snapshots:
'@types/json5@0.0.29': {}
- '@types/node@26.6.2':
+ '@types/node@26.6.4':
dependencies:
undici-types: 8.9.0
'@types/vscode@1.61.0': {}
- '@typescript-eslint/eslint-plugin@8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0))(@typescript/typescript6@6.0.2)(eslint@10.11.0)':
+ '@typescript-eslint/eslint-plugin@8.71.1(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0))(@typescript/typescript6@6.0.2)(eslint@10.12.0)':
dependencies:
'@eslint-community/regexpp': 4.12.2
- '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)
- '@typescript-eslint/scope-manager': 8.70.0
- '@typescript-eslint/type-utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)
- '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)
- '@typescript-eslint/visitor-keys': 8.70.0
- eslint: 10.11.0
- ignore: 7.0.9
+ '@typescript-eslint/parser': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)
+ '@typescript-eslint/scope-manager': 8.71.1
+ '@typescript-eslint/type-utils': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)
+ '@typescript-eslint/utils': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)
+ '@typescript-eslint/visitor-keys': 8.71.1
+ eslint: 10.12.0
+ ignore: 7.0.12
natural-compare: 1.4.0
ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2)
typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)':
+ '@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)':
dependencies:
- '@typescript-eslint/scope-manager': 8.70.0
- '@typescript-eslint/types': 8.70.0
- '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)
- '@typescript-eslint/visitor-keys': 8.70.0
+ '@typescript-eslint/scope-manager': 8.71.1
+ '@typescript-eslint/types': 8.71.1
+ '@typescript-eslint/typescript-estree': 8.71.1(@typescript/typescript6@6.0.2)
+ '@typescript-eslint/visitor-keys': 8.71.1
debug: 4.4.3
- eslint: 10.11.0
+ eslint: 10.12.0
typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/project-service@8.70.0(@typescript/typescript6@6.0.2)':
+ '@typescript-eslint/project-service@8.71.1(@typescript/typescript6@6.0.2)':
dependencies:
- '@typescript-eslint/tsconfig-utils': 8.70.0(@typescript/typescript6@6.0.2)
- '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/tsconfig-utils': 8.71.1(@typescript/typescript6@6.0.2)
+ '@typescript-eslint/types': 8.71.1
debug: 4.4.3
typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.70.0':
+ '@typescript-eslint/scope-manager@8.71.1':
dependencies:
- '@typescript-eslint/types': 8.70.0
- '@typescript-eslint/visitor-keys': 8.70.0
+ '@typescript-eslint/types': 8.71.1
+ '@typescript-eslint/visitor-keys': 8.71.1
- '@typescript-eslint/tsconfig-utils@8.70.0(@typescript/typescript6@6.0.2)':
+ '@typescript-eslint/tsconfig-utils@8.71.1(@typescript/typescript6@6.0.2)':
dependencies:
typescript: '@typescript/typescript6@6.0.2'
- '@typescript-eslint/type-utils@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)':
+ '@typescript-eslint/type-utils@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)':
dependencies:
- '@typescript-eslint/types': 8.70.0
- '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)
- '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)
+ '@typescript-eslint/types': 8.71.1
+ '@typescript-eslint/typescript-estree': 8.71.1(@typescript/typescript6@6.0.2)
+ '@typescript-eslint/utils': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)
debug: 4.4.3
- eslint: 10.11.0
+ eslint: 10.12.0
ts-api-utils: 2.5.0(@typescript/typescript6@6.0.2)
typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.70.0': {}
+ '@typescript-eslint/types@8.71.1': {}
- '@typescript-eslint/typescript-estree@8.70.0(@typescript/typescript6@6.0.2)':
+ '@typescript-eslint/typescript-estree@8.71.1(@typescript/typescript6@6.0.2)':
dependencies:
- '@typescript-eslint/project-service': 8.70.0(@typescript/typescript6@6.0.2)
- '@typescript-eslint/tsconfig-utils': 8.70.0(@typescript/typescript6@6.0.2)
- '@typescript-eslint/types': 8.70.0
- '@typescript-eslint/visitor-keys': 8.70.0
+ '@typescript-eslint/project-service': 8.71.1(@typescript/typescript6@6.0.2)
+ '@typescript-eslint/tsconfig-utils': 8.71.1(@typescript/typescript6@6.0.2)
+ '@typescript-eslint/types': 8.71.1
+ '@typescript-eslint/visitor-keys': 8.71.1
debug: 4.4.3
minimatch: 10.2.6
semver: 7.8.5
@@ -3416,20 +3422,20 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)':
+ '@typescript-eslint/utils@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)':
dependencies:
- '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0)
- '@typescript-eslint/scope-manager': 8.70.0
- '@typescript-eslint/types': 8.70.0
- '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)
- eslint: 10.11.0
+ '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0)
+ '@typescript-eslint/scope-manager': 8.71.1
+ '@typescript-eslint/types': 8.71.1
+ '@typescript-eslint/typescript-estree': 8.71.1(@typescript/typescript6@6.0.2)
+ eslint: 10.12.0
typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.70.0':
+ '@typescript-eslint/visitor-keys@8.71.1':
dependencies:
- '@typescript-eslint/types': 8.70.0
+ '@typescript-eslint/types': 8.71.1
eslint-visitor-keys: 5.0.1
'@typescript/typescript-aix-ppc64@7.0.2':
@@ -3558,7 +3564,7 @@ snapshots:
commander: 12.1.0
hosted-git-info: 4.1.0
jsonc-parser: 3.3.1
- marked: 18.0.13
+ marked: 18.1.0
mime: 1.6.0
minimatch: 10.2.6
parse5: 8.0.1
@@ -3574,11 +3580,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
- acorn-jsx@5.3.2(acorn@8.18.0):
+ acorn-jsx@5.3.2(acorn@8.19.0):
dependencies:
- acorn: 8.18.0
+ acorn: 8.19.0
- acorn@8.18.0: {}
+ acorn@8.19.0: {}
agent-base@7.1.4: {}
@@ -3684,7 +3690,7 @@ snapshots:
node-gyp-build: 4.8.4
optional: true
- bundle-name@4.1.0:
+ bundle-name@4.1.1:
dependencies:
run-applescript: 7.1.0
@@ -3713,7 +3719,7 @@ snapshots:
call-bind-apply-helpers: 1.0.2
get-intrinsic: 1.3.0
- chalk@6.0.0: {}
+ chalk@6.0.1: {}
chardet@2.2.0: {}
@@ -3771,7 +3777,7 @@ snapshots:
default-browser@5.5.1:
dependencies:
- bundle-name: 4.1.0
+ bundle-name: 4.1.1
default-browser-id: 5.0.1
define-data-property@1.1.4:
@@ -3935,9 +3941,9 @@ snapshots:
escape-string-regexp@4.0.0: {}
- eslint-config-prettier@10.1.8(eslint@10.11.0):
+ eslint-config-prettier@10.1.8(eslint@10.12.0):
dependencies:
- eslint: 10.11.0
+ eslint: 10.12.0
eslint-import-resolver-node@0.3.10:
dependencies:
@@ -3947,23 +3953,23 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.14.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0))(eslint-import-resolver-node@0.3.10)(eslint@10.11.0):
+ eslint-module-utils@2.14.0(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0))(eslint-import-resolver-node@0.3.10)(eslint@10.12.0):
dependencies:
debug: 3.2.7
optionalDependencies:
- '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)
- eslint: 10.11.0
+ '@typescript-eslint/parser': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)
+ eslint: 10.12.0
eslint-import-resolver-node: 0.3.10
transitivePeerDependencies:
- supports-color
- eslint-plugin-es@3.0.1(eslint@10.11.0):
+ eslint-plugin-es@3.0.1(eslint@10.12.0):
dependencies:
- eslint: 10.11.0
+ eslint: 10.12.0
eslint-utils: 2.1.0
regexpp: 3.2.0
- eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0))(eslint@10.11.0):
+ eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0))(eslint@10.12.0):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.2.0
@@ -3972,9 +3978,9 @@ snapshots:
array.prototype.flatmap: 1.3.3
debug: 3.2.7
doctrine: 2.1.0
- eslint: 10.11.0
+ eslint: 10.12.0
eslint-import-resolver-node: 0.3.10
- eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0))(eslint-import-resolver-node@0.3.10)(eslint@10.11.0)
+ eslint-module-utils: 2.14.0(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0))(eslint-import-resolver-node@0.3.10)(eslint@10.12.0)
hasown: 2.0.4
is-core-module: 2.17.0
is-glob: 4.0.3
@@ -3986,30 +3992,30 @@ snapshots:
string.prototype.trimend: 1.0.10
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)
+ '@typescript-eslint/parser': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
- supports-color
- eslint-plugin-node@11.1.0(eslint@10.11.0):
+ eslint-plugin-node@11.1.0(eslint@10.12.0):
dependencies:
- eslint: 10.11.0
- eslint-plugin-es: 3.0.1(eslint@10.11.0)
+ eslint: 10.12.0
+ eslint-plugin-es: 3.0.1(eslint@10.12.0)
eslint-utils: 2.1.0
ignore: 5.3.2
minimatch: 3.1.5
- resolve: 1.22.12
+ resolve: 1.22.13
semver: 6.3.1
- eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.11.0))(eslint@10.11.0)(prettier@3.9.8):
+ eslint-plugin-prettier@5.5.6(eslint-config-prettier@10.1.8(eslint@10.12.0))(eslint@10.12.0)(prettier@3.9.9):
dependencies:
- eslint: 10.11.0
- prettier: 3.9.8
+ eslint: 10.12.0
+ prettier: 3.9.9
prettier-linter-helpers: 1.0.1
synckit: 0.11.13
optionalDependencies:
- eslint-config-prettier: 10.1.8(eslint@10.11.0)
+ eslint-config-prettier: 10.1.8(eslint@10.12.0)
eslint-scope@9.1.2:
dependencies:
@@ -4028,9 +4034,9 @@ snapshots:
eslint-visitor-keys@5.0.1: {}
- eslint@10.11.0:
+ eslint@10.12.0:
dependencies:
- '@eslint-community/eslint-utils': 4.10.1(eslint@10.11.0)
+ '@eslint-community/eslint-utils': 4.10.1(eslint@10.12.0)
'@eslint-community/regexpp': 4.12.2
'@eslint/config-array': 0.23.5
'@eslint/config-helpers': 0.7.0
@@ -4065,8 +4071,8 @@ snapshots:
espree@11.2.0:
dependencies:
- acorn: 8.18.0
- acorn-jsx: 5.3.2(acorn@8.18.0)
+ acorn: 8.19.0
+ acorn-jsx: 5.3.2(acorn@8.19.0)
eslint-visitor-keys: 5.0.1
esquery@1.7.0:
@@ -4231,7 +4237,7 @@ snapshots:
ignore@5.3.2: {}
- ignore@7.0.9: {}
+ ignore@7.0.12: {}
imurmurhash@0.1.4: {}
@@ -4373,7 +4379,7 @@ snapshots:
editions: 6.22.0
textextensions: 6.11.0
- js-yaml@5.4.2:
+ js-yaml@5.4.3:
dependencies:
argparse: 2.0.1
@@ -4446,7 +4452,7 @@ snapshots:
dependencies:
yallist: 4.0.0
- marked@18.0.13: {}
+ marked@18.1.0: {}
math-intrinsics@1.1.0: {}
@@ -4492,7 +4498,7 @@ snapshots:
picomatch: 4.0.7
pidtree: 1.0.0
read-package-json-fast: 6.0.0
- shell-quote: 1.10.0
+ shell-quote: 1.12.0
which: 7.0.0
object-inspect@1.13.4: {}
@@ -4592,7 +4598,7 @@ snapshots:
dependencies:
fast-diff: 1.3.0
- prettier@3.9.8: {}
+ prettier@3.9.9: {}
proper-lockfile@4.1.2:
dependencies:
@@ -4642,7 +4648,7 @@ snapshots:
regexpp@3.2.0: {}
- resolve@1.22.12:
+ resolve@1.22.13:
dependencies:
es-errors: 1.3.0
is-core-module: 2.17.0
@@ -4719,7 +4725,7 @@ snapshots:
shebang-regex@3.0.0: {}
- shell-quote@1.10.0: {}
+ shell-quote@1.12.0: {}
side-channel-list@1.0.1:
dependencies:
@@ -4862,13 +4868,13 @@ snapshots:
tunnel: 0.0.6
underscore: 1.13.8
- typescript-eslint@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0):
+ typescript-eslint@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0):
dependencies:
- '@typescript-eslint/eslint-plugin': 8.70.0(@typescript-eslint/parser@8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0))(@typescript/typescript6@6.0.2)(eslint@10.11.0)
- '@typescript-eslint/parser': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)
- '@typescript-eslint/typescript-estree': 8.70.0(@typescript/typescript6@6.0.2)
- '@typescript-eslint/utils': 8.70.0(@typescript/typescript6@6.0.2)(eslint@10.11.0)
- eslint: 10.11.0
+ '@typescript-eslint/eslint-plugin': 8.71.1(@typescript-eslint/parser@8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0))(@typescript/typescript6@6.0.2)(eslint@10.12.0)
+ '@typescript-eslint/parser': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)
+ '@typescript-eslint/typescript-estree': 8.71.1(@typescript/typescript6@6.0.2)
+ '@typescript-eslint/utils': 8.71.1(@typescript/typescript6@6.0.2)(eslint@10.12.0)
+ eslint: 10.12.0
typescript: '@typescript/typescript6@6.0.2'
transitivePeerDependencies:
- supports-color
diff --git a/extensions/VSCode/src/index.js b/extensions/VSCode/src/index.js
deleted file mode 100644
index dfc555c6..00000000
--- a/extensions/VSCode/src/index.js
+++ /dev/null
@@ -1,1278 +0,0 @@
-/* eslint-disable */
-// @ts-nocheck
-/* originally generated by NAPI-RS, now tracked and edited by hand */
-
-const { readFileSync, readdirSync } = require('fs')
-
-// Verbose load tracing
-// --------------------
-//
-// This section and the one which follows it are hand-written, as is the
-// diagnosis they feed into the error thrown at the end of the file; the rest
-// of this file is the loader NAPI-RS generates. The builder passes
-// `--js index-generated.js` so that a NAPI build writes its loader beside
-// this one rather than over it, leaving `index-generated.js` as the
-// reference to re-derive this file from when a NAPI-RS upgrade changes
-// what it emits.
-//
-// A binding which fails to load reaches the user as a single
-// "Cannot find native binding" thrown during extension activation, naming
-// neither the artifact which was tried nor the reason each attempt failed.
-// Every decision and every `require` attempt below is therefore logged, so
-// that an Extension Host log copied from the user's machine identifies the
-// failing step. Set `CODECHAT_NAPI_DEBUG=0` to silence the output.
-const __dbgEnabled = process.env.CODECHAT_NAPI_DEBUG !== '0'
-const __dbg = (...args) => {
- if (!__dbgEnabled) return
- try {
- console.log('[codechat-napi]', ...args)
- } catch {
- // A console which throws must not turn a working load into a failure.
- }
-}
-// Render an error as a single line. What arrives here is whatever a failed
-// `require` produced, which includes non-Errors thrown by an addon's own
-// initialization code.
-const __dbgErrText = (e) => {
- try {
- if (e && typeof e === 'object') {
- return `${e.name || 'Error'}${e.code ? ' [' + e.code + ']' : ''}: ${e.message}`
- }
- return String(e)
- } catch {
- return ''
- }
-}
-const __dbgStack = (e) => {
- try {
- return e && typeof e === 'object' && typeof e.stack === 'string' ? e.stack : ''
- } catch {
- return ''
- }
-}
-// An array whose `push` announces what it collects. The loader funnels every
-// failed attempt into one of two such arrays, so tracing `push` reports each
-// failure without touching the `require` call sites -- which must keep their
-// literal string arguments for esbuild's `.node` copy loader to find them.
-const __dbgTracedArray = (label) => {
- const array = []
- if (!__dbgEnabled) return array
- const push = Array.prototype.push.bind(array)
- array.push = (...items) => {
- for (const item of items) {
- __dbg(`${label} <- ${__dbgErrText(item)}`)
- const stack = __dbgStack(item)
- if (stack) __dbg(`${label} <- stack: ${stack}`)
- }
- return push(...items)
- }
- return array
-}
-const __dbgAttempt = (kind, specifier) => {
- __dbg(`attempting ${kind}: ${specifier}`)
-}
-// Report a successful load, then hand the binding back, so that this wraps an
-// existing expression instead of restructuring the block it sits in.
-const __dbgOk = (specifier, binding) => {
- let keys
- try {
- keys = binding ? Object.keys(binding).join(', ') : String(binding)
- } catch (e) {
- keys = ``
- }
- __dbg(`LOADED ${specifier} -- exports: ${keys}`)
- return binding
-}
-const LF = String.fromCharCode(10)
-const CR = String.fromCharCode(13)
-const SPACE = ''
-const NL_INDENT = LF + ' '
-const __dbgChain = (label, errors) => {
- __dbg(`${label}: ${errors.length} error(s) recorded`)
- errors.forEach((e, i) => {
- __dbg(` [${i}] ${__dbgErrText(e)}`)
- const stack = __dbgStack(e)
- // Indent a multi-line stack so that it reads as one entry in the log.
- if (stack) __dbg(NL_INDENT.slice(1) + stack.split(CR).join(SPACE).split(LF).join(NL_INDENT))
- })
-}
-
-// Diagnosing a Windows load failure
-// ---------------------------------
-//
-// `LoadLibraryExW` reports a dependency it cannot find as
-// `ERROR_MOD_NOT_FOUND` against the path it was asked to load, not against the
-// dependency. An artifact which the directory listing logged below shows
-// sitting in place is therefore named as the file which could not be found,
-// and Windows offers no way to ask which dependency was actually absent. So
-// read the artifact's own import table and look for each name it holds along
-// the directories the loader searches: `uv_dlopen` passes
-// `LOAD_WITH_ALTERED_SEARCH_PATH`, which searches the artifact's directory
-// first, then the system directory and `PATH`.
-const { closeSync, existsSync, openSync, readSync } = require('fs')
-const { basename, dirname, join } = require('path')
-
-// A name beginning with `api-ms-` or `ext-ms-` is an API set rather than a
-// library: the loader resolves it through a schema held in the kernel, and no
-// file of that name exists on disk, so searching directories can never find
-// one.
-const __napiIsApiSet = (dllName) => /^(api|ext)-ms-/i.test(dllName)
-
-// The libraries which arrive with the Visual C++ redistributable rather than
-// with Windows. A build which links the C runtime dynamically imports
-// `VCRUNTIME140.dll` from this set, and a machine which has never installed
-// the redistributable does not have it -- the failure which
-// `.cargo/config.toml` now heads off by linking that runtime statically.
-const __napiIsRedistributableDll = (dllName) =>
- /^(vcruntime|msvcp|concrt|vcomp|vccorlib)\d+(_\w+)?\.dll$/i.test(dllName)
-
-// Microsoft's permalink to the current redistributable, which covers every
-// release from 2015 on. It is the architecture of *this process* which
-// decides the download: an x64 VSCode emulated on an ARM64 machine loads an
-// x64 artifact, which the ARM64 redistributable cannot satisfy.
-const __napiRedistributableUrl = () =>
- `https://aka.ms/vs/17/release/vc_redist.${process.arch === 'arm64' ? 'arm64' : process.arch === 'ia32' ? 'x86' : 'x64'}.exe`
-
-// The `Machine` field of the COFF header, in the terms `process.arch` uses.
-// An artifact built for the wrong architecture fails to load exactly as one
-// whose dependencies are missing does, so the field is read to tell the two
-// apart.
-const __napiMachineArch = {
- 0x014c: 'ia32',
- 0x01c4: 'arm',
- 0x8664: 'x64',
- 0xaa64: 'arm64',
-}
-
-// Read a run of bytes from an open file. The artifact runs to tens of
-// megabytes, so follow the offsets its headers hold rather than reading the
-// whole of it.
-const __napiReadAt = (
- // The open file to read from.
- fd,
- // The offset to read at.
- position,
- // How many bytes to read.
- length,
- // The bytes read, which fall short of `length` only at end of file.
-) => {
- const buffer = Buffer.alloc(length)
- const read = readSync(fd, buffer, 0, length, position)
- return buffer.subarray(0, read)
-}
-
-// List the libraries named in a Windows executable's import table.
-const __napiPeImports = (
- // The path of the artifact to read.
- artifactPath,
- // The COFF `Machine` field and the imported names, or `null` for a file
- // which does not parse as a Windows executable -- itself a finding, since a
- // truncated or overwritten artifact fails to load in the same way as one
- // whose dependencies are missing.
-) => {
- const fd = openSync(artifactPath, 'r')
- try {
- // An `MZ` signature, then the offset of the PE header at the end of the
- // DOS header which follows it.
- const dosHeader = __napiReadAt(fd, 0, 0x40)
- if (dosHeader.length < 0x40 || dosHeader.readUInt16LE(0) !== 0x5a4d) {
- return null
- }
- const peOffset = dosHeader.readUInt32LE(0x3c)
- // A 4-byte `PE\0\0` signature, then the 20-byte COFF header, which counts
- // the sections and sizes the optional header following it.
- const coffHeader = __napiReadAt(fd, peOffset, 24)
- if (coffHeader.length < 24 || coffHeader.readUInt32LE(0) !== 0x00004550) {
- return null
- }
- const machine = coffHeader.readUInt16LE(4)
- const sectionCount = coffHeader.readUInt16LE(6)
- const optionalHeaderSize = coffHeader.readUInt16LE(20)
- const optionalHeader = __napiReadAt(fd, peOffset + 24, optionalHeaderSize)
- if (optionalHeader.length < optionalHeaderSize) {
- return null
- }
- // A 64-bit image -- `PE32+`, magic `0x20b` -- widens five fields of the
- // optional header to 64 bits -- `ImageBase` and the four stack and heap
- // sizes, gaining 20 bytes -- and drops a sixth, `BaseOfData`, losing 4,
- // so the data directories sit 16 bytes further along than in a 32-bit
- // image. Each directory is an address followed by a size, and the second
- // of them is the import table.
- const directories = optionalHeader.readUInt16LE(0) === 0x20b ? 112 : 96
- const importRva = optionalHeader.readUInt32LE(directories + 8)
- if (importRva === 0) {
- return { machine, names: [] }
- }
- const sectionTable = __napiReadAt(
- fd,
- peOffset + 24 + optionalHeaderSize,
- 40 * sectionCount,
- )
- if (sectionTable.length < 40 * sectionCount) {
- return null
- }
- const sections = []
- for (let index = 0; index < sectionCount; index++) {
- const entry = sectionTable.subarray(40 * index, 40 * (index + 1))
- sections.push({
- virtualAddress: entry.readUInt32LE(12),
- // A section's size on disk and its size once mapped differ; the
- // larger of the two bounds it.
- size: Math.max(entry.readUInt32LE(8), entry.readUInt32LE(16)),
- rawOffset: entry.readUInt32LE(20),
- })
- }
- // Addresses in the import table are relative to the image as the loader
- // maps it, which is not how it sits in the file: each section lands at
- // its own offset, so only an address falling inside a section can be
- // read at all.
- const fileOffset = (rva) => {
- const section = sections.find(
- (candidate) =>
- rva >= candidate.virtualAddress &&
- rva < candidate.virtualAddress + candidate.size,
- )
- return section === undefined
- ? null
- : section.rawOffset + (rva - section.virtualAddress)
- }
- let descriptor = fileOffset(importRva)
- if (descriptor === null) {
- return null
- }
- const names = []
- // The table holds one 20-byte descriptor per library and ends with a
- // descriptor of all zeros. Only the name at offset 12 matters here; the
- // rest addresses the individual functions imported.
- while (true) {
- const entry = __napiReadAt(fd, descriptor, 20)
- if (entry.length < 20 || entry.every((byte) => byte === 0)) {
- break
- }
- const nameOffset = fileOffset(entry.readUInt32LE(12))
- if (nameOffset === null) {
- return null
- }
- // `MAX_PATH` bounds the name, which ends at its first NUL.
- const name = __napiReadAt(fd, nameOffset, 260)
- const end = name.indexOf(0)
- names.push(name.toString('latin1', 0, end === -1 ? name.length : end))
- descriptor += 20
- }
- return { machine, names }
- } finally {
- closeSync(fd)
- }
-}
-
-// Report which of the libraries an artifact imports cannot be found along the
-// path the loader searches.
-const __napiMissingImports = (
- // The path of the artifact to examine.
- artifactPath,
- // The architecture the artifact was built for -- `undefined` for a machine
- // type this does not name -- together with the names which no searched
- // directory holds, or `null` where the import table could not be read.
-) => {
- const parsed = __napiPeImports(artifactPath)
- if (parsed === null) {
- return null
- }
- // Windows permits a `PATH` entry containing spaces to be quoted and strips
- // the quotes itself before searching, so an entry left as written never
- // matches a directory, and every library living there is reported missing.
- const searchPath = [
- dirname(artifactPath),
- join(process.env.SystemRoot || 'C:\\Windows', 'System32'),
- ...(process.env.PATH || '').split(';'),
- ].map((directory) => directory.replace(/"/g, '').trim())
- const missing = []
- const seen = new Set()
- for (const name of parsed.names) {
- // One library draws several descriptors when the objects importing from
- // it spell its name differently -- `kernel32.dll` and `KERNEL32.dll` both
- // appear in these artifacts.
- const key = name.toLowerCase()
- if (seen.has(key) || __napiIsApiSet(name)) {
- continue
- }
- seen.add(key)
- if (
- !searchPath.some(
- (directory) => directory !== '' && existsSync(join(directory, name)),
- )
- ) {
- missing.push(name)
- }
- }
- return { arch: __napiMachineArch[parsed.machine], missing }
-}
-
-// Explain a failure of the native chain on Windows. Without this, such a
-// failure reaches the user as the generic message thrown below, which sends
-// them looking for a file that is present and blames npm, which has no part
-// in installing an extension from the Marketplace.
-const __napiDiagnoseWindowsLoadFailure = (
- // Every error the native chain recorded.
- errors,
- // A message naming the cause, or `null` where nothing beyond the recorded
- // errors can be said.
-) => {
- if (process.platform !== 'win32') {
- return null
- }
- try {
- // `require` reports an artifact which Windows refused to load as
- // `ERR_DLOPEN_FAILED` and one which is absent as `MODULE_NOT_FOUND`, so
- // this distinguishes a load which failed from an artifact which was
- // never installed.
- const dlopenError = errors.find(
- (e) => e && typeof e === 'object' && e.code === 'ERR_DLOPEN_FAILED',
- )
- const directory = typeof __dirname === 'string' ? __dirname : '.'
- const artifacts = readdirSync(directory).filter((entry) =>
- entry.endsWith('.node'),
- )
- if (dlopenError === undefined) {
- return artifacts.length === 0
- ? `No native module for ${process.platform}-${process.arch} was installed with this extension: ${directory} holds none. Uninstall the CodeChat Editor extension, then install it again.`
- : null
- }
- // A localized Windows writes this message in its own language, so take
- // from it only the path, which is predictable, and fall back to the
- // directory's sole artifact where even that cannot be read.
- const message =
- typeof dlopenError.message === 'string' ? dlopenError.message : ''
- const messagePath = /[A-Za-z]:\\[^\r\n]*?\.node/.exec(message)
- let artifactPath = messagePath === null ? null : messagePath[0]
- if (artifactPath === null || !existsSync(artifactPath)) {
- artifactPath =
- artifacts.length === 1 ? join(directory, artifacts[0]) : null
- }
- if (artifactPath === null) {
- return null
- }
- const parsed = __napiMissingImports(artifactPath)
- if (parsed === null) {
- return `${artifactPath} is installed, but does not parse as a Windows library, so Windows cannot load it. The file is most likely truncated or damaged: uninstall the CodeChat Editor extension, then install it again.`
- }
- const { arch, missing } = parsed
- // An artifact built for another architecture is refused with the same
- // `ERROR_MOD_NOT_FOUND` as one whose dependencies are absent, and its
- // imports all resolve, so without this check it is blamed on security
- // software below.
- if (arch !== undefined && arch !== process.arch) {
- return `${artifactPath} was built for ${arch}, but this VSCode runs as ${process.arch}, so Windows cannot load it. The wrong artifact was installed for this machine: uninstall the CodeChat Editor extension, then install it again.`
- }
- if (missing.length === 0) {
- // Nothing here identifies the cause, so pass the Windows text on rather
- // than replacing it. An addon built against another Node ABI is the one
- // remaining cause this can name.
- return `Windows refused to load ${artifactPath}, although the file is present, built for ${process.arch}, and every library it names was found. Windows reported: ${message.replace(/\s+/g, ' ').replace(/[\s.]+$/, '')}. Check whether security software has blocked or altered ${basename(artifactPath)}, and whether this addon was built for the Node ABI this VSCode uses (NODE_MODULE_VERSION ${process.versions.modules}).`
- }
- return (
- `Windows cannot load ${artifactPath}: it needs ${missing.join(', ')}, which ${missing.length === 1 ? 'is' : 'are'} not installed on this machine. ` +
- (missing.some(__napiIsRedistributableDll)
- ? `Install the Microsoft Visual C++ Redistributable from ${__napiRedistributableUrl()}, then restart VSCode.`
- : `Install the software providing ${missing.length === 1 ? 'it' : 'them'}, then restart VSCode.`)
- )
- } catch (e) {
- // The diagnosis runs only once the load has already failed. A fault in it
- // must not replace the failure it was meant to explain.
- __dbg(`diagnosis failed: ${__dbgErrText(e)}`)
- return null
- }
-}
-
-__dbg('==== binding load starting ====')
-__dbg(`platform=${process.platform} arch=${process.arch} node=${process.version} modules=${process.versions.modules} electron=${process.versions.electron || 'none'}`)
-__dbg(`execPath=${process.execPath}`)
-__dbg(`cwd=${process.cwd()}`)
-__dbg(`__dirname=${typeof __dirname === 'string' ? __dirname : ''}`)
-__dbg(`config.variables: shlib_suffix=${process.config && process.config.variables ? process.config.variables.shlib_suffix : ''} node_target_type=${process.config && process.config.variables ? process.config.variables.node_target_type : ''}`)
-for (const __dbgEnvName of [
- 'NAPI_RS_NATIVE_LIBRARY_PATH',
- 'NAPI_RS_FORCE_WASI',
- 'NAPI_RS_WASI_FLAVOR',
- 'NAPI_RS_ENFORCE_VERSION_CHECK',
-]) {
- __dbg(`env ${__dbgEnvName}=${process.env[__dbgEnvName] === undefined ? '' : JSON.stringify(process.env[__dbgEnvName])}`)
-}
-// The artifact is looked for beside this file, so a listing of that directory
-// shows directly whether the expected `.node` was packaged and installed.
-try {
- const __dbgDir = typeof __dirname === 'string' ? __dirname : '.'
- const __dbgEntries = readdirSync(__dbgDir)
- __dbg(`contents of ${__dbgDir} (${__dbgEntries.length} entries): ${__dbgEntries.join(', ')}`)
-} catch (e) {
- __dbg(`directory listing failed: ${__dbgErrText(e)}`)
-}
-let nativeBinding = null
-// Which artifact actually loaded. The WASI fallback chain overwrites it with
-// the flavor it resolved; the late native retry below leaves it alone because
-// it only runs while no WASI candidate has been loaded.
-let __napiLoadedBindingTarget = 'native'
-const loadErrors = __dbgTracedArray('loadErrors')
-
-const isMusl = () => {
- let musl = false
- if (process.platform === 'linux') {
- musl = isMuslFromFilesystem()
- if (musl === null) {
- musl = isMuslFromReport()
- }
- if (musl === null) {
- musl = isMuslFromChildProcess()
- }
- }
- __dbg(`isMusl() = ${musl}`)
- return musl
-}
-
-const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-')
-
-const isMuslFromFilesystem = () => {
- try {
- return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl')
- } catch {
- return null
- }
-}
-
-const isMuslFromReport = () => {
- let report = null
- if (process.report && typeof process.report.getReport === 'function') {
- process.report.excludeNetwork = true
- report = process.report.getReport()
- }
- if (!report) {
- return null
- }
- if (report.header && report.header.glibcVersionRuntime) {
- return false
- }
- if (Array.isArray(report.sharedObjects)) {
- if (report.sharedObjects.some(isFileMusl)) {
- return true
- }
- }
- return false
-}
-
-const isMuslFromChildProcess = () => {
- try {
- return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl')
- } catch (e) {
- // If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false
- return false
- }
-}
-
-function requireNative() {
- __dbg('requireNative(): walking the platform/arch chain')
- if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {
- try {
- __dbgAttempt('NAPI_RS_NATIVE_LIBRARY_PATH override', process.env.NAPI_RS_NATIVE_LIBRARY_PATH)
- const overrideBinding = __dbgOk(process.env.NAPI_RS_NATIVE_LIBRARY_PATH, require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH))
- // The override may be a generated WASI loader, which already reports its
- // own flavor. Adopt it: `module.exports` aliases this object, so claiming
- // 'native' would both misreport the artifact and overwrite the loader's
- // marker through the alias.
- __napiLoadedBindingTarget =
- overrideBinding && typeof overrideBinding.__napiBindingTarget === 'string'
- ? overrideBinding.__napiBindingTarget
- : 'native'
- return overrideBinding
- } catch (err) {
- loadErrors.push(err)
- }
- } else if (process.platform === 'android') {
- if (process.arch === 'arm64') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.android-arm64.node')
- return __dbgOk('./codechat-editor-client.android-arm64.node', require('./codechat-editor-client.android-arm64.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-android-arm64')
- const binding = require('codechat-editor-client-android-arm64')
- const bindingPackageVersion = require('codechat-editor-client-android-arm64/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-android-arm64', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else if (process.arch === 'arm') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.android-arm-eabi.node')
- return __dbgOk('./codechat-editor-client.android-arm-eabi.node', require('./codechat-editor-client.android-arm-eabi.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-android-arm-eabi')
- const binding = require('codechat-editor-client-android-arm-eabi')
- const bindingPackageVersion = require('codechat-editor-client-android-arm-eabi/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-android-arm-eabi', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else {
- loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`))
- }
- } else if (process.platform === 'win32') {
- if (process.arch === 'x64') {
- if ((process.config && process.config.variables && process.config.variables.shlib_suffix === 'dll.a') || (process.config && process.config.variables && process.config.variables.node_target_type === 'shared_library')) {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.win32-x64-gnu.node')
- return __dbgOk('./codechat-editor-client.win32-x64-gnu.node', require('./codechat-editor-client.win32-x64-gnu.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-win32-x64-gnu')
- const binding = require('codechat-editor-client-win32-x64-gnu')
- const bindingPackageVersion = require('codechat-editor-client-win32-x64-gnu/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-win32-x64-gnu', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.win32-x64-msvc.node')
- return __dbgOk('./codechat-editor-client.win32-x64-msvc.node', require('./codechat-editor-client.win32-x64-msvc.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-win32-x64-msvc')
- const binding = require('codechat-editor-client-win32-x64-msvc')
- const bindingPackageVersion = require('codechat-editor-client-win32-x64-msvc/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-win32-x64-msvc', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- }
- } else if (process.arch === 'ia32') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.win32-ia32-msvc.node')
- return __dbgOk('./codechat-editor-client.win32-ia32-msvc.node', require('./codechat-editor-client.win32-ia32-msvc.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-win32-ia32-msvc')
- const binding = require('codechat-editor-client-win32-ia32-msvc')
- const bindingPackageVersion = require('codechat-editor-client-win32-ia32-msvc/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-win32-ia32-msvc', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else if (process.arch === 'arm64') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.win32-arm64-msvc.node')
- return __dbgOk('./codechat-editor-client.win32-arm64-msvc.node', require('./codechat-editor-client.win32-arm64-msvc.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-win32-arm64-msvc')
- const binding = require('codechat-editor-client-win32-arm64-msvc')
- const bindingPackageVersion = require('codechat-editor-client-win32-arm64-msvc/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-win32-arm64-msvc', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else {
- loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`))
- }
- } else if (process.platform === 'darwin') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.darwin-universal.node')
- return __dbgOk('./codechat-editor-client.darwin-universal.node', require('./codechat-editor-client.darwin-universal.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-darwin-universal')
- const binding = require('codechat-editor-client-darwin-universal')
- const bindingPackageVersion = require('codechat-editor-client-darwin-universal/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-darwin-universal', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- if (process.arch === 'x64') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.darwin-x64.node')
- return __dbgOk('./codechat-editor-client.darwin-x64.node', require('./codechat-editor-client.darwin-x64.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-darwin-x64')
- const binding = require('codechat-editor-client-darwin-x64')
- const bindingPackageVersion = require('codechat-editor-client-darwin-x64/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-darwin-x64', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else if (process.arch === 'arm64') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.darwin-arm64.node')
- return __dbgOk('./codechat-editor-client.darwin-arm64.node', require('./codechat-editor-client.darwin-arm64.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-darwin-arm64')
- const binding = require('codechat-editor-client-darwin-arm64')
- const bindingPackageVersion = require('codechat-editor-client-darwin-arm64/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-darwin-arm64', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else {
- loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`))
- }
- } else if (process.platform === 'freebsd') {
- if (process.arch === 'x64') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.freebsd-x64.node')
- return __dbgOk('./codechat-editor-client.freebsd-x64.node', require('./codechat-editor-client.freebsd-x64.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-freebsd-x64')
- const binding = require('codechat-editor-client-freebsd-x64')
- const bindingPackageVersion = require('codechat-editor-client-freebsd-x64/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-freebsd-x64', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else if (process.arch === 'arm64') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.freebsd-arm64.node')
- return __dbgOk('./codechat-editor-client.freebsd-arm64.node', require('./codechat-editor-client.freebsd-arm64.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-freebsd-arm64')
- const binding = require('codechat-editor-client-freebsd-arm64')
- const bindingPackageVersion = require('codechat-editor-client-freebsd-arm64/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-freebsd-arm64', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else {
- loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`))
- }
- } else if (process.platform === 'linux') {
- if (process.arch === 'x64') {
- if (isMusl()) {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.linux-x64-musl.node')
- return __dbgOk('./codechat-editor-client.linux-x64-musl.node', require('./codechat-editor-client.linux-x64-musl.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-linux-x64-musl')
- const binding = require('codechat-editor-client-linux-x64-musl')
- const bindingPackageVersion = require('codechat-editor-client-linux-x64-musl/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-linux-x64-musl', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.linux-x64-gnu.node')
- return __dbgOk('./codechat-editor-client.linux-x64-gnu.node', require('./codechat-editor-client.linux-x64-gnu.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-linux-x64-gnu')
- const binding = require('codechat-editor-client-linux-x64-gnu')
- const bindingPackageVersion = require('codechat-editor-client-linux-x64-gnu/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-linux-x64-gnu', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- }
- } else if (process.arch === 'arm64') {
- if (isMusl()) {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.linux-arm64-musl.node')
- return __dbgOk('./codechat-editor-client.linux-arm64-musl.node', require('./codechat-editor-client.linux-arm64-musl.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-linux-arm64-musl')
- const binding = require('codechat-editor-client-linux-arm64-musl')
- const bindingPackageVersion = require('codechat-editor-client-linux-arm64-musl/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-linux-arm64-musl', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.linux-arm64-gnu.node')
- return __dbgOk('./codechat-editor-client.linux-arm64-gnu.node', require('./codechat-editor-client.linux-arm64-gnu.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-linux-arm64-gnu')
- const binding = require('codechat-editor-client-linux-arm64-gnu')
- const bindingPackageVersion = require('codechat-editor-client-linux-arm64-gnu/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-linux-arm64-gnu', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- }
- } else if (process.arch === 'arm') {
- if (isMusl()) {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.linux-arm-musleabihf.node')
- return __dbgOk('./codechat-editor-client.linux-arm-musleabihf.node', require('./codechat-editor-client.linux-arm-musleabihf.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-linux-arm-musleabihf')
- const binding = require('codechat-editor-client-linux-arm-musleabihf')
- const bindingPackageVersion = require('codechat-editor-client-linux-arm-musleabihf/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-linux-arm-musleabihf', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.linux-arm-gnueabihf.node')
- return __dbgOk('./codechat-editor-client.linux-arm-gnueabihf.node', require('./codechat-editor-client.linux-arm-gnueabihf.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-linux-arm-gnueabihf')
- const binding = require('codechat-editor-client-linux-arm-gnueabihf')
- const bindingPackageVersion = require('codechat-editor-client-linux-arm-gnueabihf/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-linux-arm-gnueabihf', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- }
- } else if (process.arch === 'loong64') {
- if (isMusl()) {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.linux-loong64-musl.node')
- return __dbgOk('./codechat-editor-client.linux-loong64-musl.node', require('./codechat-editor-client.linux-loong64-musl.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-linux-loong64-musl')
- const binding = require('codechat-editor-client-linux-loong64-musl')
- const bindingPackageVersion = require('codechat-editor-client-linux-loong64-musl/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-linux-loong64-musl', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.linux-loong64-gnu.node')
- return __dbgOk('./codechat-editor-client.linux-loong64-gnu.node', require('./codechat-editor-client.linux-loong64-gnu.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-linux-loong64-gnu')
- const binding = require('codechat-editor-client-linux-loong64-gnu')
- const bindingPackageVersion = require('codechat-editor-client-linux-loong64-gnu/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-linux-loong64-gnu', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- }
- } else if (process.arch === 'riscv64') {
- if (isMusl()) {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.linux-riscv64-musl.node')
- return __dbgOk('./codechat-editor-client.linux-riscv64-musl.node', require('./codechat-editor-client.linux-riscv64-musl.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-linux-riscv64-musl')
- const binding = require('codechat-editor-client-linux-riscv64-musl')
- const bindingPackageVersion = require('codechat-editor-client-linux-riscv64-musl/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-linux-riscv64-musl', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.linux-riscv64-gnu.node')
- return __dbgOk('./codechat-editor-client.linux-riscv64-gnu.node', require('./codechat-editor-client.linux-riscv64-gnu.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-linux-riscv64-gnu')
- const binding = require('codechat-editor-client-linux-riscv64-gnu')
- const bindingPackageVersion = require('codechat-editor-client-linux-riscv64-gnu/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-linux-riscv64-gnu', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- }
- } else if (process.arch === 'ppc64') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.linux-ppc64-gnu.node')
- return __dbgOk('./codechat-editor-client.linux-ppc64-gnu.node', require('./codechat-editor-client.linux-ppc64-gnu.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-linux-ppc64-gnu')
- const binding = require('codechat-editor-client-linux-ppc64-gnu')
- const bindingPackageVersion = require('codechat-editor-client-linux-ppc64-gnu/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-linux-ppc64-gnu', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else if (process.arch === 's390x') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.linux-s390x-gnu.node')
- return __dbgOk('./codechat-editor-client.linux-s390x-gnu.node', require('./codechat-editor-client.linux-s390x-gnu.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-linux-s390x-gnu')
- const binding = require('codechat-editor-client-linux-s390x-gnu')
- const bindingPackageVersion = require('codechat-editor-client-linux-s390x-gnu/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-linux-s390x-gnu', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else {
- loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`))
- }
- } else if (process.platform === 'openharmony') {
- if (process.arch === 'arm64') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.openharmony-arm64.node')
- return __dbgOk('./codechat-editor-client.openharmony-arm64.node', require('./codechat-editor-client.openharmony-arm64.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-openharmony-arm64')
- const binding = require('codechat-editor-client-openharmony-arm64')
- const bindingPackageVersion = require('codechat-editor-client-openharmony-arm64/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-openharmony-arm64', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else if (process.arch === 'x64') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.openharmony-x64.node')
- return __dbgOk('./codechat-editor-client.openharmony-x64.node', require('./codechat-editor-client.openharmony-x64.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-openharmony-x64')
- const binding = require('codechat-editor-client-openharmony-x64')
- const bindingPackageVersion = require('codechat-editor-client-openharmony-x64/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-openharmony-x64', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else if (process.arch === 'arm') {
- try {
- __dbgAttempt('local artifact', './codechat-editor-client.openharmony-arm.node')
- return __dbgOk('./codechat-editor-client.openharmony-arm.node', require('./codechat-editor-client.openharmony-arm.node'))
- } catch (e) {
- loadErrors.push(e)
- }
- try {
- __dbgAttempt('optional dependency package', 'codechat-editor-client-openharmony-arm')
- const binding = require('codechat-editor-client-openharmony-arm')
- const bindingPackageVersion = require('codechat-editor-client-openharmony-arm/package.json').version
- if (bindingPackageVersion !== '0.2.5' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- throw new Error(`Native binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- return __dbgOk('codechat-editor-client-openharmony-arm', binding)
- } catch (e) {
- loadErrors.push(e)
- }
- } else {
- loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`))
- }
- } else {
- loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`))
- }
-}
-
-function createLoadErrorChain(errors) {
- return errors.reduce((previous, current) => {
- let message
- try {
- message =
- current && typeof current.message === 'string'
- ? current.message
- : String(current)
- } catch {
- message = 'Unknown error'
- }
- const error = new Error(message)
- error.cause = previous
- return error
- }, null)
-}
-
-// NAPI_RS_FORCE_WASI is a tri-state flag:
-// unset / any other value → native binding preferred, WASI is only a fallback
-// 'true' → prefer WASI, but retain native as a lazy fallback
-// 'error' → require WASI without initializing a native fallback
-// Treating any non-empty string as truthy (the historical behavior) meant
-// NAPI_RS_FORCE_WASI=false, NAPI_RS_FORCE_WASI=0, etc. inadvertently triggered
-// the WASI path, causing ENOENT for packages shipped without a .wasi.cjs file.
-//
-// NAPI_RS_WASI_FLAVOR selects one exact generated flavor and implies strict
-// WASI loading. It never crosses into another flavor or falls back to native.
-const __napiWasiFlavors = ['wasm32-wasi']
-const __napiWasiFlavor = process.env.NAPI_RS_WASI_FLAVOR
-const __napiWasiFlavorRequested =
- typeof __napiWasiFlavor === 'string' && __napiWasiFlavor.length > 0
-if (
- __napiWasiFlavorRequested &&
- __napiWasiFlavors.indexOf(__napiWasiFlavor) === -1
-) {
- throw new Error(
- 'Unsupported WASI flavor "' +
- __napiWasiFlavor +
- '". Available flavors: ' +
- __napiWasiFlavors.join(', '),
- )
-}
-const forceWasiError = process.env.NAPI_RS_FORCE_WASI === 'error'
-const forceWasi =
- process.env.NAPI_RS_FORCE_WASI === 'true' ||
- forceWasiError ||
- __napiWasiFlavorRequested
-
-__dbg(
- `WASI selection: forceWasi=${forceWasi} forceWasiError=${forceWasiError} flavorRequested=${__napiWasiFlavorRequested} flavor=${__napiWasiFlavor || ''}`,
-)
-if (!forceWasi) {
- nativeBinding = requireNative()
- __dbg(`requireNative() returned ${nativeBinding ? 'a binding' : 'nothing'}`)
-} else {
- __dbg('skipping the native chain: WASI was forced')
-}
-
-if (!nativeBinding || forceWasi) {
- __dbg('entering the WASI fallback chain')
- let wasiBinding = null
- let wasiBindingLoaded = false
- const wasiBindingErrors = __dbgTracedArray('wasiBindingErrors')
- const __napiWasiResolveCandidate = (specifier, isPackage, localArtifacts) => {
- try {
- require.resolve(specifier)
- } catch (resolveError) {
- if (!resolveError || resolveError.code !== 'MODULE_NOT_FOUND') {
- throw resolveError
- }
- if (isPackage) {
- try {
- require.resolve(specifier + '/package.json')
- } catch (packageError) {
- if (packageError && packageError.code === 'MODULE_NOT_FOUND') {
- return resolveError
- }
- // An exports restriction proves the package exists even when its
- // package.json is not public. Preserve the root resolution failure.
- throw resolveError
- }
- // The package exists but its main/export target is broken.
- throw resolveError
- }
- return resolveError
- }
- if (localArtifacts) {
- let artifactError = null
- for (let i = 0; i < localArtifacts.length; i++) {
- try {
- require.resolve(localArtifacts[i])
- return null
- } catch (resolveError) {
- if (!resolveError || resolveError.code !== 'MODULE_NOT_FOUND') {
- throw resolveError
- }
- artifactError = resolveError
- }
- }
- return artifactError
- }
- return null
- }
- if (!wasiBindingLoaded && (!__napiWasiFlavorRequested || __napiWasiFlavor === 'wasm32-wasi')) {
- let candidateError = null
- let candidateFailed = false
- try {
- candidateError = __napiWasiResolveCandidate('./codechat-editor-client.wasi.cjs', false, ['./codechat-editor-client.wasm32-wasi.debug.wasm', './codechat-editor-client.wasm32-wasi.wasm'])
- candidateFailed = candidateError !== null
- if (!candidateFailed) {
- __dbgAttempt('WASI local artifact', './codechat-editor-client.wasi.cjs')
- wasiBinding = __dbgOk(
- './codechat-editor-client.wasi.cjs',
- require('./codechat-editor-client.wasi.cjs'),
- )
- nativeBinding = wasiBinding
- __napiLoadedBindingTarget = 'wasm32-wasi'
- wasiBindingLoaded = true
- }
- } catch (err) {
- candidateError = err
- candidateFailed = true
- }
- if (candidateFailed) {
- wasiBindingErrors.push(candidateError)
- loadErrors.push(candidateError)
- }
- }
- if (!wasiBindingLoaded && (!__napiWasiFlavorRequested || __napiWasiFlavor === 'wasm32-wasi')) {
- let candidateError = null
- let candidateFailed = false
- try {
- candidateError = __napiWasiResolveCandidate('codechat-editor-client-wasm32-wasi', true, undefined)
- candidateFailed = candidateError !== null
- if (!candidateFailed) {
- if (process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
- const bindingPackageVersion = require('codechat-editor-client-wasm32-wasi/package.json').version
- if (bindingPackageVersion !== '0.2.5') {
- throw new Error(`WASI binding package version mismatch, expected 0.2.5 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
- }
- }
- __dbgAttempt('WASI package', 'codechat-editor-client-wasm32-wasi')
- wasiBinding = __dbgOk(
- 'codechat-editor-client-wasm32-wasi',
- require('codechat-editor-client-wasm32-wasi'),
- )
- nativeBinding = wasiBinding
- __napiLoadedBindingTarget = 'wasm32-wasi'
- wasiBindingLoaded = true
- }
- } catch (err) {
- candidateError = err
- candidateFailed = true
- }
- if (candidateFailed) {
- wasiBindingErrors.push(candidateError)
- loadErrors.push(candidateError)
- }
- }
- if (
- !wasiBindingLoaded &&
- forceWasi &&
- !forceWasiError &&
- !__napiWasiFlavorRequested
- ) {
- __dbg('WASI was preferred but not found; retrying the native chain')
- nativeBinding = requireNative()
- }
- if ((forceWasiError || __napiWasiFlavorRequested) && !wasiBindingLoaded) {
- const error = new Error(
- __napiWasiFlavorRequested
- ? 'WASI binding for flavor "' + __napiWasiFlavor + '" not found'
- : 'WASI binding not found and NAPI_RS_FORCE_WASI is set to error',
- )
- __dbgChain('WASI load failed', wasiBindingErrors)
- __dbg(`THROWING: ${error.message}`)
- error.cause = createLoadErrorChain(wasiBindingErrors)
- throw error
- }
-}
-
-__dbg(
- `binding resolution finished: ${nativeBinding ? 'SUCCESS' : 'FAILURE'}, target=${__napiLoadedBindingTarget}`,
-)
-if (!nativeBinding) {
- if (loadErrors.length > 0) {
- // Lead with a diagnosis of the Windows failure where one can be reached:
- // it names the cause, while the message below names only the symptom.
- const windowsDiagnosis = __napiDiagnoseWindowsLoadFailure(loadErrors)
- if (windowsDiagnosis !== null) {
- __dbg(`diagnosis: ${windowsDiagnosis}`)
- }
- const error = new Error(
- windowsDiagnosis === null
- ? `Cannot find native binding. ` +
- `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` +
- 'Please try `npm i` again after removing both package-lock.json and node_modules directory.'
- : windowsDiagnosis,
- )
- // assign instead of the `new Error(message, { cause })` options form,
- // which Node < 16.9 silently ignores
- __dbgChain('every load attempt failed', loadErrors)
- __dbg(`THROWING: ${error.message}`)
- error.cause = createLoadErrorChain(loadErrors)
- throw error
- }
- __dbg('THROWING: Failed to load native binding, with no attempt recorded')
- throw new Error(`Failed to load native binding`)
-}
-
-function __napiStampBindingTarget(exportsObject, target) {
- if (
- Object.prototype.hasOwnProperty.call(exportsObject, '__napiBindingTarget')
- ) {
- if (exportsObject.__napiBindingTarget === target) {
- // Already ours: the root entry aliases the object it loaded, so a WASI
- // fallback candidate — or a `NAPI_RS_NATIVE_LIBRARY_PATH` override that
- // is a generated loader — arrives already stamped with this same value.
- return target
- }
- const error = new Error(
- '`__napiBindingTarget` is reserved by the generated binding loader, but the loaded binding already exports it. Rename the export, e.g. #[napi(js_name = "...")].',
- )
- error.code = 'ERR_NAPI_BINDING_TARGET_CONFLICT'
- throw error
- }
- if (!Object.isExtensible(exportsObject)) {
- // A `#[napi(module_exports)]` hook may seal or freeze this object
- // (`Object::seal` / `Object::freeze`). Reporting the artifact is metadata,
- // never a reason to fail an otherwise successful load, so the stamp is
- // skipped. What a consumer still sees then follows the entry point: the
- // browser and deferred loaders declare `__napiBindingTarget` at module
- // level and go on reporting it, while the CommonJS entries hand back this
- // very object as `module.exports`, so there the value is absent.
- return target
- }
- try {
- // [[Define]], not [[Set]]: an ordinary assignment walks the prototype
- // chain, so an inherited accessor could swallow the value or throw and
- // fail an otherwise successful load. The descriptor is what a successful
- // assignment would have produced.
- Object.defineProperty(exportsObject, '__napiBindingTarget', {
- configurable: true,
- enumerable: true,
- value: target,
- writable: true,
- })
- } catch {
- // Same rule as the non-extensible skip above: reporting the artifact is
- // metadata, never a reason to fail an otherwise successful load. An exotic
- // object (a Proxy whose defineProperty trap refuses) is skipped, not
- // thrown over.
- }
- // The CommonJS loaders assign this return value so `cjs-module-lexer` — and
- // therefore Node's CJS -> ESM named export detection — can see
- // `__napiBindingTarget` statically.
- return target
-}
-// Stamp before the alias, not after. The guard only reads `nativeBinding`
-// (`hasOwnProperty` plus a comparison), which is safe against any addon
-// accessor; an assignment is not, because a `#[napi(module_exports)]` hook can
-// expose a getter reporting this very value and a setter that throws. So the
-// assignment lands on the loader's own `module.exports`, still the original
-// object here, and the alias below replaces it.
-//
-// The assignment is what keeps the marker a statically visible CommonJS export:
-// `cjs-module-lexer` is Node's CJS -> ESM named export detection, it cannot see
-// a bare call, and the later `module.exports = nativeBinding` does not undo the
-// detection. The assignment itself always succeeds — its target is this
-// loader's own, still extensible `module.exports` — and the alias below then
-// discards the value it wrote. What a consumer reads is whatever the guard put
-// on `nativeBinding`, so on a frozen binding, where the guard skips, the
-// linked import resolves to `undefined`.
-module.exports.__napiBindingTarget = __napiStampBindingTarget(nativeBinding, __napiLoadedBindingTarget)
-module.exports = nativeBinding
-module.exports.CodeChatEditorServer = nativeBinding.CodeChatEditorServer
-module.exports.initServer = nativeBinding.initServer
-
-__dbg(
- `exports check: CodeChatEditorServer=${typeof nativeBinding.CodeChatEditorServer} initServer=${typeof nativeBinding.initServer}`,
-)
-__dbg('==== binding load finished ====')
diff --git a/extensions/standalone/src/filewatcher.rs b/extensions/standalone/src/filewatcher.rs
index 82cca999..08fc4de8 100644
--- a/extensions/standalone/src/filewatcher.rs
+++ b/extensions/standalone/src/filewatcher.rs
@@ -447,7 +447,7 @@ fn processing_task(
let (watcher_tx, mut watcher_rx) = mpsc::channel(10);
// Watch this file. Use the debouncer, to avoid multiple notifications
// for the same file. This approach returns a result of either a working
- // debouncer or any errors that occurred. The debouncer's scope needs
+ // debouncer or any errors that occurred. The debouncer's scope needs to
// live as long as this connection does; dropping it early means losing
// file change notifications.
let Ok(mut debounced_watcher) = new_debouncer(
@@ -710,6 +710,7 @@ fn processing_task(
EditorMessageContents::OpenUrl(_) |
EditorMessageContents::Capture(_) |
EditorMessageContents::ClientHtml(_) |
+ EditorMessageContents::UpdateToc(_) |
EditorMessageContents::RequestClose => {
let err = ResultErrTypes::ClientIllegalMessage;
error!("{err:?}");
@@ -786,8 +787,8 @@ mod tests {
};
use code_chat_editor::{
processing::{
- CodeChatForWeb, CodeMirror, CodeMirrorDiffable, SourceFileMetadata,
- source_to_codechat_for_web,
+ CodeChatForWeb, CodeMirror, CodeMirrorDiff, CodeMirrorDiffable, SourceFileMetadata,
+ StringDiff, source_to_codechat_for_web,
},
webserver::{
EditorMessage, EditorMessageContents, INITIAL_CLIENT_MESSAGE_ID,
@@ -1157,7 +1158,9 @@ mod tests {
let mut s = fs::read_to_string(&file_path).unwrap();
assert_eq!(s, "testing()");
- // 8. Change this file and verify that this produces an update.
+ // 8. Change this file and verify that this produces an update. Since
+ // the Client has the file's full text, this is a diff against the
+ // contents and version it sent in step 7.
//
// Message ids: IDE - 1->2, Server - 3, Client - 7.
s.push_str("123");
@@ -1187,9 +1190,14 @@ mod tests {
metadata: SourceFileMetadata {
mode: "python".to_string(),
},
- source: CodeMirrorDiffable::Plain(CodeMirror {
- doc: "testing()123".to_string(),
+ source: CodeMirrorDiffable::Diff(CodeMirrorDiff {
+ doc: vec![StringDiff {
+ from: 0,
+ to: Some(9),
+ insert: "testing()123".to_string(),
+ }],
doc_blocks: vec![],
+ version: 2.0,
}),
version: msg.1.contents.as_ref().unwrap().version,
}),
diff --git a/server/Cargo.toml b/server/Cargo.toml
index 4e3f2513..92ec62ec 100644
--- a/server/Cargo.toml
+++ b/server/Cargo.toml
@@ -57,16 +57,19 @@ htmd = { git = "https://github.com/bjones1/htmd.git", branch = "dom-interface",
# This must match the version of `markup5ever_rcdom`.
html5ever = "0.39"
htmlize = "1.0.6"
+ignore = "0.4"
imara-diff = { version = "0.2", features = [] }
indoc = "2.0.5"
log.workspace = true
log4rs = "1.3"
+lru = "0.18.5"
markup5ever_rcdom = "0.39"
mime = "0.3.17"
mime_guess = "2.0.5"
minify-html = { git = "https://github.com/bjones1/minify-html.git", branch = "dev", version = "0.18.1" }
minreq = { version = "3", features = ["https-rustls-probe", "proxy"] }
normalize-line-endings = "0.3.0"
+notify-debouncer-full = "0.7.0"
path-slash = "0.2.1"
pest = "2.7.14"
pest_derive = "2.7.14"
diff --git a/server/src/ide/vscode/tests.rs b/server/src/ide/vscode/tests.rs
index f0553cfd..a7063a1c 100644
--- a/server/src/ide/vscode/tests.rs
+++ b/server/src/ide/vscode/tests.rs
@@ -59,7 +59,7 @@ use crate::{
use crate::{
processing::{
CodeChatForWeb, CodeMirror, CodeMirrorDiff, CodeMirrorDiffable, CodeMirrorDocBlock,
- CodeMirrorDocBlockTransaction, SourceFileMetadata, StringDiff,
+ CodeMirrorDocBlockTransaction, CodeMirrorDocBlockUpdate, SourceFileMetadata, StringDiff,
},
webserver::{ResultOkTypes, UpdateMessageContents, drop_leading_slash},
};
@@ -1442,6 +1442,673 @@ async fn test_vscode_ide_websocket9() {
temp_dir.close().unwrap();
}
+/// Verify that the Server re-translates the current file when a change to
+/// another file on disk outdates it. The current file cross-references an id
+/// which no file defines until the test rewrites the TOC on disk to define it.
+/// The project's watcher reports this change, so its consumer re-translates the
+/// TOC, outdating the current file.
+#[actix_web::test]
+async fn test_vscode_ide_websocket10() {
+ let connection_id = "test-connection-id10";
+ let (temp_dir, test_dir, mut ws_ide, mut ws_client) = prep_test!(connection_id).await;
+ open_client(&mut ws_ide).await;
+
+ // Load the current file, following the protocol in
+ // `test_vscode_ide_websocket4`.
+ let file_path_temp = fs::canonicalize(test_dir.join("test.py")).unwrap();
+ let file_path = simplified(&file_path_temp);
+ let file_path_str = file_path.to_str().unwrap().to_string();
+ send_message(
+ &mut ws_client,
+ &EditorMessage {
+ id: INITIAL_CLIENT_MESSAGE_ID,
+ message: EditorMessageContents::CurrentFile(
+ format!(
+ "http://localhost:{IP_PORT}/vsc/fs/{connection_id}/{}",
+ file_path.to_slash().unwrap()
+ ),
+ None,
+ ),
+ },
+ )
+ .await;
+ assert_eq!(
+ read_message(&mut ws_ide).await,
+ EditorMessage {
+ id: INITIAL_CLIENT_MESSAGE_ID,
+ message: EditorMessageContents::CurrentFile(file_path_str.clone(), Some(true))
+ }
+ );
+ send_message(
+ &mut ws_ide,
+ &EditorMessage {
+ id: INITIAL_CLIENT_MESSAGE_ID,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)),
+ },
+ )
+ .await;
+ assert_eq!(
+ read_message(&mut ws_client).await,
+ EditorMessage {
+ id: INITIAL_CLIENT_MESSAGE_ID,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::Void))
+ }
+ );
+
+ // Fetch the current file, which the IDE doesn't have, so the Server reads
+ // it from disk.
+ let test_dir_thread = test_dir.clone();
+ let join_handle = thread::spawn(move || {
+ assert_eq!(
+ minreq::get(format!(
+ "http://localhost:{IP_PORT}/vsc/fs/{connection_id}/{}/test.py",
+ test_dir_thread.to_slash().unwrap(),
+ ))
+ .send()
+ .unwrap()
+ .status_code,
+ 200
+ );
+ });
+ let em = read_message(&mut ws_ide).await;
+ cast!(em.message, EditorMessageContents::LoadFile, a, b);
+ assert_eq!(em.id, INITIAL_MESSAGE_ID + MESSAGE_ID_INCREMENT);
+ send_message(
+ &mut ws_ide,
+ &EditorMessage {
+ id: INITIAL_MESSAGE_ID + MESSAGE_ID_INCREMENT,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::LoadFile(None))),
+ },
+ )
+ .await;
+ join_handle.join().unwrap();
+
+ // No file defines `foo` yet, so the cross-reference can't be resolved.
+ // Lacking a version from the IDE, the Server keeps its initial version.
+ assert_eq!(
+ read_message(&mut ws_client).await,
+ EditorMessage {
+ id: INITIAL_MESSAGE_ID + 2.0 * MESSAGE_ID_INCREMENT,
+ message: EditorMessageContents::Update(UpdateMessageContents {
+ file_path: file_path_str.clone(),
+ cursor_position: None,
+ scroll_position: None,
+ is_re_translation: false,
+ contents: Some(CodeChatForWeb {
+ metadata: SourceFileMetadata {
+ mode: "python".to_string(),
+ },
+ source: CodeMirrorDiffable::Plain(CodeMirror {
+ doc: "\n".to_string(),
+ doc_blocks: vec![CodeMirrorDocBlock {
+ from: 0,
+ to: 1,
+ indent: String::new(),
+ delimiter: "#".to_string(),
+ contents: r#"
See id "foo" not found."#.to_string(),
+ }],
+ }),
+ version: 0.0,
+ }),
+ }),
+ }
+ );
+ send_message(
+ &mut ws_client,
+ &EditorMessage {
+ id: INITIAL_MESSAGE_ID + 2.0 * MESSAGE_ID_INCREMENT,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)),
+ },
+ )
+ .await;
+ assert_eq!(
+ read_message(&mut ws_ide).await,
+ EditorMessage {
+ id: INITIAL_MESSAGE_ID + 2.0 * MESSAGE_ID_INCREMENT,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)),
+ }
+ );
+
+ // Define `foo` by rewriting the TOC on disk. After its debounce (2 s,
+ // checked every 0.5 s, so within `read_message`'s timeout), the watcher
+ // reports this change, so the consumer re-translates the TOC.
+ //
+ // The consumer's initial scan of the project may reach the TOC on either
+ // side of this write; either way, only one commit defines `foo`, outdating
+ // the current file once. A scan before the write finds no ids in the TOC.
+ // A scan after it commits the new TOC, which makes the watcher's report a
+ // no-op: the TOC's metadata then matches the cache's, so the consumer skips
+ // it.
+ fs::write(test_dir.join("toc.md"), "
Foo
\n").unwrap();
+
+ // Translating the TOC outdates the current file, which the Server
+ // re-translates, sending the Client the resolved cross-reference. The
+ // source is unchanged, so the version is too.
+ assert_eq!(
+ read_message(&mut ws_client).await,
+ EditorMessage {
+ id: INITIAL_MESSAGE_ID + 3.0 * MESSAGE_ID_INCREMENT,
+ message: EditorMessageContents::Update(UpdateMessageContents {
+ file_path: file_path_str.clone(),
+ cursor_position: None,
+ scroll_position: None,
+ is_re_translation: true,
+ contents: Some(CodeChatForWeb {
+ metadata: SourceFileMetadata {
+ mode: "python".to_string(),
+ },
+ source: CodeMirrorDiffable::Diff(CodeMirrorDiff {
+ doc: vec![],
+ doc_blocks: vec![CodeMirrorDocBlockTransaction::Update(
+ CodeMirrorDocBlockUpdate {
+ from: 0,
+ from_new: None,
+ to: None,
+ indent: None,
+ delimiter: None,
+ contents: vec![StringDiff {
+ from: 0,
+ to: Some(97),
+ insert: "
See Foo.".to_string(),
+ }],
+ }
+ )],
+ version: 0.0,
+ }),
+ version: 0.0,
+ }),
+ }),
+ }
+ );
+ send_message(
+ &mut ws_client,
+ &EditorMessage {
+ id: INITIAL_MESSAGE_ID + 3.0 * MESSAGE_ID_INCREMENT,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)),
+ },
+ )
+ .await;
+ assert_eq!(
+ read_message(&mut ws_ide).await,
+ EditorMessage {
+ id: INITIAL_MESSAGE_ID + 3.0 * MESSAGE_ID_INCREMENT,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)),
+ }
+ );
+
+ check_logger_errors(0);
+ // Report any errors produced when removing the temporary directory.
+ temp_dir.close().unwrap();
+}
+
+/// Have the Client acknowledge a message from the Server, then verify that the
+/// Server forwards the acknowledgement to the IDE.
+async fn acknowledge(
+ // The Client's websocket.
+ ws_client: &mut WebSocketStream,
+ // The IDE's websocket.
+ ws_ide: &mut WebSocketStream,
+ // The id of the message to acknowledge.
+ id: f64,
+) {
+ let result = EditorMessage {
+ id,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)),
+ };
+ send_message(ws_client, &result).await;
+ assert_eq!(read_message(ws_ide).await, result);
+}
+
+/// Fetch the TOC as the Client's sidebar does. The IDE reports that it doesn't
+/// have the TOC, so the Server reads it from disk.
+async fn fetch_sidebar_toc(
+ // The IDE's websocket.
+ ws_ide: &mut WebSocketStream,
+ // The connection whose Client fetches the TOC.
+ connection_id: &str,
+ // The directory containing the TOC.
+ test_dir: &Path,
+ // The id of the `LoadFile` message the Server sends to the IDE.
+ load_file_id: f64,
+ // The body of the response: the page showing the TOC.
+) -> String {
+ let url = format!(
+ "http://localhost:{IP_PORT}/vsc/fs/{connection_id}/{}/toc.md?mode=toc",
+ test_dir.to_slash().unwrap()
+ );
+ let join_handle = thread::spawn(move || {
+ let response = minreq::get(url).send().unwrap();
+ assert_eq!(response.status_code, 200);
+ response.as_str().unwrap().to_string()
+ });
+ let em = read_message(ws_ide).await;
+ let (_path, is_current) = cast!(
+ em.message,
+ EditorMessageContents::LoadFile,
+ path,
+ is_current
+ );
+ assert!(!is_current);
+ assert_eq!(em.id, load_file_id);
+ send_message(
+ ws_ide,
+ &EditorMessage {
+ id: load_file_id,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::LoadFile(None))),
+ },
+ )
+ .await;
+ join_handle.join().unwrap()
+}
+
+/// Build an `Update` carrying the full text of a file, as the IDE sends it.
+fn ide_update(
+ // The file's path.
+ file_path: &str,
+ // The file's lexer.
+ mode: &str,
+ // The file's new text.
+ doc: &str,
+ // The file's new version.
+ version: f64,
+ // The `Update` message.
+) -> EditorMessageContents {
+ EditorMessageContents::Update(UpdateMessageContents {
+ file_path: file_path.to_string(),
+ cursor_position: None,
+ scroll_position: None,
+ is_re_translation: false,
+ contents: Some(CodeChatForWeb {
+ metadata: SourceFileMetadata {
+ mode: mode.to_string(),
+ },
+ source: CodeMirrorDiffable::Plain(CodeMirror {
+ doc: doc.to_string(),
+ doc_blocks: vec![],
+ }),
+ version,
+ }),
+ })
+}
+
+/// Verify that the Server refreshes the TOC in the Client's sidebar when its
+/// project's cache reports the TOC outdated -- the TOC cross-references a
+/// heading in the current file, which the IDE then renames -- or changed on
+/// disk.
+#[actix_web::test]
+async fn test_vscode_ide_websocket11() {
+ let connection_id = "test-connection-id11";
+ let (temp_dir, test_dir, mut ws_ide, mut ws_client) = prep_test!(connection_id).await;
+ open_client(&mut ws_ide).await;
+
+ // Load the current file, following the protocol in
+ // `test_vscode_ide_websocket10`.
+ let file_path_temp = fs::canonicalize(test_dir.join("test.py")).unwrap();
+ let file_path = simplified(&file_path_temp);
+ let file_path_str = file_path.to_str().unwrap().to_string();
+ send_message(
+ &mut ws_client,
+ &EditorMessage {
+ id: INITIAL_CLIENT_MESSAGE_ID,
+ message: EditorMessageContents::CurrentFile(
+ format!(
+ "http://localhost:{IP_PORT}/vsc/fs/{connection_id}/{}",
+ file_path.to_slash().unwrap()
+ ),
+ None,
+ ),
+ },
+ )
+ .await;
+ assert_eq!(
+ read_message(&mut ws_ide).await,
+ EditorMessage {
+ id: INITIAL_CLIENT_MESSAGE_ID,
+ message: EditorMessageContents::CurrentFile(file_path_str.clone(), Some(true))
+ }
+ );
+ send_message(
+ &mut ws_ide,
+ &EditorMessage {
+ id: INITIAL_CLIENT_MESSAGE_ID,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)),
+ },
+ )
+ .await;
+ assert_eq!(
+ read_message(&mut ws_client).await,
+ EditorMessage {
+ id: INITIAL_CLIENT_MESSAGE_ID,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::Void))
+ }
+ );
+ let test_dir_thread = test_dir.clone();
+ let join_handle = thread::spawn(move || {
+ assert_eq!(
+ minreq::get(format!(
+ "http://localhost:{IP_PORT}/vsc/fs/{connection_id}/{}/test.py",
+ test_dir_thread.to_slash().unwrap(),
+ ))
+ .send()
+ .unwrap()
+ .status_code,
+ 200
+ );
+ });
+ let em = read_message(&mut ws_ide).await;
+ cast!(em.message, EditorMessageContents::LoadFile, a, b);
+ assert_eq!(em.id, INITIAL_MESSAGE_ID + MESSAGE_ID_INCREMENT);
+ send_message(
+ &mut ws_ide,
+ &EditorMessage {
+ id: INITIAL_MESSAGE_ID + MESSAGE_ID_INCREMENT,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::LoadFile(None))),
+ },
+ )
+ .await;
+ join_handle.join().unwrap();
+ let em = read_message(&mut ws_client).await;
+ cast!(em.message, EditorMessageContents::Update);
+ assert_eq!(em.id, INITIAL_MESSAGE_ID + 2.0 * MESSAGE_ID_INCREMENT);
+ acknowledge(
+ &mut ws_client,
+ &mut ws_ide,
+ INITIAL_MESSAGE_ID + 2.0 * MESSAGE_ID_INCREMENT,
+ )
+ .await;
+
+ // The sidebar's TOC shows the heading's text.
+ let toc_page = fetch_sidebar_toc(
+ &mut ws_ide,
+ connection_id,
+ &test_dir,
+ INITIAL_MESSAGE_ID + 3.0 * MESSAGE_ID_INCREMENT,
+ )
+ .await;
+ assert_contains!(toc_page, "Foo");
+
+ // Rename the heading in the IDE. The Client receives the edit...
+ send_message(
+ &mut ws_ide,
+ &EditorMessage {
+ id: INITIAL_IDE_MESSAGE_ID,
+ message: ide_update(&file_path_str, "python", "#
Bar
\n", 1.0),
+ },
+ )
+ .await;
+ let em = read_message(&mut ws_client).await;
+ cast!(em.message, EditorMessageContents::Update);
+ assert_eq!(em.id, INITIAL_IDE_MESSAGE_ID);
+ acknowledge(&mut ws_client, &mut ws_ide, INITIAL_IDE_MESSAGE_ID).await;
+
+ // ...then, since the edit outdated the TOC, the TOC's new rendering.
+ assert_eq!(
+ read_message(&mut ws_client).await,
+ EditorMessage {
+ id: INITIAL_MESSAGE_ID + 4.0 * MESSAGE_ID_INCREMENT,
+ message: EditorMessageContents::UpdateToc(
+ "
More and more".to_string()
+ ),
+ }
+ );
+ let em = read_message(&mut ws_ide).await;
+ cast!(em.message, EditorMessageContents::Update);
+ assert_eq!(em.id, INITIAL_CLIENT_MESSAGE_ID + MESSAGE_ID_INCREMENT);
+ let result = EditorMessage {
+ id: INITIAL_CLIENT_MESSAGE_ID + MESSAGE_ID_INCREMENT,
+ message: EditorMessageContents::Result(Ok(ResultOkTypes::Void)),
+ };
+ send_message(&mut ws_ide, &result).await;
+ assert_eq!(read_message(&mut ws_client).await, result);
+ acknowledge(
+ &mut ws_client,
+ &mut ws_ide,
+ INITIAL_MESSAGE_ID + 5.0 * MESSAGE_ID_INCREMENT,
+ )
+ .await;
+
+ check_logger_errors(0);
+ // Report any errors produced when removing the temporary directory.
+ temp_dir.close().unwrap();
+}
+
#[test]
fn test_find_eoltypes() {
assert_eq!(
diff --git a/server/src/lexer.rs b/server/src/lexer.rs
index 3ec01072..8c19da65 100644
--- a/server/src/lexer.rs
+++ b/server/src/lexer.rs
@@ -704,7 +704,7 @@ pub fn source_lexer(
let mut append_code_doc_block = |indent: &str, delimiter: &str, contents: &str| {
// Don't append empty entries.
if delimiter.is_empty() && contents.is_empty() {
- assert!(indent.is_empty());
+ assert_eq!(indent, "");
return;
}
// Define a line as any characters up to an including a newline. If the
diff --git a/server/src/processing.rs b/server/src/processing.rs
index be899c5e..bf23dbcc 100644
--- a/server/src/processing.rs
+++ b/server/src/processing.rs
@@ -79,10 +79,10 @@ use crate::{
CodeDocBlock, DocBlock, LEXERS, LanguageLexerCompiled, source_lexer,
supported_languages::MARKDOWN_MODE,
},
- processing::cache::{FileFacts, FragmentFact, IdResolution, TargetFact},
+ processing::cache::{FileFacts, FileStamp, FragmentFact, IdResolution, TargetFact},
webserver::canonicalize,
};
-use cache::{Cache, CacheMap};
+use cache::{Cache, CacheMap, get_or_insert_cache};
// Data structures
// ---------------
@@ -330,7 +330,7 @@ const DOC_BLOCK_SEPARATOR_REMOVE_FENCE: &str = r"
const DOC_BLOCK_SEPARATOR_MENDED_FENCE: &str =
"\n$1\n";
// The value of an `id` attribute which requests that the cache assign an id;
-// see `Auto-assignment of ids` in `cache.rs`.
+// see `Auto-assignment of ids` in the cache spec.
const AUTO_ID: &str = "*";
// The column at which to word wrap doc blocks.
const WORD_WRAP_COLUMN: usize = 80;
@@ -415,6 +415,33 @@ pub fn find_path_to_toc(file_path: &Path) -> Option {
}
}
+/// Return the cache of the project containing a file, creating it -- and the
+/// threads which keep it current -- if this project has none.
+pub fn project_cache(
+ // The map of project caches.
+ cache_map: &CacheMap,
+ // A file in the project.
+ file_path: &Path,
+ // The path to the project's TOC, relative to the directory containing
+ // `file_path`, as returned by `find_path_to_toc`.
+ path_to_toc: &Path,
+) -> Arc> {
+ // The project root is the directory containing `toc.md`. Canonicalize it so
+ // that every file in a project keys the same cache, and different projects
+ // key different caches.
+ let toc_path = file_path
+ .parent()
+ .unwrap_or_else(|| Path::new("."))
+ .join(path_to_toc);
+ let root = toc_path
+ .parent()
+ .map_or_else(PathBuf::new, Path::to_path_buf);
+ let root = canonicalize(&root).unwrap_or(root);
+ get_or_insert_cache(&mut cache_map.lock().unwrap(), &root, || {
+ Cache::new_project(root.clone())
+ })
+}
+
#[derive(Debug, thiserror::Error)]
pub enum CodechatForWebToSourceError {
#[error("invalid lexer {0}")]
@@ -913,14 +940,9 @@ pub fn source_to_codechat_for_web(
let cache = if let Some(project_cache) = cache {
project_cache
} else {
- // A non-project file uses a throwaway cache whose "project" is the
- // file's directory: only references within this file resolve.
- Arc::new(Mutex::new(Cache::new(
- file_path
- .parent()
- .unwrap_or_else(|| Path::new(""))
- .to_path_buf(),
- )))
+ // A non-project file uses a throwaway cache whose "project" is the file
+ // itself: only references within this file resolve.
+ Arc::new(Mutex::new(Cache::new(file_path.to_path_buf())))
};
let code_doc_block_arr;
let codechat_for_web = CodeChatForWeb {
@@ -1197,7 +1219,7 @@ static CLEAN_TARGET_HTML: LazyLock = LazyLock::new(|| {
b
});
-// Clean HTML for storage as a `Fragment`'s content, per the spec in `cache.rs`:
+// Clean HTML for storage as a `Fragment`'s content, per the cache spec:
// like `AMMONIA_OPTIONS`, but `id` and `data-gather` attributes are stripped
// (they aren't in any allowlist) to prevent duplicate ids when the content is
// rendered in a gather list, and `` elements are removed *along with
@@ -1269,26 +1291,9 @@ pub fn source_to_codechat_for_web_string(
// file by searching the current directory, then all its parents, for a file
// named `toc.md`.
let path_to_toc = find_path_to_toc(file_path);
- let cache: Option>> = path_to_toc.as_ref().map(|path_to_toc| {
- // The project root is the directory containing `toc.md`. `path_to_toc`
- // is relative to the file's directory; canonicalize the combination so
- // that every file in a project keys the same cache, and different
- // projects key different caches.
- let toc_path = file_path
- .parent()
- .unwrap_or_else(|| Path::new("."))
- .join(path_to_toc);
- let root = toc_path
- .parent()
- .map_or_else(PathBuf::new, Path::to_path_buf);
- let root = canonicalize(&root).unwrap_or(root);
- cache
- .lock()
- .unwrap()
- .entry(root.clone())
- .or_insert_with(|| Arc::new(Mutex::new(Cache::new(root.clone()))))
- .clone()
- });
+ let cache = path_to_toc
+ .as_ref()
+ .map(|path_to_toc| project_cache(cache, file_path, path_to_toc));
Ok((
match source_to_codechat_for_web(file_contents, file_path, version, is_toc, cache) {
@@ -1441,28 +1446,33 @@ fn get_dom_body(document: &Rc) -> Rc {
document.children.borrow()[0].children.borrow()[1].clone()
}
-// HTML produced from Markdown needs additional processing, termed hydration:
-//
-// * Transform math, Mermaid, GraphViz, etc. nodes.
-// * Hydrate cross-references, fragments, and gather elements from the project
-// cache.
-// * (Eventually) record document structure information.
-// * (Eventually) fill in autocomplete fields.
-//
-// Hydration is layered (see the `Design` section in `cache.rs`); the layers
-// which depend on fragment contents (gather lists) can only run after doc
-// blocks are finalized, so hydration is split into phases:
-//
-// 1. `hydrate_dom`: collect facts from the DOM, commit them to the cache, then
-// patch `` contents and `` backlinks.
-// 2. `store_fragment_contents`: once each doc block's hydrated HTML is known,
-// store each fragment's content in the cache.
-// 3. `hydrate_gathers`: insert each gather element's list of fragment contents,
-// now all present in the cache.
-//
-// This function runs all three phases for a Markdown document, where phase 2
-// needs no doc block data (fragments aren't allowed in Markdown documents, so
-// every fragment's content is an error message).
+///
hydrate_html
+///
+/// HTML produced from Markdown needs additional processing, termed hydration:
+///
+/// * Transform math, Mermaid, GraphViz, etc. nodes.
+/// * Hydrate cross-references, fragments, and gather elements from the project
+/// cache.
+/// * (Eventually) record document structure information.
+/// * (Eventually) fill in autocomplete fields.
+///
+/// Hydration is layered (see ); the layers
+/// which depend on fragment contents (gather lists) can only run after doc
+/// blocks are finalized, so hydration is split into phases:
+///
+/// 1. `hydrate_dom`: collect facts from the DOM, commit them to the cache, then
+/// patch `` contents and `` backlinks.
+/// 2. `store_fragment_contents`: once each doc block's hydrated HTML is known,
+/// store each fragment's content in the cache.
+/// 3. `hydrate_gathers`: insert each gather element's list of fragment contents,
+/// now all present in the cache.
+///
+/// Phases 1 and 2 update the cache, and each update may outdate other files;
+/// `Cache::mark_outdated` sees that every outdated file is re-rendered.
+///
+/// This function runs all three phases for a Markdown document, where phase 2
+/// needs no doc block data (fragments aren't allowed in Markdown documents, so
+/// every fragment's content is an error message).
fn hydrate_html(html: &str, file: &Path, cache: &Arc>) -> io::Result {
let (dom, walk_context) = hydrate_dom(html, file, cache, true)?;
store_fragment_contents(&walk_context, None, cache);
@@ -1488,20 +1498,22 @@ fn hydrate_dom(
// The parsed, patched DOM plus the walk results needed by later phases.
) -> io::Result<(Rc, WalkContext)> {
let dom = html_to_dom(html, None)?;
- // Read the file's metadata and canonicalize its path before taking the
- // cache lock, so that no I/O happens while the lock is held. The metadata
- // captures the state of the file whose content is being processed; the
- // canonicalization satisfies the cache's requirement that all paths are
- // canonicalized and absolute. (Canonicalization fails for files which don't
- // exist on disk -- such as tests -- in which case the path is used as-is.)
- let metadata = file.metadata().ok();
+ // Stamp the file and canonicalize its path before taking the cache lock, so
+ // that no I/O happens while the lock is held. The stamp captures the state
+ // of the file whose content is being processed (the cache's consumer, which
+ // read that content from the file itself, replaces this with the stamp it
+ // took beforehand; see `scan_file` in `cache.rs`); the canonicalization
+ // satisfies the cache's requirement that all paths are canonicalized and
+ // absolute. (Canonicalization fails for files which don't exist on disk --
+ // such as tests -- in which case the path is used as-is.)
+ let stamp = file.metadata().ok().as_ref().map(FileStamp::new);
let path = canonicalize(file).unwrap_or_else(|_| file.to_path_buf());
// ### Assign requested ids
//
// Replace each `id="*"` with a freshly generated id before facts are
// collected, so that everything downstream sees a real id. These ids reach
// the Client but are deliberately kept out of the cache until this file is
- // written and re-read; see `Auto-assignment of ids` in `cache.rs`.
+ // written and re-read; see `Auto-assignment of ids` in the cache spec.
let mut auto_ids: HashSet = HashSet::new();
{
let cache_guard = cache.lock().unwrap();
@@ -1512,7 +1524,8 @@ fn hydrate_dom(
// Walk the DOM, collecting all cacheable facts -- targets,
// cross-references, fragments, and gather elements -- without touching the
// cache. This keeps the non-`Send` DOM types out of the cache and off its
- // critical section; see the design discussion in `cache.rs`.
+ // critical section. The walk skips the content the cache generates (see
+ // `hydrating_walk_node`), so hydration never feeds back into the facts.
let mut walk_context = WalkContext {
facts: FileFacts::default(),
path,
@@ -1532,22 +1545,20 @@ fn hydrate_dom(
// diffs them against the file's previous state: added, deleted, and
// modified targets and fragments mark the files which depend on them as
// outdated, this file is linked to every id it references, and duplicate
- // ids are recorded.
+ // ids are recorded. The commit also sees that each outdated file is
+ // re-rendered; see `Cache::mark_outdated`.
let mut cache_guard = cache.lock().unwrap();
- // TODO: schedule reprocessing for each file in `commit.outdated`.
- let _commit = cache_guard.commit_file(
+ cache_guard.commit_file(
&walk_context.path,
- metadata,
+ stamp,
mem::take(&mut walk_context.facts),
);
// ### Patch cross-references
//
// Layer 2: each ``'s content depends only on its target's inner HTML,
// which the commit just placed in the cache.
- for (id, node) in &walk_context.xrefs {
- set_attr(node, "contenteditable", "false");
- let children = xref_content(&cache_guard, id, &walk_context.path)?;
- set_element_children(node, children);
+ for node in &walk_context.xrefs {
+ hydrate_xref(&cache_guard, node, &walk_context.path)?;
}
// ### Patch fragment backlinks
//
@@ -1583,9 +1594,9 @@ fn hydrate_dom(
}
/// Replace every `id="*"` -- a request that the cache assign an id -- with a
-/// freshly generated one, recording the ids assigned. Per the spec in
-/// `cache.rs`, these ids are placed in the HTML but not recorded in the cache;
-/// the fact collection walk uses the recorded set to skip them.
+/// freshly generated one, recording the ids assigned. Per the cache spec, these
+/// ids are placed in the HTML but not recorded in the cache; the fact
+/// collection walk uses the recorded set to skip them.
fn assign_auto_ids(
// The node whose descendants are scanned.
node: &Rc,
@@ -1615,23 +1626,86 @@ fn assign_auto_ids(
}
}
+/// Hydrate one ``: mark it non-editable, then replace its contents with a
+/// link to its target or an error message.
+fn hydrate_xref(
+ // The cache, already locked by the caller.
+ cache: &Cache,
+ // The `` element.
+ node: &Rc,
+ // The canonicalized path of the file the `` is rendered in, from
+ // which its link leads.
+ path: &Path,
+ // An error only if the target's stored inner HTML can't be parsed.
+) -> io::Result<()> {
+ set_attr(node, "contenteditable", "false");
+ let children = xref_content(cache, node, path)?;
+ set_element_children(node, children);
+ Ok(())
+}
+
+/// Re-hydrate every `` within the given nodes, at any depth, which
+/// hydrated to a link; see `hydrate_gathers` for why gathered content needs
+/// this. Only a link depends on the file it's rendered in, so one which
+/// hydrated to an error message is left as it is. This matters for an ``
+/// with an `id`: cleaning a fragment's content strips every `id`, so only the
+/// fragment's own file can detect that error.
+fn hydrate_xrefs_within(
+ // The cache, already locked by the caller.
+ cache: &Cache,
+ // The nodes to search.
+ nodes: &[Rc],
+ // The canonicalized path of the file these nodes are rendered in.
+ path: &Path,
+ // An error only if a target's stored inner HTML can't be parsed.
+) -> io::Result<()> {
+ for node in nodes {
+ if get_node_tag_name(node) == Some("xref") {
+ let is_error = node
+ .children
+ .borrow()
+ .iter()
+ .any(|child| has_class(child, "cc-error"));
+ if !is_error {
+ hydrate_xref(cache, node, path)?;
+ }
+ } else {
+ hydrate_xrefs_within(cache, &node.children.borrow(), path)?;
+ }
+ }
+ Ok(())
+}
+
/// The content of one hydrated ``: a link to its target, or an error
/// message.
fn xref_content(
// The cache, already locked by the caller.
cache: &Cache,
- // The id the cross-reference names.
- id: &str,
- // The canonicalized path of the file containing the cross-reference.
+ // The `` element.
+ node: &Rc,
+ // The canonicalized path of the file the cross-reference is rendered in.
path: &Path,
// The nodes to place inside the `` element.
) -> io::Result>> {
- if !is_css_identifier(id) {
+ // An `` is never a target, so an `id` on it -- even `id="*"`, which
+ // `assign_auto_ids` leaves alone -- would mislead its reader into thinking
+ // it can be referenced.
+ if get_attr_value(node, "id").is_some() {
+ return Ok(vec![error_span(
+ "a cross-reference may not have an \"id\" attribute",
+ )]);
+ }
+ let Some(id) = get_attr_value(node, "ref") else {
+ return Ok(vec![error_span(
+ "a cross-reference requires a \"ref\" attribute",
+ )]);
+ };
+ if !is_css_identifier(&id) {
return Ok(vec![error_span(&format!(
"\"{id}\" is not a valid CSS identifier"
))]);
}
- Ok(match cache.resolve_id(id) {
+ Ok(match cache.resolve_id(&id) {
IdResolution::Target {
path: target_path,
target,
@@ -1698,8 +1772,14 @@ fn store_fragment_contents(
cache: &Arc>,
) {
let mut cache_guard = cache.lock().unwrap();
+ // The ids whose content this pass has stored. Duplicates within this file
+ // share one entry in the cache, which holds the first in document order
+ // (see `Cache::commit_file`); storing each duplicate's content in turn
+ // would instead change that entry twice per pass, outdating every file
+ // which gathers the id each time this file is processed.
+ let mut stored_ids: HashSet<&str> = HashSet::new();
for fragment in &walk_context.fragments {
- if !fragment.cached {
+ if !fragment.cached || !stored_ids.insert(&fragment.id) {
continue;
}
let content = if let Some(message) = &fragment.error {
@@ -1711,26 +1791,24 @@ fn store_fragment_contents(
// `error` set during the walk.
error_html("fragments are not allowed in Markdown documents")
};
- // TODO: schedule reprocessing for each outdated file returned here.
- let _outdated =
- cache_guard.update_fragment_content(&walk_context.path, &fragment.id, content);
+ cache_guard.update_fragment_content(&walk_context.path, &fragment.id, content);
}
}
/// Render one fragment's content: the hydrated HTML of the code/doc blocks it
-/// encloses, cleaned per the spec in `cache.rs`. Per that spec, the rendering
+/// encloses, cleaned per the cache spec. Per that spec, the rendering
/// reproduces the layout of the source it came from: each doc block carries the
-/// indent it had there, each line of a code block and the first line of each doc
-/// block are preceded by their line numbers, and equal indents in the source
-/// line up in the rendering.
+/// indent it had there, each line of a code block and the first line of each
+/// doc block are preceded by their line numbers, and equal indents in the
+/// source line up in the rendering.
///
/// ### Why a doc block's indent and a code block are `
`s
///
/// The whitespace in those two *is* the layout, so everything which rewrites
-/// this HTML on its way to the screen must be told to leave it alone -- and both
-/// TinyMCE and the minifier key whitespace sensitivity on the tag name, with no
-/// class- or selector-based equivalent. (`CodeChat-doc-indent` needs no such
-/// treatment: the Client builds it outside the TinyMCE editable region, so
+/// this HTML on its way to the screen must be told to leave it alone -- and
+/// both TinyMCE and the minifier key whitespace sensitivity on the tag name,
+/// with no class- or selector-based equivalent. (`CodeChat-doc-indent` needs no
+/// such treatment: the Client builds it outside the TinyMCE editable region, so
/// nothing rewrites it.) Of the tag names both tools treat as
/// whitespace-sensitive by default, `pre` is the one which fits, and each tool
/// extends that treatment to everything nested inside it, covering the line
@@ -1811,8 +1889,8 @@ fn render_fragment_content(
// to line up with the code around it. Only the doc block's
// first line is numbered -- the block's remaining source
// lines have no fixed correspondence to the lines its
- // rendered contents occupy, since the comment delimiters are
- // gone and the text reflows.
+ // rendered contents occupy, since the comment delimiters
+ // are gone and the text reflows.
content.push_str(
"
",
);
@@ -1912,7 +1990,17 @@ fn hydrate_gathers(
new_text(":"),
],
));
- items.extend(parse_html_fragment(&fragment.content)?);
+ // The fragment's content was hydrated in the fragment's
+ // file, so each cross-reference within it links from
+ // there; re-hydrate them to link from this file instead.
+ // This file needn't depend on their targets: the
+ // fragment's stored content embeds everything about a
+ // target which this re-hydration reads, so any change to
+ // a target which alters it also changes that content,
+ // which outdates this file.
+ let content = parse_html_fragment(&fragment.content)?;
+ hydrate_xrefs_within(&cache_guard, &content, &walk_context.path)?;
+ items.extend(content);
}
IdResolution::Target { .. } => items.push(error_span(&format!(
"id \"{id}\" names a target, not a fragment"
@@ -2175,9 +2263,9 @@ struct WalkContext {
/// These are excluded from `facts`: they belong to the cache only after the
/// file carrying them is written and re-read.
auto_ids: HashSet,
- /// Each cross-reference found: its destination id and its `` node,
- /// kept so the generated contents can be patched after the cache commit.
- xrefs: Vec<(String, Rc)>,
+ /// Each cross-reference's `` node, kept so the generated contents
+ /// can be patched after the cache commit.
+ xrefs: Vec>,
/// Each fragment found, with everything the later hydration phases need.
fragments: Vec,
/// DOM for all gather elements, i.e. targets with a non-empty
@@ -2200,7 +2288,7 @@ struct WalkContext {
struct FragmentHydration {
/// The fragment's DOM node.
node: Rc,
- /// The fragment's id.
+ /// The fragment's id; empty if it has none.
id: String,
/// The index of the fragment's first code/doc block; see
/// `FragmentFact::doc_block_start_index`.
@@ -2209,13 +2297,14 @@ struct FragmentHydration {
/// number of blocks in the document; see
/// `FragmentFact::code_doc_block_end_index`.
end: usize,
- /// When set, the fragment is in an error state detected during the walk
- /// (fragment in a Markdown document, or an unparsable `following`
- /// attribute): the message replaces both the hydrated tag content and the
- /// cached fragment content.
+ /// When set, the fragment is in an error state detected during the walk (a
+ /// missing or invalid id, a fragment in a Markdown document, or an
+ /// unparsable `following` attribute): the message replaces both the
+ /// hydrated tag content and the cached fragment content.
error: Option,
/// False when the fragment wasn't recorded in `FileFacts` (its id is
- /// invalid), so no content may be stored for it.
+ /// missing, invalid, or auto-assigned during this pass), so no content may
+ /// be stored for it.
cached: bool,
}
@@ -2288,18 +2377,18 @@ fn hydrating_walk_node(node: &Rc, mut walk_context: WalkContext) -> io::Re
} else if tag_name == "xref" {
// A cross reference: record the referenced id as a fact, and
// keep the node so its generated contents can be filled in
- // after the cache commit. Note that this element doesn't allow
- // an `id` attribute, so it's never a target.
+ // after the cache commit -- with an error message, if it lacks
+ // a `ref`. Note that this element is never a target; an `id`
+ // attribute on it is an error, reported by `xref_content`.
if let Some(ref_id) = get_attr_value(child, "ref") {
- walk_context.facts.xrefs.push(ref_id.clone());
- walk_context.xrefs.push((ref_id, child.clone()));
+ walk_context.facts.xrefs.push(ref_id);
}
+ walk_context.xrefs.push(child.clone());
} else if tag_name == "fragment" {
- // A fragment; without an id it's meaningless, so it's ignored.
- // Its content can't be determined yet -- doc blocks aren't
- // finalized during the walk -- so the caller stores it later
- // via `Cache::update_fragment_content`.
- if let Some(id) = id {
+ // A fragment. Its content can't be determined yet -- doc blocks
+ // aren't finalized during the walk -- so the caller stores it
+ // later via `Cache::update_fragment_content`.
+ if let Some(id) = id.filter(|id| !id.is_empty()) {
// The `following` attribute selects how many code/doc
// blocks after the current doc block the fragment encloses;
// the default is 1.
@@ -2339,8 +2428,8 @@ fn hydrating_walk_node(node: &Rc, mut walk_context: WalkContext) -> io::Re
walk_context.facts.fragments.push(FragmentFact {
id: id.clone(),
line: 0,
- doc_block_start_index: walk_context.doc_block_index,
- code_doc_block_end_index: walk_context
+ _doc_block_start_index: walk_context.doc_block_index,
+ _code_doc_block_end_index: walk_context
.doc_block_index
.saturating_add(following),
});
@@ -2353,6 +2442,18 @@ fn hydrating_walk_node(node: &Rc, mut walk_context: WalkContext) -> io::Re
error,
cached,
});
+ } else {
+ // A fragment without an id: display an error requesting the
+ // missing id, per the cache spec. Lacking an id, it
+ // can't be cached.
+ walk_context.fragments.push(FragmentHydration {
+ node: child.clone(),
+ id: String::new(),
+ start: walk_context.doc_block_index,
+ end: walk_context.doc_block_index,
+ error: Some("a fragment requires an \"id\" attribute".to_string()),
+ cached: false,
+ });
}
} else if let Some(id) = id
&& !id.is_empty()
@@ -2380,7 +2481,7 @@ fn hydrating_walk_node(node: &Rc, mut walk_context: WalkContext) -> io::Re
id,
// Clean the inner HTML for storage; note that it's
// captured before any hydration of descendants, per
- // the spec in `cache.rs`.
+ // the cache spec.
inner_html: CLEAN_TARGET_HTML
.clean(&node_inner_html(child)?)
.to_string(),
@@ -2388,7 +2489,7 @@ fn hydrating_walk_node(node: &Rc, mut walk_context: WalkContext) -> io::Re
// pulldown-cmark HTML writer preserves them; see
// the TODO in `cache.rs`.
line: 0,
- doc_block_index: walk_context.doc_block_index,
+ _doc_block_index: walk_context.doc_block_index,
gather_ids,
});
}
@@ -2403,7 +2504,7 @@ fn hydrating_walk_node(node: &Rc, mut walk_context: WalkContext) -> io::Re
}
} else if get_attr_value(child, "data-gather").is_some() {
// `data-gather` on an element without an id: display an error
- // requesting the missing id, per the spec in `cache.rs`.
+ // requesting the missing id, per the cache spec.
walk_context.gathers_error.push((
child.clone(),
"a gather element requires an \"id\" attribute".to_string(),
diff --git a/server/src/processing/cache-spec.md b/server/src/processing/cache-spec.md
index 0906ea59..a0dc014a 100644
--- a/server/src/processing/cache-spec.md
+++ b/server/src/processing/cache-spec.md
@@ -2,11 +2,11 @@ Cache spec
==========
The cache stores the location (file name and ID) and contents (inner HTML or
-code/doc blocks for fragments) of a target. Targets are HTML elements (excluding
-``s) with an ID.
+code/doc blocks for fragments) of targets and fragments. Targets are HTML
+elements (excluding ``s and ``s) with an ID.
The goal of the cache is to support cross-references and gather elements, and to
-ensure that all IDs are unique within a project. This means that
+assist in ensuring that all IDs are unique within a project. This means that
cross-references and gather elements persist across moving or renaming files,
since the IDs will be found in the cache.
@@ -17,7 +17,7 @@ do not.
The cache reflects data read directly from disk/IDE; content edited in the
Client does not update the cache until it's written to disk/IDE, at which point
-the cache much re-process this unknown file. Since the Client is designed around
+the cache must re-process the file. Since the Client is designed around
an autosave principle which updates disk/IDE regularly, there's little gap
between the two.
@@ -28,35 +28,41 @@ Cross references
----------------
A `` is a cross reference to a `Target` or a gather
-element. The `id` specifies the destination; the cache then hydrates the
-contents based on the location and contents of the target of the provided `id`
-to e.g. `Inner HTML from target`; this hydrated form
is only present in the Client.
Details:
-* This element does not allow an `id` attribute.
+* This element allows no attribute except for `ref`. Since an `` is
+ never a `Target`, an `id` attribute on it -- including `id="*"` -- would
+ mislead, so it replaces the contents with an error message.
* The inner HTML is always taken before cache hydration, to prevent circular
- dependencies:
+ dependencies (see also ):
```html
-
See
-
See
+
See
+
See
```
Including cache hydration would cause the inner HTML to be updated each time
the file is processed, outdating the other file.
-* If the `id` referred to isn't found or refers to a duplicate id, the inner
- text is instead an appropriate error message.
+* If the `ref` attribute is missing, the `id` referred to isn't found, refers to
+ a duplicate id, or is an invalid CSS identifier, the inner text is instead an
+ appropriate error message.
* If the cross reference is to a gather element, the text is the gather
element's inner HTML, not the gathered code/doc blocks.
+* Cross references to fragments are not allowed; this would create circular
+ dependencies (see ).
+
Fragments and gather elements
-----------------------------
@@ -68,7 +74,7 @@ contenteditable="false">See Bazzy things, Zappy things`. A fragment's
content by default includes the contents of the current doc block and the
contents of the following code/doc block; fragments are not allowed in Markdown
-documents (in the case, the fragment contents consist of an error message).
+documents (in this case, the fragment contents consist of an error message).
Fragments may include the `following` attribute to enclose a specific number of
the following code/doc blocks; for example, `` includes the current doc block along with the next 3
@@ -80,28 +86,31 @@ Details:
element list of contents will simply include an error message.
* Fragments do support indirection: gather element A includes contents from
fragment B, which contains a cross reference to target C. Changes to target C
- makes B and A outdated.
-* If a gather element refers to an `id` that is a `Target` or a `GatherElement`,
- not a `Fragment`, the resulting output for this in the list of fragments is an
- error message.
+ make B and A outdated.
+* If a gather element refers to an `id` that is a `Target`, not a `Fragment`,
+ the resulting output for this in the list of fragments is an error message.
* If a gather element refers to an `id` that wasn't found or is a duplicate, its
contents will be replaced by an error message.
* Fragments store an HTML rendering of the code and doc blocks they contain,
excluding the content produced by hydrating the `` tags, to avoid
- duplication and circular dependencies. See layer 4 under `Design`: this
- exclusion is what keeps a gather element and the fragments it lists from
- outdating each other forever. The HTML rendering of a fragment reproduces the
- layout of the source it came from: each doc block includes its indent, each
- line of a code block is preceded by that line's number, and the two are
- aligned -- a doc block and a line of code indented equally in the source begin
- in the same column, with the line numbers in a gutter of their own to the left
- of both.
+ duplication and circular dependencies. Cross-references in this rendering
+ are hydrated in the fragment's file, so their links lead from there; a
+ gather element re-hydrates each which hydrated to a link so that it leads
+ from the gather element's file instead. An error message reads the same
+ anywhere, so it's kept as is. See layer 4 under
+ : this exclusion is what keeps a gather
+ element and the fragments it lists from outdating each other forever. The HTML
+ rendering of a fragment reproduces the layout of the source it came from: each
+ doc block includes its indent, each line of a code block or the first line of
+ a doc block is preceded by that line's number, and the two are aligned -- a
+ doc block and a line of code indented equally in the source begin in the same
+ column, with the line numbers in a gutter of their own to the left of both.
* The backlinks a `` hydrates to are derived from the gather elements
which list it: for each such element, its containing file, its `id`, and its
inner HTML (the link text). A fragment's rendered output therefore depends on
the gather elements which reference it -- the reverse of the direction in
- which references are written; see `Design`.
-* A `` is valid; it contains only the current doc block.
+ which references are written; see .
+* A `` is valid; it contains only the current doc block.
* The `following` attribute is clamped if it would exceed the number of code/doc
blocks in the document.
* If the `following` value cannot be parsed to a whole number, an error message
@@ -109,10 +118,12 @@ Details:
* A gather element, as a type of `Target`, requires an `id`. A `data-gather`
attribute on an element without an `id` produces an error message which
requests the missing `id`.
+* Likewise, a fragment requires an id, producing an error message when the `id`
+ is missing.
* All ids must be valid
- [CSS identifiers](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/es/ident)
+ [CSS identifiers](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/ident)
per
- [MDN recommendations](https://developer.mozilla.org/en-US/docs/Web/HTML/rence/Global_attributes/id).
+ [MDN recommendations](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Global_attributes/id).
Invalid ids produce error messages in the hydrated tag content.
Example hydration of the gather tag `
Bazzy
@@ -132,37 +143,47 @@ things
`:
```
-Search
-------
+Search (future work)
+--------------------
-The cache supports searching the (cleaned) inner HTML of all `Target`s and
-gather elements; search does not include `Fragment` contents.
+The cache will support searching the (cleaned) inner HTML of all `Target`s and
+gather elements; search will not include `Fragment` contents.
-### Auto-assignment of ids
+Auto-assignment of ids
+----------------------
If `id="*"` on either a fragment, target, or gather element, the cache replaces
-this with an random autogenerated `id` placed in the resulting HTML contents,
-but this new `id` is not yet recorded in the cache. The file is then marked as
-`Unknown` when it is saved; when re-read, this `id` is then incorporated into
-the cache. This helps avoid cases where the cache and file contents become
-unsynchronized: if the `id` is placed in the cache before the write and the
-write fails, or if the file is never written (it was being scanned, but not
-actively edited, so the file contents wasn't written back).
+this with a random autogenerated `id` placed in the resulting HTML contents, but
+this new `id` is not yet recorded in the cache. It enters the cache only when
+source containing it is next translated: the Server translates each edit the
+Client saves back to the Client, to check for changes, which commits the edit;
+otherwise, the consumer reads the file once it's written to disk. This helps
+avoid cases where the cache and file contents become unsynchronized: if the `id`
+is placed in the cache before the write and the write fails, or if the file is
+never written (it was being scanned, but not actively edited, so the file
+contents weren't written back).
+
+TODO: an `id="*"` typed in the IDE reaches the source only when the Client sends
+back the HTML containing its replacement, which it does only once the user edits
+in the Client; until then, each translation of the IDE's text assigns a
+different id. Resolve this by sending the replacement to the IDE when a
+translation assigns ids.
The autogenerated id must be a valid
-[CSS identifier](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/es/ident).
+[CSS identifier](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Values/ident).
Autogenerated ids must be checked to make sure they don't collide with an
existing id.
-Design
-------
+