From 4be44041d0e746aa2a012ce462b087d42ce32eb2 Mon Sep 17 00:00:00 2001 From: Dominik Nakamura Date: Sun, 3 Dec 2023 20:17:06 +0900 Subject: [PATCH] feat: create basic language server for schemas Using an LSP allows providing editor agnostic support for schema files. Currently only reporting errors in schemas (and not handling eventual UTF-16 encoding). --- Cargo.lock | 719 +++++++++++++++++- book/highlight/package.json | 8 +- bun.lockb | Bin 0 -> 58248 bytes crates/stef-benches/Cargo.toml | 2 +- crates/stef-lsp/Cargo.toml | 22 + crates/stef-lsp/src/compile.rs | 202 ++++++ crates/stef-lsp/src/main.rs | 160 ++++ package.json | 5 + pnpm-lock.yaml | 1121 ----------------------------- pnpm-workspace.yaml | 3 - vscode-extension/.gitignore | 3 +- vscode-extension/.vscodeignore | 4 +- vscode-extension/biome.json | 16 + vscode-extension/package.json | 16 +- vscode-extension/src/extension.ts | 49 ++ 15 files changed, 1181 insertions(+), 1149 deletions(-) create mode 100755 bun.lockb create mode 100644 crates/stef-lsp/Cargo.toml create mode 100644 crates/stef-lsp/src/compile.rs create mode 100644 crates/stef-lsp/src/main.rs create mode 100644 package.json delete mode 100644 pnpm-lock.yaml delete mode 100644 pnpm-workspace.yaml create mode 100644 vscode-extension/biome.json create mode 100644 vscode-extension/src/extension.ts diff --git a/Cargo.lock b/Cargo.lock index 7bc6c97..516e1b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,6 +26,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aliasable" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" + [[package]] name = "anstream" version = "0.6.4" @@ -74,6 +80,17 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "async-trait" +version = "0.1.74" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + [[package]] name = "atty" version = "0.2.14" @@ -85,6 +102,24 @@ dependencies = [ "winapi", ] +[[package]] +name = "auto_impl" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fee3da8ef1276b0bee5dd1c7258010d8fffd31801447323115a25560e1327b89" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + [[package]] name = "backtrace" version = "0.3.69" @@ -100,6 +135,12 @@ dependencies = [ "rustc-demangle", ] +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + [[package]] name = "bitflags" version = "2.4.1" @@ -169,7 +210,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -215,11 +256,24 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "dashmap" +version = "5.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +dependencies = [ + "cfg-if", + "hashbrown", + "lock_api", + "once_cell", + "parking_lot_core", +] + [[package]] name = "divan" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a2f0b89afd851ac3372f22144e66157058999ffe695a337711d5511acb91504" +checksum = "763cb39ba91195b15997d344ee282302799871b4ff5ddf4b6538ab1d2d1bb1a5" dependencies = [ "clap", "condtype", @@ -229,15 +283,21 @@ dependencies = [ [[package]] name = "divan-macros" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "016a705a288faf1e8d45113e54ffcc7b566e1572ff829b8455546362b0c902f5" +checksum = "de02c6e6def5706c2aca32c3e3261625000f8effc4d4c37f9d750262a6b9ca56" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" + [[package]] name = "encode_unicode" version = "0.3.6" @@ -264,6 +324,92 @@ dependencies = [ "once_cell", ] +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" + +[[package]] +name = "futures-io" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" + +[[package]] +name = "futures-macro" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "futures-sink" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" + +[[package]] +name = "futures-task" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" + +[[package]] +name = "futures-util" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + [[package]] name = "gimli" version = "0.28.1" @@ -285,10 +431,16 @@ dependencies = [ "aho-corasick", "bstr", "log", - "regex-automata", - "regex-syntax", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", ] +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "heck" version = "0.4.1" @@ -310,6 +462,22 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "indenter" version = "0.3.3" @@ -354,6 +522,21 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb" +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" + [[package]] name = "lazy_static" version = "1.4.0" @@ -388,12 +571,44 @@ version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + [[package]] name = "log" version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +[[package]] +name = "lsp-types" +version = "0.94.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66bfd44a06ae10647fe3f8214762e9369fd4248df1350924b4ef9e770a85ea1" +dependencies = [ + "bitflags 1.3.2", + "serde", + "serde_json", + "serde_repr", + "url", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + [[package]] name = "memchr" version = "2.6.4" @@ -427,7 +642,7 @@ checksum = "49e7bc1560b95a3c4a25d03de42fe76ca718ab92d1a22a55b9b4cf67b3ae635c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -448,6 +663,26 @@ dependencies = [ "adler", ] +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi 0.3.3", + "libc", +] + [[package]] name = "object" version = "0.32.1" @@ -463,6 +698,37 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +[[package]] +name = "ouroboros" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c86de06555b970aec45229b27291b53154f21a5743a163419f4e4c0b065dcde" +dependencies = [ + "aliasable", + "ouroboros_macro", + "static_assertions", +] + +[[package]] +name = "ouroboros_macro" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cad0c4b129e9696e37cb712b243777b90ef489a0bfaa0ac34e7d9b860e4f134" +dependencies = [ + "heck", + "itertools", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "owo-colors" version = "3.5.0" @@ -472,12 +738,63 @@ dependencies = [ "supports-color 1.3.1", ] +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] + [[package]] name = "paste" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + [[package]] name = "prettyplease" version = "0.2.15" @@ -485,7 +802,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.39", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", ] [[package]] @@ -506,6 +847,36 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.3", + "regex-syntax 0.8.2", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + [[package]] name = "regex-automata" version = "0.4.3" @@ -514,7 +885,7 @@ checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", - "regex-syntax", + "regex-syntax 0.8.2", ] [[package]] @@ -523,6 +894,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30b661b2f27137bdbc16f00eda72866a92bb28af1753ffbd56744fb6e2e9cd8e" +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + [[package]] name = "regex-syntax" version = "0.8.2" @@ -541,13 +918,19 @@ version = "0.38.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9470c4bf8246c8daf25f9598dca807fb6510347b1e1cfa55749113850c79d88a" dependencies = [ - "bitflags", + "bitflags 2.4.1", "errno", "libc", "linux-raw-sys", "windows-sys 0.52.0", ] +[[package]] +name = "ryu" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" + [[package]] name = "same-file" version = "1.0.6" @@ -557,6 +940,12 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "serde" version = "1.0.193" @@ -574,7 +963,38 @@ checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", +] + +[[package]] +name = "serde_json" +version = "1.0.108" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", ] [[package]] @@ -583,12 +1003,33 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2aeaf503862c419d66959f5d7ca015337d864e9c49485d771b732e2a20453597" +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + [[package]] name = "smawk" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7c388c1b5e93756d0c740965c41e8822f866621d41acbdf6336a6a168f8840c" +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + [[package]] name = "stef" version = "0.1.0" @@ -621,7 +1062,7 @@ dependencies = [ "quote", "stef-compiler", "stef-parser", - "syn", + "syn 2.0.39", "thiserror", ] @@ -654,7 +1095,7 @@ version = "0.1.0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", ] [[package]] @@ -669,6 +1110,19 @@ dependencies = [ "stef-parser", ] +[[package]] +name = "stef-lsp" +version = "0.1.0" +dependencies = [ + "ouroboros", + "stef-compiler", + "stef-parser", + "tokio", + "tower-lsp", + "tracing", + "tracing-subscriber", +] + [[package]] name = "stef-parser" version = "0.1.0" @@ -733,6 +1187,17 @@ dependencies = [ "is-terminal", ] +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.39" @@ -792,9 +1257,198 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.39", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +dependencies = [ + "backtrace", + "num_cpus", + "pin-project-lite", + "tokio-macros", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-lsp" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ba052b54a6627628d9b3c34c176e7eda8359b7da9acd497b9f20998d118508" +dependencies = [ + "async-trait", + "auto_impl", + "bytes", + "dashmap", + "futures", + "httparse", + "lsp-types", + "memchr", + "serde", + "serde_json", + "tokio", + "tokio-util", + "tower", + "tower-lsp-macros", + "tracing", +] + +[[package]] +name = "tower-lsp-macros" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84fd902d4e0b9a4b27f2f440108dc034e1758628a9b702f8ec61ad66355422fa" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.39", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + [[package]] name = "unicode-ident" version = "1.0.12" @@ -807,18 +1461,51 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + [[package]] name = "unicode-width" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + [[package]] name = "utf8parse" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + [[package]] name = "walkdir" version = "2.4.0" diff --git a/book/highlight/package.json b/book/highlight/package.json index 81a27eb..1d2430a 100644 --- a/book/highlight/package.json +++ b/book/highlight/package.json @@ -3,15 +3,15 @@ "private": true, "scripts": { "esbuild": "esbuild src/*.{css,ts} --outdir=../theme --target=es2016 --global-name=hljs --legal-comments=none --bundle", - "watch": "pnpm run esbuild --watch", - "build": "pnpm run esbuild --minify", + "watch": "bun run esbuild --watch", + "build": "bun run esbuild --minify", "lint": "biome check --apply src/**/*.ts" }, "dependencies": { "highlight.js": "^11.9.0" }, "devDependencies": { - "@biomejs/biome": "^1.3.3", - "esbuild": "^0.19.5" + "@biomejs/biome": "^1.4.1", + "esbuild": "^0.19.8" } } diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..8d535920e74de9c706145f92cb21f339564aefd9 GIT binary patch literal 58248 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 std::result::Result, Diagnostic> { + stef_parser::Schema::parse(schema, None).map_err(|e| match &e.cause { + ParseSchemaCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + ParseSchemaCause::Definition(e) => parse_definition_diagnostic(schema, e), + }) +} + +fn parse_definition_diagnostic(schema: &str, e: &ParseDefinitionError) -> Diagnostic { + match e { + ParseDefinitionError::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + ParseDefinitionError::Comment(e) => parse_comment_diagnostic(schema, e), + ParseDefinitionError::Attribute(e) => match &e.cause { + ParseAttributeCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + ParseAttributeCause::Literal(e) => match &e.cause { + ParseLiteralCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + ParseLiteralCause::FoundReference { at } + | ParseLiteralCause::InvalidInt { at } + | ParseLiteralCause::ParseInt { at, .. } => { + Diagnostic::new_simple(get_range(schema, *at..*at), e.cause.to_string()) + } + }, + }, + ParseDefinitionError::Module(e) => match &e.cause { + ParseModuleCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + ParseModuleCause::InvalidName { at } => { + Diagnostic::new_simple(get_range(schema, *at..*at), e.cause.to_string()) + } + ParseModuleCause::Definition(e) => parse_definition_diagnostic(schema, e), + }, + ParseDefinitionError::Struct(e) => match &e.cause { + ParseStructCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + ParseStructCause::InvalidName { at } => { + Diagnostic::new_simple(get_range(schema, *at..*at), e.cause.to_string()) + } + ParseStructCause::Generics(e) => parse_generics_diagnostic(schema, e), + ParseStructCause::Fields(e) => parse_fields_diagnostic(schema, e), + }, + ParseDefinitionError::Enum(e) => match &e.cause { + ParseEnumCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + ParseEnumCause::InvalidName { at } | ParseEnumCause::InvalidVariantName { at } => { + Diagnostic::new_simple(get_range(schema, *at..*at), e.cause.to_string()) + } + ParseEnumCause::Generics(e) => parse_generics_diagnostic(schema, e), + ParseEnumCause::Field(e) => parse_fields_diagnostic(schema, e), + ParseEnumCause::Comment(e) => parse_comment_diagnostic(schema, e), + ParseEnumCause::Id(e) => parse_id_diagnostic(schema, e), + }, + ParseDefinitionError::Const(e) => match &e.cause { + ParseConstCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + ParseConstCause::UnexpectedChar { at, .. } | ParseConstCause::InvalidName { at } => { + Diagnostic::new_simple(get_range(schema, *at..*at), e.cause.to_string()) + } + ParseConstCause::Type(e) => parse_type_diagnostic(schema, e), + ParseConstCause::Literal(e) => match &e.cause { + ParseLiteralCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + ParseLiteralCause::FoundReference { at } + | ParseLiteralCause::InvalidInt { at } + | ParseLiteralCause::ParseInt { at, .. } => { + Diagnostic::new_simple(get_range(schema, *at..*at), e.cause.to_string()) + } + }, + }, + ParseDefinitionError::Alias(e) => match &e.cause { + ParseAliasCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + ParseAliasCause::InvalidName { at } => { + Diagnostic::new_simple(get_range(schema, *at..*at), e.cause.to_string()) + } + ParseAliasCause::Generics(e) => parse_generics_diagnostic(schema, e), + ParseAliasCause::Type(e) => parse_type_diagnostic(schema, e), + }, + ParseDefinitionError::Import(e) => parse_import_cause_diagnostic(schema, &e.cause), + } +} + +fn parse_type_diagnostic(schema: &str, e: &ParseTypeError) -> Diagnostic { + match &e.cause { + ParseTypeCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + ParseTypeCause::Type(e) => parse_type_diagnostic(schema, e), + ParseTypeCause::Segment(c) => parse_import_cause_diagnostic(schema, c), + } +} + +fn parse_comment_diagnostic(schema: &str, e: &ParseCommentError) -> Diagnostic { + Diagnostic::new_simple(get_range(schema, e.at.clone()), e.to_string()) +} + +fn parse_import_cause_diagnostic(schema: &str, c: &ParseImportCause) -> Diagnostic { + match c { + ParseImportCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), c.to_string()) + } + ParseImportCause::InvalidSegmentName { at } => { + Diagnostic::new_simple(get_range(schema, *at..*at), c.to_string()) + } + ParseImportCause::StructName(c) => match c { + ParseStructCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), c.to_string()) + } + ParseStructCause::InvalidName { at } => { + Diagnostic::new_simple(get_range(schema, *at..*at), c.to_string()) + } + ParseStructCause::Generics(e) => parse_generics_diagnostic(schema, e), + ParseStructCause::Fields(e) => parse_fields_diagnostic(schema, e), + }, + ParseImportCause::EnumName(c) => match c { + ParseEnumCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), c.to_string()) + } + ParseEnumCause::InvalidName { at } | ParseEnumCause::InvalidVariantName { at } => { + Diagnostic::new_simple(get_range(schema, *at..*at), c.to_string()) + } + ParseEnumCause::Generics(e) => parse_generics_diagnostic(schema, e), + ParseEnumCause::Field(e) => parse_fields_diagnostic(schema, e), + ParseEnumCause::Comment(e) => parse_comment_diagnostic(schema, e), + ParseEnumCause::Id(e) => parse_id_diagnostic(schema, e), + }, + } +} + +fn parse_generics_diagnostic(schema: &str, e: &ParseGenericsError) -> Diagnostic { + match &e.cause { + stef_parser::error::ParseGenericsCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + stef_parser::error::ParseGenericsCause::InvalidName { at } => { + Diagnostic::new_simple(get_range(schema, *at..*at), e.cause.to_string()) + } + } +} + +fn parse_fields_diagnostic(schema: &str, e: &ParseFieldsError) -> Diagnostic { + match &e.cause { + ParseFieldsCause::Parser(_) => { + Diagnostic::new_simple(get_range(schema, 0..schema.len()), e.to_string()) + } + ParseFieldsCause::InvalidName { at } => { + Diagnostic::new_simple(get_range(schema, *at..*at), e.cause.to_string()) + } + ParseFieldsCause::Type(e) => parse_type_diagnostic(schema, e), + ParseFieldsCause::Id(e) => parse_id_diagnostic(schema, e), + ParseFieldsCause::Comment(e) => parse_comment_diagnostic(schema, e), + } +} + +fn parse_id_diagnostic(schema: &str, e: &ParseIdError) -> Diagnostic { + Diagnostic::new_simple(get_range(schema, e.at.clone()), e.to_string()) +} + +#[allow(clippy::cast_possible_truncation)] +fn get_range(schema: &str, location: Range) -> lsp::Range { + let start_line = schema[..location.start].lines().count().saturating_sub(1); + let start_char = schema[..location.start] + .lines() + .last() + .map_or(0, |line| line.chars().count()); + + let end_line = schema[..location.end].lines().count().saturating_sub(1); + let end_char = schema[..location.end] + .lines() + .last() + .map_or(0, |line| line.chars().count()); + + lsp::Range::new( + lsp::Position::new(start_line as u32, start_char as u32), + lsp::Position::new(end_line as u32, end_char as u32), + ) +} diff --git a/crates/stef-lsp/src/main.rs b/crates/stef-lsp/src/main.rs new file mode 100644 index 0000000..d76c750 --- /dev/null +++ b/crates/stef-lsp/src/main.rs @@ -0,0 +1,160 @@ +#![allow(missing_docs)] + +mod compile; + +use std::collections::HashMap; + +use ouroboros::self_referencing; +use stef_parser::Schema; +use tokio::sync::Mutex; +use tower_lsp::{ + async_trait, + jsonrpc::Result, + lsp_types::{ + Diagnostic, DidChangeTextDocumentParams, DidOpenTextDocumentParams, InitializeParams, + InitializeResult, InitializedParams, MessageType, ServerCapabilities, ServerInfo, + TextDocumentSyncCapability, TextDocumentSyncKind, Url, + }, + Client, LanguageServer, LspService, Server, +}; +use tracing::debug; +use tracing_subscriber::EnvFilter; + +#[derive(Debug)] +struct Backend { + client: Client, + files: Mutex>, +} + +#[self_referencing] +#[derive(Debug)] +struct File { + content: String, + #[borrows(content)] + #[covariant] + schema: std::result::Result, Diagnostic>, +} + +#[async_trait] +impl LanguageServer for Backend { + async fn initialize(&self, _params: InitializeParams) -> Result { + Ok(InitializeResult { + server_info: Some(ServerInfo { + name: env!("CARGO_CRATE_NAME").to_owned(), + version: Some(env!("CARGO_PKG_VERSION").to_owned()), + }), + capabilities: ServerCapabilities { + text_document_sync: Some(TextDocumentSyncCapability::Kind( + TextDocumentSyncKind::FULL, + )), + ..ServerCapabilities::default() + }, + offset_encoding: None, + }) + } + + async fn initialized(&self, _params: InitializedParams) { + self.client + .log_message(MessageType::INFO, "server initialized!") + .await; + } + + async fn shutdown(&self) -> Result<()> { + Ok(()) + } + + async fn did_open(&self, params: DidOpenTextDocumentParams) { + debug!(uri = %params.text_document.uri, "schema opened"); + + let file = FileBuilder { + content: params.text_document.text, + schema_builder: |schema| compile::compile(schema), + } + .build(); + + self.client + .publish_diagnostics( + params.text_document.uri.clone(), + file.borrow_schema() + .as_ref() + .err() + .map(|diag| vec![diag.clone()]) + .unwrap_or_default(), + None, + ) + .await; + + self.files + .lock() + .await + .insert(params.text_document.uri, file); + } + + async fn did_change(&self, mut params: DidChangeTextDocumentParams) { + debug!(uri = %params.text_document.uri, "schema changed"); + + let file = FileBuilder { + content: params.content_changes.remove(0).text, + schema_builder: |schema| compile::compile(schema), + } + .build(); + + self.client + .publish_diagnostics( + params.text_document.uri.clone(), + file.borrow_schema() + .as_ref() + .err() + .map(|diag| vec![diag.clone()]) + .unwrap_or_default(), + None, + ) + .await; + + self.files + .lock() + .await + .insert(params.text_document.uri, file); + } +} + +#[tokio::main] +async fn main() { + let (stdin, stdout) = (tokio::io::stdin(), tokio::io::stdout()); + let (service, socket) = LspService::new(|client| { + tracing_subscriber::fmt() + .with_env_filter(EnvFilter::from_default_env()) + .with_writer({ + let client = client.clone(); + move || ClientLogWriter { + client: client.clone(), + } + }) + .init(); + Backend { + client, + files: Mutex::default(), + } + }); + + Server::new(stdin, stdout, socket).serve(service).await; +} + +struct ClientLogWriter { + client: Client, +} + +impl std::io::Write for ClientLogWriter { + fn write(&mut self, buf: &[u8]) -> std::io::Result { + let client = self.client.clone(); + let message = String::from_utf8_lossy(buf).into_owned(); + + tokio::spawn(async move { client.log_message(MessageType::INFO, message).await }); + + Ok(buf.len()) + } + + fn flush(&mut self) -> std::io::Result<()> { + Ok(()) + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..3817b30 --- /dev/null +++ b/package.json @@ -0,0 +1,5 @@ +{ + "name": "stef", + "private": true, + "workspaces": ["book/highlight", "vscode-extension"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml deleted file mode 100644 index 8afd009..0000000 --- a/pnpm-lock.yaml +++ /dev/null @@ -1,1121 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - book/highlight: - dependencies: - highlight.js: - specifier: ^11.9.0 - version: 11.9.0 - devDependencies: - '@biomejs/biome': - specifier: ^1.3.3 - version: 1.3.3 - esbuild: - specifier: ^0.19.5 - version: 0.19.5 - - vscode-extension: - devDependencies: - '@vscode/vsce': - specifier: ^2.22.0 - version: 2.22.0 - js-yaml: - specifier: ^4.1.0 - version: 4.1.0 - -packages: - - /@biomejs/biome@1.3.3: - resolution: {integrity: sha512-vTJn7RBzLWIabUuUIoEopO860YyBrbPEu4Pztfd28jRU5QD074hKZ9IQs24pFO6A2R296gaeYmN62f4u7pUruQ==} - engines: {node: '>=14.*'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.3.3 - '@biomejs/cli-darwin-x64': 1.3.3 - '@biomejs/cli-linux-arm64': 1.3.3 - '@biomejs/cli-linux-x64': 1.3.3 - '@biomejs/cli-win32-arm64': 1.3.3 - '@biomejs/cli-win32-x64': 1.3.3 - dev: true - - /@biomejs/cli-darwin-arm64@1.3.3: - resolution: {integrity: sha512-2X87ZfbmWwe4NGukrUvnoYdI//muSgjNUCAHJ2DO+kS1sB7kDy1s6PN/IYyTJuqRcJtDuOnSpaUDE7KxR1YhtA==} - engines: {node: '>=14.*'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-darwin-x64@1.3.3: - resolution: {integrity: sha512-t+7DWTCbSgHOBcPsGKuwS1qh1z9zbXFK8i8ktE18yW7iF/W0zI62k44fYqYeFJKlb0Q08aqUvez3L+AQJFsn+w==} - engines: {node: '>=14.*'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-linux-arm64@1.3.3: - resolution: {integrity: sha512-D8CvXaB8lkXXBQ6B3n0MXSSZFiE60+aNHorBLimVTtKiMod8QvAP425oQFZFul5wMXZqPLGTKFjXbAi/rvnc1A==} - engines: {node: '>=14.*'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-linux-x64@1.3.3: - resolution: {integrity: sha512-bqB05fwJnRZwRlcm/BS/s4qPickqiXZkiU/nOYvHApfsPeqgSHgv5HWoBYuSUjgqBbX3XZJArsC5dCcVW7vAJw==} - engines: {node: '>=14.*'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-win32-arm64@1.3.3: - resolution: {integrity: sha512-muFOjAv1ONMfaJDlo4Ds+Qb9lkdSLM2XaxOe3AJPejSq3Vi0aRr51ZnE02BofMnL2sVsOA9cO54wibsuTcopbw==} - engines: {node: '>=14.*'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@biomejs/cli-win32-x64@1.3.3: - resolution: {integrity: sha512-PMkMhS4smmmTMflxuZUx3REFSazEL9xsGscvZO1dKWI4ET23la+KxEM4TlSpjOyO66UerqSkuUlZecn0QhD63A==} - engines: {node: '>=14.*'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm64@0.19.5: - resolution: {integrity: sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-arm@0.19.5: - resolution: {integrity: sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/android-x64@0.19.5: - resolution: {integrity: sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-arm64@0.19.5: - resolution: {integrity: sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/darwin-x64@0.19.5: - resolution: {integrity: sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-arm64@0.19.5: - resolution: {integrity: sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/freebsd-x64@0.19.5: - resolution: {integrity: sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm64@0.19.5: - resolution: {integrity: sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-arm@0.19.5: - resolution: {integrity: sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ia32@0.19.5: - resolution: {integrity: sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-loong64@0.19.5: - resolution: {integrity: sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-mips64el@0.19.5: - resolution: {integrity: sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-ppc64@0.19.5: - resolution: {integrity: sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-riscv64@0.19.5: - resolution: {integrity: sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-s390x@0.19.5: - resolution: {integrity: sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/linux-x64@0.19.5: - resolution: {integrity: sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - requiresBuild: true - dev: true - optional: true - - /@esbuild/netbsd-x64@0.19.5: - resolution: {integrity: sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/openbsd-x64@0.19.5: - resolution: {integrity: sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - requiresBuild: true - dev: true - optional: true - - /@esbuild/sunos-x64@0.19.5: - resolution: {integrity: sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-arm64@0.19.5: - resolution: {integrity: sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-ia32@0.19.5: - resolution: {integrity: sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@esbuild/win32-x64@0.19.5: - resolution: {integrity: sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - requiresBuild: true - dev: true - optional: true - - /@vscode/vsce@2.22.0: - resolution: {integrity: sha512-8df4uJiM3C6GZ2Sx/KilSKVxsetrTBBIUb3c0W4B1EWHcddioVs5mkyDKtMNP0khP/xBILVSzlXxhV+nm2rC9A==} - engines: {node: '>= 14'} - hasBin: true - dependencies: - azure-devops-node-api: 11.2.0 - chalk: 2.4.2 - cheerio: 1.0.0-rc.12 - commander: 6.2.1 - glob: 7.2.3 - hosted-git-info: 4.1.0 - jsonc-parser: 3.2.0 - leven: 3.1.0 - markdown-it: 12.3.2 - mime: 1.6.0 - minimatch: 3.1.2 - parse-semver: 1.1.1 - read: 1.0.7 - semver: 7.5.4 - tmp: 0.2.1 - typed-rest-client: 1.8.11 - url-join: 4.0.1 - xml2js: 0.5.0 - yauzl: 2.10.0 - yazl: 2.5.1 - optionalDependencies: - keytar: 7.9.0 - dev: true - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - dev: true - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - dev: true - - /azure-devops-node-api@11.2.0: - resolution: {integrity: sha512-XdiGPhrpaT5J8wdERRKs5g8E0Zy1pvOYTli7z9E8nmOn3YGp4FhtjhrOyFmX/8veWCwdI69mCHKJw6l+4J/bHA==} - dependencies: - tunnel: 0.0.6 - typed-rest-client: 1.8.11 - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: true - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - requiresBuild: true - dev: true - optional: true - - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - requiresBuild: true - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true - optional: true - - /boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - dev: true - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: true - - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - requiresBuild: true - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - dev: true - optional: true - - /call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 - dev: true - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - dev: true - - /cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - dependencies: - boolbase: 1.0.0 - css-select: 5.1.0 - css-what: 6.1.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - dev: true - - /cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} - dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.1.0 - htmlparser2: 8.0.2 - parse5: 7.1.2 - parse5-htmlparser2-tree-adapter: 7.0.0 - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - requiresBuild: true - dev: true - optional: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - dev: true - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - dev: true - - /commander@6.2.1: - resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} - engines: {node: '>= 6'} - dev: true - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: true - - /css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.1.0 - nth-check: 2.1.1 - dev: true - - /css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - dev: true - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - requiresBuild: true - dependencies: - mimic-response: 3.1.0 - dev: true - optional: true - - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - requiresBuild: true - dev: true - optional: true - - /define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - requiresBuild: true - dev: true - optional: true - - /dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - dev: true - - /domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - dev: true - - /domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - dependencies: - domelementtype: 2.3.0 - dev: true - - /domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - dev: true - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - requiresBuild: true - dependencies: - once: 1.4.0 - dev: true - optional: true - - /entities@2.1.0: - resolution: {integrity: sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==} - dev: true - - /entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - dev: true - - /esbuild@0.19.5: - resolution: {integrity: sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==} - engines: {node: '>=12'} - hasBin: true - requiresBuild: true - optionalDependencies: - '@esbuild/android-arm': 0.19.5 - '@esbuild/android-arm64': 0.19.5 - '@esbuild/android-x64': 0.19.5 - '@esbuild/darwin-arm64': 0.19.5 - '@esbuild/darwin-x64': 0.19.5 - '@esbuild/freebsd-arm64': 0.19.5 - '@esbuild/freebsd-x64': 0.19.5 - '@esbuild/linux-arm': 0.19.5 - '@esbuild/linux-arm64': 0.19.5 - '@esbuild/linux-ia32': 0.19.5 - '@esbuild/linux-loong64': 0.19.5 - '@esbuild/linux-mips64el': 0.19.5 - '@esbuild/linux-ppc64': 0.19.5 - '@esbuild/linux-riscv64': 0.19.5 - '@esbuild/linux-s390x': 0.19.5 - '@esbuild/linux-x64': 0.19.5 - '@esbuild/netbsd-x64': 0.19.5 - '@esbuild/openbsd-x64': 0.19.5 - '@esbuild/sunos-x64': 0.19.5 - '@esbuild/win32-arm64': 0.19.5 - '@esbuild/win32-ia32': 0.19.5 - '@esbuild/win32-x64': 0.19.5 - dev: true - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - dev: true - - /expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - requiresBuild: true - dev: true - optional: true - - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - dependencies: - pend: 1.2.0 - dev: true - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - requiresBuild: true - dev: true - optional: true - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - dev: true - - /function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - dev: true - - /get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} - dependencies: - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - dev: true - - /github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - requiresBuild: true - dev: true - optional: true - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - dev: true - - /gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - dependencies: - get-intrinsic: 1.2.2 - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - dev: true - - /has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - dependencies: - get-intrinsic: 1.2.2 - dev: true - - /has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - dev: true - - /has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - dev: true - - /hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - - /highlight.js@11.9.0: - resolution: {integrity: sha512-fJ7cW7fQGCYAkgv4CPfwFHrfd/cLS4Hau96JuJ+ZTOWhjnhoeN1ub1tFmALm/+lW5z4WCAuAV9bm05AP0mS6Gw==} - engines: {node: '>=12.0.0'} - dev: false - - /hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} - dependencies: - lru-cache: 6.0.0 - dev: true - - /htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - dev: true - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - requiresBuild: true - dev: true - optional: true - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - dev: true - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - dev: true - - /ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - requiresBuild: true - dev: true - optional: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - dev: true - - /jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} - dev: true - - /keytar@7.9.0: - resolution: {integrity: sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==} - requiresBuild: true - dependencies: - node-addon-api: 4.3.0 - prebuild-install: 7.1.1 - dev: true - optional: true - - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - - /linkify-it@3.0.3: - resolution: {integrity: sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==} - dependencies: - uc.micro: 1.0.6 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - dev: true - - /markdown-it@12.3.2: - resolution: {integrity: sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==} - hasBin: true - dependencies: - argparse: 2.0.1 - entities: 2.1.0 - linkify-it: 3.0.3 - mdurl: 1.0.1 - uc.micro: 1.0.6 - dev: true - - /mdurl@1.0.1: - resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} - dev: true - - /mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - requiresBuild: true - dev: true - optional: true - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: true - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - requiresBuild: true - dev: true - optional: true - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - requiresBuild: true - dev: true - optional: true - - /mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - dev: true - - /napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - requiresBuild: true - dev: true - optional: true - - /node-abi@3.51.0: - resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} - engines: {node: '>=10'} - requiresBuild: true - dependencies: - semver: 7.5.4 - dev: true - optional: true - - /node-addon-api@4.3.0: - resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} - requiresBuild: true - dev: true - optional: true - - /nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - dependencies: - boolbase: 1.0.0 - dev: true - - /object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - dev: true - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: true - - /parse-semver@1.1.1: - resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} - dependencies: - semver: 5.7.2 - dev: true - - /parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} - dependencies: - domhandler: 5.0.3 - parse5: 7.1.2 - dev: true - - /parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - dependencies: - entities: 4.5.0 - dev: true - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - dev: true - - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: true - - /prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - requiresBuild: true - dependencies: - detect-libc: 2.0.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.51.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - dev: true - optional: true - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - requiresBuild: true - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: true - optional: true - - /qs@6.11.2: - resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} - engines: {node: '>=0.6'} - dependencies: - side-channel: 1.0.4 - dev: true - - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - requiresBuild: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: true - optional: true - - /read@1.0.7: - resolution: {integrity: sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ==} - engines: {node: '>=0.8'} - dependencies: - mute-stream: 0.0.8 - dev: true - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - requiresBuild: true - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: true - optional: true - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: true - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - requiresBuild: true - dev: true - optional: true - - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - dev: true - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - dev: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - dev: true - - /set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} - engines: {node: '>= 0.4'} - dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - dev: true - - /side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 - dev: true - - /simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - requiresBuild: true - dev: true - optional: true - - /simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - requiresBuild: true - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - dev: true - optional: true - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - requiresBuild: true - dependencies: - safe-buffer: 5.2.1 - dev: true - optional: true - - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - requiresBuild: true - dev: true - optional: true - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - dev: true - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - requiresBuild: true - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: true - optional: true - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - requiresBuild: true - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: true - optional: true - - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - dependencies: - rimraf: 3.0.2 - dev: true - - /tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - requiresBuild: true - dependencies: - safe-buffer: 5.2.1 - dev: true - optional: true - - /tunnel@0.0.6: - resolution: {integrity: sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==} - engines: {node: '>=0.6.11 <=0.7.0 || >=0.7.3'} - dev: true - - /typed-rest-client@1.8.11: - resolution: {integrity: sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==} - dependencies: - qs: 6.11.2 - tunnel: 0.0.6 - underscore: 1.13.6 - dev: true - - /uc.micro@1.0.6: - resolution: {integrity: sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==} - dev: true - - /underscore@1.13.6: - resolution: {integrity: sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==} - dev: true - - /url-join@4.0.1: - resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} - dev: true - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - requiresBuild: true - dev: true - optional: true - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: true - - /xml2js@0.5.0: - resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} - engines: {node: '>=4.0.0'} - dependencies: - sax: 1.3.0 - xmlbuilder: 11.0.1 - dev: true - - /xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: true - - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - dev: true - - /yazl@2.5.1: - resolution: {integrity: sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==} - dependencies: - buffer-crc32: 0.2.13 - dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index d94f4c5..0000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,3 +0,0 @@ -packages: - - book/highlight - - vscode-extension diff --git a/vscode-extension/.gitignore b/vscode-extension/.gitignore index 0d59039..9a6b4f9 100644 --- a/vscode-extension/.gitignore +++ b/vscode-extension/.gitignore @@ -1,3 +1,4 @@ -/node_modules +/dist +/out /syntaxes/*.json *.vsix diff --git a/vscode-extension/.vscodeignore b/vscode-extension/.vscodeignore index f16182d..4f95ec3 100644 --- a/vscode-extension/.vscodeignore +++ b/vscode-extension/.vscodeignore @@ -1,3 +1,5 @@ +../ +out/ +src/ syntaxes/*.yaml .gitignore -pnpm-lock.yaml diff --git a/vscode-extension/biome.json b/vscode-extension/biome.json new file mode 100644 index 0000000..0810187 --- /dev/null +++ b/vscode-extension/biome.json @@ -0,0 +1,16 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.4.1/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "formatter": { + "indentStyle": "space", + "indentWidth": 2 + } +} diff --git a/vscode-extension/package.json b/vscode-extension/package.json index db35bdf..0cdf363 100644 --- a/vscode-extension/package.json +++ b/vscode-extension/package.json @@ -7,10 +7,11 @@ "repository": { "url": "https://github.com/dnaka91/stef.git" }, + "main": "./dist/extension.js", "engines": { "node": ">=20", "pnpm": ">=8", - "vscode": "^1.81.0" + "vscode": "^1.84.0" }, "categories": [ "Programming Languages" @@ -41,11 +42,22 @@ "dependencies": false }, "scripts": { - "vscode:prepublish": "js-yaml syntaxes/stef.tmLanguage.yaml > syntaxes/stef.tmLanguage.json", + "esbuild": "esbuild ./src/extension.ts --outfile=dist/extension.js --external:vscode --format=cjs --platform=node --bundle", + "watch": "bun run esbuild --watch", + "build": "bun run esbuild --minify", + "lint": "biome check --apply src/**/*.ts", + "syntaxes": "js-yaml syntaxes/stef.tmLanguage.yaml > syntaxes/stef.tmLanguage.json", + "vscode:prepublish": "bun run syntaxes && bun run build", "package": "vsce package" }, + "dependencies": { + "vscode-languageclient": "^9.0.1" + }, "devDependencies": { + "@biomejs/biome": "^1.4.1", + "@types/vscode": "^1.84.2", "@vscode/vsce": "^2.22.0", + "esbuild": "^0.19.8", "js-yaml": "^4.1.0" } } diff --git a/vscode-extension/src/extension.ts b/vscode-extension/src/extension.ts new file mode 100644 index 0000000..f5ebc6d --- /dev/null +++ b/vscode-extension/src/extension.ts @@ -0,0 +1,49 @@ +import { ExtensionContext, workspace } from "vscode"; +import { + Executable, + LanguageClient, + LanguageClientOptions, + ServerOptions, + TransportKind, +} from "vscode-languageclient/node"; + +let client: LanguageClient; + +export function activate(context: ExtensionContext) { + const executable: Executable = { + command: "stef-lsp", + transport: TransportKind.stdio, + }; + + const serverOptions: ServerOptions = { + run: executable, + debug: { + ...executable, + options: { + env: { + RUST_LOG: "info,tower_lsp=trace,stef_lsp=trace", + }, + }, + }, + }; + + const clientOptions: LanguageClientOptions = { + documentSelector: [{ scheme: "file", language: "stef" }], + synchronize: { + fileEvents: workspace.createFileSystemWatcher("**/*.stef"), + }, + }; + + client = new LanguageClient( + "stef-lsp", + "STEF Language Server", + serverOptions, + clientOptions, + ); + + client.start(); +} + +export function deactivate(): Thenable | undefined { + return client?.stop(); +}