aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--crates/project_model/src/cargo_workspace.rs20
-rw-r--r--crates/project_model/src/lib.rs606
-rw-r--r--crates/project_model/src/workspace.rs590
-rw-r--r--crates/rust-analyzer/src/cli/load_cargo.rs1
-rw-r--r--crates/rust-analyzer/src/config.rs15
-rw-r--r--crates/rust-analyzer/src/handlers.rs22
-rw-r--r--crates/rust-analyzer/src/lsp_ext.rs14
-rw-r--r--crates/rust-analyzer/src/main_loop.rs1
-rw-r--r--crates/rust-analyzer/src/reload.rs7
-rw-r--r--crates/rust-analyzer/tests/rust-analyzer/support.rs8
-rw-r--r--docs/dev/lsp-extensions.md29
-rw-r--r--editors/code/package-lock.json2764
-rw-r--r--editors/code/package.json19
-rw-r--r--editors/code/src/commands.ts21
-rw-r--r--editors/code/src/lsp_ext.ts6
-rw-r--r--editors/code/src/main.ts1
-rw-r--r--xtask/src/install.rs2
18 files changed, 734 insertions, 3393 deletions
diff --git a/.gitignore b/.gitignore
index b205bf3fb..7e097c015 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,3 +10,4 @@ crates/*/target
10generated_assists.adoc 10generated_assists.adoc
11generated_features.adoc 11generated_features.adoc
12generated_diagnostic.adoc 12generated_diagnostic.adoc
13.DS_Store
diff --git a/crates/project_model/src/cargo_workspace.rs b/crates/project_model/src/cargo_workspace.rs
index 608a031d4..540b57ae4 100644
--- a/crates/project_model/src/cargo_workspace.rs
+++ b/crates/project_model/src/cargo_workspace.rs
@@ -65,6 +65,10 @@ pub struct CargoConfig {
65 /// rustc target 65 /// rustc target
66 pub target: Option<String>, 66 pub target: Option<String>,
67 67
68 /// Don't load sysroot crates (`std`, `core` & friends). Might be useful
69 /// when debugging isolated issues.
70 pub no_sysroot: bool,
71
68 /// rustc private crate source 72 /// rustc private crate source
69 pub rustc_source: Option<AbsPathBuf>, 73 pub rustc_source: Option<AbsPathBuf>,
70} 74}
@@ -140,27 +144,27 @@ impl PackageData {
140impl CargoWorkspace { 144impl CargoWorkspace {
141 pub fn from_cargo_metadata( 145 pub fn from_cargo_metadata(
142 cargo_toml: &AbsPath, 146 cargo_toml: &AbsPath,
143 cargo_features: &CargoConfig, 147 config: &CargoConfig,
144 ) -> Result<CargoWorkspace> { 148 ) -> Result<CargoWorkspace> {
145 let mut meta = MetadataCommand::new(); 149 let mut meta = MetadataCommand::new();
146 meta.cargo_path(toolchain::cargo()); 150 meta.cargo_path(toolchain::cargo());
147 meta.manifest_path(cargo_toml.to_path_buf()); 151 meta.manifest_path(cargo_toml.to_path_buf());
148 if cargo_features.all_features { 152 if config.all_features {
149 meta.features(CargoOpt::AllFeatures); 153 meta.features(CargoOpt::AllFeatures);
150 } else { 154 } else {
151 if cargo_features.no_default_features { 155 if config.no_default_features {
152 // FIXME: `NoDefaultFeatures` is mutual exclusive with `SomeFeatures` 156 // FIXME: `NoDefaultFeatures` is mutual exclusive with `SomeFeatures`
153 // https://github.com/oli-obk/cargo_metadata/issues/79 157 // https://github.com/oli-obk/cargo_metadata/issues/79
154 meta.features(CargoOpt::NoDefaultFeatures); 158 meta.features(CargoOpt::NoDefaultFeatures);
155 } 159 }
156 if !cargo_features.features.is_empty() { 160 if !config.features.is_empty() {
157 meta.features(CargoOpt::SomeFeatures(cargo_features.features.clone())); 161 meta.features(CargoOpt::SomeFeatures(config.features.clone()));
158 } 162 }
159 } 163 }
160 if let Some(parent) = cargo_toml.parent() { 164 if let Some(parent) = cargo_toml.parent() {
161 meta.current_dir(parent.to_path_buf()); 165 meta.current_dir(parent.to_path_buf());
162 } 166 }
163 if let Some(target) = cargo_features.target.as_ref() { 167 if let Some(target) = config.target.as_ref() {
164 meta.other_options(vec![String::from("--filter-platform"), target.clone()]); 168 meta.other_options(vec![String::from("--filter-platform"), target.clone()]);
165 } 169 }
166 let mut meta = meta.exec().with_context(|| { 170 let mut meta = meta.exec().with_context(|| {
@@ -170,8 +174,8 @@ impl CargoWorkspace {
170 let mut out_dir_by_id = FxHashMap::default(); 174 let mut out_dir_by_id = FxHashMap::default();
171 let mut cfgs = FxHashMap::default(); 175 let mut cfgs = FxHashMap::default();
172 let mut proc_macro_dylib_paths = FxHashMap::default(); 176 let mut proc_macro_dylib_paths = FxHashMap::default();
173 if cargo_features.load_out_dirs_from_check { 177 if config.load_out_dirs_from_check {
174 let resources = load_extern_resources(cargo_toml, cargo_features)?; 178 let resources = load_extern_resources(cargo_toml, config)?;
175 out_dir_by_id = resources.out_dirs; 179 out_dir_by_id = resources.out_dirs;
176 cfgs = resources.cfgs; 180 cfgs = resources.cfgs;
177 proc_macro_dylib_paths = resources.proc_dylib_paths; 181 proc_macro_dylib_paths = resources.proc_dylib_paths;
diff --git a/crates/project_model/src/lib.rs b/crates/project_model/src/lib.rs
index 4531b1928..24aa9b8fa 100644
--- a/crates/project_model/src/lib.rs
+++ b/crates/project_model/src/lib.rs
@@ -4,74 +4,27 @@ mod cargo_workspace;
4mod project_json; 4mod project_json;
5mod sysroot; 5mod sysroot;
6mod cfg_flag; 6mod cfg_flag;
7mod workspace;
7 8
8use std::{ 9use std::{
9 fmt, 10 fs::{read_dir, ReadDir},
10 fs::{self, read_dir, ReadDir},
11 io, 11 io,
12 path::Component,
13 process::Command, 12 process::Command,
14}; 13};
15 14
16use anyhow::{bail, Context, Result}; 15use anyhow::{bail, Context, Result};
17use base_db::{CrateDisplayName, CrateGraph, CrateId, CrateName, Edition, Env, FileId};
18use cfg::CfgOptions;
19use paths::{AbsPath, AbsPathBuf}; 16use paths::{AbsPath, AbsPathBuf};
20use rustc_hash::{FxHashMap, FxHashSet}; 17use rustc_hash::FxHashSet;
21
22use crate::cfg_flag::CfgFlag;
23 18
24pub use crate::{ 19pub use crate::{
25 cargo_workspace::{CargoConfig, CargoWorkspace, Package, Target, TargetKind}, 20 cargo_workspace::{CargoConfig, CargoWorkspace, Package, Target, TargetKind},
26 project_json::{ProjectJson, ProjectJsonData}, 21 project_json::{ProjectJson, ProjectJsonData},
27 sysroot::Sysroot, 22 sysroot::Sysroot,
23 workspace::{PackageRoot, ProjectWorkspace},
28}; 24};
29 25
30pub use proc_macro_api::ProcMacroClient; 26pub use proc_macro_api::ProcMacroClient;
31 27
32#[derive(Clone, Eq, PartialEq)]
33pub enum ProjectWorkspace {
34 /// Project workspace was discovered by running `cargo metadata` and `rustc --print sysroot`.
35 Cargo { cargo: CargoWorkspace, sysroot: Sysroot, rustc: Option<CargoWorkspace> },
36 /// Project workspace was manually specified using a `rust-project.json` file.
37 Json { project: ProjectJson, sysroot: Option<Sysroot> },
38}
39
40impl fmt::Debug for ProjectWorkspace {
41 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
42 match self {
43 ProjectWorkspace::Cargo { cargo, sysroot, rustc } => f
44 .debug_struct("Cargo")
45 .field("n_packages", &cargo.packages().len())
46 .field("n_sysroot_crates", &sysroot.crates().len())
47 .field(
48 "n_rustc_compiler_crates",
49 &rustc.as_ref().map_or(0, |rc| rc.packages().len()),
50 )
51 .finish(),
52 ProjectWorkspace::Json { project, sysroot } => {
53 let mut debug_struct = f.debug_struct("Json");
54 debug_struct.field("n_crates", &project.n_crates());
55 if let Some(sysroot) = sysroot {
56 debug_struct.field("n_sysroot_crates", &sysroot.crates().len());
57 }
58 debug_struct.finish()
59 }
60 }
61 }
62}
63
64/// `PackageRoot` describes a package root folder.
65/// Which may be an external dependency, or a member of
66/// the current workspace.
67#[derive(Debug, Clone, Eq, PartialEq, Hash)]
68pub struct PackageRoot {
69 /// Is a member of the current workspace
70 pub is_member: bool,
71 pub include: Vec<AbsPathBuf>,
72 pub exclude: Vec<AbsPathBuf>,
73}
74
75#[derive(Debug, Clone, PartialEq, Eq, Hash, Ord, PartialOrd)] 28#[derive(Debug, Clone, PartialEq, Eq, Hash, Ord, PartialOrd)]
76pub enum ProjectManifest { 29pub enum ProjectManifest {
77 ProjectJson(AbsPathBuf), 30 ProjectJson(AbsPathBuf),
@@ -158,462 +111,6 @@ impl ProjectManifest {
158 } 111 }
159} 112}
160 113
161impl ProjectWorkspace {
162 pub fn load(
163 manifest: ProjectManifest,
164 cargo_config: &CargoConfig,
165 with_sysroot: bool,
166 ) -> Result<ProjectWorkspace> {
167 let res = match manifest {
168 ProjectManifest::ProjectJson(project_json) => {
169 let file = fs::read_to_string(&project_json).with_context(|| {
170 format!("Failed to read json file {}", project_json.display())
171 })?;
172 let data = serde_json::from_str(&file).with_context(|| {
173 format!("Failed to deserialize json file {}", project_json.display())
174 })?;
175 let project_location = project_json.parent().unwrap().to_path_buf();
176 let project = ProjectJson::new(&project_location, data);
177 let sysroot = match &project.sysroot_src {
178 Some(path) => Some(Sysroot::load(path)?),
179 None => None,
180 };
181 ProjectWorkspace::Json { project, sysroot }
182 }
183 ProjectManifest::CargoToml(cargo_toml) => {
184 let cargo_version = utf8_stdout({
185 let mut cmd = Command::new(toolchain::cargo());
186 cmd.arg("--version");
187 cmd
188 })?;
189
190 let cargo = CargoWorkspace::from_cargo_metadata(&cargo_toml, cargo_config)
191 .with_context(|| {
192 format!(
193 "Failed to read Cargo metadata from Cargo.toml file {}, {}",
194 cargo_toml.display(),
195 cargo_version
196 )
197 })?;
198 let sysroot = if with_sysroot {
199 Sysroot::discover(&cargo_toml).with_context(|| {
200 format!(
201 "Failed to find sysroot for Cargo.toml file {}. Is rust-src installed?",
202 cargo_toml.display()
203 )
204 })?
205 } else {
206 Sysroot::default()
207 };
208
209 let rustc = if let Some(rustc_dir) = &cargo_config.rustc_source {
210 Some(
211 CargoWorkspace::from_cargo_metadata(&rustc_dir, cargo_config)
212 .with_context(|| {
213 format!("Failed to read Cargo metadata for Rust sources")
214 })?,
215 )
216 } else {
217 None
218 };
219
220 ProjectWorkspace::Cargo { cargo, sysroot, rustc }
221 }
222 };
223
224 Ok(res)
225 }
226
227 pub fn load_inline(project_json: ProjectJson) -> Result<ProjectWorkspace> {
228 let sysroot = match &project_json.sysroot_src {
229 Some(path) => Some(Sysroot::load(path)?),
230 None => None,
231 };
232
233 Ok(ProjectWorkspace::Json { project: project_json, sysroot })
234 }
235
236 /// Returns the roots for the current `ProjectWorkspace`
237 /// The return type contains the path and whether or not
238 /// the root is a member of the current workspace
239 pub fn to_roots(&self) -> Vec<PackageRoot> {
240 match self {
241 ProjectWorkspace::Json { project, sysroot } => project
242 .crates()
243 .map(|(_, krate)| PackageRoot {
244 is_member: krate.is_workspace_member,
245 include: krate.include.clone(),
246 exclude: krate.exclude.clone(),
247 })
248 .collect::<FxHashSet<_>>()
249 .into_iter()
250 .chain(sysroot.as_ref().into_iter().flat_map(|sysroot| {
251 sysroot.crates().map(move |krate| PackageRoot {
252 is_member: false,
253 include: vec![sysroot[krate].root_dir().to_path_buf()],
254 exclude: Vec::new(),
255 })
256 }))
257 .collect::<Vec<_>>(),
258 ProjectWorkspace::Cargo { cargo, sysroot, rustc } => {
259 let roots = cargo
260 .packages()
261 .map(|pkg| {
262 let is_member = cargo[pkg].is_member;
263 let pkg_root = cargo[pkg].root().to_path_buf();
264
265 let mut include = vec![pkg_root.clone()];
266 include.extend(cargo[pkg].out_dir.clone());
267
268 let mut exclude = vec![pkg_root.join(".git")];
269 if is_member {
270 exclude.push(pkg_root.join("target"));
271 } else {
272 exclude.push(pkg_root.join("tests"));
273 exclude.push(pkg_root.join("examples"));
274 exclude.push(pkg_root.join("benches"));
275 }
276 PackageRoot { is_member, include, exclude }
277 })
278 .chain(sysroot.crates().map(|krate| PackageRoot {
279 is_member: false,
280 include: vec![sysroot[krate].root_dir().to_path_buf()],
281 exclude: Vec::new(),
282 }));
283 if let Some(rustc_packages) = rustc {
284 roots
285 .chain(rustc_packages.packages().map(|krate| PackageRoot {
286 is_member: false,
287 include: vec![rustc_packages[krate].root().to_path_buf()],
288 exclude: Vec::new(),
289 }))
290 .collect()
291 } else {
292 roots.collect()
293 }
294 }
295 }
296 }
297
298 pub fn proc_macro_dylib_paths(&self) -> Vec<AbsPathBuf> {
299 match self {
300 ProjectWorkspace::Json { project, sysroot: _ } => project
301 .crates()
302 .filter_map(|(_, krate)| krate.proc_macro_dylib_path.as_ref())
303 .cloned()
304 .collect(),
305 ProjectWorkspace::Cargo { cargo, sysroot: _sysroot, rustc: _rustc_crates } => cargo
306 .packages()
307 .filter_map(|pkg| cargo[pkg].proc_macro_dylib_path.as_ref())
308 .cloned()
309 .collect(),
310 }
311 }
312
313 pub fn n_packages(&self) -> usize {
314 match self {
315 ProjectWorkspace::Json { project, .. } => project.n_crates(),
316 ProjectWorkspace::Cargo { cargo, sysroot, rustc } => {
317 let rustc_package_len = rustc.as_ref().map_or(0, |rc| rc.packages().len());
318 cargo.packages().len() + sysroot.crates().len() + rustc_package_len
319 }
320 }
321 }
322
323 pub fn to_crate_graph(
324 &self,
325 target: Option<&str>,
326 proc_macro_client: &ProcMacroClient,
327 load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
328 ) -> CrateGraph {
329 let mut crate_graph = CrateGraph::default();
330 match self {
331 ProjectWorkspace::Json { project, sysroot } => {
332 let sysroot_dps = sysroot
333 .as_ref()
334 .map(|sysroot| sysroot_to_crate_graph(&mut crate_graph, sysroot, target, load));
335
336 let mut cfg_cache: FxHashMap<Option<&str>, Vec<CfgFlag>> = FxHashMap::default();
337 let crates: FxHashMap<_, _> = project
338 .crates()
339 .filter_map(|(crate_id, krate)| {
340 let file_path = &krate.root_module;
341 let file_id = match load(&file_path) {
342 Some(id) => id,
343 None => {
344 log::error!("failed to load crate root {}", file_path.display());
345 return None;
346 }
347 };
348
349 let env = krate.env.clone().into_iter().collect();
350 let proc_macro = krate
351 .proc_macro_dylib_path
352 .clone()
353 .map(|it| proc_macro_client.by_dylib_path(&it));
354
355 let target = krate.target.as_deref().or(target);
356 let target_cfgs = cfg_cache
357 .entry(target)
358 .or_insert_with(|| get_rustc_cfg_options(target));
359
360 let mut cfg_options = CfgOptions::default();
361 cfg_options.extend(target_cfgs.iter().chain(krate.cfg.iter()).cloned());
362
363 Some((
364 crate_id,
365 crate_graph.add_crate_root(
366 file_id,
367 krate.edition,
368 krate.display_name.clone(),
369 cfg_options,
370 env,
371 proc_macro.unwrap_or_default(),
372 ),
373 ))
374 })
375 .collect();
376
377 for (from, krate) in project.crates() {
378 if let Some(&from) = crates.get(&from) {
379 if let Some((public_deps, _proc_macro)) = &sysroot_dps {
380 for (name, to) in public_deps.iter() {
381 if let Err(_) = crate_graph.add_dep(from, name.clone(), *to) {
382 log::error!("cyclic dependency on {} for {:?}", name, from)
383 }
384 }
385 }
386
387 for dep in &krate.deps {
388 let to_crate_id = dep.crate_id;
389 if let Some(&to) = crates.get(&to_crate_id) {
390 if let Err(_) = crate_graph.add_dep(from, dep.name.clone(), to) {
391 log::error!("cyclic dependency {:?} -> {:?}", from, to);
392 }
393 }
394 }
395 }
396 }
397 }
398 ProjectWorkspace::Cargo { cargo, sysroot, rustc } => {
399 let (public_deps, libproc_macro) =
400 sysroot_to_crate_graph(&mut crate_graph, sysroot, target, load);
401
402 let mut cfg_options = CfgOptions::default();
403 cfg_options.extend(get_rustc_cfg_options(target));
404
405 let mut pkg_to_lib_crate = FxHashMap::default();
406
407 // Add test cfg for non-sysroot crates
408 cfg_options.insert_atom("test".into());
409 cfg_options.insert_atom("debug_assertions".into());
410
411 let mut pkg_crates = FxHashMap::default();
412
413 // Next, create crates for each package, target pair
414 for pkg in cargo.packages() {
415 let mut lib_tgt = None;
416 for &tgt in cargo[pkg].targets.iter() {
417 if let Some(crate_id) = add_target_crate_root(
418 &mut crate_graph,
419 &cargo[pkg],
420 &cargo[tgt],
421 &cfg_options,
422 proc_macro_client,
423 load,
424 ) {
425 if cargo[tgt].kind == TargetKind::Lib {
426 lib_tgt = Some((crate_id, cargo[tgt].name.clone()));
427 pkg_to_lib_crate.insert(pkg, crate_id);
428 }
429 if cargo[tgt].is_proc_macro {
430 if let Some(proc_macro) = libproc_macro {
431 if let Err(_) = crate_graph.add_dep(
432 crate_id,
433 CrateName::new("proc_macro").unwrap(),
434 proc_macro,
435 ) {
436 log::error!(
437 "cyclic dependency on proc_macro for {}",
438 &cargo[pkg].name
439 )
440 }
441 }
442 }
443
444 pkg_crates.entry(pkg).or_insert_with(Vec::new).push(crate_id);
445 }
446 }
447
448 // Set deps to the core, std and to the lib target of the current package
449 for &from in pkg_crates.get(&pkg).into_iter().flatten() {
450 if let Some((to, name)) = lib_tgt.clone() {
451 // For root projects with dashes in their name,
452 // cargo metadata does not do any normalization,
453 // so we do it ourselves currently
454 let name = CrateName::normalize_dashes(&name);
455 if to != from && crate_graph.add_dep(from, name, to).is_err() {
456 log::error!(
457 "cyclic dependency between targets of {}",
458 &cargo[pkg].name
459 )
460 }
461 }
462 for (name, krate) in public_deps.iter() {
463 if let Err(_) = crate_graph.add_dep(from, name.clone(), *krate) {
464 log::error!(
465 "cyclic dependency on {} for {}",
466 name,
467 &cargo[pkg].name
468 )
469 }
470 }
471 }
472 }
473
474 // Now add a dep edge from all targets of upstream to the lib
475 // target of downstream.
476 for pkg in cargo.packages() {
477 for dep in cargo[pkg].dependencies.iter() {
478 let name = CrateName::new(&dep.name).unwrap();
479 if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) {
480 for &from in pkg_crates.get(&pkg).into_iter().flatten() {
481 if let Err(_) = crate_graph.add_dep(from, name.clone(), to) {
482 log::error!(
483 "cyclic dependency {} -> {}",
484 &cargo[pkg].name,
485 &cargo[dep.pkg].name
486 )
487 }
488 }
489 }
490 }
491 }
492
493 let mut rustc_pkg_crates = FxHashMap::default();
494
495 // If the user provided a path to rustc sources, we add all the rustc_private crates
496 // and create dependencies on them for the crates in the current workspace
497 if let Some(rustc_workspace) = rustc {
498 for pkg in rustc_workspace.packages() {
499 for &tgt in rustc_workspace[pkg].targets.iter() {
500 if rustc_workspace[tgt].kind != TargetKind::Lib {
501 continue;
502 }
503 // Exclude alloc / core / std
504 if rustc_workspace[tgt]
505 .root
506 .components()
507 .any(|c| c == Component::Normal("library".as_ref()))
508 {
509 continue;
510 }
511
512 if let Some(crate_id) = add_target_crate_root(
513 &mut crate_graph,
514 &rustc_workspace[pkg],
515 &rustc_workspace[tgt],
516 &cfg_options,
517 proc_macro_client,
518 load,
519 ) {
520 pkg_to_lib_crate.insert(pkg, crate_id);
521 // Add dependencies on the core / std / alloc for rustc
522 for (name, krate) in public_deps.iter() {
523 if let Err(_) =
524 crate_graph.add_dep(crate_id, name.clone(), *krate)
525 {
526 log::error!(
527 "cyclic dependency on {} for {}",
528 name,
529 &cargo[pkg].name
530 )
531 }
532 }
533 rustc_pkg_crates.entry(pkg).or_insert_with(Vec::new).push(crate_id);
534 }
535 }
536 }
537 // Now add a dep edge from all targets of upstream to the lib
538 // target of downstream.
539 for pkg in rustc_workspace.packages() {
540 for dep in rustc_workspace[pkg].dependencies.iter() {
541 let name = CrateName::new(&dep.name).unwrap();
542 if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) {
543 for &from in rustc_pkg_crates.get(&pkg).into_iter().flatten() {
544 if let Err(_) = crate_graph.add_dep(from, name.clone(), to) {
545 log::error!(
546 "cyclic dependency {} -> {}",
547 &rustc_workspace[pkg].name,
548 &rustc_workspace[dep.pkg].name
549 )
550 }
551 }
552 }
553 }
554 }
555
556 // Add dependencies for all the crates of the current workspace to rustc_private libraries
557 for dep in rustc_workspace.packages() {
558 let name = CrateName::normalize_dashes(&rustc_workspace[dep].name);
559
560 if let Some(&to) = pkg_to_lib_crate.get(&dep) {
561 for pkg in cargo.packages() {
562 if !cargo[pkg].is_member {
563 continue;
564 }
565 for &from in pkg_crates.get(&pkg).into_iter().flatten() {
566 if let Err(_) = crate_graph.add_dep(from, name.clone(), to) {
567 log::error!(
568 "cyclic dependency {} -> {}",
569 &cargo[pkg].name,
570 &rustc_workspace[dep].name
571 )
572 }
573 }
574 }
575 }
576 }
577 }
578 }
579 }
580 if crate_graph.patch_cfg_if() {
581 log::debug!("Patched std to depend on cfg-if")
582 } else {
583 log::debug!("Did not patch std to depend on cfg-if")
584 }
585 crate_graph
586 }
587}
588
589fn get_rustc_cfg_options(target: Option<&str>) -> Vec<CfgFlag> {
590 let mut res = Vec::new();
591
592 // Some nightly-only cfgs, which are required for stdlib
593 res.push(CfgFlag::Atom("target_thread_local".into()));
594 for &ty in ["8", "16", "32", "64", "cas", "ptr"].iter() {
595 for &key in ["target_has_atomic", "target_has_atomic_load_store"].iter() {
596 res.push(CfgFlag::KeyValue { key: key.to_string(), value: ty.into() });
597 }
598 }
599
600 let rustc_cfgs = {
601 let mut cmd = Command::new(toolchain::rustc());
602 cmd.args(&["--print", "cfg", "-O"]);
603 if let Some(target) = target {
604 cmd.args(&["--target", target]);
605 }
606 utf8_stdout(cmd)
607 };
608
609 match rustc_cfgs {
610 Ok(rustc_cfgs) => res.extend(rustc_cfgs.lines().map(|it| it.parse().unwrap())),
611 Err(e) => log::error!("failed to get rustc cfgs: {:#}", e),
612 }
613
614 res
615}
616
617fn utf8_stdout(mut cmd: Command) -> Result<String> { 114fn utf8_stdout(mut cmd: Command) -> Result<String> {
618 let output = cmd.output().with_context(|| format!("{:?} failed", cmd))?; 115 let output = cmd.output().with_context(|| format!("{:?} failed", cmd))?;
619 if !output.status.success() { 116 if !output.status.success() {
@@ -627,98 +124,3 @@ fn utf8_stdout(mut cmd: Command) -> Result<String> {
627 let stdout = String::from_utf8(output.stdout)?; 124 let stdout = String::from_utf8(output.stdout)?;
628 Ok(stdout.trim().to_string()) 125 Ok(stdout.trim().to_string())
629} 126}
630
631fn add_target_crate_root(
632 crate_graph: &mut CrateGraph,
633 pkg: &cargo_workspace::PackageData,
634 tgt: &cargo_workspace::TargetData,
635 cfg_options: &CfgOptions,
636 proc_macro_client: &ProcMacroClient,
637 load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
638) -> Option<CrateId> {
639 let root = tgt.root.as_path();
640 if let Some(file_id) = load(root) {
641 let edition = pkg.edition;
642 let cfg_options = {
643 let mut opts = cfg_options.clone();
644 for feature in pkg.features.iter() {
645 opts.insert_key_value("feature".into(), feature.into());
646 }
647 opts.extend(pkg.cfgs.iter().cloned());
648 opts
649 };
650 let mut env = Env::default();
651 if let Some(out_dir) = &pkg.out_dir {
652 // NOTE: cargo and rustc seem to hide non-UTF-8 strings from env! and option_env!()
653 if let Some(out_dir) = out_dir.to_str().map(|s| s.to_owned()) {
654 env.set("OUT_DIR", out_dir);
655 }
656 }
657 let proc_macro = pkg
658 .proc_macro_dylib_path
659 .as_ref()
660 .map(|it| proc_macro_client.by_dylib_path(&it))
661 .unwrap_or_default();
662
663 let display_name = CrateDisplayName::from_canonical_name(pkg.name.clone());
664 let crate_id = crate_graph.add_crate_root(
665 file_id,
666 edition,
667 Some(display_name),
668 cfg_options,
669 env,
670 proc_macro.clone(),
671 );
672
673 return Some(crate_id);
674 }
675 None
676}
677fn sysroot_to_crate_graph(
678 crate_graph: &mut CrateGraph,
679 sysroot: &Sysroot,
680 target: Option<&str>,
681 load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
682) -> (Vec<(CrateName, CrateId)>, Option<CrateId>) {
683 let mut cfg_options = CfgOptions::default();
684 cfg_options.extend(get_rustc_cfg_options(target));
685 let sysroot_crates: FxHashMap<_, _> = sysroot
686 .crates()
687 .filter_map(|krate| {
688 let file_id = load(&sysroot[krate].root)?;
689
690 let env = Env::default();
691 let proc_macro = vec![];
692 let name = CrateName::new(&sysroot[krate].name)
693 .expect("Sysroot crates' names do not contain dashes");
694 let crate_id = crate_graph.add_crate_root(
695 file_id,
696 Edition::Edition2018,
697 Some(name.into()),
698 cfg_options.clone(),
699 env,
700 proc_macro,
701 );
702 Some((krate, crate_id))
703 })
704 .collect();
705
706 for from in sysroot.crates() {
707 for &to in sysroot[from].deps.iter() {
708 let name = CrateName::new(&sysroot[to].name).unwrap();
709 if let (Some(&from), Some(&to)) = (sysroot_crates.get(&from), sysroot_crates.get(&to)) {
710 if let Err(_) = crate_graph.add_dep(from, name, to) {
711 log::error!("cyclic dependency between sysroot crates")
712 }
713 }
714 }
715 }
716
717 let public_deps = sysroot
718 .public_deps()
719 .map(|(name, idx)| (CrateName::new(name).unwrap(), sysroot_crates[&idx]))
720 .collect::<Vec<_>>();
721
722 let libproc_macro = sysroot.proc_macro().and_then(|it| sysroot_crates.get(&it).copied());
723 (public_deps, libproc_macro)
724}
diff --git a/crates/project_model/src/workspace.rs b/crates/project_model/src/workspace.rs
new file mode 100644
index 000000000..9ebb0a811
--- /dev/null
+++ b/crates/project_model/src/workspace.rs
@@ -0,0 +1,590 @@
1//! Handles lowering of build-system specific workspace information (`cargo
2//! metadata` or `rust-project.json`) into representation stored in the salsa
3//! database -- `CrateGraph`.
4
5use std::{fmt, fs, path::Component, process::Command};
6
7use anyhow::{Context, Result};
8use base_db::{CrateDisplayName, CrateGraph, CrateId, CrateName, Edition, Env, FileId};
9use cfg::CfgOptions;
10use paths::{AbsPath, AbsPathBuf};
11use proc_macro_api::ProcMacroClient;
12use rustc_hash::{FxHashMap, FxHashSet};
13
14use crate::{
15 cargo_workspace, cfg_flag::CfgFlag, utf8_stdout, CargoConfig, CargoWorkspace, ProjectJson,
16 ProjectManifest, Sysroot, TargetKind,
17};
18
19/// `PackageRoot` describes a package root folder.
20/// Which may be an external dependency, or a member of
21/// the current workspace.
22#[derive(Debug, Clone, Eq, PartialEq, Hash)]
23pub struct PackageRoot {
24 /// Is a member of the current workspace
25 pub is_member: bool,
26 pub include: Vec<AbsPathBuf>,
27 pub exclude: Vec<AbsPathBuf>,
28}
29
30#[derive(Clone, Eq, PartialEq)]
31pub enum ProjectWorkspace {
32 /// Project workspace was discovered by running `cargo metadata` and `rustc --print sysroot`.
33 Cargo { cargo: CargoWorkspace, sysroot: Sysroot, rustc: Option<CargoWorkspace> },
34 /// Project workspace was manually specified using a `rust-project.json` file.
35 Json { project: ProjectJson, sysroot: Option<Sysroot> },
36}
37
38impl fmt::Debug for ProjectWorkspace {
39 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
40 match self {
41 ProjectWorkspace::Cargo { cargo, sysroot, rustc } => f
42 .debug_struct("Cargo")
43 .field("n_packages", &cargo.packages().len())
44 .field("n_sysroot_crates", &sysroot.crates().len())
45 .field(
46 "n_rustc_compiler_crates",
47 &rustc.as_ref().map_or(0, |rc| rc.packages().len()),
48 )
49 .finish(),
50 ProjectWorkspace::Json { project, sysroot } => {
51 let mut debug_struct = f.debug_struct("Json");
52 debug_struct.field("n_crates", &project.n_crates());
53 if let Some(sysroot) = sysroot {
54 debug_struct.field("n_sysroot_crates", &sysroot.crates().len());
55 }
56 debug_struct.finish()
57 }
58 }
59 }
60}
61
62impl ProjectWorkspace {
63 pub fn load(manifest: ProjectManifest, config: &CargoConfig) -> Result<ProjectWorkspace> {
64 let res = match manifest {
65 ProjectManifest::ProjectJson(project_json) => {
66 let file = fs::read_to_string(&project_json).with_context(|| {
67 format!("Failed to read json file {}", project_json.display())
68 })?;
69 let data = serde_json::from_str(&file).with_context(|| {
70 format!("Failed to deserialize json file {}", project_json.display())
71 })?;
72 let project_location = project_json.parent().unwrap().to_path_buf();
73 let project = ProjectJson::new(&project_location, data);
74 let sysroot = match &project.sysroot_src {
75 Some(path) => Some(Sysroot::load(path)?),
76 None => None,
77 };
78 ProjectWorkspace::Json { project, sysroot }
79 }
80 ProjectManifest::CargoToml(cargo_toml) => {
81 let cargo_version = utf8_stdout({
82 let mut cmd = Command::new(toolchain::cargo());
83 cmd.arg("--version");
84 cmd
85 })?;
86
87 let cargo = CargoWorkspace::from_cargo_metadata(&cargo_toml, config).with_context(
88 || {
89 format!(
90 "Failed to read Cargo metadata from Cargo.toml file {}, {}",
91 cargo_toml.display(),
92 cargo_version
93 )
94 },
95 )?;
96 let sysroot = if config.no_sysroot {
97 Sysroot::default()
98 } else {
99 Sysroot::discover(&cargo_toml).with_context(|| {
100 format!(
101 "Failed to find sysroot for Cargo.toml file {}. Is rust-src installed?",
102 cargo_toml.display()
103 )
104 })?
105 };
106
107 let rustc = if let Some(rustc_dir) = &config.rustc_source {
108 Some(CargoWorkspace::from_cargo_metadata(&rustc_dir, config).with_context(
109 || format!("Failed to read Cargo metadata for Rust sources"),
110 )?)
111 } else {
112 None
113 };
114
115 ProjectWorkspace::Cargo { cargo, sysroot, rustc }
116 }
117 };
118
119 Ok(res)
120 }
121
122 pub fn load_inline(project_json: ProjectJson) -> Result<ProjectWorkspace> {
123 let sysroot = match &project_json.sysroot_src {
124 Some(path) => Some(Sysroot::load(path)?),
125 None => None,
126 };
127
128 Ok(ProjectWorkspace::Json { project: project_json, sysroot })
129 }
130
131 /// Returns the roots for the current `ProjectWorkspace`
132 /// The return type contains the path and whether or not
133 /// the root is a member of the current workspace
134 pub fn to_roots(&self) -> Vec<PackageRoot> {
135 match self {
136 ProjectWorkspace::Json { project, sysroot } => project
137 .crates()
138 .map(|(_, krate)| PackageRoot {
139 is_member: krate.is_workspace_member,
140 include: krate.include.clone(),
141 exclude: krate.exclude.clone(),
142 })
143 .collect::<FxHashSet<_>>()
144 .into_iter()
145 .chain(sysroot.as_ref().into_iter().flat_map(|sysroot| {
146 sysroot.crates().map(move |krate| PackageRoot {
147 is_member: false,
148 include: vec![sysroot[krate].root_dir().to_path_buf()],
149 exclude: Vec::new(),
150 })
151 }))
152 .collect::<Vec<_>>(),
153 ProjectWorkspace::Cargo { cargo, sysroot, rustc } => {
154 let roots = cargo
155 .packages()
156 .map(|pkg| {
157 let is_member = cargo[pkg].is_member;
158 let pkg_root = cargo[pkg].root().to_path_buf();
159
160 let mut include = vec![pkg_root.clone()];
161 include.extend(cargo[pkg].out_dir.clone());
162
163 let mut exclude = vec![pkg_root.join(".git")];
164 if is_member {
165 exclude.push(pkg_root.join("target"));
166 } else {
167 exclude.push(pkg_root.join("tests"));
168 exclude.push(pkg_root.join("examples"));
169 exclude.push(pkg_root.join("benches"));
170 }
171 PackageRoot { is_member, include, exclude }
172 })
173 .chain(sysroot.crates().map(|krate| PackageRoot {
174 is_member: false,
175 include: vec![sysroot[krate].root_dir().to_path_buf()],
176 exclude: Vec::new(),
177 }));
178 if let Some(rustc_packages) = rustc {
179 roots
180 .chain(rustc_packages.packages().map(|krate| PackageRoot {
181 is_member: false,
182 include: vec![rustc_packages[krate].root().to_path_buf()],
183 exclude: Vec::new(),
184 }))
185 .collect()
186 } else {
187 roots.collect()
188 }
189 }
190 }
191 }
192
193 pub fn n_packages(&self) -> usize {
194 match self {
195 ProjectWorkspace::Json { project, .. } => project.n_crates(),
196 ProjectWorkspace::Cargo { cargo, sysroot, rustc } => {
197 let rustc_package_len = rustc.as_ref().map_or(0, |rc| rc.packages().len());
198 cargo.packages().len() + sysroot.crates().len() + rustc_package_len
199 }
200 }
201 }
202
203 pub fn to_crate_graph(
204 &self,
205 target: Option<&str>,
206 proc_macro_client: &ProcMacroClient,
207 load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
208 ) -> CrateGraph {
209 let mut crate_graph = CrateGraph::default();
210 match self {
211 ProjectWorkspace::Json { project, sysroot } => {
212 let sysroot_dps = sysroot
213 .as_ref()
214 .map(|sysroot| sysroot_to_crate_graph(&mut crate_graph, sysroot, target, load));
215
216 let mut cfg_cache: FxHashMap<Option<&str>, Vec<CfgFlag>> = FxHashMap::default();
217 let crates: FxHashMap<_, _> = project
218 .crates()
219 .filter_map(|(crate_id, krate)| {
220 let file_path = &krate.root_module;
221 let file_id = match load(&file_path) {
222 Some(id) => id,
223 None => {
224 log::error!("failed to load crate root {}", file_path.display());
225 return None;
226 }
227 };
228
229 let env = krate.env.clone().into_iter().collect();
230 let proc_macro = krate
231 .proc_macro_dylib_path
232 .clone()
233 .map(|it| proc_macro_client.by_dylib_path(&it));
234
235 let target = krate.target.as_deref().or(target);
236 let target_cfgs = cfg_cache
237 .entry(target)
238 .or_insert_with(|| get_rustc_cfg_options(target));
239
240 let mut cfg_options = CfgOptions::default();
241 cfg_options.extend(target_cfgs.iter().chain(krate.cfg.iter()).cloned());
242
243 Some((
244 crate_id,
245 crate_graph.add_crate_root(
246 file_id,
247 krate.edition,
248 krate.display_name.clone(),
249 cfg_options,
250 env,
251 proc_macro.unwrap_or_default(),
252 ),
253 ))
254 })
255 .collect();
256
257 for (from, krate) in project.crates() {
258 if let Some(&from) = crates.get(&from) {
259 if let Some((public_deps, _proc_macro)) = &sysroot_dps {
260 for (name, to) in public_deps.iter() {
261 if let Err(_) = crate_graph.add_dep(from, name.clone(), *to) {
262 log::error!("cyclic dependency on {} for {:?}", name, from)
263 }
264 }
265 }
266
267 for dep in &krate.deps {
268 let to_crate_id = dep.crate_id;
269 if let Some(&to) = crates.get(&to_crate_id) {
270 if let Err(_) = crate_graph.add_dep(from, dep.name.clone(), to) {
271 log::error!("cyclic dependency {:?} -> {:?}", from, to);
272 }
273 }
274 }
275 }
276 }
277 }
278 ProjectWorkspace::Cargo { cargo, sysroot, rustc } => {
279 let (public_deps, libproc_macro) =
280 sysroot_to_crate_graph(&mut crate_graph, sysroot, target, load);
281
282 let mut cfg_options = CfgOptions::default();
283 cfg_options.extend(get_rustc_cfg_options(target));
284
285 let mut pkg_to_lib_crate = FxHashMap::default();
286
287 // Add test cfg for non-sysroot crates
288 cfg_options.insert_atom("test".into());
289 cfg_options.insert_atom("debug_assertions".into());
290
291 let mut pkg_crates = FxHashMap::default();
292
293 // Next, create crates for each package, target pair
294 for pkg in cargo.packages() {
295 let mut lib_tgt = None;
296 for &tgt in cargo[pkg].targets.iter() {
297 if let Some(crate_id) = add_target_crate_root(
298 &mut crate_graph,
299 &cargo[pkg],
300 &cargo[tgt],
301 &cfg_options,
302 proc_macro_client,
303 load,
304 ) {
305 if cargo[tgt].kind == TargetKind::Lib {
306 lib_tgt = Some((crate_id, cargo[tgt].name.clone()));
307 pkg_to_lib_crate.insert(pkg, crate_id);
308 }
309 if cargo[tgt].is_proc_macro {
310 if let Some(proc_macro) = libproc_macro {
311 if let Err(_) = crate_graph.add_dep(
312 crate_id,
313 CrateName::new("proc_macro").unwrap(),
314 proc_macro,
315 ) {
316 log::error!(
317 "cyclic dependency on proc_macro for {}",
318 &cargo[pkg].name
319 )
320 }
321 }
322 }
323
324 pkg_crates.entry(pkg).or_insert_with(Vec::new).push(crate_id);
325 }
326 }
327
328 // Set deps to the core, std and to the lib target of the current package
329 for &from in pkg_crates.get(&pkg).into_iter().flatten() {
330 if let Some((to, name)) = lib_tgt.clone() {
331 // For root projects with dashes in their name,
332 // cargo metadata does not do any normalization,
333 // so we do it ourselves currently
334 let name = CrateName::normalize_dashes(&name);
335 if to != from && crate_graph.add_dep(from, name, to).is_err() {
336 log::error!(
337 "cyclic dependency between targets of {}",
338 &cargo[pkg].name
339 )
340 }
341 }
342 for (name, krate) in public_deps.iter() {
343 if let Err(_) = crate_graph.add_dep(from, name.clone(), *krate) {
344 log::error!(
345 "cyclic dependency on {} for {}",
346 name,
347 &cargo[pkg].name
348 )
349 }
350 }
351 }
352 }
353
354 // Now add a dep edge from all targets of upstream to the lib
355 // target of downstream.
356 for pkg in cargo.packages() {
357 for dep in cargo[pkg].dependencies.iter() {
358 let name = CrateName::new(&dep.name).unwrap();
359 if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) {
360 for &from in pkg_crates.get(&pkg).into_iter().flatten() {
361 if let Err(_) = crate_graph.add_dep(from, name.clone(), to) {
362 log::error!(
363 "cyclic dependency {} -> {}",
364 &cargo[pkg].name,
365 &cargo[dep.pkg].name
366 )
367 }
368 }
369 }
370 }
371 }
372
373 let mut rustc_pkg_crates = FxHashMap::default();
374
375 // If the user provided a path to rustc sources, we add all the rustc_private crates
376 // and create dependencies on them for the crates in the current workspace
377 if let Some(rustc_workspace) = rustc {
378 for pkg in rustc_workspace.packages() {
379 for &tgt in rustc_workspace[pkg].targets.iter() {
380 if rustc_workspace[tgt].kind != TargetKind::Lib {
381 continue;
382 }
383 // Exclude alloc / core / std
384 if rustc_workspace[tgt]
385 .root
386 .components()
387 .any(|c| c == Component::Normal("library".as_ref()))
388 {
389 continue;
390 }
391
392 if let Some(crate_id) = add_target_crate_root(
393 &mut crate_graph,
394 &rustc_workspace[pkg],
395 &rustc_workspace[tgt],
396 &cfg_options,
397 proc_macro_client,
398 load,
399 ) {
400 pkg_to_lib_crate.insert(pkg, crate_id);
401 // Add dependencies on the core / std / alloc for rustc
402 for (name, krate) in public_deps.iter() {
403 if let Err(_) =
404 crate_graph.add_dep(crate_id, name.clone(), *krate)
405 {
406 log::error!(
407 "cyclic dependency on {} for {}",
408 name,
409 &cargo[pkg].name
410 )
411 }
412 }
413 rustc_pkg_crates.entry(pkg).or_insert_with(Vec::new).push(crate_id);
414 }
415 }
416 }
417 // Now add a dep edge from all targets of upstream to the lib
418 // target of downstream.
419 for pkg in rustc_workspace.packages() {
420 for dep in rustc_workspace[pkg].dependencies.iter() {
421 let name = CrateName::new(&dep.name).unwrap();
422 if let Some(&to) = pkg_to_lib_crate.get(&dep.pkg) {
423 for &from in rustc_pkg_crates.get(&pkg).into_iter().flatten() {
424 if let Err(_) = crate_graph.add_dep(from, name.clone(), to) {
425 log::error!(
426 "cyclic dependency {} -> {}",
427 &rustc_workspace[pkg].name,
428 &rustc_workspace[dep.pkg].name
429 )
430 }
431 }
432 }
433 }
434 }
435
436 // Add dependencies for all the crates of the current workspace to rustc_private libraries
437 for dep in rustc_workspace.packages() {
438 let name = CrateName::normalize_dashes(&rustc_workspace[dep].name);
439
440 if let Some(&to) = pkg_to_lib_crate.get(&dep) {
441 for pkg in cargo.packages() {
442 if !cargo[pkg].is_member {
443 continue;
444 }
445 for &from in pkg_crates.get(&pkg).into_iter().flatten() {
446 if let Err(_) = crate_graph.add_dep(from, name.clone(), to) {
447 log::error!(
448 "cyclic dependency {} -> {}",
449 &cargo[pkg].name,
450 &rustc_workspace[dep].name
451 )
452 }
453 }
454 }
455 }
456 }
457 }
458 }
459 }
460 if crate_graph.patch_cfg_if() {
461 log::debug!("Patched std to depend on cfg-if")
462 } else {
463 log::debug!("Did not patch std to depend on cfg-if")
464 }
465 crate_graph
466 }
467}
468
469fn add_target_crate_root(
470 crate_graph: &mut CrateGraph,
471 pkg: &cargo_workspace::PackageData,
472 tgt: &cargo_workspace::TargetData,
473 cfg_options: &CfgOptions,
474 proc_macro_client: &ProcMacroClient,
475 load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
476) -> Option<CrateId> {
477 let root = tgt.root.as_path();
478 if let Some(file_id) = load(root) {
479 let edition = pkg.edition;
480 let cfg_options = {
481 let mut opts = cfg_options.clone();
482 for feature in pkg.features.iter() {
483 opts.insert_key_value("feature".into(), feature.into());
484 }
485 opts.extend(pkg.cfgs.iter().cloned());
486 opts
487 };
488 let mut env = Env::default();
489 if let Some(out_dir) = &pkg.out_dir {
490 // NOTE: cargo and rustc seem to hide non-UTF-8 strings from env! and option_env!()
491 if let Some(out_dir) = out_dir.to_str().map(|s| s.to_owned()) {
492 env.set("OUT_DIR", out_dir);
493 }
494 }
495 let proc_macro = pkg
496 .proc_macro_dylib_path
497 .as_ref()
498 .map(|it| proc_macro_client.by_dylib_path(&it))
499 .unwrap_or_default();
500
501 let display_name = CrateDisplayName::from_canonical_name(pkg.name.clone());
502 let crate_id = crate_graph.add_crate_root(
503 file_id,
504 edition,
505 Some(display_name),
506 cfg_options,
507 env,
508 proc_macro.clone(),
509 );
510
511 return Some(crate_id);
512 }
513 None
514}
515fn sysroot_to_crate_graph(
516 crate_graph: &mut CrateGraph,
517 sysroot: &Sysroot,
518 target: Option<&str>,
519 load: &mut dyn FnMut(&AbsPath) -> Option<FileId>,
520) -> (Vec<(CrateName, CrateId)>, Option<CrateId>) {
521 let mut cfg_options = CfgOptions::default();
522 cfg_options.extend(get_rustc_cfg_options(target));
523 let sysroot_crates: FxHashMap<_, _> = sysroot
524 .crates()
525 .filter_map(|krate| {
526 let file_id = load(&sysroot[krate].root)?;
527
528 let env = Env::default();
529 let proc_macro = vec![];
530 let name = CrateName::new(&sysroot[krate].name)
531 .expect("Sysroot crates' names do not contain dashes");
532 let crate_id = crate_graph.add_crate_root(
533 file_id,
534 Edition::Edition2018,
535 Some(name.into()),
536 cfg_options.clone(),
537 env,
538 proc_macro,
539 );
540 Some((krate, crate_id))
541 })
542 .collect();
543
544 for from in sysroot.crates() {
545 for &to in sysroot[from].deps.iter() {
546 let name = CrateName::new(&sysroot[to].name).unwrap();
547 if let (Some(&from), Some(&to)) = (sysroot_crates.get(&from), sysroot_crates.get(&to)) {
548 if let Err(_) = crate_graph.add_dep(from, name, to) {
549 log::error!("cyclic dependency between sysroot crates")
550 }
551 }
552 }
553 }
554
555 let public_deps = sysroot
556 .public_deps()
557 .map(|(name, idx)| (CrateName::new(name).unwrap(), sysroot_crates[&idx]))
558 .collect::<Vec<_>>();
559
560 let libproc_macro = sysroot.proc_macro().and_then(|it| sysroot_crates.get(&it).copied());
561 (public_deps, libproc_macro)
562}
563
564fn get_rustc_cfg_options(target: Option<&str>) -> Vec<CfgFlag> {
565 let mut res = Vec::new();
566
567 // Some nightly-only cfgs, which are required for stdlib
568 res.push(CfgFlag::Atom("target_thread_local".into()));
569 for &ty in ["8", "16", "32", "64", "cas", "ptr"].iter() {
570 for &key in ["target_has_atomic", "target_has_atomic_load_store"].iter() {
571 res.push(CfgFlag::KeyValue { key: key.to_string(), value: ty.into() });
572 }
573 }
574
575 let rustc_cfgs = {
576 let mut cmd = Command::new(toolchain::rustc());
577 cmd.args(&["--print", "cfg", "-O"]);
578 if let Some(target) = target {
579 cmd.args(&["--target", target]);
580 }
581 utf8_stdout(cmd)
582 };
583
584 match rustc_cfgs {
585 Ok(rustc_cfgs) => res.extend(rustc_cfgs.lines().map(|it| it.parse().unwrap())),
586 Err(e) => log::error!("failed to get rustc cfgs: {:#}", e),
587 }
588
589 res
590}
diff --git a/crates/rust-analyzer/src/cli/load_cargo.rs b/crates/rust-analyzer/src/cli/load_cargo.rs
index ab1e2ab92..76526c66c 100644
--- a/crates/rust-analyzer/src/cli/load_cargo.rs
+++ b/crates/rust-analyzer/src/cli/load_cargo.rs
@@ -21,7 +21,6 @@ pub fn load_cargo(
21 let ws = ProjectWorkspace::load( 21 let ws = ProjectWorkspace::load(
22 root, 22 root,
23 &CargoConfig { load_out_dirs_from_check, ..Default::default() }, 23 &CargoConfig { load_out_dirs_from_check, ..Default::default() },
24 true,
25 )?; 24 )?;
26 25
27 let (sender, receiver) = unbounded(); 26 let (sender, receiver) = unbounded();
diff --git a/crates/rust-analyzer/src/config.rs b/crates/rust-analyzer/src/config.rs
index 74a021dbf..d16796590 100644
--- a/crates/rust-analyzer/src/config.rs
+++ b/crates/rust-analyzer/src/config.rs
@@ -49,7 +49,6 @@ pub struct Config {
49 pub hover: HoverConfig, 49 pub hover: HoverConfig,
50 pub semantic_tokens_refresh: bool, 50 pub semantic_tokens_refresh: bool,
51 51
52 pub with_sysroot: bool,
53 pub linked_projects: Vec<LinkedProject>, 52 pub linked_projects: Vec<LinkedProject>,
54 pub root_path: AbsPathBuf, 53 pub root_path: AbsPathBuf,
55} 54}
@@ -155,7 +154,6 @@ impl Config {
155 Config { 154 Config {
156 client_caps: ClientCapsConfig::default(), 155 client_caps: ClientCapsConfig::default(),
157 156
158 with_sysroot: true,
159 publish_diagnostics: true, 157 publish_diagnostics: true,
160 diagnostics: DiagnosticsConfig::default(), 158 diagnostics: DiagnosticsConfig::default(),
161 diagnostics_map: DiagnosticsMapConfig::default(), 159 diagnostics_map: DiagnosticsMapConfig::default(),
@@ -209,7 +207,6 @@ impl Config {
209 207
210 let data = ConfigData::from_json(json); 208 let data = ConfigData::from_json(json);
211 209
212 self.with_sysroot = data.withSysroot;
213 self.publish_diagnostics = data.diagnostics_enable; 210 self.publish_diagnostics = data.diagnostics_enable;
214 self.diagnostics = DiagnosticsConfig { 211 self.diagnostics = DiagnosticsConfig {
215 disable_experimental: !data.diagnostics_enableExperimental, 212 disable_experimental: !data.diagnostics_enableExperimental,
@@ -246,6 +243,7 @@ impl Config {
246 load_out_dirs_from_check: data.cargo_loadOutDirsFromCheck, 243 load_out_dirs_from_check: data.cargo_loadOutDirsFromCheck,
247 target: data.cargo_target.clone(), 244 target: data.cargo_target.clone(),
248 rustc_source: rustc_source, 245 rustc_source: rustc_source,
246 no_sysroot: data.cargo_noSysroot,
249 }; 247 };
250 self.runnables = RunnablesConfig { 248 self.runnables = RunnablesConfig {
251 override_cargo: data.runnables_overrideCargo, 249 override_cargo: data.runnables_overrideCargo,
@@ -398,13 +396,10 @@ impl Config {
398 } 396 }
399 397
400 if let Some(code_action) = &doc_caps.code_action { 398 if let Some(code_action) = &doc_caps.code_action {
401 match (code_action.data_support, &code_action.resolve_support) { 399 if let Some(resolve_support) = &code_action.resolve_support {
402 (Some(true), Some(resolve_support)) => { 400 if resolve_support.properties.iter().any(|it| it == "edit") {
403 if resolve_support.properties.iter().any(|it| it == "edit") { 401 self.client_caps.code_action_resolve = true;
404 self.client_caps.code_action_resolve = true;
405 }
406 } 402 }
407 _ => (),
408 } 403 }
409 } 404 }
410 } 405 }
@@ -495,6 +490,7 @@ config_data! {
495 cargo_loadOutDirsFromCheck: bool = false, 490 cargo_loadOutDirsFromCheck: bool = false,
496 cargo_noDefaultFeatures: bool = false, 491 cargo_noDefaultFeatures: bool = false,
497 cargo_target: Option<String> = None, 492 cargo_target: Option<String> = None,
493 cargo_noSysroot: bool = false,
498 494
499 checkOnSave_enable: bool = true, 495 checkOnSave_enable: bool = true,
500 checkOnSave_allFeatures: Option<bool> = None, 496 checkOnSave_allFeatures: Option<bool> = None,
@@ -547,7 +543,6 @@ config_data! {
547 rustfmt_extraArgs: Vec<String> = Vec::new(), 543 rustfmt_extraArgs: Vec<String> = Vec::new(),
548 rustfmt_overrideCommand: Option<Vec<String>> = None, 544 rustfmt_overrideCommand: Option<Vec<String>> = None,
549 545
550 withSysroot: bool = true,
551 rustcSource : Option<String> = None, 546 rustcSource : Option<String> = None,
552 } 547 }
553} 548}
diff --git a/crates/rust-analyzer/src/handlers.rs b/crates/rust-analyzer/src/handlers.rs
index 95659b0db..782797e85 100644
--- a/crates/rust-analyzer/src/handlers.rs
+++ b/crates/rust-analyzer/src/handlers.rs
@@ -1322,6 +1322,28 @@ pub(crate) fn handle_open_docs(
1322 Ok(remote.and_then(|remote| Url::parse(&remote).ok())) 1322 Ok(remote.and_then(|remote| Url::parse(&remote).ok()))
1323} 1323}
1324 1324
1325pub(crate) fn handle_open_cargo_toml(
1326 snap: GlobalStateSnapshot,
1327 params: lsp_ext::OpenCargoTomlParams,
1328) -> Result<Option<lsp_types::GotoDefinitionResponse>> {
1329 let _p = profile::span("handle_open_cargo_toml");
1330 let file_id = from_proto::file_id(&snap, &params.text_document.uri)?;
1331 let maybe_cargo_spec = CargoTargetSpec::for_file(&snap, file_id)?;
1332 if maybe_cargo_spec.is_none() {
1333 return Ok(None);
1334 }
1335
1336 let cargo_spec = maybe_cargo_spec.unwrap();
1337 let cargo_toml_path = cargo_spec.workspace_root.join("Cargo.toml");
1338 if !cargo_toml_path.exists() {
1339 return Ok(None);
1340 }
1341 let cargo_toml_url = to_proto::url_from_abs_path(&cargo_toml_path);
1342 let cargo_toml_location = Location::new(cargo_toml_url, Range::default());
1343 let res = lsp_types::GotoDefinitionResponse::from(cargo_toml_location);
1344 Ok(Some(res))
1345}
1346
1325fn implementation_title(count: usize) -> String { 1347fn implementation_title(count: usize) -> String {
1326 if count == 1 { 1348 if count == 1 {
1327 "1 implementation".into() 1349 "1 implementation".into()
diff --git a/crates/rust-analyzer/src/lsp_ext.rs b/crates/rust-analyzer/src/lsp_ext.rs
index a7c3028e4..a5c65fa3e 100644
--- a/crates/rust-analyzer/src/lsp_ext.rs
+++ b/crates/rust-analyzer/src/lsp_ext.rs
@@ -354,3 +354,17 @@ impl Request for ExternalDocs {
354 type Result = Option<lsp_types::Url>; 354 type Result = Option<lsp_types::Url>;
355 const METHOD: &'static str = "experimental/externalDocs"; 355 const METHOD: &'static str = "experimental/externalDocs";
356} 356}
357
358pub enum OpenCargoToml {}
359
360impl Request for OpenCargoToml {
361 type Params = OpenCargoTomlParams;
362 type Result = Option<lsp_types::GotoDefinitionResponse>;
363 const METHOD: &'static str = "experimental/openCargoToml";
364}
365
366#[derive(Serialize, Deserialize, Debug)]
367#[serde(rename_all = "camelCase")]
368pub struct OpenCargoTomlParams {
369 pub text_document: TextDocumentIdentifier,
370}
diff --git a/crates/rust-analyzer/src/main_loop.rs b/crates/rust-analyzer/src/main_loop.rs
index 6e6cac42e..68a53bbcb 100644
--- a/crates/rust-analyzer/src/main_loop.rs
+++ b/crates/rust-analyzer/src/main_loop.rs
@@ -438,6 +438,7 @@ impl GlobalState {
438 .on::<lsp_ext::CodeActionResolveRequest>(handlers::handle_code_action_resolve) 438 .on::<lsp_ext::CodeActionResolveRequest>(handlers::handle_code_action_resolve)
439 .on::<lsp_ext::HoverRequest>(handlers::handle_hover) 439 .on::<lsp_ext::HoverRequest>(handlers::handle_hover)
440 .on::<lsp_ext::ExternalDocs>(handlers::handle_open_docs) 440 .on::<lsp_ext::ExternalDocs>(handlers::handle_open_docs)
441 .on::<lsp_ext::OpenCargoToml>(handlers::handle_open_cargo_toml)
441 .on::<lsp_types::request::OnTypeFormatting>(handlers::handle_on_type_formatting) 442 .on::<lsp_types::request::OnTypeFormatting>(handlers::handle_on_type_formatting)
442 .on::<lsp_types::request::DocumentSymbolRequest>(handlers::handle_document_symbol) 443 .on::<lsp_types::request::DocumentSymbolRequest>(handlers::handle_document_symbol)
443 .on::<lsp_types::request::WorkspaceSymbol>(handlers::handle_workspace_symbol) 444 .on::<lsp_types::request::WorkspaceSymbol>(handlers::handle_workspace_symbol)
diff --git a/crates/rust-analyzer/src/reload.rs b/crates/rust-analyzer/src/reload.rs
index 11c8d0e5f..fa6e09f42 100644
--- a/crates/rust-analyzer/src/reload.rs
+++ b/crates/rust-analyzer/src/reload.rs
@@ -96,17 +96,12 @@ impl GlobalState {
96 self.task_pool.handle.spawn({ 96 self.task_pool.handle.spawn({
97 let linked_projects = self.config.linked_projects.clone(); 97 let linked_projects = self.config.linked_projects.clone();
98 let cargo_config = self.config.cargo.clone(); 98 let cargo_config = self.config.cargo.clone();
99 let with_sysroot = self.config.with_sysroot.clone();
100 move || { 99 move || {
101 let workspaces = linked_projects 100 let workspaces = linked_projects
102 .iter() 101 .iter()
103 .map(|project| match project { 102 .map(|project| match project {
104 LinkedProject::ProjectManifest(manifest) => { 103 LinkedProject::ProjectManifest(manifest) => {
105 project_model::ProjectWorkspace::load( 104 project_model::ProjectWorkspace::load(manifest.clone(), &cargo_config)
106 manifest.clone(),
107 &cargo_config,
108 with_sysroot,
109 )
110 } 105 }
111 LinkedProject::InlineJsonProject(it) => { 106 LinkedProject::InlineJsonProject(it) => {
112 project_model::ProjectWorkspace::load_inline(it.clone()) 107 project_model::ProjectWorkspace::load_inline(it.clone())
diff --git a/crates/rust-analyzer/tests/rust-analyzer/support.rs b/crates/rust-analyzer/tests/rust-analyzer/support.rs
index fe9362bc0..b210b98f0 100644
--- a/crates/rust-analyzer/tests/rust-analyzer/support.rs
+++ b/crates/rust-analyzer/tests/rust-analyzer/support.rs
@@ -12,7 +12,7 @@ use lsp_types::{
12 notification::Exit, request::Shutdown, TextDocumentIdentifier, Url, WorkDoneProgress, 12 notification::Exit, request::Shutdown, TextDocumentIdentifier, Url, WorkDoneProgress,
13}; 13};
14use lsp_types::{ProgressParams, ProgressParamsValue}; 14use lsp_types::{ProgressParams, ProgressParamsValue};
15use project_model::ProjectManifest; 15use project_model::{CargoConfig, ProjectManifest};
16use rust_analyzer::{ 16use rust_analyzer::{
17 config::{ClientCapsConfig, Config, FilesConfig, FilesWatcher, LinkedProject}, 17 config::{ClientCapsConfig, Config, FilesConfig, FilesWatcher, LinkedProject},
18 main_loop, 18 main_loop,
@@ -47,8 +47,8 @@ impl<'a> Project<'a> {
47 self 47 self
48 } 48 }
49 49
50 pub(crate) fn with_sysroot(mut self, sysroot: bool) -> Project<'a> { 50 pub(crate) fn with_sysroot(mut self, yes: bool) -> Project<'a> {
51 self.with_sysroot = sysroot; 51 self.with_sysroot = yes;
52 self 52 self
53 } 53 }
54 54
@@ -90,7 +90,7 @@ impl<'a> Project<'a> {
90 work_done_progress: true, 90 work_done_progress: true,
91 ..Default::default() 91 ..Default::default()
92 }, 92 },
93 with_sysroot: self.with_sysroot, 93 cargo: CargoConfig { no_sysroot: !self.with_sysroot, ..Default::default() },
94 linked_projects, 94 linked_projects,
95 files: FilesConfig { watcher: FilesWatcher::Client, exclude: Vec::new() }, 95 files: FilesConfig { watcher: FilesWatcher::Client, exclude: Vec::new() },
96 ..Config::new(tmp_dir_path) 96 ..Config::new(tmp_dir_path)
diff --git a/docs/dev/lsp-extensions.md b/docs/dev/lsp-extensions.md
index 77d4e0ec9..db9727bee 100644
--- a/docs/dev/lsp-extensions.md
+++ b/docs/dev/lsp-extensions.md
@@ -1,8 +1,8 @@
1<!--- 1<!---
2lsp_ext.rs hash: 4f86fb54e4b2870e 2lsp_ext.rs hash: 9d5daed5b25dc4f6
3 3
4If you need to change the above hash to make the test pass, please check if you 4If you need to change the above hash to make the test pass, please check if you
5need to adjust this doc as well and ping this issue: 5need to adjust this doc as well and ping this issue:
6 6
7 https://github.com/rust-analyzer/rust-analyzer/issues/4604 7 https://github.com/rust-analyzer/rust-analyzer/issues/4604
8 8
@@ -537,3 +537,28 @@ Such actions on the client side are appended to a hover bottom as command links:
537 +-----------------------------+ 537 +-----------------------------+
538 ... 538 ...
539``` 539```
540
541## Open Cargo.toml
542
543**Issue:** https://github.com/rust-analyzer/rust-analyzer/issues/6462
544
545This request is sent from client to server to open the current project's Cargo.toml
546
547**Method:** `experimental/openCargoToml`
548
549**Request:** `OpenCargoTomlParams`
550
551**Response:** `Location | null`
552
553
554### Example
555
556```rust
557// Cargo.toml
558[package]
559// src/main.rs
560
561/* cursor here*/
562```
563
564`experimental/openCargoToml` returns a single `Link` to the start of the `[package]` keyword.
diff --git a/editors/code/package-lock.json b/editors/code/package-lock.json
index 2b6493eef..83ef00058 100644
--- a/editors/code/package-lock.json
+++ b/editors/code/package-lock.json
@@ -1,2752 +1,8 @@
1{ 1{
2 "name": "rust-analyzer", 2 "name": "rust-analyzer",
3 "version": "0.4.0-dev", 3 "version": "0.4.0-dev",
4 "lockfileVersion": 2, 4 "lockfileVersion": 1,
5 "requires": true, 5 "requires": true,
6 "packages": {
7 "": {
8 "name": "rust-analyzer",
9 "version": "0.4.0-dev",
10 "license": "MIT OR Apache-2.0",
11 "dependencies": {
12 "node-fetch": "^2.6.1",
13 "vscode-languageclient": "7.0.0-next.12"
14 },
15 "devDependencies": {
16 "@rollup/plugin-commonjs": "^13.0.2",
17 "@rollup/plugin-node-resolve": "^8.4.0",
18 "@types/glob": "^7.1.3",
19 "@types/mocha": "^7.0.2",
20 "@types/node": "~12.7.0",
21 "@types/node-fetch": "^2.5.7",
22 "@types/vscode": "^1.47.1",
23 "@typescript-eslint/eslint-plugin": "^3.10.1",
24 "@typescript-eslint/parser": "^3.10.1",
25 "eslint": "^7.8.0",
26 "glob": "^7.1.6",
27 "mocha": "^8.1.3",
28 "rollup": "^2.26.9",
29 "tslib": "^2.0.1",
30 "typescript": "^3.9.7",
31 "typescript-formatter": "^7.2.2",
32 "vsce": "^1.79.5",
33 "vscode-test": "^1.4.0"
34 },
35 "engines": {
36 "vscode": "^1.47.1"
37 }
38 },
39 "node_modules/@babel/code-frame": {
40 "version": "7.10.4",
41 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz",
42 "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==",
43 "dev": true,
44 "dependencies": {
45 "@babel/highlight": "^7.10.4"
46 }
47 },
48 "node_modules/@babel/helper-validator-identifier": {
49 "version": "7.10.4",
50 "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz",
51 "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==",
52 "dev": true
53 },
54 "node_modules/@babel/highlight": {
55 "version": "7.10.4",
56 "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz",
57 "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==",
58 "dev": true,
59 "dependencies": {
60 "@babel/helper-validator-identifier": "^7.10.4",
61 "chalk": "^2.0.0",
62 "js-tokens": "^4.0.0"
63 }
64 },
65 "node_modules/@eslint/eslintrc": {
66 "version": "0.1.0",
67 "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.0.tgz",
68 "integrity": "sha512-bfL5365QSCmH6cPeFT7Ywclj8C7LiF7sO6mUGzZhtAMV7iID1Euq6740u/SRi4C80NOnVz/CEfK8/HO+nCAPJg==",
69 "dev": true,
70 "dependencies": {
71 "ajv": "^6.12.4",
72 "debug": "^4.1.1",
73 "import-fresh": "^3.2.1",
74 "strip-json-comments": "^3.1.1"
75 }
76 },
77 "node_modules/@rollup/plugin-commonjs": {
78 "version": "13.0.2",
79 "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-13.0.2.tgz",
80 "integrity": "sha512-9JXf2k8xqvMYfqmhgtB6eCgMN9fbxwF1XDF3mGKJc6pkAmt0jnsqurxQ0tC1akQKNSXCm7c3unQxa3zuxtZ7mQ==",
81 "dev": true,
82 "dependencies": {
83 "@rollup/pluginutils": "^3.0.8",
84 "commondir": "^1.0.1",
85 "estree-walker": "^1.0.1",
86 "glob": "^7.1.2",
87 "is-reference": "^1.1.2",
88 "magic-string": "^0.25.2",
89 "resolve": "^1.11.0"
90 }
91 },
92 "node_modules/@rollup/plugin-node-resolve": {
93 "version": "8.4.0",
94 "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz",
95 "integrity": "sha512-LFqKdRLn0ShtQyf6SBYO69bGE1upV6wUhBX0vFOUnLAyzx5cwp8svA0eHUnu8+YU57XOkrMtfG63QOpQx25pHQ==",
96 "dev": true,
97 "dependencies": {
98 "@rollup/pluginutils": "^3.1.0",
99 "@types/resolve": "1.17.1",
100 "builtin-modules": "^3.1.0",
101 "deep-freeze": "^0.0.1",
102 "deepmerge": "^4.2.2",
103 "is-module": "^1.0.0",
104 "resolve": "^1.17.0"
105 }
106 },
107 "node_modules/@rollup/plugin-node-resolve/node_modules/@rollup/pluginutils": {
108 "version": "3.1.0",
109 "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
110 "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
111 "dev": true,
112 "dependencies": {
113 "@types/estree": "0.0.39",
114 "estree-walker": "^1.0.1",
115 "picomatch": "^2.2.2"
116 }
117 },
118 "node_modules/@rollup/pluginutils": {
119 "version": "3.0.10",
120 "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.10.tgz",
121 "integrity": "sha512-d44M7t+PjmMrASHbhgpSbVgtL6EFyX7J4mYxwQ/c5eoaE6N2VgCgEcWVzNnwycIloti+/MpwFr8qfw+nRw00sw==",
122 "dev": true,
123 "dependencies": {
124 "@types/estree": "0.0.39",
125 "estree-walker": "^1.0.1",
126 "picomatch": "^2.2.2"
127 }
128 },
129 "node_modules/@types/color-name": {
130 "version": "1.1.1",
131 "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz",
132 "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==",
133 "dev": true
134 },
135 "node_modules/@types/eslint-visitor-keys": {
136 "version": "1.0.0",
137 "resolved": "https://registry.npmjs.org/@types/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz",
138 "integrity": "sha512-OCutwjDZ4aFS6PB1UZ988C4YgwlBHJd6wCeQqaLdmadZ/7e+w79+hbMUFC1QXDNCmdyoRfAFdm0RypzwR+Qpag==",
139 "dev": true
140 },
141 "node_modules/@types/estree": {
142 "version": "0.0.39",
143 "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
144 "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
145 "dev": true
146 },
147 "node_modules/@types/glob": {
148 "version": "7.1.3",
149 "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
150 "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==",
151 "dev": true,
152 "dependencies": {
153 "@types/minimatch": "*",
154 "@types/node": "*"
155 }
156 },
157 "node_modules/@types/json-schema": {
158 "version": "7.0.6",
159 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
160 "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
161 "dev": true
162 },
163 "node_modules/@types/minimatch": {
164 "version": "3.0.3",
165 "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
166 "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
167 "dev": true
168 },
169 "node_modules/@types/mocha": {
170 "version": "7.0.2",
171 "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.2.tgz",
172 "integrity": "sha512-ZvO2tAcjmMi8V/5Z3JsyofMe3hasRcaw88cto5etSVMwVQfeivGAlEYmaQgceUSVYFofVjT+ioHsATjdWcFt1w==",
173 "dev": true
174 },
175 "node_modules/@types/node": {
176 "version": "12.7.12",
177 "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.12.tgz",
178 "integrity": "sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ==",
179 "dev": true
180 },
181 "node_modules/@types/node-fetch": {
182 "version": "2.5.7",
183 "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.7.tgz",
184 "integrity": "sha512-o2WVNf5UhWRkxlf6eq+jMZDu7kjgpgJfl4xVNlvryc95O/6F2ld8ztKX+qu+Rjyet93WAWm5LjeX9H5FGkODvw==",
185 "dev": true,
186 "dependencies": {
187 "@types/node": "*",
188 "form-data": "^3.0.0"
189 }
190 },
191 "node_modules/@types/resolve": {
192 "version": "1.17.1",
193 "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
194 "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
195 "dev": true,
196 "dependencies": {
197 "@types/node": "*"
198 }
199 },
200 "node_modules/@types/vscode": {
201 "version": "1.48.0",
202 "resolved": "https://registry.npmjs.org/@types/vscode/-/vscode-1.48.0.tgz",
203 "integrity": "sha512-sZJKzsJz1gSoFXcOJWw3fnKl2sseUgZmvB4AJZS+Fea+bC/jfGPVhmFL/FfQHld/TKtukVONsmoD3Pkyx9iadg==",
204 "dev": true
205 },
206 "node_modules/@typescript-eslint/eslint-plugin": {
207 "version": "3.10.1",
208 "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.10.1.tgz",
209 "integrity": "sha512-PQg0emRtzZFWq6PxBcdxRH3QIQiyFO3WCVpRL3fgj5oQS3CDs3AeAKfv4DxNhzn8ITdNJGJ4D3Qw8eAJf3lXeQ==",
210 "dev": true,
211 "dependencies": {
212 "@typescript-eslint/experimental-utils": "3.10.1",
213 "debug": "^4.1.1",
214 "functional-red-black-tree": "^1.0.1",
215 "regexpp": "^3.0.0",
216 "semver": "^7.3.2",
217 "tsutils": "^3.17.1"
218 }
219 },
220 "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
221 "version": "7.3.2",
222 "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
223 "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
224 "dev": true
225 },
226 "node_modules/@typescript-eslint/experimental-utils": {
227 "version": "3.10.1",
228 "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.10.1.tgz",
229 "integrity": "sha512-DewqIgscDzmAfd5nOGe4zm6Bl7PKtMG2Ad0KG8CUZAHlXfAKTF9Ol5PXhiMh39yRL2ChRH1cuuUGOcVyyrhQIw==",
230 "dev": true,
231 "dependencies": {
232 "@types/json-schema": "^7.0.3",
233 "@typescript-eslint/types": "3.10.1",
234 "@typescript-eslint/typescript-estree": "3.10.1",
235 "eslint-scope": "^5.0.0",
236 "eslint-utils": "^2.0.0"
237 }
238 },
239 "node_modules/@typescript-eslint/parser": {
240 "version": "3.10.1",
241 "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.10.1.tgz",
242 "integrity": "sha512-Ug1RcWcrJP02hmtaXVS3axPPTTPnZjupqhgj+NnZ6BCkwSImWk/283347+x9wN+lqOdK9Eo3vsyiyDHgsmiEJw==",
243 "dev": true,
244 "dependencies": {
245 "@types/eslint-visitor-keys": "^1.0.0",
246 "@typescript-eslint/experimental-utils": "3.10.1",
247 "@typescript-eslint/types": "3.10.1",
248 "@typescript-eslint/typescript-estree": "3.10.1",
249 "eslint-visitor-keys": "^1.1.0"
250 }
251 },
252 "node_modules/@typescript-eslint/types": {
253 "version": "3.10.1",
254 "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-3.10.1.tgz",
255 "integrity": "sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ==",
256 "dev": true
257 },
258 "node_modules/@typescript-eslint/typescript-estree": {
259 "version": "3.10.1",
260 "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.10.1.tgz",
261 "integrity": "sha512-QbcXOuq6WYvnB3XPsZpIwztBoquEYLXh2MtwVU+kO8jgYCiv4G5xrSP/1wg4tkvrEE+esZVquIPX/dxPlePk1w==",
262 "dev": true,
263 "dependencies": {
264 "@typescript-eslint/types": "3.10.1",
265 "@typescript-eslint/visitor-keys": "3.10.1",
266 "debug": "^4.1.1",
267 "glob": "^7.1.6",
268 "is-glob": "^4.0.1",
269 "lodash": "^4.17.15",
270 "semver": "^7.3.2",
271 "tsutils": "^3.17.1"
272 }
273 },
274 "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
275 "version": "7.3.2",
276 "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
277 "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
278 "dev": true
279 },
280 "node_modules/@typescript-eslint/visitor-keys": {
281 "version": "3.10.1",
282 "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-3.10.1.tgz",
283 "integrity": "sha512-9JgC82AaQeglebjZMgYR5wgmfUdUc+EitGUUMW8u2nDckaeimzW+VsoLV6FoimPv2id3VQzfjwBxEMVz08ameQ==",
284 "dev": true,
285 "dependencies": {
286 "eslint-visitor-keys": "^1.1.0"
287 }
288 },
289 "node_modules/acorn": {
290 "version": "7.4.0",
291 "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.0.tgz",
292 "integrity": "sha512-+G7P8jJmCHr+S+cLfQxygbWhXy+8YTVGzAkpEbcLo2mLoL7tij/VG41QSHACSf5QgYRhMZYHuNc6drJaO0Da+w==",
293 "dev": true
294 },
295 "node_modules/acorn-jsx": {
296 "version": "5.2.0",
297 "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz",
298 "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==",
299 "dev": true
300 },
301 "node_modules/agent-base": {
302 "version": "4.3.0",
303 "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz",
304 "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==",
305 "dev": true,
306 "dependencies": {
307 "es6-promisify": "^5.0.0"
308 }
309 },
310 "node_modules/ajv": {
311 "version": "6.12.4",
312 "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.4.tgz",
313 "integrity": "sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==",
314 "dev": true,
315 "dependencies": {
316 "fast-deep-equal": "^3.1.1",
317 "fast-json-stable-stringify": "^2.0.0",
318 "json-schema-traverse": "^0.4.1",
319 "uri-js": "^4.2.2"
320 }
321 },
322 "node_modules/ansi-colors": {
323 "version": "4.1.1",
324 "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
325 "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
326 "dev": true
327 },
328 "node_modules/ansi-regex": {
329 "version": "5.0.0",
330 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
331 "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
332 "dev": true
333 },
334 "node_modules/ansi-styles": {
335 "version": "3.2.1",
336 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
337 "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
338 "dev": true,
339 "dependencies": {
340 "color-convert": "^1.9.0"
341 }
342 },
343 "node_modules/anymatch": {
344 "version": "3.1.1",
345 "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
346 "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
347 "dev": true,
348 "dependencies": {
349 "normalize-path": "^3.0.0",
350 "picomatch": "^2.0.4"
351 }
352 },
353 "node_modules/argparse": {
354 "version": "1.0.10",
355 "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
356 "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
357 "dev": true,
358 "dependencies": {
359 "sprintf-js": "~1.0.2"
360 }
361 },
362 "node_modules/array.prototype.map": {
363 "version": "1.0.2",
364 "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz",
365 "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==",
366 "dev": true,
367 "dependencies": {
368 "define-properties": "^1.1.3",
369 "es-abstract": "^1.17.0-next.1",
370 "es-array-method-boxes-properly": "^1.0.0",
371 "is-string": "^1.0.4"
372 }
373 },
374 "node_modules/astral-regex": {
375 "version": "1.0.0",
376 "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
377 "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
378 "dev": true
379 },
380 "node_modules/asynckit": {
381 "version": "0.4.0",
382 "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
383 "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
384 "dev": true
385 },
386 "node_modules/azure-devops-node-api": {
387 "version": "7.2.0",
388 "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz",
389 "integrity": "sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w==",
390 "dev": true,
391 "dependencies": {
392 "os": "0.1.1",
393 "tunnel": "0.0.4",
394 "typed-rest-client": "1.2.0",
395 "underscore": "1.8.3"
396 }
397 },
398 "node_modules/balanced-match": {
399 "version": "1.0.0",
400 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
401 "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
402 "dev": true
403 },
404 "node_modules/binary-extensions": {
405 "version": "2.1.0",
406 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
407 "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
408 "dev": true
409 },
410 "node_modules/boolbase": {
411 "version": "1.0.0",
412 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
413 "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
414 "dev": true
415 },
416 "node_modules/brace-expansion": {
417 "version": "1.1.11",
418 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
419 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
420 "dev": true,
421 "dependencies": {
422 "balanced-match": "^1.0.0",
423 "concat-map": "0.0.1"
424 }
425 },
426 "node_modules/braces": {
427 "version": "3.0.2",
428 "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
429 "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
430 "dev": true,
431 "dependencies": {
432 "fill-range": "^7.0.1"
433 }
434 },
435 "node_modules/browser-stdout": {
436 "version": "1.3.1",
437 "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
438 "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
439 "dev": true
440 },
441 "node_modules/buffer-crc32": {
442 "version": "0.2.13",
443 "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
444 "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
445 "dev": true
446 },
447 "node_modules/builtin-modules": {
448 "version": "3.1.0",
449 "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz",
450 "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==",
451 "dev": true
452 },
453 "node_modules/callsites": {
454 "version": "3.1.0",
455 "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
456 "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
457 "dev": true
458 },
459 "node_modules/camelcase": {
460 "version": "5.3.1",
461 "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
462 "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
463 "dev": true
464 },
465 "node_modules/chalk": {
466 "version": "2.4.2",
467 "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
468 "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
469 "dev": true,
470 "dependencies": {
471 "ansi-styles": "^3.2.1",
472 "escape-string-regexp": "^1.0.5",
473 "supports-color": "^5.3.0"
474 }
475 },
476 "node_modules/cheerio": {
477 "version": "1.0.0-rc.3",
478 "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz",
479 "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==",
480 "dev": true,
481 "dependencies": {
482 "css-select": "~1.2.0",
483 "dom-serializer": "~0.1.1",
484 "entities": "~1.1.1",
485 "htmlparser2": "^3.9.1",
486 "lodash": "^4.15.0",
487 "parse5": "^3.0.1"
488 }
489 },
490 "node_modules/chokidar": {
491 "version": "3.4.2",
492 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
493 "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
494 "dev": true,
495 "dependencies": {
496 "anymatch": "~3.1.1",
497 "braces": "~3.0.2",
498 "fsevents": "~2.1.2",
499 "glob-parent": "~5.1.0",
500 "is-binary-path": "~2.1.0",
501 "is-glob": "~4.0.1",
502 "normalize-path": "~3.0.0",
503 "readdirp": "~3.4.0"
504 },
505 "optionalDependencies": {
506 "fsevents": "~2.1.2"
507 }
508 },
509 "node_modules/cliui": {
510 "version": "5.0.0",
511 "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
512 "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
513 "dev": true,
514 "dependencies": {
515 "string-width": "^3.1.0",
516 "strip-ansi": "^5.2.0",
517 "wrap-ansi": "^5.1.0"
518 }
519 },
520 "node_modules/cliui/node_modules/ansi-regex": {
521 "version": "4.1.0",
522 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
523 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
524 "dev": true
525 },
526 "node_modules/cliui/node_modules/strip-ansi": {
527 "version": "5.2.0",
528 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
529 "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
530 "dev": true,
531 "dependencies": {
532 "ansi-regex": "^4.1.0"
533 }
534 },
535 "node_modules/color-convert": {
536 "version": "1.9.3",
537 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
538 "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
539 "dev": true,
540 "dependencies": {
541 "color-name": "1.1.3"
542 }
543 },
544 "node_modules/color-name": {
545 "version": "1.1.3",
546 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
547 "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
548 "dev": true
549 },
550 "node_modules/combined-stream": {
551 "version": "1.0.8",
552 "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
553 "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
554 "dev": true,
555 "dependencies": {
556 "delayed-stream": "~1.0.0"
557 }
558 },
559 "node_modules/commander": {
560 "version": "2.20.3",
561 "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
562 "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
563 "dev": true
564 },
565 "node_modules/commandpost": {
566 "version": "1.4.0",
567 "resolved": "https://registry.npmjs.org/commandpost/-/commandpost-1.4.0.tgz",
568 "integrity": "sha512-aE2Y4MTFJ870NuB/+2z1cXBhSBBzRydVVjzhFC4gtenEhpnj15yu0qptWGJsO9YGrcPZ3ezX8AWb1VA391MKpQ==",
569 "dev": true
570 },
571 "node_modules/commondir": {
572 "version": "1.0.1",
573 "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
574 "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
575 "dev": true
576 },
577 "node_modules/concat-map": {
578 "version": "0.0.1",
579 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
580 "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
581 "dev": true
582 },
583 "node_modules/cross-spawn": {
584 "version": "7.0.3",
585 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
586 "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
587 "dev": true,
588 "dependencies": {
589 "path-key": "^3.1.0",
590 "shebang-command": "^2.0.0",
591 "which": "^2.0.1"
592 }
593 },
594 "node_modules/css-select": {
595 "version": "1.2.0",
596 "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
597 "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
598 "dev": true,
599 "dependencies": {
600 "boolbase": "~1.0.0",
601 "css-what": "2.1",
602 "domutils": "1.5.1",
603 "nth-check": "~1.0.1"
604 }
605 },
606 "node_modules/css-what": {
607 "version": "2.1.3",
608 "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
609 "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
610 "dev": true
611 },
612 "node_modules/debug": {
613 "version": "4.1.1",
614 "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
615 "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
616 "dev": true,
617 "dependencies": {
618 "ms": "^2.1.1"
619 }
620 },
621 "node_modules/decamelize": {
622 "version": "1.2.0",
623 "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
624 "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
625 "dev": true
626 },
627 "node_modules/deep-freeze": {
628 "version": "0.0.1",
629 "resolved": "https://registry.npmjs.org/deep-freeze/-/deep-freeze-0.0.1.tgz",
630 "integrity": "sha1-OgsABd4YZygZ39OM0x+RF5yJPoQ=",
631 "dev": true
632 },
633 "node_modules/deep-is": {
634 "version": "0.1.3",
635 "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
636 "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
637 "dev": true
638 },
639 "node_modules/deepmerge": {
640 "version": "4.2.2",
641 "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
642 "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
643 "dev": true
644 },
645 "node_modules/define-properties": {
646 "version": "1.1.3",
647 "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
648 "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
649 "dev": true,
650 "dependencies": {
651 "object-keys": "^1.0.12"
652 }
653 },
654 "node_modules/delayed-stream": {
655 "version": "1.0.0",
656 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
657 "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
658 "dev": true
659 },
660 "node_modules/denodeify": {
661 "version": "1.2.1",
662 "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz",
663 "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=",
664 "dev": true
665 },
666 "node_modules/diff": {
667 "version": "4.0.2",
668 "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
669 "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
670 "dev": true
671 },
672 "node_modules/doctrine": {
673 "version": "3.0.0",
674 "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
675 "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
676 "dev": true,
677 "dependencies": {
678 "esutils": "^2.0.2"
679 }
680 },
681 "node_modules/dom-serializer": {
682 "version": "0.1.1",
683 "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
684 "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
685 "dev": true,
686 "dependencies": {
687 "domelementtype": "^1.3.0",
688 "entities": "^1.1.1"
689 }
690 },
691 "node_modules/domelementtype": {
692 "version": "1.3.1",
693 "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
694 "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
695 "dev": true
696 },
697 "node_modules/domhandler": {
698 "version": "2.4.2",
699 "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
700 "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
701 "dev": true,
702 "dependencies": {
703 "domelementtype": "1"
704 }
705 },
706 "node_modules/domutils": {
707 "version": "1.5.1",
708 "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
709 "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
710 "dev": true,
711 "dependencies": {
712 "dom-serializer": "0",
713 "domelementtype": "1"
714 }
715 },
716 "node_modules/editorconfig": {
717 "version": "0.15.3",
718 "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
719 "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
720 "dev": true,
721 "dependencies": {
722 "commander": "^2.19.0",
723 "lru-cache": "^4.1.5",
724 "semver": "^5.6.0",
725 "sigmund": "^1.0.1"
726 }
727 },
728 "node_modules/editorconfig/node_modules/semver": {
729 "version": "5.7.1",
730 "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
731 "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
732 "dev": true
733 },
734 "node_modules/emoji-regex": {
735 "version": "7.0.3",
736 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
737 "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
738 "dev": true
739 },
740 "node_modules/enquirer": {
741 "version": "2.3.6",
742 "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
743 "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
744 "dev": true,
745 "dependencies": {
746 "ansi-colors": "^4.1.1"
747 }
748 },
749 "node_modules/entities": {
750 "version": "1.1.2",
751 "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
752 "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
753 "dev": true
754 },
755 "node_modules/es-abstract": {
756 "version": "1.17.6",
757 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
758 "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
759 "dev": true,
760 "dependencies": {
761 "es-to-primitive": "^1.2.1",
762 "function-bind": "^1.1.1",
763 "has": "^1.0.3",
764 "has-symbols": "^1.0.1",
765 "is-callable": "^1.2.0",
766 "is-regex": "^1.1.0",
767 "object-inspect": "^1.7.0",
768 "object-keys": "^1.1.1",
769 "object.assign": "^4.1.0",
770 "string.prototype.trimend": "^1.0.1",
771 "string.prototype.trimstart": "^1.0.1"
772 }
773 },
774 "node_modules/es-array-method-boxes-properly": {
775 "version": "1.0.0",
776 "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
777 "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
778 "dev": true
779 },
780 "node_modules/es-get-iterator": {
781 "version": "1.1.0",
782 "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz",
783 "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==",
784 "dev": true,
785 "dependencies": {
786 "es-abstract": "^1.17.4",
787 "has-symbols": "^1.0.1",
788 "is-arguments": "^1.0.4",
789 "is-map": "^2.0.1",
790 "is-set": "^2.0.1",
791 "is-string": "^1.0.5",
792 "isarray": "^2.0.5"
793 }
794 },
795 "node_modules/es-to-primitive": {
796 "version": "1.2.1",
797 "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
798 "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
799 "dev": true,
800 "dependencies": {
801 "is-callable": "^1.1.4",
802 "is-date-object": "^1.0.1",
803 "is-symbol": "^1.0.2"
804 }
805 },
806 "node_modules/es6-promise": {
807 "version": "4.2.8",
808 "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
809 "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==",
810 "dev": true
811 },
812 "node_modules/es6-promisify": {
813 "version": "5.0.0",
814 "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz",
815 "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=",
816 "dev": true,
817 "dependencies": {
818 "es6-promise": "^4.0.3"
819 }
820 },
821 "node_modules/escape-string-regexp": {
822 "version": "1.0.5",
823 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
824 "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
825 "dev": true
826 },
827 "node_modules/eslint": {
828 "version": "7.8.0",
829 "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.8.0.tgz",
830 "integrity": "sha512-qgtVyLZqKd2ZXWnLQA4NtVbOyH56zivOAdBFWE54RFkSZjokzNrcP4Z0eVWsZ+84ByXv+jL9k/wE1ENYe8xRFw==",
831 "dev": true,
832 "dependencies": {
833 "@babel/code-frame": "^7.0.0",
834 "@eslint/eslintrc": "^0.1.0",
835 "ajv": "^6.10.0",
836 "chalk": "^4.0.0",
837 "cross-spawn": "^7.0.2",
838 "debug": "^4.0.1",
839 "doctrine": "^3.0.0",
840 "enquirer": "^2.3.5",
841 "eslint-scope": "^5.1.0",
842 "eslint-utils": "^2.1.0",
843 "eslint-visitor-keys": "^1.3.0",
844 "espree": "^7.3.0",
845 "esquery": "^1.2.0",
846 "esutils": "^2.0.2",
847 "file-entry-cache": "^5.0.1",
848 "functional-red-black-tree": "^1.0.1",
849 "glob-parent": "^5.0.0",
850 "globals": "^12.1.0",
851 "ignore": "^4.0.6",
852 "import-fresh": "^3.0.0",
853 "imurmurhash": "^0.1.4",
854 "is-glob": "^4.0.0",
855 "js-yaml": "^3.13.1",
856 "json-stable-stringify-without-jsonify": "^1.0.1",
857 "levn": "^0.4.1",
858 "lodash": "^4.17.19",
859 "minimatch": "^3.0.4",
860 "natural-compare": "^1.4.0",
861 "optionator": "^0.9.1",
862 "progress": "^2.0.0",
863 "regexpp": "^3.1.0",
864 "semver": "^7.2.1",
865 "strip-ansi": "^6.0.0",
866 "strip-json-comments": "^3.1.0",
867 "table": "^5.2.3",
868 "text-table": "^0.2.0",
869 "v8-compile-cache": "^2.0.3"
870 }
871 },
872 "node_modules/eslint-scope": {
873 "version": "5.1.0",
874 "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
875 "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
876 "dev": true,
877 "dependencies": {
878 "esrecurse": "^4.1.0",
879 "estraverse": "^4.1.1"
880 }
881 },
882 "node_modules/eslint-utils": {
883 "version": "2.1.0",
884 "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
885 "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
886 "dev": true,
887 "dependencies": {
888 "eslint-visitor-keys": "^1.1.0"
889 }
890 },
891 "node_modules/eslint-visitor-keys": {
892 "version": "1.3.0",
893 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
894 "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
895 "dev": true
896 },
897 "node_modules/eslint/node_modules/ansi-styles": {
898 "version": "4.2.1",
899 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
900 "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
901 "dev": true,
902 "dependencies": {
903 "@types/color-name": "^1.1.1",
904 "color-convert": "^2.0.1"
905 }
906 },
907 "node_modules/eslint/node_modules/chalk": {
908 "version": "4.1.0",
909 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
910 "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
911 "dev": true,
912 "dependencies": {
913 "ansi-styles": "^4.1.0",
914 "supports-color": "^7.1.0"
915 }
916 },
917 "node_modules/eslint/node_modules/color-convert": {
918 "version": "2.0.1",
919 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
920 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
921 "dev": true,
922 "dependencies": {
923 "color-name": "~1.1.4"
924 }
925 },
926 "node_modules/eslint/node_modules/color-name": {
927 "version": "1.1.4",
928 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
929 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
930 "dev": true
931 },
932 "node_modules/eslint/node_modules/eslint-scope": {
933 "version": "5.1.0",
934 "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
935 "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
936 "dev": true,
937 "dependencies": {
938 "esrecurse": "^4.1.0",
939 "estraverse": "^4.1.1"
940 }
941 },
942 "node_modules/eslint/node_modules/eslint-utils": {
943 "version": "2.1.0",
944 "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
945 "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
946 "dev": true,
947 "dependencies": {
948 "eslint-visitor-keys": "^1.1.0"
949 }
950 },
951 "node_modules/eslint/node_modules/eslint-visitor-keys": {
952 "version": "1.3.0",
953 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
954 "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
955 "dev": true
956 },
957 "node_modules/eslint/node_modules/has-flag": {
958 "version": "4.0.0",
959 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
960 "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
961 "dev": true
962 },
963 "node_modules/eslint/node_modules/semver": {
964 "version": "7.3.2",
965 "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
966 "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
967 "dev": true
968 },
969 "node_modules/eslint/node_modules/supports-color": {
970 "version": "7.2.0",
971 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
972 "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
973 "dev": true,
974 "dependencies": {
975 "has-flag": "^4.0.0"
976 }
977 },
978 "node_modules/espree": {
979 "version": "7.3.0",
980 "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
981 "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
982 "dev": true,
983 "dependencies": {
984 "acorn": "^7.4.0",
985 "acorn-jsx": "^5.2.0",
986 "eslint-visitor-keys": "^1.3.0"
987 }
988 },
989 "node_modules/espree/node_modules/eslint-visitor-keys": {
990 "version": "1.3.0",
991 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
992 "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
993 "dev": true
994 },
995 "node_modules/esprima": {
996 "version": "4.0.1",
997 "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
998 "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
999 "dev": true
1000 },
1001 "node_modules/esquery": {
1002 "version": "1.3.1",
1003 "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
1004 "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
1005 "dev": true,
1006 "dependencies": {
1007 "estraverse": "^5.1.0"
1008 }
1009 },
1010 "node_modules/esquery/node_modules/estraverse": {
1011 "version": "5.2.0",
1012 "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
1013 "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
1014 "dev": true
1015 },
1016 "node_modules/esrecurse": {
1017 "version": "4.2.1",
1018 "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz",
1019 "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==",
1020 "dev": true,
1021 "dependencies": {
1022 "estraverse": "^4.1.0"
1023 }
1024 },
1025 "node_modules/estraverse": {
1026 "version": "4.3.0",
1027 "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
1028 "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
1029 "dev": true
1030 },
1031 "node_modules/estree-walker": {
1032 "version": "1.0.1",
1033 "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
1034 "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
1035 "dev": true
1036 },
1037 "node_modules/esutils": {
1038 "version": "2.0.3",
1039 "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
1040 "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
1041 "dev": true
1042 },
1043 "node_modules/fast-deep-equal": {
1044 "version": "3.1.3",
1045 "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
1046 "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
1047 "dev": true
1048 },
1049 "node_modules/fast-json-stable-stringify": {
1050 "version": "2.1.0",
1051 "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
1052 "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
1053 "dev": true
1054 },
1055 "node_modules/fast-levenshtein": {
1056 "version": "2.0.6",
1057 "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
1058 "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
1059 "dev": true
1060 },
1061 "node_modules/fd-slicer": {
1062 "version": "1.1.0",
1063 "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
1064 "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
1065 "dev": true,
1066 "dependencies": {
1067 "pend": "~1.2.0"
1068 }
1069 },
1070 "node_modules/file-entry-cache": {
1071 "version": "5.0.1",
1072 "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
1073 "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
1074 "dev": true,
1075 "dependencies": {
1076 "flat-cache": "^2.0.1"
1077 }
1078 },
1079 "node_modules/fill-range": {
1080 "version": "7.0.1",
1081 "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
1082 "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
1083 "dev": true,
1084 "dependencies": {
1085 "to-regex-range": "^5.0.1"
1086 }
1087 },
1088 "node_modules/find-up": {
1089 "version": "5.0.0",
1090 "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
1091 "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
1092 "dev": true,
1093 "dependencies": {
1094 "locate-path": "^6.0.0",
1095 "path-exists": "^4.0.0"
1096 }
1097 },
1098 "node_modules/flat": {
1099 "version": "4.1.0",
1100 "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
1101 "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
1102 "dev": true,
1103 "dependencies": {
1104 "is-buffer": "~2.0.3"
1105 }
1106 },
1107 "node_modules/flat-cache": {
1108 "version": "2.0.1",
1109 "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
1110 "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
1111 "dev": true,
1112 "dependencies": {
1113 "flatted": "^2.0.0",
1114 "rimraf": "2.6.3",
1115 "write": "1.0.3"
1116 }
1117 },
1118 "node_modules/flatted": {
1119 "version": "2.0.2",
1120 "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
1121 "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
1122 "dev": true
1123 },
1124 "node_modules/form-data": {
1125 "version": "3.0.0",
1126 "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.0.tgz",
1127 "integrity": "sha512-CKMFDglpbMi6PyN+brwB9Q/GOw0eAnsrEZDgcsH5Krhz5Od/haKHAX0NmQfha2zPPz0JpWzA7GJHGSnvCRLWsg==",
1128 "dev": true,
1129 "dependencies": {
1130 "asynckit": "^0.4.0",
1131 "combined-stream": "^1.0.8",
1132 "mime-types": "^2.1.12"
1133 }
1134 },
1135 "node_modules/fs.realpath": {
1136 "version": "1.0.0",
1137 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
1138 "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
1139 "dev": true
1140 },
1141 "node_modules/fsevents": {
1142 "version": "2.1.3",
1143 "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
1144 "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
1145 "dev": true,
1146 "optional": true,
1147 "os": [
1148 "darwin"
1149 ],
1150 "engines": {
1151 "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1152 }
1153 },
1154 "node_modules/function-bind": {
1155 "version": "1.1.1",
1156 "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1157 "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
1158 "dev": true
1159 },
1160 "node_modules/functional-red-black-tree": {
1161 "version": "1.0.1",
1162 "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
1163 "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
1164 "dev": true
1165 },
1166 "node_modules/get-caller-file": {
1167 "version": "2.0.5",
1168 "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
1169 "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
1170 "dev": true
1171 },
1172 "node_modules/glob": {
1173 "version": "7.1.6",
1174 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
1175 "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
1176 "dev": true,
1177 "dependencies": {
1178 "fs.realpath": "^1.0.0",
1179 "inflight": "^1.0.4",
1180 "inherits": "2",
1181 "minimatch": "^3.0.4",
1182 "once": "^1.3.0",
1183 "path-is-absolute": "^1.0.0"
1184 }
1185 },
1186 "node_modules/glob-parent": {
1187 "version": "5.1.1",
1188 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
1189 "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
1190 "dev": true,
1191 "dependencies": {
1192 "is-glob": "^4.0.1"
1193 }
1194 },
1195 "node_modules/globals": {
1196 "version": "12.4.0",
1197 "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
1198 "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
1199 "dev": true,
1200 "dependencies": {
1201 "type-fest": "^0.8.1"
1202 }
1203 },
1204 "node_modules/growl": {
1205 "version": "1.10.5",
1206 "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
1207 "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
1208 "dev": true
1209 },
1210 "node_modules/has": {
1211 "version": "1.0.3",
1212 "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1213 "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1214 "dev": true,
1215 "dependencies": {
1216 "function-bind": "^1.1.1"
1217 }
1218 },
1219 "node_modules/has-flag": {
1220 "version": "3.0.0",
1221 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1222 "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1223 "dev": true
1224 },
1225 "node_modules/has-symbols": {
1226 "version": "1.0.1",
1227 "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
1228 "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
1229 "dev": true
1230 },
1231 "node_modules/he": {
1232 "version": "1.2.0",
1233 "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
1234 "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
1235 "dev": true
1236 },
1237 "node_modules/htmlparser2": {
1238 "version": "3.10.1",
1239 "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
1240 "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
1241 "dev": true,
1242 "dependencies": {
1243 "domelementtype": "^1.3.1",
1244 "domhandler": "^2.3.0",
1245 "domutils": "^1.5.1",
1246 "entities": "^1.1.1",
1247 "inherits": "^2.0.1",
1248 "readable-stream": "^3.1.1"
1249 }
1250 },
1251 "node_modules/http-proxy-agent": {
1252 "version": "2.1.0",
1253 "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz",
1254 "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==",
1255 "dev": true,
1256 "dependencies": {
1257 "agent-base": "4",
1258 "debug": "3.1.0"
1259 }
1260 },
1261 "node_modules/http-proxy-agent/node_modules/debug": {
1262 "version": "3.1.0",
1263 "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
1264 "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
1265 "dev": true,
1266 "dependencies": {
1267 "ms": "2.0.0"
1268 }
1269 },
1270 "node_modules/http-proxy-agent/node_modules/ms": {
1271 "version": "2.0.0",
1272 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1273 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1274 "dev": true
1275 },
1276 "node_modules/https-proxy-agent": {
1277 "version": "2.2.4",
1278 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz",
1279 "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==",
1280 "dev": true,
1281 "dependencies": {
1282 "agent-base": "^4.3.0",
1283 "debug": "^3.1.0"
1284 }
1285 },
1286 "node_modules/https-proxy-agent/node_modules/debug": {
1287 "version": "3.2.6",
1288 "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1289 "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1290 "dev": true,
1291 "dependencies": {
1292 "ms": "^2.1.1"
1293 }
1294 },
1295 "node_modules/ignore": {
1296 "version": "4.0.6",
1297 "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
1298 "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
1299 "dev": true
1300 },
1301 "node_modules/import-fresh": {
1302 "version": "3.2.1",
1303 "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
1304 "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
1305 "dev": true,
1306 "dependencies": {
1307 "parent-module": "^1.0.0",
1308 "resolve-from": "^4.0.0"
1309 }
1310 },
1311 "node_modules/imurmurhash": {
1312 "version": "0.1.4",
1313 "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
1314 "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
1315 "dev": true
1316 },
1317 "node_modules/inflight": {
1318 "version": "1.0.6",
1319 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1320 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1321 "dev": true,
1322 "dependencies": {
1323 "once": "^1.3.0",
1324 "wrappy": "1"
1325 }
1326 },
1327 "node_modules/inherits": {
1328 "version": "2.0.4",
1329 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1330 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1331 "dev": true
1332 },
1333 "node_modules/is-arguments": {
1334 "version": "1.0.4",
1335 "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
1336 "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
1337 "dev": true
1338 },
1339 "node_modules/is-binary-path": {
1340 "version": "2.1.0",
1341 "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1342 "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1343 "dev": true,
1344 "dependencies": {
1345 "binary-extensions": "^2.0.0"
1346 }
1347 },
1348 "node_modules/is-buffer": {
1349 "version": "2.0.4",
1350 "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
1351 "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
1352 "dev": true
1353 },
1354 "node_modules/is-callable": {
1355 "version": "1.2.0",
1356 "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
1357 "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
1358 "dev": true
1359 },
1360 "node_modules/is-date-object": {
1361 "version": "1.0.2",
1362 "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
1363 "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
1364 "dev": true
1365 },
1366 "node_modules/is-extglob": {
1367 "version": "2.1.1",
1368 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1369 "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
1370 "dev": true
1371 },
1372 "node_modules/is-fullwidth-code-point": {
1373 "version": "2.0.0",
1374 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1375 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1376 "dev": true
1377 },
1378 "node_modules/is-glob": {
1379 "version": "4.0.1",
1380 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
1381 "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
1382 "dev": true,
1383 "dependencies": {
1384 "is-extglob": "^2.1.1"
1385 }
1386 },
1387 "node_modules/is-map": {
1388 "version": "2.0.1",
1389 "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz",
1390 "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==",
1391 "dev": true
1392 },
1393 "node_modules/is-module": {
1394 "version": "1.0.0",
1395 "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
1396 "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
1397 "dev": true
1398 },
1399 "node_modules/is-number": {
1400 "version": "7.0.0",
1401 "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1402 "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1403 "dev": true
1404 },
1405 "node_modules/is-plain-obj": {
1406 "version": "1.1.0",
1407 "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
1408 "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
1409 "dev": true
1410 },
1411 "node_modules/is-reference": {
1412 "version": "1.2.1",
1413 "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
1414 "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
1415 "dev": true,
1416 "dependencies": {
1417 "@types/estree": "*"
1418 }
1419 },
1420 "node_modules/is-regex": {
1421 "version": "1.1.1",
1422 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
1423 "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
1424 "dev": true,
1425 "dependencies": {
1426 "has-symbols": "^1.0.1"
1427 }
1428 },
1429 "node_modules/is-set": {
1430 "version": "2.0.1",
1431 "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz",
1432 "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==",
1433 "dev": true
1434 },
1435 "node_modules/is-string": {
1436 "version": "1.0.5",
1437 "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
1438 "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
1439 "dev": true
1440 },
1441 "node_modules/is-symbol": {
1442 "version": "1.0.3",
1443 "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
1444 "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
1445 "dev": true,
1446 "dependencies": {
1447 "has-symbols": "^1.0.1"
1448 }
1449 },
1450 "node_modules/isarray": {
1451 "version": "2.0.5",
1452 "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
1453 "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
1454 "dev": true
1455 },
1456 "node_modules/isexe": {
1457 "version": "2.0.0",
1458 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1459 "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1460 "dev": true
1461 },
1462 "node_modules/iterate-iterator": {
1463 "version": "1.0.1",
1464 "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz",
1465 "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==",
1466 "dev": true
1467 },
1468 "node_modules/iterate-value": {
1469 "version": "1.0.2",
1470 "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz",
1471 "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==",
1472 "dev": true,
1473 "dependencies": {
1474 "es-get-iterator": "^1.0.2",
1475 "iterate-iterator": "^1.0.1"
1476 }
1477 },
1478 "node_modules/js-tokens": {
1479 "version": "4.0.0",
1480 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1481 "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1482 "dev": true
1483 },
1484 "node_modules/js-yaml": {
1485 "version": "3.14.0",
1486 "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
1487 "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
1488 "dev": true,
1489 "dependencies": {
1490 "argparse": "^1.0.7",
1491 "esprima": "^4.0.0"
1492 }
1493 },
1494 "node_modules/json-schema-traverse": {
1495 "version": "0.4.1",
1496 "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
1497 "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
1498 "dev": true
1499 },
1500 "node_modules/json-stable-stringify-without-jsonify": {
1501 "version": "1.0.1",
1502 "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
1503 "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
1504 "dev": true
1505 },
1506 "node_modules/leven": {
1507 "version": "3.1.0",
1508 "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
1509 "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
1510 "dev": true
1511 },
1512 "node_modules/levn": {
1513 "version": "0.4.1",
1514 "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
1515 "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
1516 "dev": true,
1517 "dependencies": {
1518 "prelude-ls": "^1.2.1",
1519 "type-check": "~0.4.0"
1520 }
1521 },
1522 "node_modules/linkify-it": {
1523 "version": "2.2.0",
1524 "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz",
1525 "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==",
1526 "dev": true,
1527 "dependencies": {
1528 "uc.micro": "^1.0.1"
1529 }
1530 },
1531 "node_modules/locate-path": {
1532 "version": "6.0.0",
1533 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
1534 "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
1535 "dev": true,
1536 "dependencies": {
1537 "p-locate": "^5.0.0"
1538 }
1539 },
1540 "node_modules/lodash": {
1541 "version": "4.17.19",
1542 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
1543 "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
1544 "dev": true
1545 },
1546 "node_modules/log-symbols": {
1547 "version": "4.0.0",
1548 "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
1549 "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
1550 "dev": true,
1551 "dependencies": {
1552 "chalk": "^4.0.0"
1553 }
1554 },
1555 "node_modules/log-symbols/node_modules/ansi-styles": {
1556 "version": "4.2.1",
1557 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
1558 "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
1559 "dev": true,
1560 "dependencies": {
1561 "@types/color-name": "^1.1.1",
1562 "color-convert": "^2.0.1"
1563 }
1564 },
1565 "node_modules/log-symbols/node_modules/chalk": {
1566 "version": "4.1.0",
1567 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
1568 "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
1569 "dev": true,
1570 "dependencies": {
1571 "ansi-styles": "^4.1.0",
1572 "supports-color": "^7.1.0"
1573 }
1574 },
1575 "node_modules/log-symbols/node_modules/color-convert": {
1576 "version": "2.0.1",
1577 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1578 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1579 "dev": true,
1580 "dependencies": {
1581 "color-name": "~1.1.4"
1582 }
1583 },
1584 "node_modules/log-symbols/node_modules/color-name": {
1585 "version": "1.1.4",
1586 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1587 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1588 "dev": true
1589 },
1590 "node_modules/log-symbols/node_modules/has-flag": {
1591 "version": "4.0.0",
1592 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1593 "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1594 "dev": true
1595 },
1596 "node_modules/log-symbols/node_modules/supports-color": {
1597 "version": "7.2.0",
1598 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1599 "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1600 "dev": true,
1601 "dependencies": {
1602 "has-flag": "^4.0.0"
1603 }
1604 },
1605 "node_modules/lru-cache": {
1606 "version": "4.1.5",
1607 "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
1608 "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
1609 "dev": true,
1610 "dependencies": {
1611 "pseudomap": "^1.0.2",
1612 "yallist": "^2.1.2"
1613 }
1614 },
1615 "node_modules/magic-string": {
1616 "version": "0.25.7",
1617 "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz",
1618 "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==",
1619 "dev": true,
1620 "dependencies": {
1621 "sourcemap-codec": "^1.4.4"
1622 }
1623 },
1624 "node_modules/markdown-it": {
1625 "version": "10.0.0",
1626 "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz",
1627 "integrity": "sha512-YWOP1j7UbDNz+TumYP1kpwnP0aEa711cJjrAQrzd0UXlbJfc5aAq0F/PZHjiioqDC1NKgvIMX+o+9Bk7yuM2dg==",
1628 "dev": true,
1629 "dependencies": {
1630 "argparse": "^1.0.7",
1631 "entities": "~2.0.0",
1632 "linkify-it": "^2.0.0",
1633 "mdurl": "^1.0.1",
1634 "uc.micro": "^1.0.5"
1635 }
1636 },
1637 "node_modules/markdown-it/node_modules/entities": {
1638 "version": "2.0.3",
1639 "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.3.tgz",
1640 "integrity": "sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==",
1641 "dev": true
1642 },
1643 "node_modules/mdurl": {
1644 "version": "1.0.1",
1645 "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
1646 "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
1647 "dev": true
1648 },
1649 "node_modules/mime": {
1650 "version": "1.6.0",
1651 "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1652 "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1653 "dev": true
1654 },
1655 "node_modules/mime-db": {
1656 "version": "1.44.0",
1657 "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
1658 "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
1659 "dev": true
1660 },
1661 "node_modules/mime-types": {
1662 "version": "2.1.27",
1663 "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
1664 "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
1665 "dev": true,
1666 "dependencies": {
1667 "mime-db": "1.44.0"
1668 }
1669 },
1670 "node_modules/minimatch": {
1671 "version": "3.0.4",
1672 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1673 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1674 "dev": true,
1675 "dependencies": {
1676 "brace-expansion": "^1.1.7"
1677 }
1678 },
1679 "node_modules/minimist": {
1680 "version": "1.2.5",
1681 "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
1682 "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
1683 "dev": true
1684 },
1685 "node_modules/mkdirp": {
1686 "version": "0.5.5",
1687 "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
1688 "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
1689 "dev": true,
1690 "dependencies": {
1691 "minimist": "^1.2.5"
1692 }
1693 },
1694 "node_modules/mocha": {
1695 "version": "8.1.3",
1696 "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.1.3.tgz",
1697 "integrity": "sha512-ZbaYib4hT4PpF4bdSO2DohooKXIn4lDeiYqB+vTmCdr6l2woW0b6H3pf5x4sM5nwQMru9RvjjHYWVGltR50ZBw==",
1698 "dev": true,
1699 "dependencies": {
1700 "ansi-colors": "4.1.1",
1701 "browser-stdout": "1.3.1",
1702 "chokidar": "3.4.2",
1703 "debug": "4.1.1",
1704 "diff": "4.0.2",
1705 "escape-string-regexp": "4.0.0",
1706 "find-up": "5.0.0",
1707 "glob": "7.1.6",
1708 "growl": "1.10.5",
1709 "he": "1.2.0",
1710 "js-yaml": "3.14.0",
1711 "log-symbols": "4.0.0",
1712 "minimatch": "3.0.4",
1713 "ms": "2.1.2",
1714 "object.assign": "4.1.0",
1715 "promise.allsettled": "1.0.2",
1716 "serialize-javascript": "4.0.0",
1717 "strip-json-comments": "3.0.1",
1718 "supports-color": "7.1.0",
1719 "which": "2.0.2",
1720 "wide-align": "1.1.3",
1721 "workerpool": "6.0.0",
1722 "yargs": "13.3.2",
1723 "yargs-parser": "13.1.2",
1724 "yargs-unparser": "1.6.1"
1725 }
1726 },
1727 "node_modules/mocha/node_modules/ansi-colors": {
1728 "version": "4.1.1",
1729 "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
1730 "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
1731 "dev": true
1732 },
1733 "node_modules/mocha/node_modules/escape-string-regexp": {
1734 "version": "4.0.0",
1735 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
1736 "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
1737 "dev": true
1738 },
1739 "node_modules/mocha/node_modules/has-flag": {
1740 "version": "4.0.0",
1741 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1742 "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1743 "dev": true
1744 },
1745 "node_modules/mocha/node_modules/strip-json-comments": {
1746 "version": "3.0.1",
1747 "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
1748 "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
1749 "dev": true
1750 },
1751 "node_modules/mocha/node_modules/supports-color": {
1752 "version": "7.1.0",
1753 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
1754 "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
1755 "dev": true,
1756 "dependencies": {
1757 "has-flag": "^4.0.0"
1758 }
1759 },
1760 "node_modules/ms": {
1761 "version": "2.1.2",
1762 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1763 "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1764 "dev": true
1765 },
1766 "node_modules/mute-stream": {
1767 "version": "0.0.8",
1768 "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
1769 "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
1770 "dev": true
1771 },
1772 "node_modules/natural-compare": {
1773 "version": "1.4.0",
1774 "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
1775 "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
1776 "dev": true
1777 },
1778 "node_modules/node-fetch": {
1779 "version": "2.6.1",
1780 "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
1781 "integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw=="
1782 },
1783 "node_modules/normalize-path": {
1784 "version": "3.0.0",
1785 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1786 "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1787 "dev": true
1788 },
1789 "node_modules/nth-check": {
1790 "version": "1.0.2",
1791 "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
1792 "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
1793 "dev": true,
1794 "dependencies": {
1795 "boolbase": "~1.0.0"
1796 }
1797 },
1798 "node_modules/object-inspect": {
1799 "version": "1.8.0",
1800 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
1801 "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
1802 "dev": true
1803 },
1804 "node_modules/object-keys": {
1805 "version": "1.1.1",
1806 "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1807 "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
1808 "dev": true
1809 },
1810 "node_modules/object.assign": {
1811 "version": "4.1.0",
1812 "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
1813 "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
1814 "dev": true,
1815 "dependencies": {
1816 "define-properties": "^1.1.2",
1817 "function-bind": "^1.1.1",
1818 "has-symbols": "^1.0.0",
1819 "object-keys": "^1.0.11"
1820 }
1821 },
1822 "node_modules/once": {
1823 "version": "1.4.0",
1824 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1825 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1826 "dev": true,
1827 "dependencies": {
1828 "wrappy": "1"
1829 }
1830 },
1831 "node_modules/optionator": {
1832 "version": "0.9.1",
1833 "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
1834 "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
1835 "dev": true,
1836 "dependencies": {
1837 "deep-is": "^0.1.3",
1838 "fast-levenshtein": "^2.0.6",
1839 "levn": "^0.4.1",
1840 "prelude-ls": "^1.2.1",
1841 "type-check": "^0.4.0",
1842 "word-wrap": "^1.2.3"
1843 }
1844 },
1845 "node_modules/os": {
1846 "version": "0.1.1",
1847 "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz",
1848 "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=",
1849 "dev": true
1850 },
1851 "node_modules/os-homedir": {
1852 "version": "1.0.2",
1853 "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1854 "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
1855 "dev": true
1856 },
1857 "node_modules/os-tmpdir": {
1858 "version": "1.0.2",
1859 "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1860 "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1861 "dev": true
1862 },
1863 "node_modules/osenv": {
1864 "version": "0.1.5",
1865 "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
1866 "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
1867 "dev": true,
1868 "dependencies": {
1869 "os-homedir": "^1.0.0",
1870 "os-tmpdir": "^1.0.0"
1871 }
1872 },
1873 "node_modules/p-limit": {
1874 "version": "3.0.2",
1875 "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
1876 "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
1877 "dev": true,
1878 "dependencies": {
1879 "p-try": "^2.0.0"
1880 }
1881 },
1882 "node_modules/p-locate": {
1883 "version": "5.0.0",
1884 "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
1885 "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
1886 "dev": true,
1887 "dependencies": {
1888 "p-limit": "^3.0.2"
1889 }
1890 },
1891 "node_modules/p-try": {
1892 "version": "2.2.0",
1893 "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1894 "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
1895 "dev": true
1896 },
1897 "node_modules/parent-module": {
1898 "version": "1.0.1",
1899 "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
1900 "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
1901 "dev": true,
1902 "dependencies": {
1903 "callsites": "^3.0.0"
1904 }
1905 },
1906 "node_modules/parse-semver": {
1907 "version": "1.1.1",
1908 "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz",
1909 "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=",
1910 "dev": true,
1911 "dependencies": {
1912 "semver": "^5.1.0"
1913 }
1914 },
1915 "node_modules/parse-semver/node_modules/semver": {
1916 "version": "5.7.1",
1917 "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1918 "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
1919 "dev": true
1920 },
1921 "node_modules/parse5": {
1922 "version": "3.0.3",
1923 "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
1924 "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
1925 "dev": true,
1926 "dependencies": {
1927 "@types/node": "*"
1928 }
1929 },
1930 "node_modules/path-exists": {
1931 "version": "4.0.0",
1932 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
1933 "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
1934 "dev": true
1935 },
1936 "node_modules/path-is-absolute": {
1937 "version": "1.0.1",
1938 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1939 "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1940 "dev": true
1941 },
1942 "node_modules/path-key": {
1943 "version": "3.1.1",
1944 "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1945 "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1946 "dev": true
1947 },
1948 "node_modules/path-parse": {
1949 "version": "1.0.6",
1950 "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1951 "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1952 "dev": true
1953 },
1954 "node_modules/pend": {
1955 "version": "1.2.0",
1956 "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
1957 "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
1958 "dev": true
1959 },
1960 "node_modules/picomatch": {
1961 "version": "2.2.2",
1962 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
1963 "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
1964 "dev": true
1965 },
1966 "node_modules/prelude-ls": {
1967 "version": "1.2.1",
1968 "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
1969 "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
1970 "dev": true
1971 },
1972 "node_modules/progress": {
1973 "version": "2.0.3",
1974 "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
1975 "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
1976 "dev": true
1977 },
1978 "node_modules/promise.allsettled": {
1979 "version": "1.0.2",
1980 "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz",
1981 "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==",
1982 "dev": true,
1983 "dependencies": {
1984 "array.prototype.map": "^1.0.1",
1985 "define-properties": "^1.1.3",
1986 "es-abstract": "^1.17.0-next.1",
1987 "function-bind": "^1.1.1",
1988 "iterate-value": "^1.0.0"
1989 }
1990 },
1991 "node_modules/pseudomap": {
1992 "version": "1.0.2",
1993 "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
1994 "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
1995 "dev": true
1996 },
1997 "node_modules/punycode": {
1998 "version": "2.1.1",
1999 "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
2000 "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
2001 "dev": true
2002 },
2003 "node_modules/randombytes": {
2004 "version": "2.1.0",
2005 "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
2006 "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
2007 "dev": true,
2008 "dependencies": {
2009 "safe-buffer": "^5.1.0"
2010 }
2011 },
2012 "node_modules/read": {
2013 "version": "1.0.7",
2014 "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
2015 "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
2016 "dev": true,
2017 "dependencies": {
2018 "mute-stream": "~0.0.4"
2019 }
2020 },
2021 "node_modules/readable-stream": {
2022 "version": "3.6.0",
2023 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
2024 "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
2025 "dev": true,
2026 "dependencies": {
2027 "inherits": "^2.0.3",
2028 "string_decoder": "^1.1.1",
2029 "util-deprecate": "^1.0.1"
2030 }
2031 },
2032 "node_modules/readdirp": {
2033 "version": "3.4.0",
2034 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
2035 "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
2036 "dev": true,
2037 "dependencies": {
2038 "picomatch": "^2.2.1"
2039 }
2040 },
2041 "node_modules/regexpp": {
2042 "version": "3.1.0",
2043 "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
2044 "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
2045 "dev": true
2046 },
2047 "node_modules/require-directory": {
2048 "version": "2.1.1",
2049 "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
2050 "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
2051 "dev": true
2052 },
2053 "node_modules/require-main-filename": {
2054 "version": "2.0.0",
2055 "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
2056 "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
2057 "dev": true
2058 },
2059 "node_modules/resolve": {
2060 "version": "1.17.0",
2061 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
2062 "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
2063 "dev": true,
2064 "dependencies": {
2065 "path-parse": "^1.0.6"
2066 }
2067 },
2068 "node_modules/resolve-from": {
2069 "version": "4.0.0",
2070 "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
2071 "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2072 "dev": true
2073 },
2074 "node_modules/rimraf": {
2075 "version": "2.6.3",
2076 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
2077 "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
2078 "dev": true,
2079 "dependencies": {
2080 "glob": "^7.1.3"
2081 }
2082 },
2083 "node_modules/rollup": {
2084 "version": "2.26.9",
2085 "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.26.9.tgz",
2086 "integrity": "sha512-XIiWYLayLqV+oY4S2Lub/shJq4uk/QQLwWToYCL4LjZbYHbFK3czea4UDVRUJu+zNmKmxq5Zb/OG7c5HSvH2TQ==",
2087 "dev": true,
2088 "dependencies": {
2089 "fsevents": "~2.1.2"
2090 },
2091 "optionalDependencies": {
2092 "fsevents": "~2.1.2"
2093 }
2094 },
2095 "node_modules/safe-buffer": {
2096 "version": "5.2.0",
2097 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
2098 "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
2099 "dev": true
2100 },
2101 "node_modules/semver": {
2102 "version": "6.3.0",
2103 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
2104 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
2105 },
2106 "node_modules/serialize-javascript": {
2107 "version": "4.0.0",
2108 "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz",
2109 "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==",
2110 "dev": true,
2111 "dependencies": {
2112 "randombytes": "^2.1.0"
2113 }
2114 },
2115 "node_modules/set-blocking": {
2116 "version": "2.0.0",
2117 "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
2118 "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
2119 "dev": true
2120 },
2121 "node_modules/shebang-command": {
2122 "version": "2.0.0",
2123 "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2124 "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2125 "dev": true,
2126 "dependencies": {
2127 "shebang-regex": "^3.0.0"
2128 }
2129 },
2130 "node_modules/shebang-regex": {
2131 "version": "3.0.0",
2132 "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2133 "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2134 "dev": true
2135 },
2136 "node_modules/sigmund": {
2137 "version": "1.0.1",
2138 "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
2139 "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
2140 "dev": true
2141 },
2142 "node_modules/slice-ansi": {
2143 "version": "2.1.0",
2144 "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
2145 "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
2146 "dev": true,
2147 "dependencies": {
2148 "ansi-styles": "^3.2.0",
2149 "astral-regex": "^1.0.0",
2150 "is-fullwidth-code-point": "^2.0.0"
2151 }
2152 },
2153 "node_modules/sourcemap-codec": {
2154 "version": "1.4.8",
2155 "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
2156 "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
2157 "dev": true
2158 },
2159 "node_modules/sprintf-js": {
2160 "version": "1.0.3",
2161 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
2162 "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
2163 "dev": true
2164 },
2165 "node_modules/string_decoder": {
2166 "version": "1.3.0",
2167 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
2168 "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
2169 "dev": true,
2170 "dependencies": {
2171 "safe-buffer": "~5.2.0"
2172 }
2173 },
2174 "node_modules/string-width": {
2175 "version": "3.1.0",
2176 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2177 "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2178 "dev": true,
2179 "dependencies": {
2180 "emoji-regex": "^7.0.1",
2181 "is-fullwidth-code-point": "^2.0.0",
2182 "strip-ansi": "^5.1.0"
2183 }
2184 },
2185 "node_modules/string-width/node_modules/ansi-regex": {
2186 "version": "4.1.0",
2187 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
2188 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
2189 "dev": true
2190 },
2191 "node_modules/string-width/node_modules/strip-ansi": {
2192 "version": "5.2.0",
2193 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2194 "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2195 "dev": true,
2196 "dependencies": {
2197 "ansi-regex": "^4.1.0"
2198 }
2199 },
2200 "node_modules/string.prototype.trimend": {
2201 "version": "1.0.1",
2202 "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
2203 "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
2204 "dev": true,
2205 "dependencies": {
2206 "define-properties": "^1.1.3",
2207 "es-abstract": "^1.17.5"
2208 }
2209 },
2210 "node_modules/string.prototype.trimstart": {
2211 "version": "1.0.1",
2212 "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
2213 "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
2214 "dev": true,
2215 "dependencies": {
2216 "define-properties": "^1.1.3",
2217 "es-abstract": "^1.17.5"
2218 }
2219 },
2220 "node_modules/strip-ansi": {
2221 "version": "6.0.0",
2222 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
2223 "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
2224 "dev": true,
2225 "dependencies": {
2226 "ansi-regex": "^5.0.0"
2227 }
2228 },
2229 "node_modules/strip-json-comments": {
2230 "version": "3.1.1",
2231 "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
2232 "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
2233 "dev": true
2234 },
2235 "node_modules/supports-color": {
2236 "version": "5.5.0",
2237 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2238 "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2239 "dev": true,
2240 "dependencies": {
2241 "has-flag": "^3.0.0"
2242 }
2243 },
2244 "node_modules/table": {
2245 "version": "5.4.6",
2246 "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
2247 "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
2248 "dev": true,
2249 "dependencies": {
2250 "ajv": "^6.10.2",
2251 "lodash": "^4.17.14",
2252 "slice-ansi": "^2.1.0",
2253 "string-width": "^3.0.0"
2254 }
2255 },
2256 "node_modules/text-table": {
2257 "version": "0.2.0",
2258 "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
2259 "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
2260 "dev": true
2261 },
2262 "node_modules/tmp": {
2263 "version": "0.0.29",
2264 "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz",
2265 "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=",
2266 "dev": true,
2267 "dependencies": {
2268 "os-tmpdir": "~1.0.1"
2269 }
2270 },
2271 "node_modules/to-regex-range": {
2272 "version": "5.0.1",
2273 "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2274 "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2275 "dev": true,
2276 "dependencies": {
2277 "is-number": "^7.0.0"
2278 }
2279 },
2280 "node_modules/tslib": {
2281 "version": "2.0.1",
2282 "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.1.tgz",
2283 "integrity": "sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ==",
2284 "dev": true
2285 },
2286 "node_modules/tsutils": {
2287 "version": "3.17.1",
2288 "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.17.1.tgz",
2289 "integrity": "sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==",
2290 "dev": true,
2291 "dependencies": {
2292 "tslib": "^1.8.1"
2293 }
2294 },
2295 "node_modules/tsutils/node_modules/tslib": {
2296 "version": "1.13.0",
2297 "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
2298 "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
2299 "dev": true
2300 },
2301 "node_modules/tunnel": {
2302 "version": "0.0.4",
2303 "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz",
2304 "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=",
2305 "dev": true
2306 },
2307 "node_modules/type-check": {
2308 "version": "0.4.0",
2309 "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
2310 "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
2311 "dev": true,
2312 "dependencies": {
2313 "prelude-ls": "^1.2.1"
2314 }
2315 },
2316 "node_modules/type-fest": {
2317 "version": "0.8.1",
2318 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
2319 "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
2320 "dev": true
2321 },
2322 "node_modules/typed-rest-client": {
2323 "version": "1.2.0",
2324 "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz",
2325 "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==",
2326 "dev": true,
2327 "dependencies": {
2328 "tunnel": "0.0.4",
2329 "underscore": "1.8.3"
2330 }
2331 },
2332 "node_modules/typescript": {
2333 "version": "3.9.7",
2334 "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.7.tgz",
2335 "integrity": "sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==",
2336 "dev": true
2337 },
2338 "node_modules/typescript-formatter": {
2339 "version": "7.2.2",
2340 "resolved": "https://registry.npmjs.org/typescript-formatter/-/typescript-formatter-7.2.2.tgz",
2341 "integrity": "sha512-V7vfI9XArVhriOTYHPzMU2WUnm5IMdu9X/CPxs8mIMGxmTBFpDABlbkBka64PZJ9/xgQeRpK8KzzAG4MPzxBDQ==",
2342 "dev": true,
2343 "dependencies": {
2344 "commandpost": "^1.0.0",
2345 "editorconfig": "^0.15.0"
2346 }
2347 },
2348 "node_modules/uc.micro": {
2349 "version": "1.0.6",
2350 "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
2351 "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
2352 "dev": true
2353 },
2354 "node_modules/underscore": {
2355 "version": "1.8.3",
2356 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
2357 "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
2358 "dev": true
2359 },
2360 "node_modules/uri-js": {
2361 "version": "4.4.0",
2362 "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
2363 "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
2364 "dev": true,
2365 "dependencies": {
2366 "punycode": "^2.1.0"
2367 }
2368 },
2369 "node_modules/url-join": {
2370 "version": "1.1.0",
2371 "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz",
2372 "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=",
2373 "dev": true
2374 },
2375 "node_modules/util-deprecate": {
2376 "version": "1.0.2",
2377 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2378 "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2379 "dev": true
2380 },
2381 "node_modules/v8-compile-cache": {
2382 "version": "2.1.1",
2383 "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
2384 "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
2385 "dev": true
2386 },
2387 "node_modules/vsce": {
2388 "version": "1.79.5",
2389 "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.79.5.tgz",
2390 "integrity": "sha512-KZFOthGwxWFwoGqwrkzfTfyCZGuniTofnJ1a/dCzQ2HP93u1UuCKrTQyGT+SuGHu8sNqdBYNe0hb9GC3qCN7fg==",
2391 "dev": true,
2392 "dependencies": {
2393 "azure-devops-node-api": "^7.2.0",
2394 "chalk": "^2.4.2",
2395 "cheerio": "^1.0.0-rc.1",
2396 "commander": "^2.8.1",
2397 "denodeify": "^1.2.1",
2398 "glob": "^7.0.6",
2399 "leven": "^3.1.0",
2400 "lodash": "^4.17.15",
2401 "markdown-it": "^10.0.0",
2402 "mime": "^1.3.4",
2403 "minimatch": "^3.0.3",
2404 "osenv": "^0.1.3",
2405 "parse-semver": "^1.1.1",
2406 "read": "^1.0.7",
2407 "semver": "^5.1.0",
2408 "tmp": "0.0.29",
2409 "typed-rest-client": "1.2.0",
2410 "url-join": "^1.1.0",
2411 "yauzl": "^2.3.1",
2412 "yazl": "^2.2.2"
2413 }
2414 },
2415 "node_modules/vsce/node_modules/semver": {
2416 "version": "5.7.1",
2417 "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
2418 "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
2419 "dev": true
2420 },
2421 "node_modules/vscode-jsonrpc": {
2422 "version": "6.0.0-next.7",
2423 "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0-next.7.tgz",
2424 "integrity": "sha512-1nG+6cuTtpzmXe7yYfO9GCkYlyV6Ai+jDnwidHiT2T7zhc+bJM+VTtc0T/CdTlDyTNTqIcCj0V1nD4TcVjJ7Ug=="
2425 },
2426 "node_modules/vscode-languageclient": {
2427 "version": "7.0.0-next.12",
2428 "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0-next.12.tgz",
2429 "integrity": "sha512-OrzvOvhS5o26C0KctTJC7hkwh3avCwkVhllzy42AqwpIUZ3p2aVqkSG2uVxaeodq8ThBb3TLgtg50vxyWs6FEg==",
2430 "dependencies": {
2431 "semver": "^6.3.0",
2432 "vscode-languageserver-protocol": "3.16.0-next.10"
2433 }
2434 },
2435 "node_modules/vscode-languageserver-protocol": {
2436 "version": "3.16.0-next.10",
2437 "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0-next.10.tgz",
2438 "integrity": "sha512-YRTctHUZvts0Z1xXKNYU0ha0o+Tlgtwr+6O8OmDquM086N8exiSKBMwMC+Ra1QtIE+1mfW43Wxsme2FnMkAS9A==",
2439 "dependencies": {
2440 "vscode-jsonrpc": "6.0.0-next.7",
2441 "vscode-languageserver-types": "3.16.0-next.4"
2442 }
2443 },
2444 "node_modules/vscode-languageserver-types": {
2445 "version": "3.16.0-next.4",
2446 "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0-next.4.tgz",
2447 "integrity": "sha512-NlKJyGcET/ZBCCLBYIPaGo2c37R03bPYeWXozUtnjyye7+9dhlbMSODyoG2INcQf8zFmB4qhm2UOJjgYEgPCNA=="
2448 },
2449 "node_modules/vscode-test": {
2450 "version": "1.4.0",
2451 "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.0.tgz",
2452 "integrity": "sha512-Jt7HNGvSE0+++Tvtq5wc4hiXLIr2OjDShz/gbAfM/mahQpy4rKBnmOK33D+MR67ATWviQhl+vpmU3p/qwSH/Pg==",
2453 "dev": true,
2454 "dependencies": {
2455 "http-proxy-agent": "^2.1.0",
2456 "https-proxy-agent": "^2.2.4",
2457 "rimraf": "^2.6.3"
2458 }
2459 },
2460 "node_modules/which": {
2461 "version": "2.0.2",
2462 "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2463 "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2464 "dev": true,
2465 "dependencies": {
2466 "isexe": "^2.0.0"
2467 }
2468 },
2469 "node_modules/which-module": {
2470 "version": "2.0.0",
2471 "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
2472 "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
2473 "dev": true
2474 },
2475 "node_modules/wide-align": {
2476 "version": "1.1.3",
2477 "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
2478 "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
2479 "dev": true,
2480 "dependencies": {
2481 "string-width": "^1.0.2 || 2"
2482 }
2483 },
2484 "node_modules/wide-align/node_modules/ansi-regex": {
2485 "version": "3.0.0",
2486 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
2487 "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
2488 "dev": true
2489 },
2490 "node_modules/wide-align/node_modules/string-width": {
2491 "version": "2.1.1",
2492 "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
2493 "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
2494 "dev": true,
2495 "dependencies": {
2496 "is-fullwidth-code-point": "^2.0.0",
2497 "strip-ansi": "^4.0.0"
2498 }
2499 },
2500 "node_modules/wide-align/node_modules/strip-ansi": {
2501 "version": "4.0.0",
2502 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
2503 "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
2504 "dev": true,
2505 "dependencies": {
2506 "ansi-regex": "^3.0.0"
2507 }
2508 },
2509 "node_modules/word-wrap": {
2510 "version": "1.2.3",
2511 "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
2512 "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
2513 "dev": true
2514 },
2515 "node_modules/workerpool": {
2516 "version": "6.0.0",
2517 "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz",
2518 "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==",
2519 "dev": true
2520 },
2521 "node_modules/wrap-ansi": {
2522 "version": "5.1.0",
2523 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
2524 "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
2525 "dev": true,
2526 "dependencies": {
2527 "ansi-styles": "^3.2.0",
2528 "string-width": "^3.0.0",
2529 "strip-ansi": "^5.0.0"
2530 }
2531 },
2532 "node_modules/wrap-ansi/node_modules/ansi-regex": {
2533 "version": "4.1.0",
2534 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
2535 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
2536 "dev": true
2537 },
2538 "node_modules/wrap-ansi/node_modules/strip-ansi": {
2539 "version": "5.2.0",
2540 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2541 "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2542 "dev": true,
2543 "dependencies": {
2544 "ansi-regex": "^4.1.0"
2545 }
2546 },
2547 "node_modules/wrappy": {
2548 "version": "1.0.2",
2549 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2550 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2551 "dev": true
2552 },
2553 "node_modules/write": {
2554 "version": "1.0.3",
2555 "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
2556 "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
2557 "dev": true,
2558 "dependencies": {
2559 "mkdirp": "^0.5.1"
2560 }
2561 },
2562 "node_modules/y18n": {
2563 "version": "4.0.0",
2564 "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
2565 "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
2566 "dev": true
2567 },
2568 "node_modules/yallist": {
2569 "version": "2.1.2",
2570 "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
2571 "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
2572 "dev": true
2573 },
2574 "node_modules/yargs": {
2575 "version": "13.3.2",
2576 "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
2577 "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
2578 "dev": true,
2579 "dependencies": {
2580 "cliui": "^5.0.0",
2581 "find-up": "^3.0.0",
2582 "get-caller-file": "^2.0.1",
2583 "require-directory": "^2.1.1",
2584 "require-main-filename": "^2.0.0",
2585 "set-blocking": "^2.0.0",
2586 "string-width": "^3.0.0",
2587 "which-module": "^2.0.0",
2588 "y18n": "^4.0.0",
2589 "yargs-parser": "^13.1.2"
2590 }
2591 },
2592 "node_modules/yargs-parser": {
2593 "version": "13.1.2",
2594 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
2595 "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
2596 "dev": true,
2597 "dependencies": {
2598 "camelcase": "^5.0.0",
2599 "decamelize": "^1.2.0"
2600 }
2601 },
2602 "node_modules/yargs-unparser": {
2603 "version": "1.6.1",
2604 "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.1.tgz",
2605 "integrity": "sha512-qZV14lK9MWsGCmcr7u5oXGH0dbGqZAIxTDrWXZDo5zUr6b6iUmelNKO6x6R1dQT24AH3LgRxJpr8meWy2unolA==",
2606 "dev": true,
2607 "dependencies": {
2608 "camelcase": "^5.3.1",
2609 "decamelize": "^1.2.0",
2610 "flat": "^4.1.0",
2611 "is-plain-obj": "^1.1.0",
2612 "yargs": "^14.2.3"
2613 }
2614 },
2615 "node_modules/yargs-unparser/node_modules/find-up": {
2616 "version": "3.0.0",
2617 "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
2618 "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
2619 "dev": true,
2620 "dependencies": {
2621 "locate-path": "^3.0.0"
2622 }
2623 },
2624 "node_modules/yargs-unparser/node_modules/locate-path": {
2625 "version": "3.0.0",
2626 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
2627 "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
2628 "dev": true,
2629 "dependencies": {
2630 "p-locate": "^3.0.0",
2631 "path-exists": "^3.0.0"
2632 }
2633 },
2634 "node_modules/yargs-unparser/node_modules/p-limit": {
2635 "version": "2.3.0",
2636 "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
2637 "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
2638 "dev": true,
2639 "dependencies": {
2640 "p-try": "^2.0.0"
2641 }
2642 },
2643 "node_modules/yargs-unparser/node_modules/p-locate": {
2644 "version": "3.0.0",
2645 "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
2646 "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
2647 "dev": true,
2648 "dependencies": {
2649 "p-limit": "^2.0.0"
2650 }
2651 },
2652 "node_modules/yargs-unparser/node_modules/path-exists": {
2653 "version": "3.0.0",
2654 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
2655 "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
2656 "dev": true
2657 },
2658 "node_modules/yargs-unparser/node_modules/yargs": {
2659 "version": "14.2.3",
2660 "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
2661 "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
2662 "dev": true,
2663 "dependencies": {
2664 "cliui": "^5.0.0",
2665 "decamelize": "^1.2.0",
2666 "find-up": "^3.0.0",
2667 "get-caller-file": "^2.0.1",
2668 "require-directory": "^2.1.1",
2669 "require-main-filename": "^2.0.0",
2670 "set-blocking": "^2.0.0",
2671 "string-width": "^3.0.0",
2672 "which-module": "^2.0.0",
2673 "y18n": "^4.0.0",
2674 "yargs-parser": "^15.0.1"
2675 }
2676 },
2677 "node_modules/yargs-unparser/node_modules/yargs-parser": {
2678 "version": "15.0.1",
2679 "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
2680 "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
2681 "dev": true,
2682 "dependencies": {
2683 "camelcase": "^5.0.0",
2684 "decamelize": "^1.2.0"
2685 }
2686 },
2687 "node_modules/yargs/node_modules/find-up": {
2688 "version": "3.0.0",
2689 "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
2690 "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
2691 "dev": true,
2692 "dependencies": {
2693 "locate-path": "^3.0.0"
2694 }
2695 },
2696 "node_modules/yargs/node_modules/locate-path": {
2697 "version": "3.0.0",
2698 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
2699 "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
2700 "dev": true,
2701 "dependencies": {
2702 "p-locate": "^3.0.0",
2703 "path-exists": "^3.0.0"
2704 }
2705 },
2706 "node_modules/yargs/node_modules/p-limit": {
2707 "version": "2.3.0",
2708 "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
2709 "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
2710 "dev": true,
2711 "dependencies": {
2712 "p-try": "^2.0.0"
2713 }
2714 },
2715 "node_modules/yargs/node_modules/p-locate": {
2716 "version": "3.0.0",
2717 "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
2718 "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
2719 "dev": true,
2720 "dependencies": {
2721 "p-limit": "^2.0.0"
2722 }
2723 },
2724 "node_modules/yargs/node_modules/path-exists": {
2725 "version": "3.0.0",
2726 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
2727 "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
2728 "dev": true
2729 },
2730 "node_modules/yauzl": {
2731 "version": "2.10.0",
2732 "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
2733 "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
2734 "dev": true,
2735 "dependencies": {
2736 "buffer-crc32": "~0.2.3",
2737 "fd-slicer": "~1.1.0"
2738 }
2739 },
2740 "node_modules/yazl": {
2741 "version": "2.5.1",
2742 "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz",
2743 "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==",
2744 "dev": true,
2745 "dependencies": {
2746 "buffer-crc32": "~0.2.3"
2747 }
2748 }
2749 },
2750 "dependencies": { 6 "dependencies": {
2751 "@babel/code-frame": { 7 "@babel/code-frame": {
2752 "version": "7.10.4", 8 "version": "7.10.4",
@@ -4890,15 +2146,6 @@
4890 "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 2146 "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
4891 "dev": true 2147 "dev": true
4892 }, 2148 },
4893 "string_decoder": {
4894 "version": "1.3.0",
4895 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
4896 "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
4897 "dev": true,
4898 "requires": {
4899 "safe-buffer": "~5.2.0"
4900 }
4901 },
4902 "string-width": { 2149 "string-width": {
4903 "version": "3.1.0", 2150 "version": "3.1.0",
4904 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2151 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
@@ -4947,6 +2194,15 @@
4947 "es-abstract": "^1.17.5" 2194 "es-abstract": "^1.17.5"
4948 } 2195 }
4949 }, 2196 },
2197 "string_decoder": {
2198 "version": "1.3.0",
2199 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
2200 "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
2201 "dev": true,
2202 "requires": {
2203 "safe-buffer": "~5.2.0"
2204 }
2205 },
4950 "strip-ansi": { 2206 "strip-ansi": {
4951 "version": "6.0.0", 2207 "version": "6.0.0",
4952 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", 2208 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
diff --git a/editors/code/package.json b/editors/code/package.json
index 6db78a99a..220d44abc 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -187,6 +187,11 @@
187 "command": "rust-analyzer.openDocs", 187 "command": "rust-analyzer.openDocs",
188 "title": "Open docs under cursor", 188 "title": "Open docs under cursor",
189 "category": "Rust Analyzer" 189 "category": "Rust Analyzer"
190 },
191 {
192 "command": "rust-analyzer.openCargoToml",
193 "title": "Open Cargo.toml",
194 "category": "Rust Analyzer"
190 } 195 }
191 ], 196 ],
192 "keybindings": [ 197 "keybindings": [
@@ -278,6 +283,11 @@
278 "default": null, 283 "default": null,
279 "description": "Specify the compilation target" 284 "description": "Specify the compilation target"
280 }, 285 },
286 "rust-analyzer.noSysroot": {
287 "markdownDescription": "Internal config for debugging, disables loading of sysroot crates",
288 "type": "boolean",
289 "default": false
290 },
281 "rust-analyzer.rustfmt.extraArgs": { 291 "rust-analyzer.rustfmt.extraArgs": {
282 "type": "array", 292 "type": "array",
283 "items": { 293 "items": {
@@ -600,11 +610,6 @@
600 }, 610 },
601 "default": null 611 "default": null
602 }, 612 },
603 "rust-analyzer.withSysroot": {
604 "markdownDescription": "Internal config for debugging, disables loading of sysroot crates",
605 "type": "boolean",
606 "default": true
607 },
608 "rust-analyzer.diagnostics.enable": { 613 "rust-analyzer.diagnostics.enable": {
609 "type": "boolean", 614 "type": "boolean",
610 "default": true, 615 "default": true,
@@ -1065,6 +1070,10 @@
1065 { 1070 {
1066 "command": "rust-analyzer.openDocs", 1071 "command": "rust-analyzer.openDocs",
1067 "when": "inRustProject" 1072 "when": "inRustProject"
1073 },
1074 {
1075 "command": "rust-analyzer.openCargoToml",
1076 "when": "inRustProject"
1068 } 1077 }
1069 ] 1078 ]
1070 } 1079 }
diff --git a/editors/code/src/commands.ts b/editors/code/src/commands.ts
index cf34622c3..92bc4d7f7 100644
--- a/editors/code/src/commands.ts
+++ b/editors/code/src/commands.ts
@@ -188,6 +188,27 @@ export function parentModule(ctx: Ctx): Cmd {
188 }; 188 };
189} 189}
190 190
191export function openCargoToml(ctx: Ctx): Cmd {
192 return async () => {
193 const editor = ctx.activeRustEditor;
194 const client = ctx.client;
195 if (!editor || !client) return;
196
197 const response = await client.sendRequest(ra.openCargoToml, {
198 textDocument: ctx.client.code2ProtocolConverter.asTextDocumentIdentifier(editor.document),
199 });
200 if (!response) return;
201
202 const uri = client.protocol2CodeConverter.asUri(response.uri);
203 const range = client.protocol2CodeConverter.asRange(response.range);
204
205 const doc = await vscode.workspace.openTextDocument(uri);
206 const e = await vscode.window.showTextDocument(doc);
207 e.selection = new vscode.Selection(range.start, range.start);
208 e.revealRange(range, vscode.TextEditorRevealType.InCenter);
209 };
210}
211
191export function ssr(ctx: Ctx): Cmd { 212export function ssr(ctx: Ctx): Cmd {
192 return async () => { 213 return async () => {
193 const editor = vscode.window.activeTextEditor; 214 const editor = vscode.window.activeTextEditor;
diff --git a/editors/code/src/lsp_ext.ts b/editors/code/src/lsp_ext.ts
index d320c3cd7..5e877ce65 100644
--- a/editors/code/src/lsp_ext.ts
+++ b/editors/code/src/lsp_ext.ts
@@ -114,3 +114,9 @@ export interface CommandLinkGroup {
114} 114}
115 115
116export const openDocs = new lc.RequestType<lc.TextDocumentPositionParams, string | void, void>('experimental/externalDocs'); 116export const openDocs = new lc.RequestType<lc.TextDocumentPositionParams, string | void, void>('experimental/externalDocs');
117
118export const openCargoToml = new lc.RequestType<OpenCargoTomlParams, lc.Location, void>("experimental/openCargoToml");
119
120export interface OpenCargoTomlParams {
121 textDocument: lc.TextDocumentIdentifier;
122}
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index 09543e348..2f3dde8ac 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -111,6 +111,7 @@ async function tryActivate(context: vscode.ExtensionContext) {
111 ctx.registerCommand('debug', commands.debug); 111 ctx.registerCommand('debug', commands.debug);
112 ctx.registerCommand('newDebugConfig', commands.newDebugConfig); 112 ctx.registerCommand('newDebugConfig', commands.newDebugConfig);
113 ctx.registerCommand('openDocs', commands.openDocs); 113 ctx.registerCommand('openDocs', commands.openDocs);
114 ctx.registerCommand('openCargoToml', commands.openCargoToml);
114 115
115 defaultOnEnter.dispose(); 116 defaultOnEnter.dispose();
116 ctx.registerCommand('onEnter', commands.onEnter); 117 ctx.registerCommand('onEnter', commands.onEnter);
diff --git a/xtask/src/install.rs b/xtask/src/install.rs
index 41f3e3da1..78a8af797 100644
--- a/xtask/src/install.rs
+++ b/xtask/src/install.rs
@@ -143,7 +143,7 @@ fn install_client(client_opt: ClientOpt) -> Result<()> {
143 if !installed_extensions.contains("rust-analyzer") { 143 if !installed_extensions.contains("rust-analyzer") {
144 bail!( 144 bail!(
145 "Could not install the Visual Studio Code extension. \ 145 "Could not install the Visual Studio Code extension. \
146 Please make sure you have at least NodeJS 15.x together with the latest version of VS Code installed and try again. \ 146 Please make sure you have at least NodeJS 12.x together with the latest version of VS Code installed and try again. \
147 Note that installing via xtask install does not work for VS Code Remote, instead you’ll need to install the .vsix manually." 147 Note that installing via xtask install does not work for VS Code Remote, instead you’ll need to install the .vsix manually."
148 ); 148 );
149 } 149 }