From b9ec34180b664b1a90e4b9c6c2f092b4262aacfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Dani=C5=82o?= Date: Wed, 8 Apr 2020 11:13:58 +0200 Subject: [PATCH 01/27] Update contributing.md --- docs/contributing.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/contributing.md b/docs/contributing.md index 33eeb8a267..3486a2cf6f 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -3,6 +3,8 @@ Thank you for your interest in contributing to the Enso IDE! We believe that onl involvement can Enso be the best it can be! There are a whole host of ways to contribute, and every single one is appreciated. +
+ ## Reporting Issues While it's never great to find a bug, they are a reality of software and software development! We can't fix or improve on the things that we don't know about, so report as many bugs as you can! If @@ -25,6 +27,8 @@ The reproduction steps are particularly important, as the more easily we can rep faster we can fix the bug! It's also helpful to have the version of the IDE, as that will let us know if the bug is Operating System or Architecture specific. +
+ ## Development Environment The project builds on MacOS, Windows, and Linux. Cross-platform targets work well on all of these platforms, however, MacOS package will miss the right application icon if built on Linux or Windows @@ -52,8 +56,6 @@ need the following setup: `nvm install --lts && nvm use --lts`.
-
-
## Working with sources Please note that you should not use a code auto-formatter in this codebase. Please read the @@ -63,7 +65,6 @@ guide. Be sure to carefully read the and the [Rust style guide 2](https://github.com/luna/enso/blob/master/doc/rust-style-guide.md) before contributing to the codebase. -
### Development As this is a multi-part project with many complex dependencies, it is equipped with a build script @@ -91,8 +92,6 @@ however, this doc will use the former form in order to stay cross-platform compa and installers use `node ./run dist` instead. The final packages will be located at `app/dist/native`. -
- ### Testing, Linting, and Validation After changing the code it's always a good idea to lint and test the code. We have prepared several scripts which maximally automate the process: From ff64c11d8fe361d5df6b3fc554ce099f64f45795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Dani=C5=82o?= Date: Wed, 8 Apr 2020 11:14:35 +0200 Subject: [PATCH 02/27] Update contributing.md --- docs/contributing.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/contributing.md b/docs/contributing.md index 3486a2cf6f..2a51c3fa1d 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -6,13 +6,14 @@ single one is appreciated.
## Reporting Issues -While it's never great to find a bug, they are a reality of software and software development! We -can't fix or improve on the things that we don't know about, so report as many bugs as you can! If -you're not sure whether something is a bug, file it anyway! **If you are concerned that your bug publicly presents a security risk to the users of Enso, please contact [security@enso.org](mailto:security@enso.org).** +While it's never great to find a bug, they are a reality of software and software development! We +can't fix or improve on the things that we don't know about, so report as many bugs as you can! If +you're not sure whether something is a bug, file it anyway! + Even though GitHub search can be a bit hard to use sometimes, we'd appreciate if you could [search](https://github.com/luna/enso/search?q=&type=Issues&utf8=%E2%9C%93) for your issue before filing a bug as it's possible that someone else has already reported the issue. We know the search From fdaa86fabb9cdc20897abce44731e957c0d5a8d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Dani=C5=82o?= Date: Wed, 8 Apr 2020 11:16:32 +0200 Subject: [PATCH 03/27] Update contributing.md --- docs/contributing.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/contributing.md b/docs/contributing.md index 2a51c3fa1d..806e6b141c 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -44,6 +44,7 @@ need the following setup: rustup toolchain install nightly-2019-11-04 # Install the nightly channel. rustup override set nightly-2019-11-04 # Set it as the default toolchain for this folder. rustup component add clippy # Install the linter. + cargo install wasm-pack --version 0.8.1 # Install the wasm-pack toolkit. cargo install cargo-watch # To enable ./run watch utility ``` From b1a5b34b6759422691a9bd537af8d0c7fd6a09f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wojciech=20Dani=C5=82o?= Date: Wed, 8 Apr 2020 11:29:01 +0200 Subject: [PATCH 04/27] Update contributing.md --- docs/contributing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/contributing.md b/docs/contributing.md index 806e6b141c..c9cfcf5fc8 100644 --- a/docs/contributing.md +++ b/docs/contributing.md @@ -1,4 +1,4 @@ -# Contributing Guide +# Development & Contributing Guide Thank you for your interest in contributing to the Enso IDE! We believe that only through community involvement can Enso be the best it can be! There are a whole host of ways to contribute, and every single one is appreciated. From 6517159baebb9e870d466d81e09fc9c1d83af26c Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 8 Apr 2020 14:47:56 +0200 Subject: [PATCH 05/27] playing with simple cases, improving test harness --- .../double_representation/alias_analysis.rs | 138 ++++++++++++++---- .../alias_analysis/test_utils.rs | 31 ++-- 2 files changed, 130 insertions(+), 39 deletions(-) diff --git a/src/rust/ide/src/double_representation/alias_analysis.rs b/src/rust/ide/src/double_representation/alias_analysis.rs index 4f419ac8de..fcda1e142f 100644 --- a/src/rust/ide/src/double_representation/alias_analysis.rs +++ b/src/rust/ide/src/double_representation/alias_analysis.rs @@ -5,6 +5,9 @@ use crate::prelude::*; use crate::double_representation::node::NodeInfo; +use ast::crumbs::InfixCrumb; +use ast::crumbs::Crumb; + #[cfg(test)] pub mod test_utils; @@ -51,7 +54,7 @@ impl PartialEq for NormalizedName { // ======================= /// Description of how some node is interacting with the graph's scope. -#[derive(Clone,Debug)] +#[derive(Clone,Debug,Default)] pub struct IdentifierUsage { /// Identifiers from the graph's scope that node is using. pub introduced : Vec, @@ -65,28 +68,103 @@ pub struct IdentifierUsage { // === Analysis === // ================ +#[derive(Clone,Copy,Debug,Display)] +enum Context {Graph,AssignmentPattern} + +#[derive(Clone,Debug)] +struct AliasAnalyzer { + usage : IdentifierUsage, + context : Vec, + location : ast::crumbs::Crumbs, +} + +impl AliasAnalyzer { + fn new() -> AliasAnalyzer { + AliasAnalyzer { + usage : default(), + context : vec![Context::Graph], + location : default(), + } + } + + fn use_identifier(&mut self, identifier:NormalizedName) { + let identifier = LocatedIdentifier::new(self.location.clone(), identifier); + self.usage.used.push(identifier) + } + fn introduce_identifier(&mut self, identifier:NormalizedName) { + let identifier = LocatedIdentifier::new(self.location.clone(), identifier); + self.usage.introduced.push(identifier) + } + + fn process_ast(&mut self, ast:&Ast) { + if let Some(name) = NormalizedName::try_from_ast(ast) { + match self.context.last() { + Some(Context::AssignmentPattern) => self.introduce_identifier(name), + Some(Context::Graph) => self.use_identifier(name), + _ => todo!() + } + } else { + for (crumb,ast) in ast.enumerate() { + self.in_location(crumb, |this| this.process_ast(ast)) + } + } + } + + fn in_location(&mut self, crumb:impl Into, f:F) -> R + where F:FnOnce(&mut Self) -> R { + self.location.push(crumb.into()); + let ret = f(self); + self.location.pop(); + ret + } + + fn enter_assignment_pattern(&mut self, ast:&Ast) { + self.in_location(InfixCrumb::LeftOperand, |this| { + this.context.push(Context::AssignmentPattern); + this.process_ast(ast); + this.context.pop(); + }); + } + + fn enter_assignment_body(&mut self, ast:&Ast) { + self.in_location(InfixCrumb::RightOperand, |this| this.process_ast(ast)); + } + + fn enter_node(&mut self, node:&NodeInfo) { + let ast = node.ast(); + if let Some(assignment) = ast::opr::to_assignment(ast) { + self.enter_assignment_pattern(&assignment.larg); + self.enter_assignment_body(&assignment.rarg); + } else { + self.process_ast(ast) + } + } +} + /// Describes identifiers that nodes introduces into the graph and identifiers from graph's scope /// that node uses. This logic serves as a base for connection discovery. pub fn analyse_identifier_usage(node:&NodeInfo) -> IdentifierUsage { - analyse_identifier_usage_mock(node) -} - -/// Hardcoded proper result for `sum = a + b`. -/// TODO [mwu] remove when real implementation is present -fn analyse_identifier_usage_mock(_:&NodeInfo) -> IdentifierUsage { - use ast::crumbs::InfixCrumb::LeftOperand; - use ast::crumbs::InfixCrumb::RightOperand; - let sum = NormalizedName::new("sum"); - let a = NormalizedName::new("a"); - let b = NormalizedName::new("b"); - let introduced = vec![LocatedIdentifier::new(&[LeftOperand], sum)]; - let used = vec![ - LocatedIdentifier::new(&[RightOperand, LeftOperand], a), - LocatedIdentifier::new(&[RightOperand, RightOperand], b), - ]; - IdentifierUsage {introduced,used} + let mut analyzer = AliasAnalyzer::new(); + analyzer.enter_node(node); + analyzer.usage } +///// Hardcoded proper result for `sum = a + b`. +///// TODO [mwu] remove when real implementation is present +//fn analyse_identifier_usage_mock(_:&NodeInfo) -> IdentifierUsage { +// use ast::crumbs::InfixCrumb::LeftOperand; +// use ast::crumbs::InfixCrumb::RightOperand; +// let sum = NormalizedName::new("sum"); +// let a = NormalizedName::new("a"); +// let b = NormalizedName::new("b"); +// let introduced = vec![LocatedIdentifier::new(&[LeftOperand], sum)]; +// let used = vec![ +// LocatedIdentifier::new(&[RightOperand, LeftOperand], a), +// LocatedIdentifier::new(&[RightOperand, RightOperand], b), +// ]; +// IdentifierUsage {introduced,used} +//} +// // ============= @@ -116,6 +194,7 @@ mod tests { let ast = parser.parse_line(&case.code).unwrap(); let node = NodeInfo::from_line_ast(&ast).unwrap(); let result = analyse_identifier_usage(&node); + println!("Analysis results: {:?}", result); validate_identifiers(&node, case.expected_introduced, &result.introduced); validate_identifiers(&node, case.expected_used, &result.used); } @@ -128,14 +207,15 @@ mod tests { } - #[wasm_bindgen_test] + #[test] fn test_alias_analysis() { let parser = parser::Parser::new_or_panic(); - // TODO [mwu] Uncomment and make them pass. And add more. -// let test_cases = vec![ -// "«sum» = »a« + »b«", -// "«foo» = »bar«", + let test_cases = vec![ + "»foo«", + "«five» = 5", + "«foo» = »bar«", + "«sum» = »a« »+« »b«", // "«foo» a b = a + b", // "Foo «a» «b» = »bar«", // "a.«hello» = »print« 'Hello'", @@ -143,13 +223,13 @@ mod tests { // "«log_name» = object -> »print« object.»name«", // "«log_name» = object -> »print« $ »name« object", // "«^» a n = a * a ^ (n - 1)", -// ]; -// for case in test_cases { -// run_markdown_case(&parser,case) -// } + ]; + for case in test_cases { + run_markdown_case(&parser,case) + } - let code = "«sum» = »a« + »b«"; - run_markdown_case(&parser, code); +// let code = "«sum» = »a« + »b«"; +// run_markdown_case(&parser, code); } } diff --git a/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs b/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs index cc4c59f3f2..dfdaf940ac 100644 --- a/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs +++ b/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs @@ -11,7 +11,6 @@ use regex::Regex; use regex::Replacer; - // ============ // === Case === // ============ @@ -133,11 +132,12 @@ enum HasBeenValidated {No,Yes} /// Helper test structure that requires that each given identifier is validated at least once. /// Otherwise, it shall panic when dropped. #[derive(Clone,Debug)] -pub struct IdentifierValidator { - validations:HashMap +pub struct IdentifierValidator<'a> { + node :&'a NodeInfo, + validations:HashMap, } -impl IdentifierValidator { +impl<'a> IdentifierValidator<'a> { /// Creates a new checker, with identifier set obtained from given node's representation /// spans. pub fn new(node:&NodeInfo,spans:Vec>) -> IdentifierValidator { @@ -148,7 +148,7 @@ impl IdentifierValidator { let name = NormalizedName::new(&repr[span]); validations.insert(name, HasBeenValidated::No); } - IdentifierValidator {validations} + IdentifierValidator {node,validations} } /// Marks given identifier as checked. @@ -159,19 +159,30 @@ impl IdentifierValidator { } /// Marks given sequence of identifiers as checked. - pub fn validate_identifiers<'a> + pub fn validate_identifiers (&mut self, identifiers:impl IntoIterator) { for identifier in identifiers { - self.validate_identifier(&identifier.item) + self.validate_identifier(&identifier.item); + + let crumbs = &identifier.crumbs; + let ast = self.node.ast().get_traversing(&crumbs).expect("failed to retrieve ast from crumb"); + let name_err = || iformat!("Failed to use AST {ast.repr()} as an identifier name"); + let name = NormalizedName::try_from_ast(ast).expect(&name_err()); + assert_eq!(name,identifier.item) } } } /// Panics if there are remaining identifiers that were not checked. -impl Drop for IdentifierValidator { +impl<'a> Drop for IdentifierValidator<'a> { fn drop(&mut self) { - for elem in &self.validations { - assert_eq!(elem.1, &HasBeenValidated::Yes, "identifier `{}` was not validated)", elem.0) + if !std::thread::panicking() { + for elem in &self.validations { + assert_eq!(elem.1, &HasBeenValidated::Yes, + "identifier `{}` was not validated)", elem.0) + } + } else { + println!("Skipping identifier validation, because thread is already in panic."); } } } From fadc178bc291a7f0792f37f6ff4f7799558c16e6 Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 8 Apr 2020 23:26:30 +0200 Subject: [PATCH 06/27] [wip] --- src/rust/ide/ast/impl/src/app.rs | 17 ++++ src/rust/ide/ast/impl/src/crumbs.rs | 21 ++++- src/rust/ide/ast/impl/src/lib.rs | 1 + src/rust/ide/ast/impl/src/opr.rs | 88 ++++++++++++++++--- src/rust/ide/ast/impl/src/prefix.rs | 55 ++++++++++++ .../double_representation/alias_analysis.rs | 87 +++++++++++++----- .../src/double_representation/definition.rs | 4 +- src/rust/ide/src/lib.rs | 3 +- 8 files changed, 237 insertions(+), 39 deletions(-) create mode 100644 src/rust/ide/ast/impl/src/app.rs diff --git a/src/rust/ide/ast/impl/src/app.rs b/src/rust/ide/ast/impl/src/app.rs new file mode 100644 index 0000000000..86d7f65bb1 --- /dev/null +++ b/src/rust/ide/ast/impl/src/app.rs @@ -0,0 +1,17 @@ +use crate::prelude::*; + +struct GeneralizedApplication { + target : Ast, + arguments : Vec +} + +//impl GeneralizedApplication { +// pub fn try_new(ast:&Ast) -> Option { +// if let Some(chain) = crate::opr::Chain::try_new(ast) { +// let target = chain.target?; +// let arguments = chain.args.into_iter().map(|arg| arg.operand) +// +// } +// } +//} + diff --git a/src/rust/ide/ast/impl/src/crumbs.rs b/src/rust/ide/ast/impl/src/crumbs.rs index 2215ac8e60..842a6be093 100644 --- a/src/rust/ide/ast/impl/src/crumbs.rs +++ b/src/rust/ide/ast/impl/src/crumbs.rs @@ -3,13 +3,12 @@ use crate::prelude::*; -use crate::known; +use crate::{known, HasTokens, TokenConsumer}; use crate::Shape; use utils::fail::FallibleResult; - // ============== // === Errors === // ============== @@ -901,12 +900,30 @@ impl Located { ret } + pub fn descendant(&self, crumbs:Cs, child:U) -> Located + where Cs : IntoIterator>,{ + let crumbs_so_far = self.crumbs.iter().copied(); + let crumbs_to_add = crumbs.into_iter().map(|crumb| crumb.into()); + let crumbs = crumbs_so_far.chain(crumbs_to_add); + Located::new(crumbs, child) + } + + pub fn child(&self, crumb:impl Into, child:U) -> Located { + self.descendant(std::iter::once(crumb),child) + } + /// Maps into child, concatenating this crumbs and child crumbs. pub fn push_descendant(self, child:Located) -> Located { self.into_descendant(child.crumbs,child.item) } } +impl HasTokens for Located { + fn feed_to(&self, consumer:&mut impl TokenConsumer) { + self.item.feed_to(consumer) + } +} + /// Reference to AST stored under some known crumbs path. pub type ChildAst<'a> = Located<&'a Ast>; diff --git a/src/rust/ide/ast/impl/src/lib.rs b/src/rust/ide/ast/impl/src/lib.rs index 7c1ce46d1e..4359de44d1 100644 --- a/src/rust/ide/ast/impl/src/lib.rs +++ b/src/rust/ide/ast/impl/src/lib.rs @@ -5,6 +5,7 @@ #![feature(type_alias_impl_trait)] #![feature(matches_macro)] +pub mod app; #[warn(missing_docs)] pub mod assoc; #[warn(missing_docs)] diff --git a/src/rust/ide/ast/impl/src/opr.rs b/src/rust/ide/ast/impl/src/opr.rs index da85e6b346..d97ccceb37 100644 --- a/src/rust/ide/ast/impl/src/opr.rs +++ b/src/rust/ide/ast/impl/src/opr.rs @@ -6,6 +6,7 @@ use crate::Ast; use crate::assoc::Assoc; use crate::known; use crate::Shape; +use crate::crumbs::{Crumb, Located, InfixCrumb, SectionLeftCrumb, SectionRightCrumb, SectionSidesCrumb}; /// Identifiers of operators with special meaning for IDE. pub mod predefined { @@ -34,11 +35,23 @@ pub fn is_assignment(ast:&Ast) -> bool { } /// Infix operator operand. Optional, as we deal with Section* nodes as well. -pub type Operand = Option; +pub type Operand = Option>; /// Infix operator standing between (optional) operands. -pub type Operator = known::Opr; +pub type Operator = Located; +fn make_operand(parent:&Located, crumb:impl Into, child:&Ast) -> Operand { + Some(parent.child(crumb,child.clone())) +} + +fn make_operator(parent:&Located, crumb:impl Into, opr:&Ast) -> Option { + let opr = known::Opr::try_from(opr).ok()?; + Some(parent.child(crumb,opr)) +} + +fn assoc(ast:&known::Opr) -> Assoc { + Assoc::of(&ast.name) +} // ======================== @@ -57,28 +70,32 @@ pub struct GeneralizedInfix { } impl GeneralizedInfix { + pub fn try_new_root(ast:&Ast) -> Option { + GeneralizedInfix::try_new(&Located::new_root(ast.clone())) + } + /// Tries interpret given AST node as GeneralizedInfix. Returns None, if Ast is not any kind of /// application on infix operator. - pub fn try_new(ast:&Ast) -> Option { + pub fn try_new(ast:&Located) -> Option { match ast.shape() { Shape::Infix(infix) => Some(GeneralizedInfix{ - left : Some(infix.larg.clone()), - opr : known::Opr::try_from(&infix.opr).ok()?, - right : Some(infix.rarg.clone()), + left : make_operand (ast,InfixCrumb::LeftOperand, &infix.larg), + opr : make_operator(ast,InfixCrumb::Operator, &infix.opr)?, + right : make_operand (ast,InfixCrumb::RightOperand,&infix.rarg), }), Shape::SectionLeft(left) => Some(GeneralizedInfix{ - left : Some(left.arg.clone()), - opr : known::Opr::try_from(&left.opr).ok()?, + left : make_operand (ast,SectionLeftCrumb::Arg,&left.arg), + opr : make_operator(ast,SectionLeftCrumb::Opr,&left.opr)?, right : None, }), Shape::SectionRight(right) => Some(GeneralizedInfix{ left : None, - opr : known::Opr::try_from(&right.opr).ok()?, - right : Some(right.arg.clone()), + opr : make_operator(ast,SectionRightCrumb::Opr,&right.opr)?, + right : make_operand (ast,SectionRightCrumb::Arg,&right.arg), }), Shape::SectionSides(sides) => Some(GeneralizedInfix{ left : None, - opr : known::Opr::try_from(&sides.opr).ok()?, + opr : make_operator(ast,SectionSidesCrumb,&sides.opr)?, right : None, }), _ => None, @@ -127,7 +144,7 @@ impl GeneralizedInfix { let mut target_subtree_flat = match target_subtree_infix { Some(target_infix) if target_infix.name() == self.name() => target_infix.flatten(), - _ => Chain { target, args:Vec::new() }, + _ => Chain { target, args:Vec::new(), operator:self.opr.item.clone() }, }; target_subtree_flat.args.push(rest); @@ -149,20 +166,31 @@ pub struct Chain { pub target : Operand, /// Subsequent operands applied to the `target`. pub args : Vec, + /// Operator. + pub operator : known::Opr, } impl Chain { /// If this is infix, it flattens whole chain and returns result. /// Otherwise, returns None. pub fn try_new(ast:&Ast) -> Option { - GeneralizedInfix::try_new(ast).map(|infix| infix.flatten()) + GeneralizedInfix::try_new_root(&ast).map(|infix| infix.flatten()) } /// Flattens infix chain if this is infix application of given operator. pub fn try_new_of(ast:&Ast, operator:&str) -> Option { - let infix = GeneralizedInfix::try_new(ast)?; + let infix = GeneralizedInfix::try_new_root(&ast)?; (infix.name() == operator).as_some_from(|| infix.flatten()) } + + /// Iterates over &Located, beginning with target (this argument) and then subsequent + /// arguments. + pub fn enumerate_operands<'a>(&'a self) -> impl Iterator> + 'a { + let this = std::iter::once(&self.target); + let args = self.args.iter().map(|elem| &elem.operand); + let operands = this.chain(args).flatten(); + operands + } } /// Element of the infix application chain, i.e. operator and its operand. @@ -175,3 +203,35 @@ pub struct ChainElement { /// or on the left side of operator. pub operand : Operand, } + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn infix_chain_tests() { + let a = Ast::var("a"); + let b = Ast::var("b"); + let c = Ast::var("c"); + let a_plus_b = Ast::infix(a.clone(),"+",b.clone()); + let a_plus_b_plus_c = Ast::infix(a_plus_b.clone(),"+",c.clone()); + + + let chain = Chain::try_new(&a_plus_b_plus_c).unwrap(); + + let expect_ast_at_crumb_for = |operand:&Operand, expected_ast:&Ast| { + let crumbs = &operand.as_ref().unwrap().crumbs; + let ast = a_plus_b_plus_c.get_traversing(crumbs).unwrap(); + assert_eq!(ast, expected_ast, "expected `{}` at crumbs `{:?}` for `{}`", + expected_ast.repr(), crumbs, a_plus_b_plus_c.repr()); + }; + + assert_eq!(chain.target.as_ref().unwrap().item, a); + assert_eq!(chain.args[0].operand.as_ref().unwrap().item, b); + assert_eq!(chain.args[1].operand.as_ref().unwrap().item, c); + expect_ast_at_crumb_for(&chain.target, &a); + expect_ast_at_crumb_for(&chain.args[0].operand, &b); + expect_ast_at_crumb_for(&chain.args[1].operand, &c); + } +} \ No newline at end of file diff --git a/src/rust/ide/ast/impl/src/prefix.rs b/src/rust/ide/ast/impl/src/prefix.rs index fe36d9b989..40ce081818 100644 --- a/src/rust/ide/ast/impl/src/prefix.rs +++ b/src/rust/ide/ast/impl/src/prefix.rs @@ -4,6 +4,10 @@ use crate::prelude::*; use crate::known; use crate::Ast; +use crate::crumbs::Located; +use crate::crumbs::PrefixCrumb; + +use utils::vec::VecExt; #[derive(Clone,Debug)] /// Result of flattening a sequence of prefix applications. @@ -35,6 +39,10 @@ impl Chain { Chain {func,args} } + pub fn try_new(ast:&Ast) -> Option { + known::Prefix::try_from(ast).as_ref().map(Chain::new).ok() + } + /// As new but if the AST is not a prefix, interprets is a function with an /// empty arguments list. pub fn new_non_strict(ast:&Ast) -> Chain { @@ -55,4 +63,51 @@ impl Chain { Chain {func,args} } } + + pub fn enumerate_args<'a>(&'a self) -> Box> + 'a> { + if let Some(func_step_count) = self.args.len().checked_sub(1) { + let func_crumbs = std::iter::repeat(PrefixCrumb::Func).take(func_step_count); + let mut crumbs = func_crumbs.collect_vec(); + crumbs.push(PrefixCrumb::Arg); + let ret = self.args.iter().map(move |arg| { + let ret = Located::new(&crumbs, arg.clone()); + crumbs.pop_front(); + ret + }); + Box::new(ret) + } else { + assert!(self.args.is_empty()); + Box::new(std::iter::empty()) + } + } } + + + +#[cfg(test)] +mod tests { + use super::*; + + use utils::test::ExpectTuple; + + #[test] + fn prefix_chain() { + let a = Ast::var("a"); + let b = Ast::var("b"); + let c = Ast::var("c"); + + let a_b = Ast::prefix(a.clone(),b.clone()); + let a_b_c = Ast::prefix(a_b.clone(),c.clone()); + + let chain = Chain::try_new(&a_b_c).unwrap(); + assert_eq!(chain.func, a); + assert_eq!(chain.args[0], b); + assert_eq!(chain.args[1], c); + + let (arg1,arg2) = chain.enumerate_args().expect_tuple(); + assert_eq!(arg1.item, b); + assert_eq!(a_b_c.get_traversing(&arg1.crumbs).unwrap(), &b); + assert_eq!(arg2.item, c); + assert_eq!(a_b_c.get_traversing(&arg2.crumbs).unwrap(), &c); + } +} \ No newline at end of file diff --git a/src/rust/ide/src/double_representation/alias_analysis.rs b/src/rust/ide/src/double_representation/alias_analysis.rs index fcda1e142f..f05bd36d08 100644 --- a/src/rust/ide/src/double_representation/alias_analysis.rs +++ b/src/rust/ide/src/double_representation/alias_analysis.rs @@ -5,8 +5,10 @@ use crate::prelude::*; use crate::double_representation::node::NodeInfo; -use ast::crumbs::InfixCrumb; +use ast::crumbs::{InfixCrumb, Located}; use ast::crumbs::Crumb; +use crate::double_representation::definition::DefinitionInfo; +use crate::double_representation::alias_analysis::Context::Graph; #[cfg(test)] pub mod test_utils; @@ -68,7 +70,7 @@ pub struct IdentifierUsage { // === Analysis === // ================ -#[derive(Clone,Copy,Debug,Display)] +#[derive(Clone,Copy,Debug,Display,PartialEq)] enum Context {Graph,AssignmentPattern} #[derive(Clone,Debug)] @@ -96,28 +98,70 @@ impl AliasAnalyzer { self.usage.introduced.push(identifier) } + fn in_context(&mut self, context:Context) -> bool { + self.context.last().contains(&&context) + } + + fn in_assignment_pattern(&mut self) -> bool { + self.in_context(Context::AssignmentPattern) + } + fn process_ast(&mut self, ast:&Ast) { - if let Some(name) = NormalizedName::try_from_ast(ast) { - match self.context.last() { - Some(Context::AssignmentPattern) => self.introduce_identifier(name), - Some(Context::Graph) => self.use_identifier(name), - _ => todo!() + println!("Processing `{}` in context {}",ast.repr(),self.context.last().unwrap()); + + // Special case for pattern matching. + if self.in_assignment_pattern() { + // We are in the assignment's pattern. three options: + // 1) This is a destructuring pattern match with prefix syntax, like `Point x y`. + // 3) As above but with operator and infix syntax, like `head,tail`. + // 2) This is a nullary symbol binding, like `foo`. + // (the possibility of definition has been already excluded) + if let Some(prefix_chain) = ast::prefix::Chain::try_new(ast) { + println!("Pattern of infix chain of {}",ast.repr()); + // Arguments introduce names, we ignore function name. + for Located{crumbs,item} in prefix_chain.enumerate_args() { + println!("Argument: crumb {:?} contents {}", crumbs,item.repr()); + self.in_location_nested(crumbs, |this| this.process_ast(&item)) + } + } else if let Some(infix_chain) = ast::opr::Chain::try_new(ast) { + for operand in infix_chain.enumerate_operands() { + self.in_location_of(operand, |this| this.process_ast(&operand.item)) + } + } else if let Some(name) = NormalizedName::try_from_ast(ast) { + self.introduce_identifier(name) } - } else { - for (crumb,ast) in ast.enumerate() { - self.in_location(crumb, |this| this.process_ast(ast)) + } else if self.in_context(Graph) { + if let Some(name) = NormalizedName::try_from_ast(ast) { + self.use_identifier(name) + } else { + for (crumb,ast) in ast.enumerate() { + self.in_location(crumb, |this| this.process_ast(ast)) + } } } } fn in_location(&mut self, crumb:impl Into, f:F) -> R where F:FnOnce(&mut Self) -> R { - self.location.push(crumb.into()); + self.in_location_nested(std::iter::once(crumb),f) + } + + fn in_location_nested(&mut self, crumbs:impl IntoIterator>, f:F) -> R + where F:FnOnce(&mut Self) -> R { + let size_before = self.location.len(); + self.location.extend(crumbs.into_iter().map(|crumb| crumb.into())); let ret = f(self); - self.location.pop(); + while self.location.len() > size_before { + self.location.pop(); + } ret } + fn in_location_of(&mut self, located_item:&Located, f:F) -> R + where F:FnOnce(&mut Self) -> R { + self.in_location_nested(located_item.crumbs.iter().cloned(), f) + } + fn enter_assignment_pattern(&mut self, ast:&Ast) { self.in_location(InfixCrumb::LeftOperand, |this| { this.context.push(Context::AssignmentPattern); @@ -176,10 +220,10 @@ mod tests { use super::*; use super::test_utils::*; - use wasm_bindgen_test::wasm_bindgen_test; - use wasm_bindgen_test::wasm_bindgen_test_configure; - - wasm_bindgen_test_configure!(run_in_browser); +// use wasm_bindgen_test::wasm_bindgen_test; +// use wasm_bindgen_test::wasm_bindgen_test_configure; +// +// wasm_bindgen_test_configure!(run_in_browser); /// Checks if actual observed sequence of located identifiers matches the expected one. /// Expected identifiers are described as code spans in the node's text representation. @@ -211,18 +255,21 @@ mod tests { fn test_alias_analysis() { let parser = parser::Parser::new_or_panic(); + // Removed cases +// "«foo» a b = a »+« b", // this we don't care, because this is not a node +// "«log_name» object = »print« object.»name«", +// "«^» a n = a * a ^ (n - 1)", + let test_cases = vec![ "»foo«", "«five» = 5", "«foo» = »bar«", "«sum» = »a« »+« »b«", -// "«foo» a b = a + b", -// "Foo «a» «b» = »bar«", + "Point «x» «u» = »point«", + "«x» »,« «y» = »pair«" // "a.«hello» = »print« 'Hello'", -// "«log_name» object = »print« object.»name«", // "«log_name» = object -> »print« object.»name«", // "«log_name» = object -> »print« $ »name« object", -// "«^» a n = a * a ^ (n - 1)", ]; for case in test_cases { run_markdown_case(&parser,case) diff --git a/src/rust/ide/src/double_representation/definition.rs b/src/rust/ide/src/double_representation/definition.rs index cb990a1aa4..a2019f938d 100644 --- a/src/rust/ide/src/double_representation/definition.rs +++ b/src/rust/ide/src/double_representation/definition.rs @@ -154,10 +154,10 @@ impl DefinitionName { let accessor_chain = opr::Chain::try_new_of(ast,opr::predefined::ACCESS); let (extended_target,name) = match accessor_chain { Some(accessor_chain) => { - let mut args = vec![ast::identifier::name(&accessor_chain.target?)?.clone()]; + let mut args = vec![ast::identifier::name(&*accessor_chain.target?)?.clone()]; for arg in accessor_chain.args.iter() { let arg_ast = arg.operand.as_ref()?; - args.push(ast::identifier::name(arg_ast)?.clone()) + args.push(ast::identifier::name(&*arg_ast)?.clone()) } let name = args.pop()?; (args,name) diff --git a/src/rust/ide/src/lib.rs b/src/rust/ide/src/lib.rs index 50c9d457b6..4d09b7d6a6 100644 --- a/src/rust/ide/src/lib.rs +++ b/src/rust/ide/src/lib.rs @@ -1,6 +1,7 @@ //! Main library crate for IDE. It includes implementation of //! controllers, view logic and code that wraps them all together. - +//! +#![feature(associated_type_bounds)] #![feature(bool_to_option)] #![feature(cell_update)] #![feature(drain_filter)] From 90d64eb17985f32517aa9fdfc0a0d66248c0fe7b Mon Sep 17 00:00:00 2001 From: mwu Date: Thu, 9 Apr 2020 12:50:25 +0200 Subject: [PATCH 07/27] fixes --- src/rust/ide/ast/impl/src/opr.rs | 6 ++++++ src/rust/ide/parser/tests/ast.rs | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/rust/ide/ast/impl/src/opr.rs b/src/rust/ide/ast/impl/src/opr.rs index d97ccceb37..c4baa1addf 100644 --- a/src/rust/ide/ast/impl/src/opr.rs +++ b/src/rust/ide/ast/impl/src/opr.rs @@ -191,6 +191,12 @@ impl Chain { let operands = this.chain(args).flatten(); operands } + + /// Iterates over &Located, beginning with target (this argument) and then subsequent + /// arguments. + pub fn enumerate_operators<'a>(&'a self) -> impl Iterator> + 'a { + self.args.iter().map(|elem| &elem.operator) + } } /// Element of the infix application chain, i.e. operator and its operand. diff --git a/src/rust/ide/parser/tests/ast.rs b/src/rust/ide/parser/tests/ast.rs index 54b2ddf394..0e42910eba 100644 --- a/src/rust/ide/parser/tests/ast.rs +++ b/src/rust/ide/parser/tests/ast.rs @@ -43,7 +43,7 @@ pub fn generalized_infix_test() { let make_gen_infix = |code:&str| { let ast = parser.parse(code.to_string(),default()).unwrap(); let line = expect_single_line(&ast); - GeneralizedInfix::try_new(line) + GeneralizedInfix::try_new_root(line) }; let infix = make_gen_infix("a+b").unwrap(); From 757ed2b5f42067ad3c2ea4d39a9710934be75439 Mon Sep 17 00:00:00 2001 From: mwu Date: Fri, 10 Apr 2020 01:04:45 +0200 Subject: [PATCH 08/27] updates based on Ara's feedback and call with Wojciech --- src/rust/ide/ast/impl/src/opr.rs | 50 ++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 21 deletions(-) diff --git a/src/rust/ide/ast/impl/src/opr.rs b/src/rust/ide/ast/impl/src/opr.rs index c4baa1addf..079f8d624d 100644 --- a/src/rust/ide/ast/impl/src/opr.rs +++ b/src/rust/ide/ast/impl/src/opr.rs @@ -215,29 +215,37 @@ pub struct ChainElement { mod tests { use super::*; + fn expect_at(root_ast:&Ast, operand:&Operand, expected_ast:&Ast) { + assert_eq!(&operand.as_ref().unwrap().item,expected_ast); + let crumbs = &operand.as_ref().unwrap().crumbs; + let ast = root_ast.get_traversing(crumbs).unwrap(); + assert_eq!(ast, expected_ast, "expected `{}` at crumbs `{:?}` for `{}`", + expected_ast.repr(), crumbs, root_ast.repr()); + } + #[test] fn infix_chain_tests() { - let a = Ast::var("a"); - let b = Ast::var("b"); - let c = Ast::var("c"); - let a_plus_b = Ast::infix(a.clone(),"+",b.clone()); + let a = Ast::var("a"); + let b = Ast::var("b"); + let c = Ast::var("c"); + let a_plus_b = Ast::infix(a.clone(),"+",b.clone()); let a_plus_b_plus_c = Ast::infix(a_plus_b.clone(),"+",c.clone()); + let chain = Chain::try_new(&a_plus_b_plus_c).unwrap(); + expect_at(&a_plus_b_plus_c,&chain.target,&a); + expect_at(&a_plus_b_plus_c,&chain.args[0].operand,&b); + expect_at(&a_plus_b_plus_c,&chain.args[1].operand,&c); + } - - let chain = Chain::try_new(&a_plus_b_plus_c).unwrap(); - - let expect_ast_at_crumb_for = |operand:&Operand, expected_ast:&Ast| { - let crumbs = &operand.as_ref().unwrap().crumbs; - let ast = a_plus_b_plus_c.get_traversing(crumbs).unwrap(); - assert_eq!(ast, expected_ast, "expected `{}` at crumbs `{:?}` for `{}`", - expected_ast.repr(), crumbs, a_plus_b_plus_c.repr()); - }; - - assert_eq!(chain.target.as_ref().unwrap().item, a); - assert_eq!(chain.args[0].operand.as_ref().unwrap().item, b); - assert_eq!(chain.args[1].operand.as_ref().unwrap().item, c); - expect_ast_at_crumb_for(&chain.target, &a); - expect_ast_at_crumb_for(&chain.args[0].operand, &b); - expect_ast_at_crumb_for(&chain.args[1].operand, &c); + #[test] + fn infix_chain_tests_right() { + let a = Ast::var("a"); + let b = Ast::var("b"); + let c = Ast::var("c"); + let b_comma_c = Ast::infix(b.clone(),",",c.clone()); + let a_comma_b_comma_c = Ast::infix(a.clone(),",",b_comma_c.clone()); + let chain = Chain::try_new(&a_comma_b_comma_c).unwrap(); + expect_at(&a_comma_b_comma_c,&chain.target,&c); + expect_at(&a_comma_b_comma_c,&chain.args[0].operand,&b); + expect_at(&a_comma_b_comma_c,&chain.args[1].operand,&a); } -} \ No newline at end of file +} From eb2b2a471afc88f75c8fee84495af8b5e6964169 Mon Sep 17 00:00:00 2001 From: mwu Date: Fri, 10 Apr 2020 14:44:44 +0200 Subject: [PATCH 09/27] development --- src/rust/ide/ast/impl/src/app.rs | 17 -- src/rust/ide/ast/impl/src/lib.rs | 1 - src/rust/ide/ast/impl/src/opr.rs | 2 +- .../double_representation/alias_analysis.rs | 172 ++++++++++++------ .../alias_analysis/test_utils.rs | 16 +- src/rust/ide/utils/src/vec.rs | 11 ++ 6 files changed, 136 insertions(+), 83 deletions(-) delete mode 100644 src/rust/ide/ast/impl/src/app.rs diff --git a/src/rust/ide/ast/impl/src/app.rs b/src/rust/ide/ast/impl/src/app.rs deleted file mode 100644 index 86d7f65bb1..0000000000 --- a/src/rust/ide/ast/impl/src/app.rs +++ /dev/null @@ -1,17 +0,0 @@ -use crate::prelude::*; - -struct GeneralizedApplication { - target : Ast, - arguments : Vec -} - -//impl GeneralizedApplication { -// pub fn try_new(ast:&Ast) -> Option { -// if let Some(chain) = crate::opr::Chain::try_new(ast) { -// let target = chain.target?; -// let arguments = chain.args.into_iter().map(|arg| arg.operand) -// -// } -// } -//} - diff --git a/src/rust/ide/ast/impl/src/lib.rs b/src/rust/ide/ast/impl/src/lib.rs index 4359de44d1..7c1ce46d1e 100644 --- a/src/rust/ide/ast/impl/src/lib.rs +++ b/src/rust/ide/ast/impl/src/lib.rs @@ -5,7 +5,6 @@ #![feature(type_alias_impl_trait)] #![feature(matches_macro)] -pub mod app; #[warn(missing_docs)] pub mod assoc; #[warn(missing_docs)] diff --git a/src/rust/ide/ast/impl/src/opr.rs b/src/rust/ide/ast/impl/src/opr.rs index 079f8d624d..bc3152e5ca 100644 --- a/src/rust/ide/ast/impl/src/opr.rs +++ b/src/rust/ide/ast/impl/src/opr.rs @@ -104,7 +104,7 @@ impl GeneralizedInfix { /// Associativity of the operator used in this infix expression. pub fn assoc(&self) -> Assoc { - Assoc::of(&self.name()) + assoc(&self.opr.item) } /// Identifier name of the operator used in this infix expression. diff --git a/src/rust/ide/src/double_representation/alias_analysis.rs b/src/rust/ide/src/double_representation/alias_analysis.rs index f05bd36d08..e8058deca9 100644 --- a/src/rust/ide/src/double_representation/alias_analysis.rs +++ b/src/rust/ide/src/double_representation/alias_analysis.rs @@ -8,7 +8,6 @@ use crate::double_representation::node::NodeInfo; use ast::crumbs::{InfixCrumb, Located}; use ast::crumbs::Crumb; use crate::double_representation::definition::DefinitionInfo; -use crate::double_representation::alias_analysis::Context::Graph; #[cfg(test)] pub mod test_utils; @@ -71,46 +70,119 @@ pub struct IdentifierUsage { // ================ #[derive(Clone,Copy,Debug,Display,PartialEq)] -enum Context {Graph,AssignmentPattern} +enum NameKind { Used, Introduced } + +#[derive(Clone,Copy,Debug,Display,PartialEq)] +enum Context { NonPattern, Pattern } + +#[derive(Clone,Debug,Default)] +struct Scope { + symbols : IdentifierUsage +} + +//struct WithPushed<'a,T> { +// target : &'a Vec, +// original_count : usize +//} +// +//impl<'a,T> WithPushed<'a,T> { +// fn new_single() +//} +// +//impl<'a,T> Drop for WithPushed<'a,T> { +// fn drop(&mut self) { +// self.target.truncate(self.original_count) +// } +//} #[derive(Clone,Debug)] struct AliasAnalyzer { - usage : IdentifierUsage, + scopes : Vec, context : Vec, - location : ast::crumbs::Crumbs, + location : Vec, } impl AliasAnalyzer { fn new() -> AliasAnalyzer { AliasAnalyzer { - usage : default(), - context : vec![Context::Graph], + scopes : vec![default()], + context : vec![Context::NonPattern], location : default(), } } - fn use_identifier(&mut self, identifier:NormalizedName) { - let identifier = LocatedIdentifier::new(self.location.clone(), identifier); - self.usage.used.push(identifier) + fn with_items_added + ( &mut self + , vec : impl Fn(&mut Self) -> &mut Vec + , items : Cs + , f : F) -> R + where + Cs : IntoIterator>, + F : FnOnce(&mut Self) -> R { + let original_count = vec(self).len(); + vec(self).extend(items.into_iter().map(|item| item.into())); + let ret = f(self); + vec(self).truncate(original_count); + ret + } + + fn in_new_scope(&mut self, f:impl FnOnce(&mut AliasAnalyzer)) { + let scope = Scope::default(); + self.with_items_added(|this| &mut this.scopes, std::iter::once(scope), f); + } + + fn in_new_context(&mut self, context:Context, f:impl FnOnce(&mut AliasAnalyzer)) { + self.with_items_added(|this| &mut this.context, std::iter::once(context), f); + } + + fn in_new_location(&mut self, crumbs:Cs, f:F) -> R + where Cs : IntoIterator>, + F : FnOnce(&mut AliasAnalyzer) -> R { + self.with_items_added(|this| &mut this.location, crumbs, f) + } + + fn current_scope_mut(&mut self) -> &mut Scope { + // TODO explain why absolutely safe and should totally not break tests + self.scopes.last_mut().unwrap() } - fn introduce_identifier(&mut self, identifier:NormalizedName) { + + fn add_identifier(&mut self, kind:NameKind, identifier:NormalizedName) { let identifier = LocatedIdentifier::new(self.location.clone(), identifier); - self.usage.introduced.push(identifier) + let symbols = &mut self.current_scope_mut().symbols; + let target = match kind { + NameKind::Used => &mut symbols.used, + NameKind::Introduced => &mut symbols.introduced, + }; + target.push(identifier) } fn in_context(&mut self, context:Context) -> bool { self.context.last().contains(&&context) } - fn in_assignment_pattern(&mut self) -> bool { - self.in_context(Context::AssignmentPattern) + fn is_in_pattern(&mut self) -> bool { + self.in_context(Context::Pattern) + } + + fn try_adding_name(&mut self, kind:NameKind, ast:&Ast) -> bool { + if let Some(name) = NormalizedName::try_from_ast(ast) { + self.add_identifier(kind,name); + true + } else { + false + } + } + fn try_adding_located(&mut self, kind:NameKind, located:&Located) -> bool + where for<'a> &'a T : Into<&'a Ast> { + let ast = (&located.item).into(); + self.in_location_of(located, |this| this.try_adding_name(kind,ast)) } fn process_ast(&mut self, ast:&Ast) { println!("Processing `{}` in context {}",ast.repr(),self.context.last().unwrap()); - - // Special case for pattern matching. - if self.in_assignment_pattern() { + if let Some(assignment) = ast::opr::to_assignment(ast) { + self.process_assignment(&assignment); + } else if self.is_in_pattern() { // We are in the assignment's pattern. three options: // 1) This is a destructuring pattern match with prefix syntax, like `Point x y`. // 3) As above but with operator and infix syntax, like `head,tail`. @@ -121,18 +193,22 @@ impl AliasAnalyzer { // Arguments introduce names, we ignore function name. for Located{crumbs,item} in prefix_chain.enumerate_args() { println!("Argument: crumb {:?} contents {}", crumbs,item.repr()); - self.in_location_nested(crumbs, |this| this.process_ast(&item)) + self.in_new_location(crumbs, |this| this.process_ast(&item)) } } else if let Some(infix_chain) = ast::opr::Chain::try_new(ast) { for operand in infix_chain.enumerate_operands() { self.in_location_of(operand, |this| this.process_ast(&operand.item)) } - } else if let Some(name) = NormalizedName::try_from_ast(ast) { - self.introduce_identifier(name) + for operator in infix_chain.enumerate_operators() { + // Operators in infix positions are treated as constructors, i.e. they are used. + self.try_adding_located(NameKind::Used,operator); + } + } else { + self.try_adding_name(NameKind::Introduced,ast); } - } else if self.in_context(Graph) { - if let Some(name) = NormalizedName::try_from_ast(ast) { - self.use_identifier(name) + } else if self.in_context(Context::NonPattern) { + if self.try_adding_name(NameKind::Used,ast) { + // Plain identifier: just add and do nothing. } else { for (crumb,ast) in ast.enumerate() { self.in_location(crumb, |this| this.process_ast(ast)) @@ -143,45 +219,27 @@ impl AliasAnalyzer { fn in_location(&mut self, crumb:impl Into, f:F) -> R where F:FnOnce(&mut Self) -> R { - self.in_location_nested(std::iter::once(crumb),f) - } - - fn in_location_nested(&mut self, crumbs:impl IntoIterator>, f:F) -> R - where F:FnOnce(&mut Self) -> R { - let size_before = self.location.len(); - self.location.extend(crumbs.into_iter().map(|crumb| crumb.into())); - let ret = f(self); - while self.location.len() > size_before { - self.location.pop(); - } - ret + self.in_new_location(std::iter::once(crumb),f) } fn in_location_of(&mut self, located_item:&Located, f:F) -> R where F:FnOnce(&mut Self) -> R { - self.in_location_nested(located_item.crumbs.iter().cloned(), f) + self.in_new_location(located_item.crumbs.iter().cloned(), f) } - fn enter_assignment_pattern(&mut self, ast:&Ast) { - self.in_location(InfixCrumb::LeftOperand, |this| { - this.context.push(Context::AssignmentPattern); - this.process_ast(ast); - this.context.pop(); - }); - } - - fn enter_assignment_body(&mut self, ast:&Ast) { - self.in_location(InfixCrumb::RightOperand, |this| this.process_ast(ast)); + fn process_assignment(&mut self, assignment:&ast::known::Infix) { + self.in_location(InfixCrumb::LeftOperand, |this| + this.in_new_context(Context::Pattern, |this| + this.process_ast(&assignment.larg) + ) + ); + self.in_location(InfixCrumb::RightOperand, |this| + this.process_ast(&assignment.rarg) + ); } fn enter_node(&mut self, node:&NodeInfo) { - let ast = node.ast(); - if let Some(assignment) = ast::opr::to_assignment(ast) { - self.enter_assignment_pattern(&assignment.larg); - self.enter_assignment_body(&assignment.rarg); - } else { - self.process_ast(ast) - } + self.process_ast(node.ast()) } } @@ -190,7 +248,7 @@ impl AliasAnalyzer { pub fn analyse_identifier_usage(node:&NodeInfo) -> IdentifierUsage { let mut analyzer = AliasAnalyzer::new(); analyzer.enter_node(node); - analyzer.usage + analyzer.scopes.last().unwrap().symbols.clone() // TODO mvoe out } ///// Hardcoded proper result for `sum = a + b`. @@ -228,8 +286,8 @@ mod tests { /// Checks if actual observed sequence of located identifiers matches the expected one. /// Expected identifiers are described as code spans in the node's text representation. fn validate_identifiers - (node:&NodeInfo, expected:Vec>, actual:&Vec) { - let mut checker = IdentifierValidator::new(node,expected); + (name:impl Str, node:&NodeInfo, expected:Vec>, actual:&Vec) { + let mut checker = IdentifierValidator::new(name,node,expected); checker.validate_identifiers(actual); } @@ -239,8 +297,8 @@ mod tests { let node = NodeInfo::from_line_ast(&ast).unwrap(); let result = analyse_identifier_usage(&node); println!("Analysis results: {:?}", result); - validate_identifiers(&node, case.expected_introduced, &result.introduced); - validate_identifiers(&node, case.expected_used, &result.used); + validate_identifiers("introduced",&node, case.expected_introduced, &result.introduced); + validate_identifiers("used", &node, case.expected_used, &result.used); } /// Runs the test for the test case expressed using markdown notation. See `Case` for details. diff --git a/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs b/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs index dfdaf940ac..9df9c85bbd 100644 --- a/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs +++ b/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs @@ -133,14 +133,16 @@ enum HasBeenValidated {No,Yes} /// Otherwise, it shall panic when dropped. #[derive(Clone,Debug)] pub struct IdentifierValidator<'a> { - node :&'a NodeInfo, - validations:HashMap, + name : String, + node : &'a NodeInfo, + validations : HashMap, } impl<'a> IdentifierValidator<'a> { /// Creates a new checker, with identifier set obtained from given node's representation /// spans. - pub fn new(node:&NodeInfo,spans:Vec>) -> IdentifierValidator { + pub fn new(name:impl Str, node:&NodeInfo,spans:Vec>) -> IdentifierValidator { + let name = name.into(); let ast = node.ast(); let repr = ast.repr(); let mut validations = HashMap::default(); @@ -148,13 +150,13 @@ impl<'a> IdentifierValidator<'a> { let name = NormalizedName::new(&repr[span]); validations.insert(name, HasBeenValidated::No); } - IdentifierValidator {node,validations} + IdentifierValidator {name,node,validations} } /// Marks given identifier as checked. pub fn validate_identifier(&mut self, name:&NormalizedName) { - let err = || iformat!("unexpected identifier `{name}` validated"); - let used = self.validations.get_mut(&name).expect(&err()); + let err = iformat!("{self.name}: unexpected identifier `{name}` validated"); + let used = self.validations.get_mut(&name).expect(&err); *used = HasBeenValidated::Yes; } @@ -179,7 +181,7 @@ impl<'a> Drop for IdentifierValidator<'a> { if !std::thread::panicking() { for elem in &self.validations { assert_eq!(elem.1, &HasBeenValidated::Yes, - "identifier `{}` was not validated)", elem.0) + "{}: identifier `{}` was not validated)", self.name,elem.0) } } else { println!("Skipping identifier validation, because thread is already in panic."); diff --git a/src/rust/ide/utils/src/vec.rs b/src/rust/ide/utils/src/vec.rs index f1ede5e04a..3b76cd11bc 100644 --- a/src/rust/ide/utils/src/vec.rs +++ b/src/rust/ide/utils/src/vec.rs @@ -16,6 +16,17 @@ pub trait VecExt : AsMut> { fn pop_front(&mut self) -> Option { self.try_remove(0) } + + /// Removes the last `n` elements from the vector. + /// + /// Returns Some if elements were succesfully removed. + /// Returns None and leaves self intact, if there were not enough elements. + fn remove_last_n(&mut self, n:usize) -> Option<()> { + let vec = self.as_mut(); + let new_size = vec.len().checked_sub(n)?; + vec.truncate(new_size); + Some(()) + } } impl VecExt for Vec {} From e3411a81431db643609f2372b0599ccf8aadfd25 Mon Sep 17 00:00:00 2001 From: mwu Date: Fri, 10 Apr 2020 17:25:13 +0200 Subject: [PATCH 10/27] [wip] --- src/rust/Cargo.toml | 2 +- .../double_representation/alias_analysis.rs | 109 +++++++++++++----- 2 files changed, 78 insertions(+), 33 deletions(-) diff --git a/src/rust/Cargo.toml b/src/rust/Cargo.toml index d264822023..3c1e88e24d 100644 --- a/src/rust/Cargo.toml +++ b/src/rust/Cargo.toml @@ -47,4 +47,4 @@ debug = false [profile.test] opt-level = 0 lto = false -debug = false +debug = true diff --git a/src/rust/ide/src/double_representation/alias_analysis.rs b/src/rust/ide/src/double_representation/alias_analysis.rs index e8058deca9..9b37a7c4d0 100644 --- a/src/rust/ide/src/double_representation/alias_analysis.rs +++ b/src/rust/ide/src/double_representation/alias_analysis.rs @@ -80,34 +80,21 @@ struct Scope { symbols : IdentifierUsage } -//struct WithPushed<'a,T> { -// target : &'a Vec, -// original_count : usize -//} -// -//impl<'a,T> WithPushed<'a,T> { -// fn new_single() -//} -// -//impl<'a,T> Drop for WithPushed<'a,T> { -// fn drop(&mut self) { -// self.target.truncate(self.original_count) -// } -//} - #[derive(Clone,Debug)] struct AliasAnalyzer { - scopes : Vec, - context : Vec, - location : Vec, + run_focus : Option, + scopes : Vec, + context : Vec, + location : Vec, } impl AliasAnalyzer { fn new() -> AliasAnalyzer { AliasAnalyzer { - scopes : vec![default()], - context : vec![Context::NonPattern], - location : default(), + run_focus : default(), + scopes : vec![default()], + context : vec![Context::NonPattern], + location : default(), } } @@ -147,20 +134,59 @@ impl AliasAnalyzer { } fn add_identifier(&mut self, kind:NameKind, identifier:NormalizedName) { - let identifier = LocatedIdentifier::new(self.location.clone(), identifier); - let symbols = &mut self.current_scope_mut().symbols; - let target = match kind { - NameKind::Used => &mut symbols.used, - NameKind::Introduced => &mut symbols.introduced, - }; - target.push(identifier) + let matching_focus = self.run_focus.contains(&kind); + let identifier = LocatedIdentifier::new(self.location.clone(), identifier); + let scope_index = self.scopes.len()-1; + + + let symbols = &mut self.current_scope_mut().symbols; + if matching_focus { + let target = match kind { + NameKind::Used => &mut symbols.used, + NameKind::Introduced => &mut symbols.introduced, + }; + println!("Name {} is {} in scope @{}",identifier.item.0,kind,scope_index); + target.push(identifier) + } + + /* + if self.run_focus.contains(&kind) == false { + return + } + let identifier = LocatedIdentifier::new(self.location.clone(), identifier); + let scope_index = self.scopes.len()-1; + assert!(self.scopes.len() > 0); + + match kind { + NameKind::Introduced => { + println!("Name {} is introduced into scope @{}",identifier.item.0,kind,scope_index); + self.current_scope_mut().symbols.introduced.push(identifier); + } + NameKind::Used => { + for scope in self.scopes.iter_mut().rev() { + if scope.intro + } + } + } + + + + let symbols = &mut self.current_scope_mut().symbols; + let target = match kind { + NameKind::Used => &mut symbols.used, + NameKind::Introduced => &mut symbols.introduced, + }; + println!("Name {} is {} in scope @{}",identifier.item.0,kind,scope_index); + target.push(identifier) + */ } - fn in_context(&mut self, context:Context) -> bool { + + fn in_context(&self, context:Context) -> bool { self.context.last().contains(&&context) } - fn is_in_pattern(&mut self) -> bool { + fn is_in_pattern(&self) -> bool { self.in_context(Context::Pattern) } @@ -207,7 +233,13 @@ impl AliasAnalyzer { self.try_adding_name(NameKind::Introduced,ast); } } else if self.in_context(Context::NonPattern) { - if self.try_adding_name(NameKind::Used,ast) { + if let Ok(block) = ast::known::Block::try_from(ast) { + self.in_new_scope(|this| { + for (crumb,ast) in ast.enumerate() { + this.in_location(crumb, |this| this.process_ast(ast)) + } + }) + } else if self.try_adding_name(NameKind::Used,ast) { // Plain identifier: just add and do nothing. } else { for (crumb,ast) in ast.enumerate() { @@ -246,7 +278,12 @@ impl AliasAnalyzer { /// Describes identifiers that nodes introduces into the graph and identifiers from graph's scope /// that node uses. This logic serves as a base for connection discovery. pub fn analyse_identifier_usage(node:&NodeInfo) -> IdentifierUsage { + println!("\n===============================================================================\n"); + println!("Case: {}",node.ast().repr()); let mut analyzer = AliasAnalyzer::new(); + analyzer.run_focus = Some(NameKind::Introduced); + analyzer.enter_node(node); + analyzer.run_focus = Some(NameKind::Used); analyzer.enter_node(node); analyzer.scopes.last().unwrap().symbols.clone() // TODO mvoe out } @@ -324,7 +361,15 @@ mod tests { "«foo» = »bar«", "«sum» = »a« »+« »b«", "Point «x» «u» = »point«", - "«x» »,« «y» = »pair«" + "«x» »,« «y» = »pair«", + + r"«inc» = + »foo« »+« 1", + + r"«inc» = + foo = 2 + foo »+« 1", + // "a.«hello» = »print« 'Hello'", // "«log_name» = object -> »print« object.»name«", // "«log_name» = object -> »print« $ »name« object", From 31d0b1f0a98b8bb218d3aa1e016f63f1c285252a Mon Sep 17 00:00:00 2001 From: mwu Date: Fri, 10 Apr 2020 21:09:02 +0200 Subject: [PATCH 11/27] fixed nested block handling --- src/rust/ide/ast/impl/src/crumbs.rs | 34 +++++------ .../double_representation/alias_analysis.rs | 61 ++++++++++++------- 2 files changed, 57 insertions(+), 38 deletions(-) diff --git a/src/rust/ide/ast/impl/src/crumbs.rs b/src/rust/ide/ast/impl/src/crumbs.rs index 842a6be093..ee8fe0f52a 100644 --- a/src/rust/ide/ast/impl/src/crumbs.rs +++ b/src/rust/ide/ast/impl/src/crumbs.rs @@ -91,21 +91,21 @@ pub type Crumbs = Vec; // === InvalidSuffix === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub struct InvalidSuffixCrumb; // === TextLineFmt === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub struct TextLineFmtCrumb {pub segment_index:usize} // === TextBlockFmt === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub struct TextBlockFmtCrumb { pub text_line_index : usize, pub segment_index : usize @@ -115,7 +115,7 @@ pub struct TextBlockFmtCrumb { // === TextUnclosed === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub struct TextUnclosedCrumb { pub text_line_crumb : TextLineFmtCrumb } @@ -124,7 +124,7 @@ pub struct TextUnclosedCrumb { // === Prefix === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub enum PrefixCrumb { Func, Arg @@ -134,7 +134,7 @@ pub enum PrefixCrumb { // === Infix === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub enum InfixCrumb { LeftOperand, Operator, @@ -145,7 +145,7 @@ pub enum InfixCrumb { // === SectionLeft === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub enum SectionLeftCrumb { Arg, Opr @@ -155,7 +155,7 @@ pub enum SectionLeftCrumb { // === SectionRight === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub enum SectionRightCrumb { Opr, Arg @@ -165,21 +165,21 @@ pub enum SectionRightCrumb { // === SectionSides === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub struct SectionSidesCrumb; // === Module === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub struct ModuleCrumb {pub line_index:usize} // === Block === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub enum BlockCrumb { /// The first non-empty line in block. HeadLine, @@ -191,14 +191,14 @@ pub enum BlockCrumb { // === Import === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub struct ImportCrumb {pub index:usize} // === Mixfix === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub enum MixfixCrumb { Name {index:usize}, Args {index:usize} @@ -208,14 +208,14 @@ pub enum MixfixCrumb { // === Group === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub struct GroupCrumb; // === Def === #[allow(missing_docs)] -#[derive(Clone,Copy,Debug,PartialEq,Hash)] +#[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] pub enum DefCrumb { Name, Args {index:usize}, @@ -270,7 +270,7 @@ macro_rules! impl_crumbs { } /// Crumb identifies location of child AST in an AST node. Allows for a single step AST traversal. - #[derive(Clone,Copy,Debug,PartialEq,Hash)] + #[derive(Clone,Copy,Debug,PartialEq,Eq,Hash)] #[allow(missing_docs)] pub enum Crumb { $($id($crumb_id),)* @@ -859,7 +859,7 @@ pub fn non_empty_line_indices<'a, T:'a> // =============== /// Item which location is identified by `Crumbs`. -#[derive(Clone,Debug,Shrinkwrap)] +#[derive(Clone,Debug,Shrinkwrap,PartialEq,Eq,Hash)] pub struct Located { /// Crumbs from containing parent. pub crumbs : Crumbs, diff --git a/src/rust/ide/src/double_representation/alias_analysis.rs b/src/rust/ide/src/double_representation/alias_analysis.rs index 9b37a7c4d0..ce9dc412ba 100644 --- a/src/rust/ide/src/double_representation/alias_analysis.rs +++ b/src/rust/ide/src/double_representation/alias_analysis.rs @@ -80,9 +80,30 @@ struct Scope { symbols : IdentifierUsage } +impl Scope { + fn used_from_parent(self) -> impl Iterator { + // note: we must drop location, because we care only about name, obviously usage and + // introducing will take place elsewhere.s + let locally_available: HashSet = self.symbols.introduced.into_iter().map(|located_name| located_name.item).collect(); + let all_used = self.symbols.used.into_iter(); + all_used.filter(move |name| { + let aaa = !locally_available.contains(&name.item); + println!("Test: does {:?} belong to {:?}: {}", name, locally_available, aaa); + aaa + }) + } + + fn coalesce_child(&mut self, child:Scope) { + println!("Coalescing scopes:\n\ttarget: {:?}\n\tchild: {:?}",self,child); + let symbols_to_use = child.used_from_parent(); + self.symbols.used.extend(symbols_to_use); + println!("\tResult: {:?}",self); + } +} + #[derive(Clone,Debug)] struct AliasAnalyzer { - run_focus : Option, +// run_focus : Option, scopes : Vec, context : Vec, location : Vec, @@ -91,7 +112,7 @@ struct AliasAnalyzer { impl AliasAnalyzer { fn new() -> AliasAnalyzer { AliasAnalyzer { - run_focus : default(), +// run_focus : default(), scopes : vec![default()], context : vec![Context::NonPattern], location : default(), @@ -115,7 +136,11 @@ impl AliasAnalyzer { fn in_new_scope(&mut self, f:impl FnOnce(&mut AliasAnalyzer)) { let scope = Scope::default(); - self.with_items_added(|this| &mut this.scopes, std::iter::once(scope), f); + self.scopes.push(scope); + f(self); + let scope = self.scopes.pop().unwrap(); + self.scopes.last_mut().unwrap().coalesce_child(scope); +// self.with_items_added(|this| &mut this.scopes, std::iter::once(scope), f); } fn in_new_context(&mut self, context:Context, f:impl FnOnce(&mut AliasAnalyzer)) { @@ -134,21 +159,15 @@ impl AliasAnalyzer { } fn add_identifier(&mut self, kind:NameKind, identifier:NormalizedName) { - let matching_focus = self.run_focus.contains(&kind); - let identifier = LocatedIdentifier::new(self.location.clone(), identifier); - let scope_index = self.scopes.len()-1; - - - let symbols = &mut self.current_scope_mut().symbols; - if matching_focus { - let target = match kind { - NameKind::Used => &mut symbols.used, - NameKind::Introduced => &mut symbols.introduced, - }; - println!("Name {} is {} in scope @{}",identifier.item.0,kind,scope_index); - target.push(identifier) - } - + let identifier = LocatedIdentifier::new(self.location.clone(), identifier); + let scope_index = self.scopes.len()-1; + let symbols = &mut self.current_scope_mut().symbols; + let target = match kind { + NameKind::Used => &mut symbols.used, + NameKind::Introduced => &mut symbols.introduced, + }; + println!("Name {} is {} in scope @{}",identifier.item.0,kind,scope_index); + target.push(identifier) /* if self.run_focus.contains(&kind) == false { return @@ -281,10 +300,10 @@ pub fn analyse_identifier_usage(node:&NodeInfo) -> IdentifierUsage { println!("\n===============================================================================\n"); println!("Case: {}",node.ast().repr()); let mut analyzer = AliasAnalyzer::new(); - analyzer.run_focus = Some(NameKind::Introduced); - analyzer.enter_node(node); - analyzer.run_focus = Some(NameKind::Used); +// analyzer.run_focus = Some(NameKind::Introduced); analyzer.enter_node(node); +// analyzer.run_focus = Some(NameKind::Used); +// analyzer.enter_node(node); analyzer.scopes.last().unwrap().symbols.clone() // TODO mvoe out } From 68cdf2c8675659f6d1417234db35f87f8b251b7a Mon Sep 17 00:00:00 2001 From: mwu Date: Sun, 12 Apr 2020 13:23:24 +0200 Subject: [PATCH 12/27] total refactoring --- src/rust/ide/ast/impl/src/crumbs.rs | 45 ++-- src/rust/ide/ast/impl/src/lib.rs | 1 + src/rust/ide/ast/impl/src/opr.rs | 53 +++- src/rust/ide/ast/impl/src/prefix.rs | 8 +- .../double_representation/alias_analysis.rs | 253 +++++++++--------- .../src/double_representation/definition.rs | 2 +- 6 files changed, 195 insertions(+), 167 deletions(-) diff --git a/src/rust/ide/ast/impl/src/crumbs.rs b/src/rust/ide/ast/impl/src/crumbs.rs index ee8fe0f52a..3741d0c356 100644 --- a/src/rust/ide/ast/impl/src/crumbs.rs +++ b/src/rust/ide/ast/impl/src/crumbs.rs @@ -9,6 +9,7 @@ use crate::Shape; use utils::fail::FallibleResult; + // ============== // === Errors === // ============== @@ -238,6 +239,14 @@ macro_rules! from_crumb { Crumb::$id(crumb.clone()) } } + + impl IntoIterator for $crumb_id { + type Item = Crumb; + type IntoIter = std::iter::Once; + fn into_iter(self) -> Self::IntoIter { + std::iter::once(Crumb::from(self)) + } + } } } @@ -278,6 +287,15 @@ macro_rules! impl_crumbs { } } +impl IntoIterator for Crumb { + type Item = Crumb; + type IntoIter = std::iter::Once; + fn into_iter(self) -> Self::IntoIter { + std::iter::once(self) + } +} + + impl_crumbs!{ (InvalidSuffix,InvalidSuffixCrumb), (TextLineFmt ,TextLineFmtCrumb), @@ -893,13 +911,6 @@ impl Located { Located::new(self.crumbs, f(self.item)) } - /// Replaces the item, while pushing given crumbs on top of already present ones. - pub fn into_descendant(self, crumbs:Crumbs, item:U) -> Located { - let mut ret = self.map(|_| item); - ret.crumbs.extend(crumbs); - ret - } - pub fn descendant(&self, crumbs:Cs, child:U) -> Located where Cs : IntoIterator>,{ let crumbs_so_far = self.crumbs.iter().copied(); @@ -908,13 +919,16 @@ impl Located { Located::new(crumbs, child) } - pub fn child(&self, crumb:impl Into, child:U) -> Located { - self.descendant(std::iter::once(crumb),child) - } +// pub fn child(&self, crumb:impl Into, child:U) -> Located { +// self.descendant(std::iter::once(crumb),child) +// } /// Maps into child, concatenating this crumbs and child crumbs. - pub fn push_descendant(self, child:Located) -> Located { - self.into_descendant(child.crumbs,child.item) + pub fn into_descendant(self, child:Located) -> Located { + let Located {crumbs,item} = child; + let mut ret = self.map(|_| item); + ret.crumbs.extend(crumbs); + ret } } @@ -1442,13 +1456,8 @@ mod tests { assert_eq!(item.item, "zero"); assert!(item.crumbs.is_empty()); - let item = item.into_descendant(vec![Crumb::Infix(InfixCrumb::LeftOperand)], 1); - assert_eq!(item.item, 1); - let (crumb0,) = item.crumbs.iter().expect_tuple(); - assert_eq!(crumb0,&Crumb::Infix(InfixCrumb::LeftOperand)); - let child_item = Located::new_direct_child(InfixCrumb::Operator, "two"); - let item = item.push_descendant(child_item); + let item = item.into_descendant(child_item); assert_eq!(item.item, "two"); let (crumb0,crumb1) = item.crumbs.iter().expect_tuple(); assert_eq!(crumb0,&Crumb::Infix(InfixCrumb::LeftOperand)); diff --git a/src/rust/ide/ast/impl/src/lib.rs b/src/rust/ide/ast/impl/src/lib.rs index 7c1ce46d1e..b7d02cdff9 100644 --- a/src/rust/ide/ast/impl/src/lib.rs +++ b/src/rust/ide/ast/impl/src/lib.rs @@ -32,6 +32,7 @@ pub mod prelude { pub use crate::Ast; pub use crate::traits::*; + pub use utils::option::*; } use crate::prelude::*; diff --git a/src/rust/ide/ast/impl/src/opr.rs b/src/rust/ide/ast/impl/src/opr.rs index bc3152e5ca..4b5aeae9f4 100644 --- a/src/rust/ide/ast/impl/src/opr.rs +++ b/src/rust/ide/ast/impl/src/opr.rs @@ -10,22 +10,44 @@ use crate::crumbs::{Crumb, Located, InfixCrumb, SectionLeftCrumb, SectionRightCr /// Identifiers of operators with special meaning for IDE. pub mod predefined { - /// Used to create bindings, e.g. `add a b = a + b` or `foo = 5`. - pub const ASSIGNMENT : &str = "="; /// Used to create type paths (like `Int.+` or `IO.println`). pub const ACCESS : &str = "."; + /// Used to create bindings, e.g. `add a b = a + b` or `foo = 5`. + pub const ASSIGNMENT : &str = "="; + /// Used to create lambda expressions, e.g. `a -> b -> a + b`. + pub const ARROW : &str = "->"; +} + +/// Checks if the given AST has Opr shape with the name matching given string. +pub fn is_opr_named(ast:&Ast, name:impl Str) -> bool { + let opr_opt = known::Opr::try_from(ast).ok(); + opr_opt.contains_if(|opr| opr.name == name.as_ref()) } /// Checks if given Ast is an assignment operator identifier. pub fn is_assignment_opr(ast:&Ast) -> bool { - let opr_opt = known::Opr::try_from(ast); - opr_opt.map(|opr| opr.name == predefined::ASSIGNMENT).unwrap_or(false) + is_opr_named(ast,predefined::ASSIGNMENT) } -/// If given Ast is an assignment operator, returns it as Some known::Infix. -pub fn to_assignment(ast:&Ast) -> Option { +/// Checks if given Ast is an assignment operator identifier. +pub fn is_arrow_opr(ast:&Ast) -> bool { + is_opr_named(ast,predefined::ARROW) +} + +/// If given Ast is a specific infix operator application, returns it. +pub fn to_specific_infix(ast:&Ast, name:&str) -> Option { let infix = known::Infix::try_from(ast).ok()?; - is_assignment_opr(&infix.opr).then(infix) + is_opr_named(&infix.opr,name).then(infix) +} + +/// If given Ast is an assignment infix expression, returns it as Some known::Infix. +pub fn to_assignment(ast:&Ast) -> Option { + to_specific_infix(ast,predefined::ASSIGNMENT) +} + +/// If given Ast is an arrow infix expression, returns it as Some known::Infix. +pub fn to_arrow(ast:&Ast) -> Option { + to_specific_infix(ast,predefined::ARROW) } /// Checks if a given node is an assignment infix expression. @@ -34,19 +56,27 @@ pub fn is_assignment(ast:&Ast) -> bool { infix.map(|infix| is_assignment_opr(&infix.opr)).unwrap_or(false) } + + +// =========================== +// === Chain-related types === +// =========================== + /// Infix operator operand. Optional, as we deal with Section* nodes as well. pub type Operand = Option>; /// Infix operator standing between (optional) operands. pub type Operator = Located; -fn make_operand(parent:&Located, crumb:impl Into, child:&Ast) -> Operand { - Some(parent.child(crumb,child.clone())) +/// Creates `Operand` from `ast` with position relative to the given `parent` node. +pub fn make_operand(parent:&Located, crumb:impl Into, child:&Ast) -> Operand { + Some(parent.descendant(crumb.into(),child.clone())) } -fn make_operator(parent:&Located, crumb:impl Into, opr:&Ast) -> Option { +/// Creates `Operator` from `ast` with position relative to the given `parent` node. +pub fn make_operator(parent:&Located, crumb:impl Into, opr:&Ast) -> Option { let opr = known::Opr::try_from(opr).ok()?; - Some(parent.child(crumb,opr)) + Some(parent.descendant(crumb.into(),opr)) } fn assoc(ast:&known::Opr) -> Assoc { @@ -54,6 +84,7 @@ fn assoc(ast:&known::Opr) -> Assoc { } + // ======================== // === GeneralizedInfix === // ======================== diff --git a/src/rust/ide/ast/impl/src/prefix.rs b/src/rust/ide/ast/impl/src/prefix.rs index 40ce081818..8191845a94 100644 --- a/src/rust/ide/ast/impl/src/prefix.rs +++ b/src/rust/ide/ast/impl/src/prefix.rs @@ -64,13 +64,13 @@ impl Chain { } } - pub fn enumerate_args<'a>(&'a self) -> Box> + 'a> { + pub fn enumerate_args<'a>(&'a self) -> Box> + 'a> { if let Some(func_step_count) = self.args.len().checked_sub(1) { let func_crumbs = std::iter::repeat(PrefixCrumb::Func).take(func_step_count); let mut crumbs = func_crumbs.collect_vec(); crumbs.push(PrefixCrumb::Arg); let ret = self.args.iter().map(move |arg| { - let ret = Located::new(&crumbs, arg.clone()); + let ret = Located::new(&crumbs, arg); crumbs.pop_front(); ret }); @@ -105,9 +105,9 @@ mod tests { assert_eq!(chain.args[1], c); let (arg1,arg2) = chain.enumerate_args().expect_tuple(); - assert_eq!(arg1.item, b); + assert_eq!(arg1.item, &b); assert_eq!(a_b_c.get_traversing(&arg1.crumbs).unwrap(), &b); - assert_eq!(arg2.item, c); + assert_eq!(arg2.item, &c); assert_eq!(a_b_c.get_traversing(&arg2.crumbs).unwrap(), &c); } } \ No newline at end of file diff --git a/src/rust/ide/src/double_representation/alias_analysis.rs b/src/rust/ide/src/double_representation/alias_analysis.rs index ce9dc412ba..1be2225a0d 100644 --- a/src/rust/ide/src/double_representation/alias_analysis.rs +++ b/src/rust/ide/src/double_representation/alias_analysis.rs @@ -5,6 +5,7 @@ use crate::prelude::*; use crate::double_representation::node::NodeInfo; +use std::borrow::Borrow; use ast::crumbs::{InfixCrumb, Located}; use ast::crumbs::Crumb; use crate::double_representation::definition::DefinitionInfo; @@ -69,56 +70,75 @@ pub struct IdentifierUsage { // === Analysis === // ================ +/// Says whether the identifier occurrence introduces it into scope or uses it from scope. +#[allow(missing_docs)] #[derive(Clone,Copy,Debug,Display,PartialEq)] -enum NameKind { Used, Introduced } +pub enum OccurrenceKind { Used, Introduced } +/// If the current context in the AST processor is a pattern context. +#[allow(missing_docs)] #[derive(Clone,Copy,Debug,Display,PartialEq)] -enum Context { NonPattern, Pattern } +pub enum Context { NonPattern, Pattern } +/// Represents scope and information about identifiers usage within it. #[derive(Clone,Debug,Default)] -struct Scope { - symbols : IdentifierUsage +pub struct Scope { + #[allow(missing_docs)] + pub symbols : IdentifierUsage, } impl Scope { - fn used_from_parent(self) -> impl Iterator { - // note: we must drop location, because we care only about name, obviously usage and - // introducing will take place elsewhere.s - let locally_available: HashSet = self.symbols.introduced.into_iter().map(|located_name| located_name.item).collect(); - let all_used = self.symbols.used.into_iter(); - all_used.filter(move |name| { - let aaa = !locally_available.contains(&name.item); - println!("Test: does {:?} belong to {:?}: {}", name, locally_available, aaa); - aaa - }) + /// Iterates over identifiers that are used in this scope but are not introduced in this scope + /// i.e. the identifiers that parent scope must provide. + pub fn used_from_parent(self) -> impl Iterator { + let available = self.symbols.introduced.into_iter().map(|located_name| located_name.item); + let available : HashSet = HashSet::from_iter(available); + let all_used = self.symbols.used.into_iter(); + all_used.filter(move |name| !available.contains(&name.item)) } + /// Drops the information about nested child scope by: + /// 1) disregarding any usage of identifiers introduced in the child scope; + /// 2) propagating all non-shadowed identifier usage from this scope into this scope usage list. fn coalesce_child(&mut self, child:Scope) { - println!("Coalescing scopes:\n\ttarget: {:?}\n\tchild: {:?}",self,child); let symbols_to_use = child.used_from_parent(); self.symbols.used.extend(symbols_to_use); - println!("\tResult: {:?}",self); } } -#[derive(Clone,Debug)] -struct AliasAnalyzer { -// run_focus : Option, +/// Replaces macro matches on `->` operator with its resolved Ast. +fn pretend_that_lambda_is_not_a_macro_at_all(ast:&Ast) -> Option { + let match_ast = ast::known::Match::try_from(ast.clone()).ok()?; + let lhs = match_ast.pfx.as_ref()?; + let segment = &match_ast.segs.head; + if ast::opr::is_arrow_opr(&segment.head) { + println!("Got lambda, replacing with {}!", match_ast.resolved.repr()); + Some(match_ast.resolved.clone()) + } else { + None + } +} + +/// Traverser AST and analyzes identifier usage. +#[derive(Clone,Debug,Default)] +pub struct AliasAnalyzer { + /// Root scope for this analyzer. + root_scope: Scope, + /// Stack of scopes, shadowing the root one. scopes : Vec, + /// Stack of context. Lack of any context information is considered non-pattern context. context : Vec, + /// Current location, relative to the input AST root. location : Vec, } impl AliasAnalyzer { - fn new() -> AliasAnalyzer { - AliasAnalyzer { -// run_focus : default(), - scopes : vec![default()], - context : vec![Context::NonPattern], - location : default(), - } + /// Creates a new analyzer. + pub fn new() -> AliasAnalyzer { + AliasAnalyzer::default() } + /// Adds items to the target vector, calls the callback `f` then removes the items. fn with_items_added ( &mut self , vec : impl Fn(&mut Self) -> &mut Vec @@ -139,11 +159,10 @@ impl AliasAnalyzer { self.scopes.push(scope); f(self); let scope = self.scopes.pop().unwrap(); - self.scopes.last_mut().unwrap().coalesce_child(scope); -// self.with_items_added(|this| &mut this.scopes, std::iter::once(scope), f); + self.current_scope_mut().coalesce_child(scope); } - fn in_new_context(&mut self, context:Context, f:impl FnOnce(&mut AliasAnalyzer)) { + fn in_context(&mut self, context:Context, f:impl FnOnce(&mut AliasAnalyzer)) { self.with_items_added(|this| &mut this.context, std::iter::once(context), f); } @@ -153,63 +172,42 @@ impl AliasAnalyzer { self.with_items_added(|this| &mut this.location, crumbs, f) } + fn in_location(&mut self, crumb:impl Into, f:F) -> R + where F:FnOnce(&mut Self) -> R { + self.in_new_location(std::iter::once(crumb),f) + } + + fn in_location_of(&mut self, located_item:&Located, f:F) -> R + where F:FnOnce(&mut Self) -> R { + self.in_new_location(located_item.crumbs.iter().copied(), f) + } + fn current_scope_mut(&mut self) -> &mut Scope { - // TODO explain why absolutely safe and should totally not break tests - self.scopes.last_mut().unwrap() + self.scopes.last_mut().unwrap_or(&mut self.root_scope) } - fn add_identifier(&mut self, kind:NameKind, identifier:NormalizedName) { + fn add_identifier(&mut self, kind: OccurrenceKind, identifier:NormalizedName) { let identifier = LocatedIdentifier::new(self.location.clone(), identifier); - let scope_index = self.scopes.len()-1; + let scope_index = self.scopes.len(); let symbols = &mut self.current_scope_mut().symbols; let target = match kind { - NameKind::Used => &mut symbols.used, - NameKind::Introduced => &mut symbols.introduced, + OccurrenceKind::Used => &mut symbols.used, + OccurrenceKind::Introduced => &mut symbols.introduced, }; println!("Name {} is {} in scope @{}",identifier.item.0,kind,scope_index); target.push(identifier) - /* - if self.run_focus.contains(&kind) == false { - return - } - let identifier = LocatedIdentifier::new(self.location.clone(), identifier); - let scope_index = self.scopes.len()-1; - assert!(self.scopes.len() > 0); - - match kind { - NameKind::Introduced => { - println!("Name {} is introduced into scope @{}",identifier.item.0,kind,scope_index); - self.current_scope_mut().symbols.introduced.push(identifier); - } - NameKind::Used => { - for scope in self.scopes.iter_mut().rev() { - if scope.intro - } - } - } - - - - let symbols = &mut self.current_scope_mut().symbols; - let target = match kind { - NameKind::Used => &mut symbols.used, - NameKind::Introduced => &mut symbols.introduced, - }; - println!("Name {} is {} in scope @{}",identifier.item.0,kind,scope_index); - target.push(identifier) - */ } - fn in_context(&self, context:Context) -> bool { - self.context.last().contains(&&context) + fn is_in_context(&self, context:Context) -> bool { + self.context.last().unwrap_or(&Context::NonPattern) == &context } fn is_in_pattern(&self) -> bool { - self.in_context(Context::Pattern) + self.is_in_context(Context::Pattern) } - fn try_adding_name(&mut self, kind:NameKind, ast:&Ast) -> bool { + fn store_name_occurrence(&mut self, kind: OccurrenceKind, ast:&Ast) -> bool { if let Some(name) = NormalizedName::try_from_ast(ast) { self.add_identifier(kind,name); true @@ -217,79 +215,86 @@ impl AliasAnalyzer { false } } - fn try_adding_located(&mut self, kind:NameKind, located:&Located) -> bool + fn store_if_name(&mut self, kind:OccurrenceKind, located:&Located) -> bool where for<'a> &'a T : Into<&'a Ast> { let ast = (&located.item).into(); - self.in_location_of(located, |this| this.try_adding_name(kind,ast)) + self.in_location_of(located, |this| this.store_name_occurrence(kind, ast)) + } + + fn process_subtree(&mut self, crumb:impl Into, ast:&Ast) { + self.in_location(crumb.into(), |this| this.process_ast(ast)) + } + + fn process_located_ast(&mut self, located_ast:&Located>) { + self.in_location_of(&located_ast, |this| this.process_ast(located_ast.item.borrow())) + } + + fn process_subtrees(&mut self, ast:&Ast) { + for (crumb,ast) in ast.enumerate() { + self.process_subtree(crumb,ast) + } } fn process_ast(&mut self, ast:&Ast) { - println!("Processing `{}` in context {}",ast.repr(),self.context.last().unwrap()); - if let Some(assignment) = ast::opr::to_assignment(ast) { + let ast = pretend_that_lambda_is_not_a_macro_at_all(ast).unwrap_or(ast.clone()); + println!("Processing `{}` in 0context {:?}",ast.repr(),self.context.last()); + if let Some(assignment) = ast::opr::to_assignment(&ast) { self.process_assignment(&assignment); + } else if let Some(lambda) = ast::opr::to_arrow(&ast) { + self.process_lambda(&lambda); } else if self.is_in_pattern() { - // We are in the assignment's pattern. three options: + // We are in the pattern (be it a lambda's or assignment's left side). Three options: // 1) This is a destructuring pattern match with prefix syntax, like `Point x y`. // 3) As above but with operator and infix syntax, like `head,tail`. // 2) This is a nullary symbol binding, like `foo`. // (the possibility of definition has been already excluded) - if let Some(prefix_chain) = ast::prefix::Chain::try_new(ast) { + if let Some(prefix_chain) = ast::prefix::Chain::try_new(&ast) { println!("Pattern of infix chain of {}",ast.repr()); // Arguments introduce names, we ignore function name. - for Located{crumbs,item} in prefix_chain.enumerate_args() { - println!("Argument: crumb {:?} contents {}", crumbs,item.repr()); - self.in_new_location(crumbs, |this| this.process_ast(&item)) + // Arguments will just introduce names in pattern context. + for argument in prefix_chain.enumerate_args() { + self.process_located_ast(&argument) } - } else if let Some(infix_chain) = ast::opr::Chain::try_new(ast) { + } else if let Some(infix_chain) = ast::opr::Chain::try_new(&ast) { for operand in infix_chain.enumerate_operands() { - self.in_location_of(operand, |this| this.process_ast(&operand.item)) + self.process_located_ast(operand) } for operator in infix_chain.enumerate_operators() { // Operators in infix positions are treated as constructors, i.e. they are used. - self.try_adding_located(NameKind::Used,operator); + self.store_if_name(OccurrenceKind::Used, operator); } } else { - self.try_adding_name(NameKind::Introduced,ast); + self.store_name_occurrence(OccurrenceKind::Introduced, &ast); } - } else if self.in_context(Context::NonPattern) { - if let Ok(block) = ast::known::Block::try_from(ast) { - self.in_new_scope(|this| { - for (crumb,ast) in ast.enumerate() { - this.in_location(crumb, |this| this.process_ast(ast)) - } - }) - } else if self.try_adding_name(NameKind::Used,ast) { - // Plain identifier: just add and do nothing. + } else if self.is_in_context(Context::NonPattern) { + if let Ok(_) = ast::known::Block::try_from(&ast) { + self.in_new_scope(|this| this.process_subtrees(&ast)) + } else if self.store_name_occurrence(OccurrenceKind::Used, &ast) { + // Plain identifier: we just added as the condition side-effect. + // No need to do anything more. } else { - for (crumb,ast) in ast.enumerate() { - self.in_location(crumb, |this| this.process_ast(ast)) - } + self.process_subtrees(&ast); } } } - fn in_location(&mut self, crumb:impl Into, f:F) -> R - where F:FnOnce(&mut Self) -> R { - self.in_new_location(std::iter::once(crumb),f) - } - - fn in_location_of(&mut self, located_item:&Located, f:F) -> R - where F:FnOnce(&mut Self) -> R { - self.in_new_location(located_item.crumbs.iter().cloned(), f) - } - fn process_assignment(&mut self, assignment:&ast::known::Infix) { - self.in_location(InfixCrumb::LeftOperand, |this| - this.in_new_context(Context::Pattern, |this| - this.process_ast(&assignment.larg) - ) - ); - self.in_location(InfixCrumb::RightOperand, |this| - this.process_ast(&assignment.rarg) + self.in_context(Context::Pattern, |this| + this.process_subtree(InfixCrumb::LeftOperand, &assignment.larg) ); + self.process_subtree(InfixCrumb::RightOperand, &assignment.rarg); } - fn enter_node(&mut self, node:&NodeInfo) { + fn process_lambda(&mut self, lambda:&ast::known::Infix) { + self.in_new_scope(|this| { + this.in_context(Context::Pattern, |this| + this.process_subtree(InfixCrumb::LeftOperand, &lambda.larg) + ); + this.process_subtree(InfixCrumb::RightOperand, &lambda.rarg); + }) + } + + fn process_node(&mut self, node:&NodeInfo) { self.process_ast(node.ast()) } } @@ -300,29 +305,10 @@ pub fn analyse_identifier_usage(node:&NodeInfo) -> IdentifierUsage { println!("\n===============================================================================\n"); println!("Case: {}",node.ast().repr()); let mut analyzer = AliasAnalyzer::new(); -// analyzer.run_focus = Some(NameKind::Introduced); - analyzer.enter_node(node); -// analyzer.run_focus = Some(NameKind::Used); -// analyzer.enter_node(node); - analyzer.scopes.last().unwrap().symbols.clone() // TODO mvoe out + analyzer.process_node(node); + analyzer.root_scope.symbols } -///// Hardcoded proper result for `sum = a + b`. -///// TODO [mwu] remove when real implementation is present -//fn analyse_identifier_usage_mock(_:&NodeInfo) -> IdentifierUsage { -// use ast::crumbs::InfixCrumb::LeftOperand; -// use ast::crumbs::InfixCrumb::RightOperand; -// let sum = NormalizedName::new("sum"); -// let a = NormalizedName::new("a"); -// let b = NormalizedName::new("b"); -// let introduced = vec![LocatedIdentifier::new(&[LeftOperand], sum)]; -// let used = vec![ -// LocatedIdentifier::new(&[RightOperand, LeftOperand], a), -// LocatedIdentifier::new(&[RightOperand, RightOperand], b), -// ]; -// IdentifierUsage {introduced,used} -//} -// // ============= @@ -375,6 +361,7 @@ mod tests { // "«^» a n = a * a ^ (n - 1)", let test_cases = vec![ +// "a -> »b«", "»foo«", "«five» = 5", "«foo» = »bar«", diff --git a/src/rust/ide/src/double_representation/definition.rs b/src/rust/ide/src/double_representation/definition.rs index a2019f938d..caa4d158c4 100644 --- a/src/rust/ide/src/double_representation/definition.rs +++ b/src/rust/ide/src/double_representation/definition.rs @@ -308,7 +308,7 @@ pub type ChildDefinition = ast::crumbs::Located; /// Its crumbs will accumulate both current crumbs and the passed one. pub fn resolve_single_name(def:ChildDefinition, id:&Crumb) -> FallibleResult { let child = def.item.def_iter().find_by_name(id)?; - Ok(def.push_descendant(child)) + Ok(def.into_descendant(child)) } From 917595877436cfc80cb7cf0b8bce0a5f17000e38 Mon Sep 17 00:00:00 2001 From: mwu Date: Tue, 14 Apr 2020 03:14:04 +0200 Subject: [PATCH 13/27] cleanups --- src/rust/ide/ast/impl/src/crumbs.rs | 15 +---- src/rust/ide/ast/impl/src/opr.rs | 6 +- src/rust/ide/ast/impl/src/prefix.rs | 28 ++++---- .../double_representation/alias_analysis.rs | 65 ++++++++++--------- .../src/double_representation/definition.rs | 2 +- 5 files changed, 55 insertions(+), 61 deletions(-) diff --git a/src/rust/ide/ast/impl/src/crumbs.rs b/src/rust/ide/ast/impl/src/crumbs.rs index 3741d0c356..68f351bda7 100644 --- a/src/rust/ide/ast/impl/src/crumbs.rs +++ b/src/rust/ide/ast/impl/src/crumbs.rs @@ -323,7 +323,7 @@ impl_crumbs!{ /// Interface for items that allow getting/setting stored Ast located by arbitrary `Crumb`. pub trait Crumbable { /// Specific `Crumb` type used by `Self` to locate child Asts. - type Crumb : Into; + type Crumb : Into + IntoIterator; /// Retrieves `Ast` under the crumb. fn get(&self, crumb:&Self::Crumb) -> FallibleResult<&Ast>; @@ -900,17 +900,12 @@ impl Located { Located {crumbs,item} } - /// Creates a new item in a root location (single crumb location). - pub fn new_direct_child(crumb:impl Into, item:T) -> Located { - let crumbs = vec![crumb.into()]; - Located {crumbs,item} - } - /// Uses given function to map over the item. pub fn map(self, f:impl FnOnce(T) -> U) -> Located { Located::new(self.crumbs, f(self.item)) } + /// Takes crumbs relative to self and item that will be wrapped. pub fn descendant(&self, crumbs:Cs, child:U) -> Located where Cs : IntoIterator>,{ let crumbs_so_far = self.crumbs.iter().copied(); @@ -919,10 +914,6 @@ impl Located { Located::new(crumbs, child) } -// pub fn child(&self, crumb:impl Into, child:U) -> Located { -// self.descendant(std::iter::once(crumb),child) -// } - /// Maps into child, concatenating this crumbs and child crumbs. pub fn into_descendant(self, child:Located) -> Located { let Located {crumbs,item} = child; @@ -1456,7 +1447,7 @@ mod tests { assert_eq!(item.item, "zero"); assert!(item.crumbs.is_empty()); - let child_item = Located::new_direct_child(InfixCrumb::Operator, "two"); + let child_item = Located::new(InfixCrumb::Operator, "two"); let item = item.into_descendant(child_item); assert_eq!(item.item, "two"); let (crumb0,crumb1) = item.crumbs.iter().expect_tuple(); diff --git a/src/rust/ide/ast/impl/src/opr.rs b/src/rust/ide/ast/impl/src/opr.rs index 4b5aeae9f4..85d3d8c20b 100644 --- a/src/rust/ide/ast/impl/src/opr.rs +++ b/src/rust/ide/ast/impl/src/opr.rs @@ -89,7 +89,7 @@ fn assoc(ast:&known::Opr) -> Assoc { // === GeneralizedInfix === // ======================== -/// An abstraction over `Infix` and all `SectionSth` nodes. +/// An abstraction over `Infix` and all `SectionSth` nodes. Stores crumb locations for all its ASTs. #[derive(Clone,Debug)] pub struct GeneralizedInfix { /// Left operand, if present. @@ -101,6 +101,7 @@ pub struct GeneralizedInfix { } impl GeneralizedInfix { + /// As `try_new` but assumes that this expression is located at the root crumb location. pub fn try_new_root(ast:&Ast) -> Option { GeneralizedInfix::try_new(&Located::new_root(ast.clone())) } @@ -197,7 +198,8 @@ pub struct Chain { pub target : Operand, /// Subsequent operands applied to the `target`. pub args : Vec, - /// Operator. + /// Operator AST. Generally all operators in the chain should be the same (except for id). + /// It is not specified which exactly operator's in the chain this AST belongs to. pub operator : known::Opr, } diff --git a/src/rust/ide/ast/impl/src/prefix.rs b/src/rust/ide/ast/impl/src/prefix.rs index 8191845a94..ce29351f19 100644 --- a/src/rust/ide/ast/impl/src/prefix.rs +++ b/src/rust/ide/ast/impl/src/prefix.rs @@ -39,6 +39,7 @@ impl Chain { Chain {func,args} } + /// Like `new` but returns None if given Ast is not of a Prefix shape. pub fn try_new(ast:&Ast) -> Option { known::Prefix::try_from(ast).as_ref().map(Chain::new).ok() } @@ -64,21 +65,18 @@ impl Chain { } } - pub fn enumerate_args<'a>(&'a self) -> Box> + 'a> { - if let Some(func_step_count) = self.args.len().checked_sub(1) { - let func_crumbs = std::iter::repeat(PrefixCrumb::Func).take(func_step_count); - let mut crumbs = func_crumbs.collect_vec(); - crumbs.push(PrefixCrumb::Arg); - let ret = self.args.iter().map(move |arg| { - let ret = Located::new(&crumbs, arg); - crumbs.pop_front(); - ret - }); - Box::new(ret) - } else { - assert!(self.args.is_empty()); - Box::new(std::iter::empty()) - } + /// Iterates over all arguments, left-to right. + pub fn enumerate_args<'a>(&'a self) -> impl Iterator> + 'a { + // Location is always like [Func,Func,…,Func,Arg]. + // We iterate beginning from the deeply nested args. So we can just create crumbs + // location once and then just pop initial crumb when traversing arguments. + let func_crumbs = std::iter::repeat(PrefixCrumb::Func).take(self.args.len()); + let mut crumbs = func_crumbs.collect_vec(); + crumbs.push(PrefixCrumb::Arg); + self.args.iter().map(move |arg| { + crumbs.pop_front(); + Located::new(&crumbs, arg) + }) } } diff --git a/src/rust/ide/src/double_representation/alias_analysis.rs b/src/rust/ide/src/double_representation/alias_analysis.rs index 1be2225a0d..8f13b4a560 100644 --- a/src/rust/ide/src/double_representation/alias_analysis.rs +++ b/src/rust/ide/src/double_representation/alias_analysis.rs @@ -8,15 +8,14 @@ use crate::double_representation::node::NodeInfo; use std::borrow::Borrow; use ast::crumbs::{InfixCrumb, Located}; use ast::crumbs::Crumb; -use crate::double_representation::definition::DefinitionInfo; #[cfg(test)] pub mod test_utils; /// Identifier with its ast crumb location (relative to the node's ast). -pub type LocatedIdentifier = ast::crumbs::Located; - +pub type LocatedIdentifier = Located; +trait IsCrumbs = IntoIterator; // ====================== // === NormalizedName === @@ -109,7 +108,6 @@ impl Scope { /// Replaces macro matches on `->` operator with its resolved Ast. fn pretend_that_lambda_is_not_a_macro_at_all(ast:&Ast) -> Option { let match_ast = ast::known::Match::try_from(ast.clone()).ok()?; - let lhs = match_ast.pfx.as_ref()?; let segment = &match_ast.segs.head; if ast::opr::is_arrow_opr(&segment.head) { println!("Got lambda, replacing with {}!", match_ast.resolved.repr()); @@ -123,13 +121,13 @@ fn pretend_that_lambda_is_not_a_macro_at_all(ast:&Ast) -> Option { #[derive(Clone,Debug,Default)] pub struct AliasAnalyzer { /// Root scope for this analyzer. - root_scope: Scope, - /// Stack of scopes, shadowing the root one. - scopes : Vec, + root_scope : Scope, + /// Stack of scopes that shadow the root one. + shadowing_scopes : Vec, /// Stack of context. Lack of any context information is considered non-pattern context. - context : Vec, + context : Vec, /// Current location, relative to the input AST root. - location : Vec, + location : Vec, } impl AliasAnalyzer { @@ -154,41 +152,43 @@ impl AliasAnalyzer { ret } - fn in_new_scope(&mut self, f:impl FnOnce(&mut AliasAnalyzer)) { + /// Pushes a new scope, then runs a given `f` function. Once it finished, scope is removed and + /// its unshadowed variable usage propagated onto the current scope. + fn in_new_scope(&mut self, f:impl FnOnce(&mut Self)) { let scope = Scope::default(); - self.scopes.push(scope); + self.shadowing_scopes.push(scope); f(self); - let scope = self.scopes.pop().unwrap(); + let scope = self.shadowing_scopes.pop().unwrap(); self.current_scope_mut().coalesce_child(scope); } - fn in_context(&mut self, context:Context, f:impl FnOnce(&mut AliasAnalyzer)) { + /// Temporarily sets contest and invokes `f` within it. + fn in_context(&mut self, context:Context, f:impl FnOnce(&mut Self)) { self.with_items_added(|this| &mut this.context, std::iter::once(context), f); } - fn in_new_location(&mut self, crumbs:Cs, f:F) -> R - where Cs : IntoIterator>, - F : FnOnce(&mut AliasAnalyzer) -> R { + /// Enters a new location (relative to the current one), invokes `f`, leaves the location. + fn in_location(&mut self, crumbs:Cs, f:F) -> R + where Cs : IsCrumbs, + F : FnOnce(&mut Self) -> R { self.with_items_added(|this| &mut this.location, crumbs, f) } - fn in_location(&mut self, crumb:impl Into, f:F) -> R - where F:FnOnce(&mut Self) -> R { - self.in_new_location(std::iter::once(crumb),f) - } - + /// Enters a new location (relative to the current one), invokes `f`, leaves the location. fn in_location_of(&mut self, located_item:&Located, f:F) -> R where F:FnOnce(&mut Self) -> R { - self.in_new_location(located_item.crumbs.iter().copied(), f) + self.in_location(located_item.crumbs.iter().copied(), f) } + /// Obtains a mutable reference to the current scope. fn current_scope_mut(&mut self) -> &mut Scope { - self.scopes.last_mut().unwrap_or(&mut self.root_scope) + self.shadowing_scopes.last_mut().unwrap_or(&mut self.root_scope) } - fn add_identifier(&mut self, kind: OccurrenceKind, identifier:NormalizedName) { + /// Records identifier occurrence in the current scope. + fn record_identifier(&mut self, kind: OccurrenceKind, identifier:NormalizedName) { let identifier = LocatedIdentifier::new(self.location.clone(), identifier); - let scope_index = self.scopes.len(); + let scope_index = self.shadowing_scopes.len(); let symbols = &mut self.current_scope_mut().symbols; let target = match kind { OccurrenceKind::Used => &mut symbols.used, @@ -198,27 +198,30 @@ impl AliasAnalyzer { target.push(identifier) } - + /// Checks if we are currently in the given context kind. fn is_in_context(&self, context:Context) -> bool { self.context.last().unwrap_or(&Context::NonPattern) == &context } + /// Checks if we are currently in the pattern context. fn is_in_pattern(&self) -> bool { self.is_in_context(Context::Pattern) } - fn store_name_occurrence(&mut self, kind: OccurrenceKind, ast:&Ast) -> bool { + /// If given AST is an identifier, records its occurrence. + fn record_if_identifier(&mut self, kind: OccurrenceKind, ast:&Ast) -> bool { if let Some(name) = NormalizedName::try_from_ast(ast) { - self.add_identifier(kind,name); + self.record_identifier(kind, name); true } else { false } } + fn store_if_name(&mut self, kind:OccurrenceKind, located:&Located) -> bool where for<'a> &'a T : Into<&'a Ast> { let ast = (&located.item).into(); - self.in_location_of(located, |this| this.store_name_occurrence(kind, ast)) + self.in_location_of(located, |this| this.record_if_identifier(kind, ast)) } fn process_subtree(&mut self, crumb:impl Into, ast:&Ast) { @@ -264,12 +267,12 @@ impl AliasAnalyzer { self.store_if_name(OccurrenceKind::Used, operator); } } else { - self.store_name_occurrence(OccurrenceKind::Introduced, &ast); + self.record_if_identifier(OccurrenceKind::Introduced, &ast); } } else if self.is_in_context(Context::NonPattern) { if let Ok(_) = ast::known::Block::try_from(&ast) { self.in_new_scope(|this| this.process_subtrees(&ast)) - } else if self.store_name_occurrence(OccurrenceKind::Used, &ast) { + } else if self.record_if_identifier(OccurrenceKind::Used, &ast) { // Plain identifier: we just added as the condition side-effect. // No need to do anything more. } else { diff --git a/src/rust/ide/src/double_representation/definition.rs b/src/rust/ide/src/double_representation/definition.rs index caa4d158c4..fd0297f4f4 100644 --- a/src/rust/ide/src/double_representation/definition.rs +++ b/src/rust/ide/src/double_representation/definition.rs @@ -384,7 +384,7 @@ pub trait DefinitionProvider { pub fn ast_direct_children<'a> (ast:&'a impl Crumbable) -> Box>+'a> { let iter = ast.enumerate().map(|(crumb,ast)| { - ChildAst::new_direct_child(crumb,ast) + ChildAst::new(crumb,ast) }); Box::new(iter) } From 9441a4c18118d3d8442e0013be1135571449b30c Mon Sep 17 00:00:00 2001 From: mwu Date: Tue, 14 Apr 2020 23:06:34 +0200 Subject: [PATCH 14/27] cleanups & docs --- src/rust/ide/ast/impl/src/opr.rs | 1 + .../double_representation/alias_analysis.rs | 131 +++++++++--------- .../alias_analysis/test_utils.rs | 4 +- src/rust/ide/src/lib.rs | 4 + 4 files changed, 75 insertions(+), 65 deletions(-) diff --git a/src/rust/ide/ast/impl/src/opr.rs b/src/rust/ide/ast/impl/src/opr.rs index 85d3d8c20b..35e5f0911f 100644 --- a/src/rust/ide/ast/impl/src/opr.rs +++ b/src/rust/ide/ast/impl/src/opr.rs @@ -79,6 +79,7 @@ pub fn make_operator(parent:&Located, crumb:impl Into, opr:&Ast) -> Some(parent.descendant(crumb.into(),opr)) } +/// Describes associativity of the given operator AST. fn assoc(ast:&known::Opr) -> Assoc { Assoc::of(&ast.name) } diff --git a/src/rust/ide/src/double_representation/alias_analysis.rs b/src/rust/ide/src/double_representation/alias_analysis.rs index 8f13b4a560..df78108f1a 100644 --- a/src/rust/ide/src/double_representation/alias_analysis.rs +++ b/src/rust/ide/src/double_representation/alias_analysis.rs @@ -17,6 +17,8 @@ pub type LocatedIdentifier = Located; trait IsCrumbs = IntoIterator; + + // ====================== // === NormalizedName === // ====================== @@ -137,14 +139,12 @@ impl AliasAnalyzer { } /// Adds items to the target vector, calls the callback `f` then removes the items. - fn with_items_added + fn with_items_added ( &mut self , vec : impl Fn(&mut Self) -> &mut Vec - , items : Cs - , f : F) -> R - where - Cs : IntoIterator>, - F : FnOnce(&mut Self) -> R { + , items : impl IntoIterator> + , f : impl FnOnce(&mut Self) -> R + ) -> R { let original_count = vec(self).len(); vec(self).extend(items.into_iter().map(|item| item.into())); let ret = f(self); @@ -185,6 +185,10 @@ impl AliasAnalyzer { self.shadowing_scopes.last_mut().unwrap_or(&mut self.root_scope) } + fn current_context(&self) -> Context { + self.context.last().copied().unwrap_or(Context::NonPattern) + } + /// Records identifier occurrence in the current scope. fn record_identifier(&mut self, kind: OccurrenceKind, identifier:NormalizedName) { let identifier = LocatedIdentifier::new(self.location.clone(), identifier); @@ -198,49 +202,48 @@ impl AliasAnalyzer { target.push(identifier) } - /// Checks if we are currently in the given context kind. - fn is_in_context(&self, context:Context) -> bool { - self.context.last().unwrap_or(&Context::NonPattern) == &context - } - /// Checks if we are currently in the pattern context. fn is_in_pattern(&self) -> bool { - self.is_in_context(Context::Pattern) + self.current_context() == Context::Pattern } /// If given AST is an identifier, records its occurrence. - fn record_if_identifier(&mut self, kind: OccurrenceKind, ast:&Ast) -> bool { - if let Some(name) = NormalizedName::try_from_ast(ast) { - self.record_identifier(kind, name); - true - } else { - false - } + /// Returns boolean saying if the identifier was recorded. + fn try_recording_identifier(&mut self, kind: OccurrenceKind, ast:&Ast) -> bool { + let name = NormalizedName::try_from_ast(ast); + name.map(|name| self.record_identifier(kind, name)).is_some() } - + + /// If the given located AST-like entity is an identifier, records its occurrence. fn store_if_name(&mut self, kind:OccurrenceKind, located:&Located) -> bool where for<'a> &'a T : Into<&'a Ast> { let ast = (&located.item).into(); - self.in_location_of(located, |this| this.record_if_identifier(kind, ast)) + self.in_location_of(located, |this| this.try_recording_identifier(kind, ast)) } - fn process_subtree(&mut self, crumb:impl Into, ast:&Ast) { - self.in_location(crumb.into(), |this| this.process_ast(ast)) + /// Processes the given AST, while crumb is temporarily pushed to the current location. + fn process_subtree_at(&mut self, crumb:impl Into, subtree:&Ast) { + self.in_location(crumb.into(), |this| this.process_ast(subtree)) } + /// Processes the given AST, while crumb is temporarily pushed to the current location. fn process_located_ast(&mut self, located_ast:&Located>) { self.in_location_of(&located_ast, |this| this.process_ast(located_ast.item.borrow())) } + /// Processes all subtrees of the given AST in their respective locations. fn process_subtrees(&mut self, ast:&Ast) { for (crumb,ast) in ast.enumerate() { - self.process_subtree(crumb,ast) + self.process_subtree_at(crumb, ast) } } - fn process_ast(&mut self, ast:&Ast) { + /// Processes the given AST, along with its subtree. + /// + /// This is the primary function that is recursively being called as the AST is being traversed. + pub fn process_ast(&mut self, ast:&Ast) { let ast = pretend_that_lambda_is_not_a_macro_at_all(ast).unwrap_or(ast.clone()); - println!("Processing `{}` in 0context {:?}",ast.repr(),self.context.last()); + println!("Processing `{}` in context {}",ast.repr(),self.current_context()); if let Some(assignment) = ast::opr::to_assignment(&ast) { self.process_assignment(&assignment); } else if let Some(lambda) = ast::opr::to_arrow(&ast) { @@ -251,14 +254,8 @@ impl AliasAnalyzer { // 3) As above but with operator and infix syntax, like `head,tail`. // 2) This is a nullary symbol binding, like `foo`. // (the possibility of definition has been already excluded) - if let Some(prefix_chain) = ast::prefix::Chain::try_new(&ast) { - println!("Pattern of infix chain of {}",ast.repr()); - // Arguments introduce names, we ignore function name. - // Arguments will just introduce names in pattern context. - for argument in prefix_chain.enumerate_args() { - self.process_located_ast(&argument) - } - } else if let Some(infix_chain) = ast::opr::Chain::try_new(&ast) { + if let Some(infix_chain) = ast::opr::Chain::try_new(&ast) { + // Infix always acts as pattern-match in left-side. for operand in infix_chain.enumerate_operands() { self.process_located_ast(operand) } @@ -266,13 +263,28 @@ impl AliasAnalyzer { // Operators in infix positions are treated as constructors, i.e. they are used. self.store_if_name(OccurrenceKind::Used, operator); } + } else if let Some(prefix_chain) = ast::prefix::Chain::try_new(&ast) { + // Arguments introduce names, we ignore function name. + // Arguments will just introduce names in pattern context. + for argument in prefix_chain.enumerate_args() { + self.process_located_ast(&argument) + } } else { - self.record_if_identifier(OccurrenceKind::Introduced, &ast); + match ast.shape() { + ast::Shape::Cons(_) => { + self.try_recording_identifier(OccurrenceKind::Used, &ast); + } ast::Shape::Var(_) => { + self.try_recording_identifier(OccurrenceKind::Introduced, &ast); + } _ => { + self.process_subtrees(&ast); + } + } } - } else if self.is_in_context(Context::NonPattern) { + } else { + // Non-pattern context. if let Ok(_) = ast::known::Block::try_from(&ast) { self.in_new_scope(|this| this.process_subtrees(&ast)) - } else if self.record_if_identifier(OccurrenceKind::Used, &ast) { + } else if self.try_recording_identifier(OccurrenceKind::Used, &ast) { // Plain identifier: we just added as the condition side-effect. // No need to do anything more. } else { @@ -281,25 +293,26 @@ impl AliasAnalyzer { } } + /// Processes the assignment AST node. Left side is pattern, right side is business as usual. fn process_assignment(&mut self, assignment:&ast::known::Infix) { self.in_context(Context::Pattern, |this| - this.process_subtree(InfixCrumb::LeftOperand, &assignment.larg) + this.process_subtree_at(InfixCrumb::LeftOperand, &assignment.larg) ); - self.process_subtree(InfixCrumb::RightOperand, &assignment.rarg); + self.process_subtree_at(InfixCrumb::RightOperand, &assignment.rarg); } + /// Processes the assignment AST node. Left side is pattern, right side is business as usual. + /// Additionally, the whole lambda is a new scope. + // TODO [mwu] + // Depending on the eventual decision, this might need to be rewritten to use macros. fn process_lambda(&mut self, lambda:&ast::known::Infix) { self.in_new_scope(|this| { this.in_context(Context::Pattern, |this| - this.process_subtree(InfixCrumb::LeftOperand, &lambda.larg) + this.process_subtree_at(InfixCrumb::LeftOperand, &lambda.larg) ); - this.process_subtree(InfixCrumb::RightOperand, &lambda.rarg); + this.process_subtree_at(InfixCrumb::RightOperand, &lambda.rarg); }) } - - fn process_node(&mut self, node:&NodeInfo) { - self.process_ast(node.ast()) - } } /// Describes identifiers that nodes introduces into the graph and identifiers from graph's scope @@ -308,7 +321,7 @@ pub fn analyse_identifier_usage(node:&NodeInfo) -> IdentifierUsage { println!("\n===============================================================================\n"); println!("Case: {}",node.ast().repr()); let mut analyzer = AliasAnalyzer::new(); - analyzer.process_node(node); + analyzer.process_ast(node.ast()); analyzer.root_scope.symbols } @@ -323,10 +336,7 @@ mod tests { use super::*; use super::test_utils::*; -// use wasm_bindgen_test::wasm_bindgen_test; -// use wasm_bindgen_test::wasm_bindgen_test_configure; -// -// wasm_bindgen_test_configure!(run_in_browser); + wasm_bindgen_test_configure!(run_in_browser); /// Checks if actual observed sequence of located identifiers matches the expected one. /// Expected identifiers are described as code spans in the node's text representation. @@ -347,9 +357,9 @@ mod tests { } /// Runs the test for the test case expressed using markdown notation. See `Case` for details. - fn run_markdown_case(parser:&parser::Parser, marked_code:impl Str) { + fn run_markdown_case(parser:&parser::Parser, marked_code:impl AsRef) { println!("Running test case for {}", marked_code.as_ref()); - let case = Case::from_markdown(marked_code); + let case = Case::from_markdown(marked_code.as_ref()); run_case(parser,case) } @@ -363,11 +373,14 @@ mod tests { // "«log_name» object = »print« object.»name«", // "«^» a n = a * a ^ (n - 1)", - let test_cases = vec![ -// "a -> »b«", + let test_cases = [ "»foo«", "«five» = 5", + "»Five« = 5", "«foo» = »bar«", + "«foo» = »foo« »+« »bar«", + "«foo» = »Bar«", + "5 = »Bar«", "«sum» = »a« »+« »b«", "Point «x» «u» = »point«", "«x» »,« «y» = »pair«", @@ -378,17 +391,9 @@ mod tests { r"«inc» = foo = 2 foo »+« 1", - -// "a.«hello» = »print« 'Hello'", -// "«log_name» = object -> »print« object.»name«", -// "«log_name» = object -> »print« $ »name« object", ]; - for case in test_cases { + for case in &test_cases { run_markdown_case(&parser,case) } - - -// let code = "«sum» = »a« + »b«"; -// run_markdown_case(&parser, code); } } diff --git a/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs b/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs index 9df9c85bbd..99e8b21a32 100644 --- a/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs +++ b/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs @@ -33,7 +33,7 @@ impl Case { /// AST in which all identifiers introduced into the graph's scope are marked like `«foo»`, and /// all identifiers used from graph's scope are marked like `»sum«`. pub fn from_markdown(marked_code:impl Str) -> Case { - // Regexp that matches either «sth» or »sth« into a group names `introduced` or `used`, + // Regexp that matches either «sth» or »sth« into a group named `introduced` or `used`, // respectively. See: https://regex101.com/r/pboF8O/2 for detailed explanation. let regex = format!(r"«(?P<{}>[^»]*)»|»(?P<{}>[^«]*)«",INTRODUCED,USED); // As this is test utils, we don't try nicely handling failure nor reusing the compiled @@ -99,7 +99,7 @@ impl MarkdownReplacer { } } -// Processes every single match for a marged entity. +// Processes every single match for a marked entity. impl Replacer for MarkdownReplacer { fn replace_append(&mut self, captures: &Captures, dst: &mut String) { let (kind,matched) = if let Some(introduced) = captures.name(INTRODUCED) { diff --git a/src/rust/ide/src/lib.rs b/src/rust/ide/src/lib.rs index 4d09b7d6a6..c23dd730f9 100644 --- a/src/rust/ide/src/lib.rs +++ b/src/rust/ide/src/lib.rs @@ -49,6 +49,10 @@ pub mod prelude { pub use utils::fail::FallibleResult; pub use utils::option::OptionExt; pub use utils::vec::VecExt; + + + #[cfg(test)] pub use wasm_bindgen_test::wasm_bindgen_test; + #[cfg(test)] pub use wasm_bindgen_test::wasm_bindgen_test_configure; } use crate::prelude::*; From 84ecdbf27f1c14303908013c6f0317aa4fd1726d Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 15 Apr 2020 03:00:55 +0200 Subject: [PATCH 15/27] cleanups, fixes, tests --- src/rust/ide/ast/impl/src/opr.rs | 11 ++- .../double_representation/alias_analysis.rs | 87 +++++++++---------- .../alias_analysis/test_utils.rs | 4 +- .../src/double_representation/definition.rs | 28 +++++- 4 files changed, 78 insertions(+), 52 deletions(-) diff --git a/src/rust/ide/ast/impl/src/opr.rs b/src/rust/ide/ast/impl/src/opr.rs index 35e5f0911f..19a0976337 100644 --- a/src/rust/ide/ast/impl/src/opr.rs +++ b/src/rust/ide/ast/impl/src/opr.rs @@ -6,7 +6,8 @@ use crate::Ast; use crate::assoc::Assoc; use crate::known; use crate::Shape; -use crate::crumbs::{Crumb, Located, InfixCrumb, SectionLeftCrumb, SectionRightCrumb, SectionSidesCrumb}; +use crate::crumbs::Crumb; +use crate::crumbs::Located; /// Identifiers of operators with special meaning for IDE. pub mod predefined { @@ -110,6 +111,11 @@ impl GeneralizedInfix { /// Tries interpret given AST node as GeneralizedInfix. Returns None, if Ast is not any kind of /// application on infix operator. pub fn try_new(ast:&Located) -> Option { + use crate::crumbs::InfixCrumb; + use crate::crumbs::SectionLeftCrumb; + use crate::crumbs::SectionRightCrumb; + use crate::crumbs::SectionSidesCrumb; + match ast.shape() { Shape::Infix(infix) => Some(GeneralizedInfix{ left : make_operand (ast,InfixCrumb::LeftOperand, &infix.larg), @@ -222,8 +228,7 @@ impl Chain { pub fn enumerate_operands<'a>(&'a self) -> impl Iterator> + 'a { let this = std::iter::once(&self.target); let args = self.args.iter().map(|elem| &elem.operand); - let operands = this.chain(args).flatten(); - operands + this.chain(args).flatten() } /// Iterates over &Located, beginning with target (this argument) and then subsequent diff --git a/src/rust/ide/src/double_representation/alias_analysis.rs b/src/rust/ide/src/double_representation/alias_analysis.rs index df78108f1a..2f03e36cf2 100644 --- a/src/rust/ide/src/double_representation/alias_analysis.rs +++ b/src/rust/ide/src/double_representation/alias_analysis.rs @@ -3,19 +3,20 @@ use crate::prelude::*; +use crate::double_representation::definition::DefinitionInfo; +use crate::double_representation::definition::ScopeKind; use crate::double_representation::node::NodeInfo; -use std::borrow::Borrow; -use ast::crumbs::{InfixCrumb, Located}; use ast::crumbs::Crumb; +use ast::crumbs::InfixCrumb; +use ast::crumbs::Located; +use std::borrow::Borrow; #[cfg(test)] pub mod test_utils; -/// Identifier with its ast crumb location (relative to the node's ast). -pub type LocatedIdentifier = Located; - -trait IsCrumbs = IntoIterator; +/// Case-insensitive identifier with its ast crumb location (relative to the node's ast). +pub type LocatedName = Located; @@ -60,9 +61,9 @@ impl PartialEq for NormalizedName { #[derive(Clone,Debug,Default)] pub struct IdentifierUsage { /// Identifiers from the graph's scope that node is using. - pub introduced : Vec, + pub introduced : Vec, /// Identifiers that node introduces into the parent scope. - pub used : Vec, + pub used : Vec, } @@ -91,7 +92,7 @@ pub struct Scope { impl Scope { /// Iterates over identifiers that are used in this scope but are not introduced in this scope /// i.e. the identifiers that parent scope must provide. - pub fn used_from_parent(self) -> impl Iterator { + pub fn used_from_parent(self) -> impl Iterator { let available = self.symbols.introduced.into_iter().map(|located_name| located_name.item); let available : HashSet = HashSet::from_iter(available); let all_used = self.symbols.used.into_iter(); @@ -107,18 +108,6 @@ impl Scope { } } -/// Replaces macro matches on `->` operator with its resolved Ast. -fn pretend_that_lambda_is_not_a_macro_at_all(ast:&Ast) -> Option { - let match_ast = ast::known::Match::try_from(ast.clone()).ok()?; - let segment = &match_ast.segs.head; - if ast::opr::is_arrow_opr(&segment.head) { - println!("Got lambda, replacing with {}!", match_ast.resolved.repr()); - Some(match_ast.resolved.clone()) - } else { - None - } -} - /// Traverser AST and analyzes identifier usage. #[derive(Clone,Debug,Default)] pub struct AliasAnalyzer { @@ -169,7 +158,7 @@ impl AliasAnalyzer { /// Enters a new location (relative to the current one), invokes `f`, leaves the location. fn in_location(&mut self, crumbs:Cs, f:F) -> R - where Cs : IsCrumbs, + where Cs : IntoIterator, F : FnOnce(&mut Self) -> R { self.with_items_added(|this| &mut this.location, crumbs, f) } @@ -191,7 +180,7 @@ impl AliasAnalyzer { /// Records identifier occurrence in the current scope. fn record_identifier(&mut self, kind: OccurrenceKind, identifier:NormalizedName) { - let identifier = LocatedIdentifier::new(self.location.clone(), identifier); + let identifier = LocatedName::new(self.location.clone(), identifier); let scope_index = self.shadowing_scopes.len(); let symbols = &mut self.current_scope_mut().symbols; let target = match kind { @@ -242,19 +231,23 @@ impl AliasAnalyzer { /// /// This is the primary function that is recursively being called as the AST is being traversed. pub fn process_ast(&mut self, ast:&Ast) { - let ast = pretend_that_lambda_is_not_a_macro_at_all(ast).unwrap_or(ast.clone()); - println!("Processing `{}` in context {}",ast.repr(),self.current_context()); - if let Some(assignment) = ast::opr::to_assignment(&ast) { + if let Some(definition) = DefinitionInfo::from_line_ast(&ast,ScopeKind::NonRoot,default()) { + // If AST looks like definition, we disregard its arguments and body, as they cannot + // form connections in the analyzed graph. However, we need to record the name, because + // it may shadow identifier from parent scope. + let name = NormalizedName::new(definition.name.name); + self.record_identifier(OccurrenceKind::Introduced,name); + } else if let Some(assignment) = ast::opr::to_assignment(ast) { self.process_assignment(&assignment); - } else if let Some(lambda) = ast::opr::to_arrow(&ast) { + } else if let Some(lambda) = ast::opr::to_arrow(ast) { self.process_lambda(&lambda); } else if self.is_in_pattern() { // We are in the pattern (be it a lambda's or assignment's left side). Three options: - // 1) This is a destructuring pattern match with prefix syntax, like `Point x y`. - // 3) As above but with operator and infix syntax, like `head,tail`. - // 2) This is a nullary symbol binding, like `foo`. + // 1) This is a destructuring pattern match using infix syntax, like `head,tail`. + // 2) This is a destructuring pattern match with prefix syntax, like `Point x y`. + // 3) This is a single AST node, like `foo` or `Foo`. // (the possibility of definition has been already excluded) - if let Some(infix_chain) = ast::opr::Chain::try_new(&ast) { + if let Some(infix_chain) = ast::opr::Chain::try_new(ast) { // Infix always acts as pattern-match in left-side. for operand in infix_chain.enumerate_operands() { self.process_located_ast(operand) @@ -263,32 +256,34 @@ impl AliasAnalyzer { // Operators in infix positions are treated as constructors, i.e. they are used. self.store_if_name(OccurrenceKind::Used, operator); } - } else if let Some(prefix_chain) = ast::prefix::Chain::try_new(&ast) { + } else if let Some(prefix_chain) = ast::prefix::Chain::try_new(ast) { // Arguments introduce names, we ignore function name. // Arguments will just introduce names in pattern context. for argument in prefix_chain.enumerate_args() { self.process_located_ast(&argument) } } else { + // Single AST node on the assignment LHS. Deal with identifiers, otherwise + // recursively process subtrees. match ast.shape() { ast::Shape::Cons(_) => { - self.try_recording_identifier(OccurrenceKind::Used, &ast); + self.try_recording_identifier(OccurrenceKind::Used,ast); } ast::Shape::Var(_) => { - self.try_recording_identifier(OccurrenceKind::Introduced, &ast); + self.try_recording_identifier(OccurrenceKind::Introduced,ast); } _ => { - self.process_subtrees(&ast); + self.process_subtrees(ast); } } } } else { // Non-pattern context. - if let Ok(_) = ast::known::Block::try_from(&ast) { - self.in_new_scope(|this| this.process_subtrees(&ast)) - } else if self.try_recording_identifier(OccurrenceKind::Used, &ast) { + if ast::known::Block::try_from(ast).is_ok() { + self.in_new_scope(|this| this.process_subtrees(ast)) + } else if self.try_recording_identifier(OccurrenceKind::Used,ast) { // Plain identifier: we just added as the condition side-effect. // No need to do anything more. } else { - self.process_subtrees(&ast); + self.process_subtrees(ast); } } } @@ -341,7 +336,7 @@ mod tests { /// Checks if actual observed sequence of located identifiers matches the expected one. /// Expected identifiers are described as code spans in the node's text representation. fn validate_identifiers - (name:impl Str, node:&NodeInfo, expected:Vec>, actual:&Vec) { + (name:impl Str, node:&NodeInfo, expected:Vec>, actual:&Vec) { let mut checker = IdentifierValidator::new(name,node,expected); checker.validate_identifiers(actual); } @@ -367,12 +362,6 @@ mod tests { #[test] fn test_alias_analysis() { let parser = parser::Parser::new_or_panic(); - - // Removed cases -// "«foo» a b = a »+« b", // this we don't care, because this is not a node -// "«log_name» object = »print« object.»name«", -// "«^» a n = a * a ^ (n - 1)", - let test_cases = [ "»foo«", "«five» = 5", @@ -391,6 +380,12 @@ mod tests { r"«inc» = foo = 2 foo »+« 1", + + // Below should know that "foo + 1" does not uses "foo" from scope. + // That requires at least partial support for definitions. + r"«inc» = + foo x = 2 + foo »+« 1", ]; for case in &test_cases { run_markdown_case(&parser,case) diff --git a/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs b/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs index 99e8b21a32..9085576b30 100644 --- a/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs +++ b/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs @@ -2,7 +2,7 @@ use crate::prelude::*; use crate::double_representation::alias_analysis::NormalizedName; -use crate::double_representation::alias_analysis::LocatedIdentifier; +use crate::double_representation::alias_analysis::LocatedName; use crate::double_representation::node::NodeInfo; use regex::Captures; @@ -162,7 +162,7 @@ impl<'a> IdentifierValidator<'a> { /// Marks given sequence of identifiers as checked. pub fn validate_identifiers - (&mut self, identifiers:impl IntoIterator) { + (&mut self, identifiers:impl IntoIterator) { for identifier in identifiers { self.validate_identifier(&identifier.item); diff --git a/src/rust/ide/src/double_representation/definition.rs b/src/rust/ide/src/double_representation/definition.rs index fd0297f4f4..04533d82b3 100644 --- a/src/rust/ide/src/double_representation/definition.rs +++ b/src/rust/ide/src/double_representation/definition.rs @@ -163,7 +163,8 @@ impl DefinitionName { (args,name) } None => { - (Vec::new(), ast::identifier::name(ast)?.clone()) + let var = known::Var::try_from(ast).ok()?; + (Vec::new(), var.name.clone()) } }; Some(DefinitionName {extended_target,name}) @@ -453,6 +454,8 @@ mod tests { use utils::test::ExpectTuple; use wasm_bindgen_test::wasm_bindgen_test; + use crate::double_representation::INDENT; + use ast::crumbs::InfixCrumb; wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); @@ -470,6 +473,29 @@ mod tests { iformat!(" {line}") } + #[test] + fn match_is_not_definition() { + let cons = Ast::cons("Foo"); + let arg = Ast::number(5); + let lhs = Ast::prefix(cons, arg.clone()); + let rhs = Ast::var("bar"); + let ast = Ast::infix(lhs, "=", rhs.clone()); + + // Not a definition, it is a pattern match/ + assert_eq!(ast.repr(), "Foo 5 = bar"); + let def_opt = DefinitionInfo::from_line_ast(&ast,ScopeKind::NonRoot,INDENT); + assert!(def_opt.is_none()); + + let var = Ast::var("foo"); + let lhs = Ast::prefix(var, arg); + let ast = Ast::infix(lhs, "=", rhs); + + // Now it is a definition. + assert_eq!(ast.repr(), "foo 5 = bar"); + let def_opt = DefinitionInfo::from_line_ast(&ast,ScopeKind::NonRoot,INDENT); + assert!(def_opt.is_some()); + } + #[wasm_bindgen_test] fn list_definition_test() { let parser = parser::Parser::new_or_panic(); From 6d09cee74187bf558f41bc90edba56b8403a3536 Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 15 Apr 2020 03:10:39 +0200 Subject: [PATCH 16/27] cleanups --- src/rust/ide/ast/impl/src/crumbs.rs | 5 ++--- .../src/double_representation/alias_analysis.rs | 14 ++++++++++---- .../alias_analysis/test_utils.rs | 2 ++ .../ide/src/double_representation/definition.rs | 4 ++-- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/rust/ide/ast/impl/src/crumbs.rs b/src/rust/ide/ast/impl/src/crumbs.rs index 68f351bda7..9ea8306884 100644 --- a/src/rust/ide/ast/impl/src/crumbs.rs +++ b/src/rust/ide/ast/impl/src/crumbs.rs @@ -1450,9 +1450,8 @@ mod tests { let child_item = Located::new(InfixCrumb::Operator, "two"); let item = item.into_descendant(child_item); assert_eq!(item.item, "two"); - let (crumb0,crumb1) = item.crumbs.iter().expect_tuple(); - assert_eq!(crumb0,&Crumb::Infix(InfixCrumb::LeftOperand)); - assert_eq!(crumb1,&Crumb::Infix(InfixCrumb::Operator)); + let (crumb0,) = item.crumbs.iter().expect_tuple(); + assert_eq!(crumb0,&Crumb::Infix(InfixCrumb::Operator)); let item2 = item.clone().map(|item| item.len() ); assert_eq!(item2.item,3); diff --git a/src/rust/ide/src/double_representation/alias_analysis.rs b/src/rust/ide/src/double_representation/alias_analysis.rs index 2f03e36cf2..b0ba5af5e2 100644 --- a/src/rust/ide/src/double_representation/alias_analysis.rs +++ b/src/rust/ide/src/double_representation/alias_analysis.rs @@ -72,6 +72,9 @@ pub struct IdentifierUsage { // === Analysis === // ================ + +// === Helper Datatypes === + /// Says whether the identifier occurrence introduces it into scope or uses it from scope. #[allow(missing_docs)] #[derive(Clone,Copy,Debug,Display,PartialEq)] @@ -108,6 +111,9 @@ impl Scope { } } + +// === AliasAnalyzer === + /// Traverser AST and analyzes identifier usage. #[derive(Clone,Debug,Default)] pub struct AliasAnalyzer { @@ -174,6 +180,7 @@ impl AliasAnalyzer { self.shadowing_scopes.last_mut().unwrap_or(&mut self.root_scope) } + /// Returns the current context kind. (pattern or not) fn current_context(&self) -> Context { self.context.last().copied().unwrap_or(Context::NonPattern) } @@ -313,8 +320,6 @@ impl AliasAnalyzer { /// Describes identifiers that nodes introduces into the graph and identifiers from graph's scope /// that node uses. This logic serves as a base for connection discovery. pub fn analyse_identifier_usage(node:&NodeInfo) -> IdentifierUsage { - println!("\n===============================================================================\n"); - println!("Case: {}",node.ast().repr()); let mut analyzer = AliasAnalyzer::new(); analyzer.process_ast(node.ast()); analyzer.root_scope.symbols @@ -343,6 +348,8 @@ mod tests { /// Runs the test for the given test case description. fn run_case(parser:&parser::Parser, case:Case) { + println!("\n===========================================================================\n"); + println!("Case: {}",&case.code); let ast = parser.parse_line(&case.code).unwrap(); let node = NodeInfo::from_line_ast(&ast).unwrap(); let result = analyse_identifier_usage(&node); @@ -358,8 +365,7 @@ mod tests { run_case(parser,case) } - - #[test] + #[wasm_bindgen_test] fn test_alias_analysis() { let parser = parser::Parser::new_or_panic(); let test_cases = [ diff --git a/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs b/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs index 9085576b30..852022aaab 100644 --- a/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs +++ b/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs @@ -1,3 +1,4 @@ +//! Utilities to facilitate testing of alias-analysis-related code. use crate::prelude::*; @@ -11,6 +12,7 @@ use regex::Regex; use regex::Replacer; + // ============ // === Case === // ============ diff --git a/src/rust/ide/src/double_representation/definition.rs b/src/rust/ide/src/double_representation/definition.rs index 04533d82b3..6644853f3b 100644 --- a/src/rust/ide/src/double_representation/definition.rs +++ b/src/rust/ide/src/double_representation/definition.rs @@ -452,10 +452,10 @@ impl DefinitionProvider for DefinitionInfo { mod tests { use super::*; + use crate::double_representation::INDENT; + use utils::test::ExpectTuple; use wasm_bindgen_test::wasm_bindgen_test; - use crate::double_representation::INDENT; - use ast::crumbs::InfixCrumb; wasm_bindgen_test::wasm_bindgen_test_configure!(run_in_browser); From c866db438353dadb081833e927d95a63db4af4b9 Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 15 Apr 2020 03:17:58 +0200 Subject: [PATCH 17/27] minor --- src/rust/ide/ast/impl/src/crumbs.rs | 4 +++- src/rust/ide/ast/impl/src/opr.rs | 4 ++-- src/rust/ide/ast/impl/src/prefix.rs | 4 ++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/rust/ide/ast/impl/src/crumbs.rs b/src/rust/ide/ast/impl/src/crumbs.rs index 9ea8306884..49ab1320ea 100644 --- a/src/rust/ide/ast/impl/src/crumbs.rs +++ b/src/rust/ide/ast/impl/src/crumbs.rs @@ -3,8 +3,10 @@ use crate::prelude::*; -use crate::{known, HasTokens, TokenConsumer}; +use crate::known; +use crate::HasTokens; use crate::Shape; +use crate::TokenConsumer; use utils::fail::FallibleResult; diff --git a/src/rust/ide/ast/impl/src/opr.rs b/src/rust/ide/ast/impl/src/opr.rs index 19a0976337..a96d543533 100644 --- a/src/rust/ide/ast/impl/src/opr.rs +++ b/src/rust/ide/ast/impl/src/opr.rs @@ -3,11 +3,11 @@ use crate::prelude::*; use crate::Ast; -use crate::assoc::Assoc; -use crate::known; use crate::Shape; +use crate::assoc::Assoc; use crate::crumbs::Crumb; use crate::crumbs::Located; +use crate::known; /// Identifiers of operators with special meaning for IDE. pub mod predefined { diff --git a/src/rust/ide/ast/impl/src/prefix.rs b/src/rust/ide/ast/impl/src/prefix.rs index ce29351f19..87eed1a54c 100644 --- a/src/rust/ide/ast/impl/src/prefix.rs +++ b/src/rust/ide/ast/impl/src/prefix.rs @@ -2,10 +2,10 @@ use crate::prelude::*; -use crate::known; use crate::Ast; use crate::crumbs::Located; use crate::crumbs::PrefixCrumb; +use crate::known; use utils::vec::VecExt; @@ -108,4 +108,4 @@ mod tests { assert_eq!(arg2.item, &c); assert_eq!(a_b_c.get_traversing(&arg2.crumbs).unwrap(), &c); } -} \ No newline at end of file +} From 853f60864cf897533dbf70b13437e9d97bd29132 Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 15 Apr 2020 04:04:40 +0200 Subject: [PATCH 18/27] ouch, it's tricky --- .../ide/src/double_representation/definition.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/rust/ide/src/double_representation/definition.rs b/src/rust/ide/src/double_representation/definition.rs index 6644853f3b..3c4768ba24 100644 --- a/src/rust/ide/src/double_representation/definition.rs +++ b/src/rust/ide/src/double_representation/definition.rs @@ -163,8 +163,15 @@ impl DefinitionName { (args,name) } None => { - let var = known::Var::try_from(ast).ok()?; - (Vec::new(), var.name.clone()) + let name = match ast.shape() { + ast::Shape::Var (var) => Some(&var.name), + ast::Shape::Opr (opr) => Some(&opr.name), + ast::Shape::SectionSides(sides) => ast::identifier::name(&sides.opr), + // Shape::Cons is intentionally omitted. + // It serves to pattern-match, not as definition name. + _ => None + }?; + (Vec::new(), name.clone()) } }; Some(DefinitionName {extended_target,name}) @@ -496,7 +503,7 @@ mod tests { assert!(def_opt.is_some()); } - #[wasm_bindgen_test] + #[test] fn list_definition_test() { let parser = parser::Parser::new_or_panic(); From 87c1628448773e2a277acdffdcf8d5894cc51508 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Wed, 15 Apr 2020 10:10:10 -0300 Subject: [PATCH 19/27] Fixed PageUp and PageDown (#340) --- .../src/display/shape/text/text_field.rs | 85 +++++++++----- .../shape/text/text_field/content/line.rs | 8 +- .../display/shape/text/text_field/cursor.rs | 111 ++++++++++++------ .../shape/text/text_field/frp/keyboard.rs | 4 +- src/rust/ide/src/view/text_editor.rs | 2 +- 5 files changed, 141 insertions(+), 69 deletions(-) diff --git a/src/rust/ensogl/src/display/shape/text/text_field.rs b/src/rust/ensogl/src/display/shape/text/text_field.rs index b642477a0f..57692b214f 100644 --- a/src/rust/ensogl/src/display/shape/text/text_field.rs +++ b/src/rust/ensogl/src/display/shape/text/text_field.rs @@ -26,13 +26,13 @@ use crate::display::shape::text::glyph::font::FontRegistry; use crate::display::shape::text::text_field::render::TextFieldSprites; use crate::display::shape::text::text_field::render::assignment::GlyphLinesAssignmentUpdate; use crate::display::world::World; +use crate::system::web::text_input::KeyboardBinding; use data::text::TextChange; use data::text::TextLocation; use nalgebra::Vector2; use nalgebra::Vector3; use nalgebra::Vector4; -use crate::system::web::text_input::KeyboardBinding; @@ -148,28 +148,28 @@ shared! { TextField self.properties.size } - /// Scroll one page down. - pub fn page_down(&mut self) { - self.scroll(Vector2::new(0.0, -self.size().y)) - } - - /// Scroll one page up. - pub fn page_up(&mut self) { - self.scroll(Vector2::new(0.0, self.size().y)) - } - /// Scroll text by given offset in pixels. pub fn scroll(&mut self, offset:Vector2) { - let position_change = -Vector3::new(offset.x,offset.y,0.0); - self.rendered.display_object.mod_position(|pos| *pos += position_change); - let mut update = self.assignment_update(); - if offset.x != 0.0 { - update.update_after_x_scroll(offset.x); - } - if offset.y != 0.0 { - update.update_line_assignment(); + let scroll_position = self.scroll_position(); + let padding_lines = 2; + let lines = self.content.lines().len() + padding_lines; + let text_height = self.content.line_height * lines as f32; + let view_height = self.size().y; + let height = (text_height - view_height).max(0.0); + let offset_y = offset.y.min(scroll_position.y).max(scroll_position.y - height); + let offset = Vector2::new(offset.x, offset_y); + if offset.x != 0.0 || offset.y != 0.0 { + let position_change = -Vector3::new(offset.x,offset.y,0.0); + self.rendered.display_object.mod_position(|pos| *pos += position_change); + let mut update = self.assignment_update(); + if offset.x != 0.0 { + update.update_after_x_scroll(offset.x); + } + if offset.y != 0.0 { + update.update_line_assignment(); + } + self.rendered.update_glyphs(&mut self.content); } - self.rendered.update_glyphs(&mut self.content); } /// Get current scroll position. @@ -204,21 +204,51 @@ shared! { TextField /// Jump active cursor to point on the screen. pub fn jump_cursor(&mut self, point:Vector2, selecting:bool) { - let point_on_text = self.relative_position(point); - let content = &mut self.content; - let mut navigation = CursorNavigation {selecting, ..CursorNavigation::default(content)}; + let point_on_text = self.relative_position(point); + let text_field_size = self.size(); + let content = &mut self.content; + let mut navigation = CursorNavigation{selecting,content,text_field_size}; self.cursors.jump_cursor(&mut navigation,point_on_text); self.rendered.update_cursor_sprites(&self.cursors, &mut self.content,self.focused); } + /// Processes PageUp and PageDown, scrolling the page accordingly. + fn scroll_page(&mut self, step:Step) { + let page_height = self.size().y; + let scrolling = match step { + Step::PageUp => page_height, + Step::PageDown => -page_height, + _ => 0.0 + }; + + self.scroll(Vector2::new(0.0,scrolling)); + } + + /// Adjust the view to make the last cursor visible. + fn adjust_view(&mut self) { + let last_cursor = self.cursors.last_cursor(); + let scroll_y = self.scroll_position().y; + let view_size = self.size(); + let current_line = last_cursor.current_line(&mut self.content); + let current_line_pos = current_line.y_position(); + let next_line_pos = current_line_pos + current_line.height; + let y_scrolling = (scroll_y - next_line_pos + view_size.y).min(0.0); + let y_scrolling = (scroll_y - current_line_pos).max(y_scrolling); + let scrolling = Vector2::new(0.0,y_scrolling); + self.scroll(scrolling); + } + /// Move all cursors by given step. pub fn navigate_cursors(&mut self, step:Step, selecting:bool) { if !selecting { self.clear_word_occurrences() } - let content = &mut self.content; - let mut navigation = CursorNavigation {content,selecting}; + let text_field_size = self.size(); + let content = &mut self.content; + let mut navigation = CursorNavigation{content,selecting,text_field_size}; self.cursors.navigate_all_cursors(&mut navigation,step); + self.scroll_page(step); + self.adjust_view(); self.rendered.update_cursor_sprites(&self.cursors, &mut self.content,self.focused); } @@ -370,6 +400,7 @@ impl TextField { // TODO[ao] updates should be done only in one place and only once per frame // see https://github.com/luna/ide/issues/178 this.assignment_update().update_after_text_edit(); + this.adjust_view(); this.rendered.update_glyphs(&mut this.content); this.rendered.update_cursor_sprites(&this.cursors, &mut this.content, this.focused); }); @@ -385,11 +416,11 @@ impl TextField { /// For cursors with selection it will just remove the selected text. For the rest, it will /// remove all content covered by `step`. pub fn do_delete_operation(&self, step:Step) { + let text_field_size = self.size(); self.with_borrowed(|this| { let content = &mut this.content; let selecting = true; - let mut navigation = CursorNavigation - {selecting,..CursorNavigation::default(content)}; + let mut navigation = CursorNavigation{selecting,content,text_field_size}; let without_selection = |c:&Cursor| !c.has_selection(); this.cursors.navigate_cursors(&mut navigation,step,without_selection); }); diff --git a/src/rust/ensogl/src/display/shape/text/text_field/content/line.rs b/src/rust/ensogl/src/display/shape/text/text_field/content/line.rs index 9ecc13b3bd..14aa9400c3 100644 --- a/src/rust/ensogl/src/display/shape/text/text_field/content/line.rs +++ b/src/rust/ensogl/src/display/shape/text/text_field/content/line.rs @@ -8,7 +8,6 @@ use nalgebra::Vector2; use std::ops::Range; - // ============ // === Line === // ============ @@ -99,11 +98,16 @@ pub struct LineFullInfo<'a> { } impl<'a> LineFullInfo<'a> { + /// Get the y position of the top of the line. + pub fn y_position(&self) -> f32 { + self.height * self.line_id as f32 + } + /// Get the point where a _baseline_ of current line begins (The _baseline_ is a font specific /// term, for details see [freetype documentation] /// (https://www.freetype.org/freetype2/docs/glyphs/glyphs-3.html#section-1)). pub fn baseline_start(&self) -> Vector2 { - Vector2::new(0.0, (-(self.line_id as f32) - 0.85) * self.height) + Vector2::new(0.0, -self.y_position() - self.height * 0.85) } /// Get x position of character with given index. The position is in _text space_. diff --git a/src/rust/ensogl/src/display/shape/text/text_field/cursor.rs b/src/rust/ensogl/src/display/shape/text/text_field/cursor.rs index 0da1c3ceb1..4ef42d82f5 100644 --- a/src/rust/ensogl/src/display/shape/text/text_field/cursor.rs +++ b/src/rust/ensogl/src/display/shape/text/text_field/cursor.rs @@ -133,11 +133,14 @@ impl Cursor { /// Home, End, Ctrl+Home, etc.) #[derive(Copy,Clone,Debug,Eq,Hash,PartialEq)] #[allow(missing_docs)] -pub enum Step {Left,LeftWord,Right,RightWord,Up,Down,LineBegin,LineEnd,DocBegin,DocEnd} +pub enum Step +{Left,LeftWord,Right,RightWord,PageUp,Up,PageDown,Down,LineBegin,LineEnd,DocBegin,DocEnd} /// A struct for cursor navigation process. #[derive(Debug)] pub struct CursorNavigation<'a> { + /// A snapshot of TextField's size. + pub text_field_size: Vector2, /// A reference to text content. This is required to obtain the x positions of chars for proper /// moving cursors up and down. pub content: &'a mut TextFieldContent, @@ -146,12 +149,6 @@ pub struct CursorNavigation<'a> { } impl<'a> CursorNavigation<'a> { - /// Creates a new CursorNavigation with defaults. - pub fn default(content:&'a mut TextFieldContent) -> Self { - let selecting = default(); - Self {content,selecting} - } - /// Jump cursor directly to given position. pub fn move_cursor_to_position(&self, cursor:&mut Cursor, to:TextLocation) { cursor.position = to; @@ -220,16 +217,18 @@ impl<'a> CursorNavigation<'a> { /// Get cursor position one line above the given position, such the new x coordinate of /// displayed cursor on the screen will be nearest the current value. - pub fn line_up_position(&mut self, position:&TextLocation) -> Option { - let prev_line = position.line.checked_sub(1); - prev_line.map(|line| self.near_same_x_in_another_line(position,line)) + pub fn line_up_position(&mut self, position:&TextLocation, lines:usize) -> TextLocation { + let prev_line = position.line.checked_sub(lines); + let prev_line = prev_line.map(|line| self.near_same_x_in_another_line(position,line)); + prev_line.unwrap_or_else(TextLocation::at_document_begin) } /// Get cursor position one line behind the given position, such the new x coordinate of /// displayed cursor on the screen will be nearest the current value. - pub fn line_down_position(&mut self, position:&TextLocation) -> Option { - let next_line = Some(position.line + 1).filter(|l| *l < self.content.lines().len()); - next_line.map(|line| self.near_same_x_in_another_line(position,line)) + pub fn line_down_position(&mut self, position:&TextLocation, lines:usize) -> TextLocation { + let next_line = Some(position.line + lines).filter(|l| *l < self.content.lines().len()); + let next_line = next_line.map(|line| self.near_same_x_in_another_line(position,line)); + next_line.unwrap_or_else(|| self.content_end_position()) } /// Returns the next column if it exists. If it doesn't exist it attempts to return the @@ -277,6 +276,10 @@ impl<'a> CursorNavigation<'a> { Self::next_valid_text_location(line, previous_line, previous_column, line_end) } + fn get_lines_from_height(&self) -> usize { + (self.text_field_size.y / self.content.line_height) as usize + } + /// New position of cursor at `position` after applying `step`. fn new_position(&mut self, position: TextLocation, step:Step) -> TextLocation { match step { @@ -284,8 +287,10 @@ impl<'a> CursorNavigation<'a> { Step::RightWord => self.next_word_position(&position).unwrap_or(position), Step::Left => self.prev_char_position(&position).unwrap_or(position), Step::Right => self.next_char_position(&position).unwrap_or(position), - Step::Up => self.line_up_position(&position).unwrap_or(position), - Step::Down => self.line_down_position(&position).unwrap_or(position), + Step::PageUp => self.line_up_position(&position,self.get_lines_from_height()), + Step::PageDown => self.line_down_position(&position,self.get_lines_from_height()), + Step::Up => self.line_up_position(&position,1), + Step::Down => self.line_down_position(&position,1), Step::LineBegin => TextLocation::at_line_begin(position.line), Step::LineEnd => self.line_end_position(position.line), Step::DocBegin => TextLocation::at_document_begin(), @@ -587,13 +592,19 @@ mod test { expected_positions.insert(LineEnd, vec![(0,10),(1,10),(2,9)]); expected_positions.insert(DocBegin, vec![(0,0)]); expected_positions.insert(DocEnd, vec![(2,9)]); - - let mut fonts = FontRegistry::new(); - let properties = TextFieldProperties::default(&mut fonts); - let mut content = TextFieldContent::new(text,&properties); - let mut navigation = CursorNavigation::default(&mut content); - - for step in &[/*Left,Right,Up,*/Down,/*LineBegin,LineEnd,DocBegin,DocEnd*/] { + expected_positions.insert(PageUp, vec![(0,0),(0,9)]); + expected_positions.insert(PageDown, vec![(2,0),(2,9)]); + + let mut fonts = FontRegistry::new(); + let mut properties = TextFieldProperties::default(&mut fonts); + let two_lines_high = properties.text_size * 2.0; + properties.size = Vector2::new(10.0, two_lines_high); + let content = &mut TextFieldContent::new(text,&properties); + let text_field_size = properties.size; + let selecting = false; + let mut navigation = CursorNavigation{selecting,content,text_field_size}; + + for step in &[Left,Right,Up,Down,LineBegin,LineEnd,DocBegin,DocEnd,PageUp,PageDown] { let mut cursors = Cursors::mock(initial_cursors.clone()); cursors.navigate_all_cursors(&mut navigation,*step); let expected = expected_positions.get(step).unwrap(); @@ -613,16 +624,39 @@ mod test { let initial_cursors = vec![initial_cursor]; let new_position = TextLocation {line:1,column:10}; - let mut fonts = FontRegistry::new(); - let properties = TextFieldProperties::default(&mut fonts); - let mut content = TextFieldContent::new(text,&properties); - let mut navigation = CursorNavigation::default(&mut content); + let mut fonts = FontRegistry::new(); + let properties = TextFieldProperties::default(&mut fonts); + let content = &mut TextFieldContent::new(text,&properties); + let selecting = false; + let text_field_size = properties.size; + let mut navigation = CursorNavigation{content,text_field_size,selecting}; let mut cursors = Cursors::mock(initial_cursors.clone()); cursors.navigate_all_cursors(&mut navigation,LineEnd); assert_eq!(new_position, cursors.first_cursor().position); assert_eq!(new_position, cursors.first_cursor().selected_to); } + #[wasm_bindgen_test(async)] + async fn page_scrolling() { + ensogl_core_msdf_sys::initialized().await; + let text = "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19"; + let initial_cursor = Cursor::new(TextLocation::at_document_begin()); + let initial_cursors = vec![initial_cursor]; + let expected_position = TextLocation {line:6,column:0}; + + let mut fonts = FontRegistry::new(); + let mut properties = TextFieldProperties::default(&mut fonts); + properties.size = Vector2::new(100.0,100.0); + let content = &mut TextFieldContent::new(text,&properties); + let selecting = false; + let text_field_size = properties.size; + let mut navigation = CursorNavigation{selecting,content,text_field_size}; + let mut cursors = Cursors::mock(initial_cursors.clone()); + cursors.navigate_all_cursors(&mut navigation,PageDown); + assert_eq!(expected_position, cursors.first_cursor().position); + assert_eq!(expected_position, cursors.first_cursor().selected_to); + } + #[wasm_bindgen_test(async)] async fn moving_with_select() { ensogl_core_msdf_sys::initialized().await; @@ -631,11 +665,12 @@ mod test { let initial_cursors = vec![Cursor::new(initial_loc)]; let new_loc = TextLocation {line:0,column:9}; - let mut fonts = FontRegistry::new(); - let properties = TextFieldProperties::default(&mut fonts); - let mut content = TextFieldContent::new(text,&properties); - let mut navigation = CursorNavigation - {selecting:true, ..CursorNavigation::default(&mut content)}; + let mut fonts = FontRegistry::new(); + let properties = TextFieldProperties::default(&mut fonts); + let content = &mut TextFieldContent::new(text,&properties); + let selecting = true; + let text_field_size = properties.size; + let mut navigation = CursorNavigation{selecting,content,text_field_size}; let mut cursors = Cursors::mock(initial_cursors.clone()); cursors.navigate_all_cursors(&mut navigation,LineEnd); assert_eq!(new_loc , cursors.first_cursor().position); @@ -697,12 +732,14 @@ mod test { #[wasm_bindgen_test(async)] async fn step_into_word() { msdf_sys::initialized().await; - let content = "first sentence\r\nthis is a second sentence\r\nlast sentence\n"; - let content = &mut TextFieldContent::new(content,&mock_properties()); - let selecting = false; - let mut navigation = CursorNavigation{content,selecting}; - let mut location = TextLocation::at_document_begin(); - location = navigation.next_word_position(&location).unwrap(); + let content = "first sentence\r\nthis is a second sentence\r\nlast sentence\n"; + let properties = mock_properties(); + let content = &mut TextFieldContent::new(content,&properties); + let selecting = false; + let text_field_size = properties.size; + let mut navigation = CursorNavigation{content,selecting,text_field_size}; + let mut location = TextLocation::at_document_begin(); + location = navigation.next_word_position(&location).unwrap(); assert_eq!(location, TextLocation{line:0, column:5}); location = navigation.next_word_position(&location).unwrap(); assert_eq!(location, TextLocation{line:0, column:14}); diff --git a/src/rust/ensogl/src/display/shape/text/text_field/frp/keyboard.rs b/src/rust/ensogl/src/display/shape/text/text_field/frp/keyboard.rs index 84db91801f..44c89faef4 100644 --- a/src/rust/ensogl/src/display/shape/text/text_field/frp/keyboard.rs +++ b/src/rust/ensogl/src/display/shape/text/text_field/frp/keyboard.rs @@ -150,6 +150,8 @@ impl TextFieldKeyboardFrp { setter.set_navigation_action(&[ArrowRight], Step::Right); setter.set_navigation_action(&[ArrowUp], Step::Up); setter.set_navigation_action(&[ArrowDown], Step::Down); + setter.set_navigation_action(&[PageDown], Step::PageDown); + setter.set_navigation_action(&[PageUp], Step::PageUp); setter.set_navigation_action(&[Home], Step::LineBegin); setter.set_navigation_action(&[End], Step::LineEnd); setter.set_navigation_action(&[Control,Home], Step::DocBegin); @@ -161,8 +163,6 @@ impl TextFieldKeyboardFrp { setter.set_action(&[Delete], |t| t.do_delete_operation(Step::Right)); setter.set_action(&[Backspace], |t| t.do_delete_operation(Step::Left)); setter.set_action(&[Escape], |t| t.finish_multicursor_mode()); - setter.set_action(&[PageDown], |t| t.page_down()); - setter.set_action(&[PageUp], |t| t.page_up()); } } diff --git a/src/rust/ide/src/view/text_editor.rs b/src/rust/ide/src/view/text_editor.rs index 0b18b26874..76ba29af9d 100644 --- a/src/rust/ide/src/view/text_editor.rs +++ b/src/rust/ide/src/view/text_editor.rs @@ -77,7 +77,7 @@ impl TextEditor { let font = fonts.get_or_load_embedded_font("DejaVuSansMono").unwrap(); let padding = default(); let position = zero(); - let size = Vector2::new(screen.width, screen.height); + let size = Vector2::new(screen.width, screen.height / 2.0); let black = Vector4::new(0.0,0.0,0.0,1.0); let base_color = black; let text_size = 16.0; From 3599f61f06ac5096478641755fbfe9172c197f64 Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 15 Apr 2020 15:19:05 +0200 Subject: [PATCH 20/27] fixes in tests --- src/rust/ide/src/double_representation/definition.rs | 2 +- src/rust/ide/src/double_representation/graph.rs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/rust/ide/src/double_representation/definition.rs b/src/rust/ide/src/double_representation/definition.rs index 3c4768ba24..e759dcb442 100644 --- a/src/rust/ide/src/double_representation/definition.rs +++ b/src/rust/ide/src/double_representation/definition.rs @@ -503,7 +503,7 @@ mod tests { assert!(def_opt.is_some()); } - #[test] + #[wasm_bindgen_test] fn list_definition_test() { let parser = parser::Parser::new_or_panic(); diff --git a/src/rust/ide/src/double_representation/graph.rs b/src/rust/ide/src/double_representation/graph.rs index 043ef92049..56df7e6fa4 100644 --- a/src/rust/ide/src/double_representation/graph.rs +++ b/src/rust/ide/src/double_representation/graph.rs @@ -338,9 +338,11 @@ mod tests { main = foo = node foo a = not_node - Int.= a = node node "; + // TODO [mwu] + // Add case like `Int.+ a = not_node` once https://github.com/luna/enso/issues/565 is fixed + let graph = main_graph(&mut parser, program); let nodes = graph.nodes(); assert_eq!(nodes.len(), 2); From 1acb811754e122433690b80cf618d5346e9ec3d6 Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 15 Apr 2020 15:19:11 +0200 Subject: [PATCH 21/27] CR feedback --- src/rust/ide/utils/src/vec.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/rust/ide/utils/src/vec.rs b/src/rust/ide/utils/src/vec.rs index 3b76cd11bc..d56d58d54d 100644 --- a/src/rust/ide/utils/src/vec.rs +++ b/src/rust/ide/utils/src/vec.rs @@ -17,15 +17,11 @@ pub trait VecExt : AsMut> { self.try_remove(0) } - /// Removes the last `n` elements from the vector. - /// - /// Returns Some if elements were succesfully removed. - /// Returns None and leaves self intact, if there were not enough elements. - fn remove_last_n(&mut self, n:usize) -> Option<()> { + /// Removes the last `n` elements from the vector. Returns true if the elements were removed. + fn remove_last_n(&mut self, n:usize) -> bool { let vec = self.as_mut(); - let new_size = vec.len().checked_sub(n)?; - vec.truncate(new_size); - Some(()) + let new_size = vec.len().checked_sub(n); + new_size.map(|new_size| vec.truncate(new_size)).is_some() } } From 0403eec3086f8a0fd0b453d1716ca9e9f8dec4fa Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 15 Apr 2020 15:30:11 +0200 Subject: [PATCH 22/27] todo note to refer to the spec, once it is available --- src/rust/ide/src/double_representation/alias_analysis.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/rust/ide/src/double_representation/alias_analysis.rs b/src/rust/ide/src/double_representation/alias_analysis.rs index b0ba5af5e2..5aac7bb67e 100644 --- a/src/rust/ide/src/double_representation/alias_analysis.rs +++ b/src/rust/ide/src/double_representation/alias_analysis.rs @@ -81,6 +81,7 @@ pub struct IdentifierUsage { pub enum OccurrenceKind { Used, Introduced } /// If the current context in the AST processor is a pattern context. +// TODO [mwu] Refer to the specification once it is merged. #[allow(missing_docs)] #[derive(Clone,Copy,Debug,Display,PartialEq)] pub enum Context { NonPattern, Pattern } From 9b1cc066f97bbe48015ecc8e37735eae2db7c0f8 Mon Sep 17 00:00:00 2001 From: Danilo Guanabara Date: Wed, 15 Apr 2020 10:46:22 -0300 Subject: [PATCH 23/27] async sleep function (#357) --- src/rust/Cargo.lock | 753 +++++++++++++++------------ src/rust/lib/debug-scenes/Cargo.toml | 6 +- src/rust/lib/system/web/Cargo.toml | 18 +- src/rust/lib/system/web/src/lib.rs | 86 +++ 4 files changed, 513 insertions(+), 350 deletions(-) diff --git a/src/rust/Cargo.lock b/src/rust/Cargo.lock index 1af11c62d6..2f219b1fd0 100644 --- a/src/rust/Cargo.lock +++ b/src/rust/Cargo.lock @@ -6,7 +6,7 @@ version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -16,7 +16,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "aho-corasick" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -34,7 +34,7 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.26" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -53,11 +53,11 @@ dependencies = [ "data 0.1.0", "derive_more 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "enso-prelude 0.1.0", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", "shapely 0.1.0", "shrinkwraprs 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", @@ -71,9 +71,42 @@ dependencies = [ "Inflector 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)", "enso-prelude 0.1.0", "macro-utils 0.1.0", - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "async-std" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "async-task 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-io 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", + "mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)", + "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "async-task" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -81,8 +114,8 @@ name = "atty" version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -98,22 +131,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "backtrace" -version = "0.3.44" +version = "0.3.46" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace-sys 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "backtrace-sys" -version = "0.1.32" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -182,7 +215,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bumpalo" -version = "3.2.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -216,7 +249,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bzip2-sys 0.1.8+1.0.8 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -225,15 +258,7 @@ version = "0.1.8+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "c2-chacha" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -248,12 +273,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "chrono" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -264,7 +289,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -285,15 +310,15 @@ dependencies = [ [[package]] name = "console" -version = "0.9.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "clicolors-control 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "encode_unicode 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "termios 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-width 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -322,12 +347,12 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "try_from 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -335,16 +360,16 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.6.4" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "core-foundation-sys" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -355,6 +380,15 @@ dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "crossbeam-channel" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", + "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "crossbeam-deque" version = "0.7.3" @@ -375,7 +409,7 @@ dependencies = [ "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -403,12 +437,12 @@ name = "data" version = "0.1.0" dependencies = [ "enso-prelude 0.1.0", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "derivative" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", @@ -416,6 +450,16 @@ dependencies = [ "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "derivative" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "derive_more" version = "0.15.0" @@ -424,19 +468,19 @@ dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "derive_more" -version = "0.99.3" +version = "0.99.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -452,7 +496,7 @@ name = "download-lp" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "indicatif 0.10.3 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)", @@ -502,19 +546,19 @@ name = "enso-prelude" version = "0.1.0" dependencies = [ "boolinator 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "derivative 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)", + "derivative 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "derive_more 0.99.5 (registry+https://github.com/rust-lang/crates.io-index)", "enclose 1.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "ifmt 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "nalgebra 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "num 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "paste 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "shapely 0.1.0", "shrinkwraprs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "weak-table 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -534,22 +578,22 @@ dependencies = [ "ensogl-core-embedded-fonts 0.1.0", "ensogl-core-msdf-sys 0.1.0", "ensogl-system-web 0.1.0", - "enum_dispatch 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "enum_dispatch 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "eval-tt 0.1.0", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "logger 0.1.0", "nalgebra 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "num_enum 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num_enum 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", "optics 0.1.0", "palette 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", - "paste 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "paste 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "shapely 0.1.0", "shrinkwraprs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-test 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -592,27 +636,29 @@ dependencies = [ name = "ensogl-system-web" version = "0.1.0" dependencies = [ + "async-std 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "data 0.1.0", "enso-prelude 0.1.0", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "logger 0.1.0", "nalgebra 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", + "wasm-bindgen-futures 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-test 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "web-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "enum_dispatch" -version = "0.2.1" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -627,26 +673,26 @@ dependencies = [ name = "eval-tt" version = "0.1.0" dependencies = [ - "paste 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "paste 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)", - "failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)", + "failure_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "failure_derive" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", "synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -659,13 +705,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "file-manager-client" version = "0.1.0" dependencies = [ - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "enso-prelude 0.1.0", "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "json-rpc 0.1.0", - "paste 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "paste 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", "shapely 0.1.0", "utils 0.1.0", "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -675,15 +721,15 @@ dependencies = [ name = "file-manager-server" version = "0.1.0" dependencies = [ - "chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "enso-prelude 0.1.0", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "file-manager-client 0.1.0", "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "json-rpc 0.1.0", - "paste 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "paste 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", "tungstenite 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -691,12 +737,12 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -706,7 +752,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -808,10 +854,10 @@ name = "futures-macro" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -824,6 +870,11 @@ name = "futures-task" version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "futures-timer" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "futures-util" version = "0.3.4" @@ -837,8 +888,8 @@ dependencies = [ "futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -864,7 +915,7 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "wasi 0.9.0+wasi-snapshot-preview1 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -921,7 +972,7 @@ dependencies = [ [[package]] name = "h2" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -929,12 +980,12 @@ dependencies = [ "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "indexmap 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -947,10 +998,10 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -965,7 +1016,7 @@ dependencies = [ [[package]] name = "http" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -990,7 +1041,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1047,15 +1098,15 @@ dependencies = [ [[package]] name = "hyper" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-channel 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "h2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "h2 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1063,7 +1114,7 @@ dependencies = [ "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", "tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "want 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1076,7 +1127,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1086,9 +1137,9 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1104,7 +1155,7 @@ dependencies = [ "ensogl 0.1.0", "ensogl-core-msdf-sys 0.1.0", "ensogl-system-web 0.1.0", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "file-manager-client 0.1.0", "flo_stream 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1113,8 +1164,8 @@ dependencies = [ "json-rpc 0.1.0", "nalgebra 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", "parser 0.1.0", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", "shapely 0.1.0", "utils 0.1.0", "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1150,7 +1201,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "ifmt-impl 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1159,10 +1210,10 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", "proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)", "quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1192,11 +1243,11 @@ name = "indicatif" version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "console 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "console 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "number_prefix 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1212,7 +1263,7 @@ name = "iovec" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1241,10 +1292,10 @@ name = "json-rpc" version = "0.1.0" dependencies = [ "enso-prelude 0.1.0", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", "shapely 0.1.0", "shrinkwraprs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", @@ -1265,10 +1316,18 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "kv-log-macro" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "language-tags" version = "0.2.2" @@ -1281,7 +1340,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.67" +version = "0.2.68" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1327,9 +1386,9 @@ dependencies = [ name = "macro-utils" version = "0.1.0" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1357,10 +1416,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "memoffset" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1403,7 +1462,7 @@ dependencies = [ "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1411,6 +1470,16 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "mio-uds" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "miow" version = "0.2.1" @@ -1432,29 +1501,29 @@ dependencies = [ "generic-array 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)", "matrixmultiply 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "num-complex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "rand_distr 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", "typenum 1.11.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "native-tls" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl 0.10.28 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.10.29 (registry+https://github.com/rust-lang/crates.io-index)", "openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", - "schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.55 (registry+https://github.com/rust-lang/crates.io-index)", + "schannel 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1464,7 +1533,7 @@ version = "0.2.33" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1486,7 +1555,7 @@ dependencies = [ "num-complex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "num-iter 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)", - "num-rational 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "num-rational 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1507,7 +1576,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1531,7 +1600,7 @@ dependencies = [ [[package]] name = "num-rational" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1554,28 +1623,28 @@ name = "num_cpus" version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num_enum" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "derivative 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "num_enum_derive 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "derivative 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_enum_derive 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "num_enum_derive" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1598,15 +1667,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl" -version = "0.10.28" +version = "0.10.29" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.55 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1616,12 +1685,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "openssl-sys" -version = "0.9.54" +version = "0.9.55" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "pkg-config 0.3.17 (registry+https://github.com/rust-lang/crates.io-index)", "vcpkg 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1650,9 +1719,9 @@ name = "palette_derive" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1681,7 +1750,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1695,9 +1764,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1711,15 +1780,15 @@ dependencies = [ "data 0.1.0", "enso-prelude 0.1.0", "ensogl-build-utilities 0.1.0", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "matches 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "reqwest 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", "shrinkwraprs 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", "utils 0.1.0", "uuid 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1729,22 +1798,22 @@ dependencies = [ [[package]] name = "paste" -version = "0.1.7" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "paste-impl 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", + "paste-impl 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "paste-impl" -version = "0.1.7" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1793,7 +1862,7 @@ name = "phf_shared" version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "siphasher 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "siphasher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1809,9 +1878,9 @@ name = "pin-project-internal" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1849,17 +1918,12 @@ dependencies = [ [[package]] name = "proc-macro-hack" -version = "0.5.11" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", -] [[package]] name = "proc-macro-nested" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -1872,7 +1936,7 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1886,7 +1950,7 @@ dependencies = [ "error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)", "idna 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -1900,10 +1964,10 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1912,7 +1976,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1930,8 +1994,8 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "rand_hc 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_pcg 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1948,10 +2012,10 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2013,7 +2077,7 @@ name = "rand_jitter" version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2025,7 +2089,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", "rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2084,18 +2148,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "regex" -version = "1.3.4" +version = "1.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "aho-corasick 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", - "regex-syntax 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)", "thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "regex-syntax" -version = "0.6.16" +version = "0.6.17" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2116,7 +2180,7 @@ dependencies = [ "cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)", "cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", "encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2124,9 +2188,9 @@ dependencies = [ "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", "serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", "tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2149,22 +2213,22 @@ dependencies = [ "encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)", "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "hyper 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)", "hyper-tls 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)", "mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", "serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2198,7 +2262,7 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2208,7 +2272,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "schannel" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2227,21 +2291,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "security-framework" -version = "0.3.4" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", - "security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "security-framework-sys" -version = "0.3.3" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2259,30 +2325,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "serde" -version = "1.0.104" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_derive" -version = "1.0.104" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "serde_json" -version = "1.0.48" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2292,7 +2358,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", "url 1.7.2 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2303,7 +2369,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", "itoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2327,9 +2393,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "shapely" version = "0.1.0" dependencies = [ - "derivative 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "derivative 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", "enso-prelude 0.1.0", - "paste 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "paste 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", "shapely-macros 0.1.0", "shrinkwraprs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2342,9 +2408,9 @@ dependencies = [ "boolinator 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "macro-utils 0.1.0", - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2354,9 +2420,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2366,14 +2432,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "siphasher" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2400,7 +2466,7 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -2428,11 +2494,11 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.16" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2441,9 +2507,9 @@ name = "synstructure" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2453,7 +2519,7 @@ version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2462,10 +2528,10 @@ dependencies = [ [[package]] name = "termios" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2481,7 +2547,7 @@ name = "time" version = "0.1.42" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)", "redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2506,11 +2572,12 @@ dependencies = [ [[package]] name = "tokio" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-core 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "iovec 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2573,9 +2640,9 @@ name = "tokio-macros" version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2651,7 +2718,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-io 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2660,13 +2727,13 @@ name = "tokio-tls" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "tokio-util" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2674,7 +2741,7 @@ dependencies = [ "futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "pin-project-lite 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2682,7 +2749,7 @@ name = "toml" version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2716,11 +2783,11 @@ dependencies = [ "base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)", - "http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "input_buffer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", "url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -2766,7 +2833,7 @@ name = "unicode-normalization" version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2819,7 +2886,7 @@ name = "utils" version = "0.1.0" dependencies = [ "enso-prelude 0.1.0", - "failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", "pin-utils 0.1.0-alpha.4 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2838,7 +2905,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2887,8 +2954,8 @@ version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-macro 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2897,12 +2964,12 @@ name = "wasm-bindgen-backend" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bumpalo 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2922,7 +2989,7 @@ name = "wasm-bindgen-macro" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-macro-support 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2931,9 +2998,9 @@ name = "wasm-bindgen-macro-support" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-shared 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2961,8 +3028,8 @@ name = "wasm-bindgen-test-macro" version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -2970,12 +3037,12 @@ name = "wasm-bindgen-webidl" version = "0.2.58" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", "heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-backend 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", "weedle 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -2990,7 +3057,7 @@ name = "web-sys" version = "0.3.35" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)", + "anyhow 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)", "js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)", "sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen 0.2.58 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3016,9 +3083,9 @@ dependencies = [ name = "web-test-proc-macro" version = "0.1.0" dependencies = [ - "proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", - "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", - "syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)", "wasm-bindgen-test 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3033,7 +3100,7 @@ dependencies = [ "bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)", "futures 0.1.29 (registry+https://github.com/rust-lang/crates.io-index)", "hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)", - "native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", "sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", "tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", @@ -3106,7 +3173,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bzip2 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)", + "flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)", "podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3114,15 +3181,17 @@ dependencies = [ [metadata] "checksum Inflector 0.11.4 (registry+https://github.com/rust-lang/crates.io-index)" = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" "checksum adler32 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5d2e7343e7fc9de883d1b0341e0b13970f764c14101234857d2ddafa1cb1cac2" -"checksum aho-corasick 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d5e63fd144e18ba274ae7095c0197a870a7b9468abc801dd62f190d80817d2ec" +"checksum aho-corasick 0.7.10 (registry+https://github.com/rust-lang/crates.io-index)" = "8716408b8bc624ed7f65d223ddb9ac2d044c0547b6fa4b0d554f3a9540496ada" "checksum alga 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4f823d037a7ec6ea2197046bafd4ae150e6bc36f9ca347404f46a46823fa84f2" -"checksum anyhow 1.0.26 (registry+https://github.com/rust-lang/crates.io-index)" = "7825f6833612eb2414095684fcf6c635becf3ce97fe48cf6421321e93bfbd53c" +"checksum anyhow 1.0.28 (registry+https://github.com/rust-lang/crates.io-index)" = "d9a60d744a80c30fcb657dfe2c1b22bcb3e814c1a1e3674f32bf5820b570fbff" "checksum approx 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3" +"checksum async-std 1.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "538ecb01eb64eecd772087e5b6f7540cbc917f047727339a472dafed2185b267" +"checksum async-task 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0ac2c016b079e771204030951c366db398864f5026f84a44dafb0ff20f02085d" "checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" "checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2" "checksum autocfg 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f8aac770f1885fd7e387acedd76065302551364496e46b3dd00860b2f8359b9d" -"checksum backtrace 0.3.44 (registry+https://github.com/rust-lang/crates.io-index)" = "e4036b9bf40f3cf16aba72a3d65e8a520fc4bafcdc7079aea8f848c58c5b5536" -"checksum backtrace-sys 0.1.32 (registry+https://github.com/rust-lang/crates.io-index)" = "5d6575f128516de27e3ce99689419835fce9643a9b215a14d2b5b685be018491" +"checksum backtrace 0.3.46 (registry+https://github.com/rust-lang/crates.io-index)" = "b1e692897359247cc6bb902933361652380af0f1b7651ae5c5013407f30e109e" +"checksum backtrace-sys 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "7de8aba10a69c8e8d7622c5710229485ec32e9d55fdad160ea559c086fdcd118" "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum base64 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b41b7ea54a0c9d92199de89e20e58d49f02f8e699814ef3fdf266f6f748d15c7" "checksum base64 0.9.3 (registry+https://github.com/rust-lang/crates.io-index)" = "489d6c0ed21b11d038c31b6ceccca973e65d73ba3bd8ecb9a2babf5546164643" @@ -3132,33 +3201,34 @@ dependencies = [ "checksum block-buffer 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" "checksum block-padding 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" "checksum boolinator 2.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "cfa8873f51c92e232f9bac4065cddef41b714152812bfc5f7672ba16d6ef8cd9" -"checksum bumpalo 3.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f359dc14ff8911330a51ef78022d376f25ed00248912803b58f00cb1c27f742" +"checksum bumpalo 3.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "12ae9db68ad7fac5fe51304d20f016c911539251075a214f8e663babefa35187" "checksum byte-tools 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" "checksum byteorder 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" "checksum bytes 0.4.12 (registry+https://github.com/rust-lang/crates.io-index)" = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" "checksum bytes 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "130aac562c0dd69c56b3b1cc8ffd2e17be31d0b6c25b61c96b76231aa23e39e1" "checksum bzip2 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "42b7c3cbf0fa9c1b82308d57191728ca0256cb821220f4e2fd410a72ade26e3b" "checksum bzip2-sys 0.1.8+1.0.8 (registry+https://github.com/rust-lang/crates.io-index)" = "05305b41c5034ff0e93937ac64133d109b5a2660114ec45e9760bc6816d83038" -"checksum c2-chacha 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "214238caa1bf3a496ec3392968969cab8549f96ff30652c9e56885329315f6bb" "checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd" "checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum chrono 0.4.10 (registry+https://github.com/rust-lang/crates.io-index)" = "31850b4a4d6bae316f7a09e691c944c28299298837edc0a03f755618c23cbc01" +"checksum chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "80094f509cf8b5ae86a4966a39b3ff66cd7e2a3e594accec3743ff3fabeab5b2" "checksum clicolors-control 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90082ee5dcdd64dc4e9e0d37fbf3ee325419e39c0092191e0393df65518f741e" "checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum console 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "45e0f3986890b3acbc782009e2629dfe2baa430ac091519ce3be26164a2ae6c0" +"checksum console 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6728a28023f207181b193262711102bfbaf47cc9d13bc71d0736607ef8efe88c" "checksum console_error_panic_hook 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d976903543e0c48546a91908f21588a680a8c8f984df9a5d69feccb2b2a211" "checksum cookie 0.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "888604f00b3db336d2af898ec3c1d5d0ddf5e6d462220f2ededc33a87ac4bbd5" "checksum cookie_store 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46750b3f362965f197996c4448e4a0935e791bf7d6631bfce9ee0af3d24c919c" -"checksum core-foundation 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "25b9e03f145fd4f2bf705e07b900cd41fc636598fe5dc452fd0db1441c3f496d" -"checksum core-foundation-sys 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e7ca8a5221364ef15ce201e8ed2f609fc312682a8f4e0e3d4aa5879764e0fa3b" +"checksum core-foundation 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" +"checksum core-foundation-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" "checksum crc32fast 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ba125de2af0df55319f41944744ad91c71113bf74a4646efff39afe1f6842db1" +"checksum crossbeam-channel 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "cced8691919c02aac3cb0a1bc2e9b73d89e832bf9a06fc579d4e71b68a2da061" "checksum crossbeam-deque 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" "checksum crossbeam-epoch 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" "checksum crossbeam-queue 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c695eeca1e7173472a32221542ae469b3e9aac3a4fc81f7696bcad82029493db" "checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" -"checksum derivative 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "942ca430eef7a3806595a6737bc388bf51adb888d3fc0dd1b50f1c170167ee3a" +"checksum derivative 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3c6d883546668a3e2011b6a716a7330b82eabb0151b138217f632c8243e17135" +"checksum derivative 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1eae4d76b7cefedd1b4f8cc24378b2fbd1ac1b66e3bbebe8e2192d3be81cb355" "checksum derive_more 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a141330240c921ec6d074a3e188a7c7ef95668bb95e7d44fa0e5778ec2a7afe" -"checksum derive_more 0.99.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a806e96c59a76a5ba6e18735b6cf833344671e61e7863f2edb5c518ea2cac95c" +"checksum derive_more 0.99.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e2323f3f47db9a0e77ce7a300605d8d2098597fc451ed1a97bb1f6411bb550a7" "checksum digest 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" "checksum download-lp 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "9c990fef441b9f1ce8e47b3854e4fbae08ee2d2022faffd101be0dfd3d81456a" "checksum dtoa 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4358a9e11b9a09cf52383b451b49a169e8d797b68aa02301ff586d70d9661ea3" @@ -3166,12 +3236,12 @@ dependencies = [ "checksum enclose 1.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1056f553da426e9c025a662efa48b52e62e0a3a7648aa2d15aeaaf7f0d329357" "checksum encode_unicode 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" "checksum encoding_rs 0.8.22 (registry+https://github.com/rust-lang/crates.io-index)" = "cd8d03faa7fe0c1431609dfad7bbe827af30f82e1e2ae6f7ee4fca6bd764bc28" -"checksum enum_dispatch 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "97c676e703d999177c8de93e98dc09d6f4f3f0bb087d4384c3deca69bbe6a99d" +"checksum enum_dispatch 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "733967190e01b0dcb64f2f42687a78af0e418e064489e993e16445643d088560" "checksum error-chain 0.12.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d371106cc88ffdfb1eabd7111e432da544f16f3e2d7bf1dfe8bf575f1df045cd" -"checksum failure 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8273f13c977665c5db7eb2b99ae520952fe5ac831ae4cd09d80c4c7042b5ed9" -"checksum failure_derive 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0bc225b78e0391e4b8683440bf2e63c2deeeb2ce5189eab46e2b68c6d3725d08" +"checksum failure 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b8529c2421efa3066a5cbd8063d2244603824daccb6936b079010bb2aa89464b" +"checksum failure_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "030a733c8287d6213886dd487564ff5c8f6aae10278b3588ed177f9d18f8d231" "checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" -"checksum flate2 1.0.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6bd6d6f4752952feb71363cffc9ebac9411b75b87c6ab6058c40c8900cf43c0f" +"checksum flate2 1.0.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2cfff41391129e0a856d6d822600b8d71179d46879e310417eb9c762eb178b42" "checksum flo_stream 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b02e0d3667b27514149c1ac9b372d700f3e6df4bbaf6b7c5df12915de2996049" "checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3" "checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" @@ -3189,22 +3259,23 @@ dependencies = [ "checksum futures-macro 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "9a5081aa3de1f7542a794a397cde100ed903b0630152d0973479018fd85423a7" "checksum futures-sink 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3466821b4bc114d95b087b850a724c6f83115e929bc88f1fa98a3304a944c8a6" "checksum futures-task 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "7b0a34e53cf6cdcd0178aa573aed466b646eb3db769570841fda0c7ede375a27" +"checksum futures-timer 2.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a1de7508b218029b0f01662ed8f61b1c964b3ae99d6f25462d0f55a595109df6" "checksum futures-util 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "22766cf25d64306bedf0384da004d05c9974ab104fcc4528f1236181c18004c5" "checksum generic-array 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" "checksum generic-array 0.13.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0ed1e761351b56f54eb9dcd0cfaca9fd0daecf93918e1cfc01c8a3d26ee7adcd" "checksum getrandom 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "7abc8dd8451921606d809ba32e95b6111925cd2906060d2dcc29c070220503eb" "checksum h2 0.1.26 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" -"checksum h2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9d5c295d1c0c68e4e42003d75f908f5e16a1edd1cbe0b0d02e4dc2006a384f47" +"checksum h2 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "377038bf3c89d18d6ca1431e7a5027194fbd724ca10592b9487ede5e8e144f42" "checksum heck 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "20564e78d53d2bb135c343b3f47714a56af2061f1c928fdb541dc7b9fdd94205" -"checksum hermit-abi 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "1010591b26bbfe835e9faeabeb11866061cc7dcebffd56ad7d0942d0e61aefd8" +"checksum hermit-abi 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "725cf19794cf90aa94e65050cb4191ff5d8fa87a498383774c47b332e3af952e" "checksum http 0.1.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" -"checksum http 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b708cc7f06493459026f53b9a61a7a121a5d1ec6238dee58ea4941132b30156b" +"checksum http 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "28d569972648b2c512421b5f2a405ad6ac9666547189d0c5477a3f200f3e02f9" "checksum http-body 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" "checksum http-body 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "13d5ff830006f7646652e057693569bfe0d51760c0085a071769d142a205111b" "checksum httparse 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "cd179ae861f0c2e53da70d892f5f3029f9594be0c41dc5269cd371691b1dc2f9" "checksum hyper 0.10.16 (registry+https://github.com/rust-lang/crates.io-index)" = "0a0652d9a2609a968c14be1a9ea00bf4b1d64e2e1f53a1b51b6fff3a6e829273" "checksum hyper 0.12.35 (registry+https://github.com/rust-lang/crates.io-index)" = "9dbe6ed1438e1f8ad955a4701e9a944938e9519f6888d12d8558b645e247d5f6" -"checksum hyper 0.13.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e7b15203263d1faa615f9337d79c1d37959439dc46c2b4faab33286fadc2a1c5" +"checksum hyper 0.13.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ed6081100e960d9d74734659ffc9cc91daf1c0fc7aceb8eaa94ee1a3f5046f2e" "checksum hyper-tls 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3a800d6aa50af4b5850b2b0f659625ce9504df908e9733b635720483be26174f" "checksum hyper-tls 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3adcd308402b9553630734e9c36b77a7e48b3821251ca2493e8cd596763aafaa" "checksum idna 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "38f09e0f0b1fb55fdee1f17470ad800da77af5186a1a76c026b679358b7e844e" @@ -3221,9 +3292,10 @@ dependencies = [ "checksum js-sys 0.3.35 (registry+https://github.com/rust-lang/crates.io-index)" = "7889c7c36282151f6bf465be4700359318aef36baa951462382eae49e9577cf9" "checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" "checksum keyboard-types 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a989afac88279b0482f402d234b5fbd405bf1ad051308595b58de4e6de22346b" +"checksum kv-log-macro 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c54d9f465d530a752e6ebdc217e081a7a614b48cb200f6f0aee21ba6bc9aabb" "checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum libc 0.2.67 (registry+https://github.com/rust-lang/crates.io-index)" = "eb147597cdf94ed43ab7a9038716637d2d1bf2bc571da995d0028dec06bd3018" +"checksum libc 0.2.68 (registry+https://github.com/rust-lang/crates.io-index)" = "dea0c0405123bba743ee3f91f49b1c7cfb684eef0da0a50110f758ccf24cdff0" "checksum libm 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c7d73b3f436185384286bd8098d17ec07c9a7d2388a6599f824d8502b529702a" "checksum lock_api 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "79b2de95ecb4691949fea4716ca53cdbcfccb2c612e19644a8bad05edcf9f47b" "checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" @@ -3232,15 +3304,16 @@ dependencies = [ "checksum matrixmultiply 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d4f7ec66360130972f34830bfad9ef05c6610a43938a467bcc9ab9369ab3478f" "checksum maybe-uninit 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" "checksum memchr 2.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3728d817d99e5ac407411fa471ff9800a778d88a24685968b36824eaf4bee400" -"checksum memoffset 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "75189eb85871ea5c2e2c15abbdd541185f63b408415e5051f5cac122d8c774b9" +"checksum memoffset 0.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b4fc2c02a7e374099d4ee95a193111f72d2110197fe200272371758f6c3643d8" "checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" "checksum mime 0.3.16 (registry+https://github.com/rust-lang/crates.io-index)" = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" "checksum mime_guess 2.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2684d4c2e97d99848d30b324b00c8fcc7e5c897b7cbb5819b09e7c90e8baf212" "checksum miniz_oxide 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "aa679ff6578b1cddee93d7e82e263b94a575e0bfced07284eb0c037c1d2416a5" "checksum mio 0.6.21 (registry+https://github.com/rust-lang/crates.io-index)" = "302dec22bcf6bae6dfb69c647187f4b4d0fb6f535521f7bc022430ce8e12008f" +"checksum mio-uds 0.6.7 (registry+https://github.com/rust-lang/crates.io-index)" = "966257a94e196b11bb43aca423754d87429960a768de9414f3691d6957abf125" "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum nalgebra 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0abb021006c01b126a936a8dd1351e0720d83995f4fc942d0d426c654f990745" -"checksum native-tls 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "4b2df1a4c22fd44a62147fd8f13dd0f95c9d8ca7b2610299b2a2f9cf8964274e" +"checksum native-tls 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "2b0d88c06fe90d5ee94048ba40409ef1d9315d86f6f38c2efdaad4fb50c58b2d" "checksum net2 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "42550d9fb7b6684a6d404d9fa7250c2eb2646df731d1c06afc06dcee9e1bcf88" "checksum nom 4.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2ad2a91a8e869eeb30b9cb3119ae87773a8f4ae617f41b1eb9c154b2905f7bd6" "checksum num 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" @@ -3248,25 +3321,25 @@ dependencies = [ "checksum num-complex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" "checksum num-integer 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "3f6ea62e9d81a77cd3ee9a2a5b9b609447857f3d358704331e4ef39eb247fcba" "checksum num-iter 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "dfb0800a0291891dd9f4fe7bd9c19384f98f7fbe0cd0f39a2c6b88b9868bbc00" -"checksum num-rational 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "da4dc79f9e6c81bef96148c8f6b8e72ad4541caa4a24373e900a36da07de03a3" +"checksum num-rational 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" "checksum num-traits 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "c62be47e61d1842b9170f0fdeec8eba98e60e90e5446449a0545e5152acd7096" "checksum num_cpus 1.12.0 (registry+https://github.com/rust-lang/crates.io-index)" = "46203554f085ff89c235cd12f7075f3233af9b11ed7c9e16dfe2560d03313ce6" -"checksum num_enum 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "be601e38e20a6f3d01049d85801cb9b7a34a8da7a0da70df507bbde7735058c8" -"checksum num_enum_derive 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b59f30f6a043f2606adbd0addbf1eef6f2e28e8c4968918b63b7ff97ac0db2a7" +"checksum num_enum 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca565a7df06f3d4b485494f25ba05da1435950f4dc263440eda7a6fa9b8e36e4" +"checksum num_enum_derive 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ffa5a33ddddfee04c0283a7653987d634e880347e96b5b2ed64de07efb59db9d" "checksum number_prefix 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "dbf9993e59c894e3c08aa1c2712914e9e6bf1fcbfc6bef283e2183df345a4fee" "checksum once_cell 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1c601810575c99596d4afc46f78a678c80105117c379eb3650cf99b8a21ce5b" "checksum opaque-debug 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" -"checksum openssl 0.10.28 (registry+https://github.com/rust-lang/crates.io-index)" = "973293749822d7dd6370d6da1e523b0d1db19f06c459134c658b2a4261378b52" +"checksum openssl 0.10.29 (registry+https://github.com/rust-lang/crates.io-index)" = "cee6d85f4cb4c4f59a6a85d5b68a233d280c82e29e822913b9c8b129fbf20bdd" "checksum openssl-probe 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "77af24da69f9d9341038eba93a073b1fdaaa1b788221b00a69bce9e762cb32de" -"checksum openssl-sys 0.9.54 (registry+https://github.com/rust-lang/crates.io-index)" = "1024c0a59774200a555087a6da3f253a9095a5f344e353b212ac4c8b8e450986" +"checksum openssl-sys 0.9.55 (registry+https://github.com/rust-lang/crates.io-index)" = "7717097d810a0f2e2323f9e5d11e71608355e24828410b55b9d4f18aa5f9a5d8" "checksum palette 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a05c0334468e62a4dfbda34b29110aa7d70d58c7fdb2c9857b5874dd9827cc59" "checksum palette_derive 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0b4b5f600e60dd3a147fb57b4547033d382d1979eb087af310e91cb45a63b1f4" "checksum parking_lot 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "92e98c49ab0b7ce5b222f2cc9193fc4efe11c6d0bd4f648e374684a6857b1cfc" "checksum parking_lot 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" "checksum parking_lot_core 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "b876b1b9e7ac6e1a74a6da34d25c42e17e8862aa409cbbbdcfc8d86c6f3bc62b" "checksum parking_lot_core 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7582838484df45743c8434fbff785e8edf260c28748353d44bc0da32e0ceabf1" -"checksum paste 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "63e1afe738d71b1ebab5f1207c055054015427dbfc7bbe9ee1266894156ec046" -"checksum paste-impl 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "6d4dc4a7f6f743211c5aab239640a65091535d97d43d92a52bca435a640892bb" +"checksum paste 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "ab4fb1930692d1b6a9cfabdde3d06ea0a7d186518e2f4d67660d8970e2fa647a" +"checksum paste-impl 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "a62486e111e571b1e93b710b61e8f493c0013be39629b714cb166bdb06aa5a8a" "checksum path-clean 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ecba01bf2678719532c5e3059e0b5f0811273d94b397088b82e3bd0a78c78fdd" "checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" "checksum percent-encoding 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" @@ -3282,17 +3355,17 @@ dependencies = [ "checksum podio 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "780fb4b6698bbf9cf2444ea5d22411cef2953f0824b98f33cf454ec5615645bd" "checksum ppv-lite86 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "74490b50b9fbe561ac330df47c08f3f33073d2d00c150f719147d7c54522fa1b" "checksum proc-macro-crate 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "e10d4b51f154c8a7fb96fd6dad097cb74b863943ec010ac94b9fd1be8861fe1e" -"checksum proc-macro-hack 0.5.11 (registry+https://github.com/rust-lang/crates.io-index)" = "ecd45702f76d6d3c75a80564378ae228a85f0b59d2f3ed43c91b4a69eb2ebfc5" -"checksum proc-macro-nested 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "369a6ed065f249a159e06c45752c780bda2fb53c995718f9e484d08daa9eb42e" +"checksum proc-macro-hack 0.5.15 (registry+https://github.com/rust-lang/crates.io-index)" = "0d659fe7c6d27f25e9d80a1a094c223f5246f6a6596453e09d7229bf42750b63" +"checksum proc-macro-nested 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8e946095f9d3ed29ec38de908c22f95d9ac008e424c7bcae54c75a79c527c694" "checksum proc-macro2 0.4.30 (registry+https://github.com/rust-lang/crates.io-index)" = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759" -"checksum proc-macro2 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "6c09721c6781493a2a492a96b5a5bf19b65917fe6728884e7c44dd0c60ca3435" +"checksum proc-macro2 1.0.10 (registry+https://github.com/rust-lang/crates.io-index)" = "df246d292ff63439fea9bc8c0a270bed0e390d5ebd4db4ba15aba81111b5abe3" "checksum publicsuffix 1.5.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3bbaa49075179162b49acac1c6aa45fb4dafb5f13cf6794276d77bc7fd95757b" "checksum quote 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "6ce23b6b870e8f94f81fb0a363d65d86675884b34a09043c81e5562f11c1f8e1" -"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" +"checksum quote 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2bdc6c187c65bca4260c9011c9e3132efe4909da44726bad24cf7572ae338d7f" "checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" "checksum rand 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" "checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -"checksum rand_chacha 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "03a2a90da8c7523f554344f921aa97283eadf6ac484a6d2a7d0212fa7f8d6853" +"checksum rand_chacha 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" "checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" "checksum rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" "checksum rand_core 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" @@ -3309,8 +3382,8 @@ dependencies = [ "checksum rawpointer 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" "checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" "checksum redox_syscall 0.1.56 (registry+https://github.com/rust-lang/crates.io-index)" = "2439c63f3f6139d1b57529d16bc3b8bb855230c8efcc5d3a896c8bea7c3b1e84" -"checksum regex 1.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "322cf97724bea3ee221b78fe25ac9c46114ebb51747ad5babd51a2fc6a8235a8" -"checksum regex-syntax 0.6.16 (registry+https://github.com/rust-lang/crates.io-index)" = "1132f845907680735a84409c3bebc64d1364a5683ffbce899550cd09d5eaefc1" +"checksum regex 1.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "7f6946991529684867e47d86474e3a6d0c0ab9b82d5821e314b1ede31fa3a4b3" +"checksum regex-syntax 0.6.17 (registry+https://github.com/rust-lang/crates.io-index)" = "7fe5bd57d1d7414c6b5ed48563a2c855d995ff777729dcd91c369ec7fea395ae" "checksum remove_dir_all 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "4a83fa3702a688b9359eccba92d153ac33fd2e8462f9e0e3fdf155239ea7792e" "checksum reqwest 0.10.4 (registry+https://github.com/rust-lang/crates.io-index)" = "02b81e49ddec5109a9dcfc5f2a317ff53377c915e9ae9d4f2fb50914b85614e2" "checksum reqwest 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)" = "f88643aea3c1343c804950d7bf983bd2067f5ab59db6d613a08e05572f2714ab" @@ -3318,40 +3391,40 @@ dependencies = [ "checksum rustc-demangle 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "4c691c0e608126e00913e33f0ccf3727d5fc84573623b8d65b2df340b5201783" "checksum rustc-hash 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" "checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum ryu 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bfa8506c1de11c9c4e4c38863ccbe02a305c8188e85a05a784c9e11e1c3910c8" +"checksum ryu 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535622e6be132bccd223f4bb2b8ac8d53cda3c7a6394944d3b2b33fb974f9d76" "checksum safemem 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" -"checksum schannel 0.1.17 (registry+https://github.com/rust-lang/crates.io-index)" = "507a9e6e8ffe0a4e0ebb9a10293e62fdf7657c06f1b8bb07a8fcf697d2abf295" +"checksum schannel 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "039c25b130bd8c1321ee2d7de7fde2659fa9c2744e4bb29711cfc852ea53cd19" "checksum scoped-tls 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" "checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -"checksum security-framework 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8ef2429d7cefe5fd28bd1d2ed41c944547d4ff84776f5935b456da44593a16df" -"checksum security-framework-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e31493fc37615debb8c5090a7aeb4a9730bc61e77ab10b9af59f1a202284f895" +"checksum security-framework 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "572dfa3a0785509e7a44b5b4bebcf94d41ba34e9ed9eb9df722545c3b3c4144a" +"checksum security-framework-sys 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8ddb15a5fec93b7021b8a9e96009c5d8d51c15673569f7c0f6b7204e5b7b404f" "checksum semver 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" "checksum semver-parser 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" -"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449" -"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64" -"checksum serde_json 1.0.48 (registry+https://github.com/rust-lang/crates.io-index)" = "9371ade75d4c2d6cb154141b9752cf3781ec9c05e0e5cf35060e1e70ee7b9c25" +"checksum serde 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)" = "36df6ac6412072f67cf767ebbde4133a5b2e88e76dc6187fa7104cd16f783399" +"checksum serde_derive 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)" = "9e549e3abf4fb8621bd1609f11dfc9f5e50320802273b12f3811a67e6716ea6c" +"checksum serde_json 1.0.51 (registry+https://github.com/rust-lang/crates.io-index)" = "da07b57ee2623368351e9a0488bb0b261322a15a6e0ae53e243cbdc0f4208da9" "checksum serde_urlencoded 0.5.5 (registry+https://github.com/rust-lang/crates.io-index)" = "642dd69105886af2efd227f75a520ec9b44a820d65bc133a9131f7d229fd165a" "checksum serde_urlencoded 0.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "9ec5d77e2d4c73717816afac02670d5c4f534ea95ed430442cad02e7a6e32c97" "checksum sha-1 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" "checksum sha1 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "2579985fda508104f7587689507983eadd6a6e84dd35d6d115361f530916fa0d" "checksum shrinkwraprs 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "83695fde96cbe9e08f0e4eb96b1b56fdbd44f2098ee27462dda964c7745fddc7" "checksum shrinkwraprs 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e63e6744142336dfb606fe2b068afa2e1cca1ee6a5d8377277a92945d81fa331" -"checksum siphasher 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "83da420ee8d1a89e640d0948c646c1c088758d3a3c538f943bfa97bdac17929d" +"checksum siphasher 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e88f89a550c01e4cd809f3df4f52dc9e939f3273a2017eabd5c6d12fd98bb23" "checksum sized-chunks 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "d59044ea371ad781ff976f7b06480b9f0180e834eda94114f2afb4afc12b7718" "checksum slab 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" "checksum smallvec 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" -"checksum smallvec 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5c2fb2ec9bcd216a5b0d0ccf31ab17b5ed1d627960edff65bbe95d3ce221cefc" +"checksum smallvec 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05720e22615919e4734f6a99ceae50d00226c3c5aca406e102ebc33298214e0a" "checksum sourcefile 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4bf77cb82ba8453b42b6ae1d692e4cdc92f9a47beaf89a847c8be83f4e328ad3" "checksum string 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" "checksum syn 0.15.44 (registry+https://github.com/rust-lang/crates.io-index)" = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5" -"checksum syn 1.0.16 (registry+https://github.com/rust-lang/crates.io-index)" = "123bd9499cfb380418d509322d7a6d52e5315f064fe4b3ad18a53d6b92c07859" +"checksum syn 1.0.17 (registry+https://github.com/rust-lang/crates.io-index)" = "0df0eb663f387145cab623dea85b09c2c5b4b0aef44e945d928e682fce71bb03" "checksum synstructure 0.12.3 (registry+https://github.com/rust-lang/crates.io-index)" = "67656ea1dc1b41b1451851562ea232ec2e5a80242139f7e679ceccfb5d61f545" "checksum tempfile 3.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" -"checksum termios 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "72b620c5ea021d75a735c943269bb07d30c9b77d6ac6b236bc8b5c496ef05625" +"checksum termios 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6f0fcee7b24a25675de40d5bb4de6e41b0df07bc9856295e7e2b3a3600c400c2" "checksum thread_local 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d40c6d1b69745a6ec6fb1ca717914848da4b44ae29d9b3080cbee91d72a69b14" "checksum time 0.1.42 (registry+https://github.com/rust-lang/crates.io-index)" = "db8dcfca086c1143c9270ac42a2bbd8a7ee477b78ac8e45b19abfb0cbede4b6f" "checksum tokio 0.1.22 (registry+https://github.com/rust-lang/crates.io-index)" = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" -"checksum tokio 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "0fa5e81d6bc4e67fe889d5783bd2a128ab2e0cfa487e0be16b6a8d177b101616" +"checksum tokio 0.2.16 (registry+https://github.com/rust-lang/crates.io-index)" = "ee5a0dd887e37d37390c13ff8ac830f992307fe30a1fff0ab8427af67211ba28" "checksum tokio-buf 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" "checksum tokio-codec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "25b2998660ba0e70d18684de5d06b70b70a3a747469af9dea7618cc59e75976b" "checksum tokio-current-thread 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" @@ -3365,7 +3438,7 @@ dependencies = [ "checksum tokio-timer 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" "checksum tokio-tls 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "354b8cd83825b3c20217a9dc174d6a0c67441a2fae5c41bcb1ea6679f6ae0f7c" "checksum tokio-tls 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7bde02a3a5291395f59b06ec6945a3077602fac2b07eeeaf0dee2122f3619828" -"checksum tokio-util 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "571da51182ec208780505a32528fc5512a8fe1443ab960b3f2f3ef093cd16930" +"checksum tokio-util 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be8242891f2b6cbef26a2d7e8605133c2c554cd35b3e4948ea892d6d68436499" "checksum toml 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ffc92d160b1eef40665be3a05630d003936a3bc7da7421277846c2613e92c71a" "checksum tower-service 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860" "checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" diff --git a/src/rust/lib/debug-scenes/Cargo.toml b/src/rust/lib/debug-scenes/Cargo.toml index c91f4e89ec..b64ac28e4f 100644 --- a/src/rust/lib/debug-scenes/Cargo.toml +++ b/src/rust/lib/debug-scenes/Cargo.toml @@ -16,10 +16,10 @@ enso-frp = { version = "0.1.0" , path = "../frp" } ide = { version = "0.1.0" , path = "../../ide" } graph-editor = { version = "0.1.0" , path = "../graph-editor" } -enso-prelude = { version = "0.1.0" , path = "../prelude" } +enso-prelude = { version = "0.1.0" , path = "../prelude" } wasm-bindgen = { version = "=0.2.58" , features = ["nightly"] } -nalgebra = { version = "0.19.0" } -js-sys = { version = "0.3.28" } +nalgebra = { version = "0.19.0" } +js-sys = { version = "0.3.28" } im-rc = "14.3.0" diff --git a/src/rust/lib/system/web/Cargo.toml b/src/rust/lib/system/web/Cargo.toml index 4e0bbc623c..1d1366cee2 100644 --- a/src/rust/lib/system/web/Cargo.toml +++ b/src/rust/lib/system/web/Cargo.toml @@ -10,15 +10,19 @@ edition = "2018" default = ["console_error_panic_hook"] [dependencies] -data = { version = "0.1.0" , path = "../../data" } -enso-prelude = { version = "0.1.0" , path = "../../prelude" } -logger = { version = "0.1.0" , path = "../../logger" } -js-sys = { version = "0.3.28" } -wasm-bindgen = { version = "=0.2.58" , features = ["nightly"] } -failure = { version = "0.1.5" } -nalgebra = { version = "0.19.0" } +data = { version = "0.1.0" , path = "../../data" } +enso-prelude = { version = "0.1.0" , path = "../../prelude" } +logger = { version = "0.1.0" , path = "../../logger" } +js-sys = { version = "0.3.28" } +wasm-bindgen = { version = "=0.2.58" , features = ["nightly"] } +failure = { version = "0.1.5" } +nalgebra = { version = "0.19.0" } +wasm-bindgen-futures = { version = "0.4.8" } console_error_panic_hook = { version = "0.1.1", optional = true } +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +async-std = { version = "1.5.0" } + [dependencies.web-sys] version = "0.3.4" features = [ diff --git a/src/rust/lib/system/web/src/lib.rs b/src/rust/lib/system/web/src/lib.rs index 4fca5f4212..e5b39db48f 100644 --- a/src/rust/lib/system/web/src/lib.rs +++ b/src/rust/lib/system/web/src/lib.rs @@ -33,6 +33,8 @@ pub use web_sys::Node; pub use web_sys::Performance; pub use web_sys::WebGl2RenderingContext; pub use web_sys::Window; +pub use std::time::Duration; +pub use std::time::Instant; @@ -481,3 +483,87 @@ pub mod traits { pub use super::NodeInserter; pub use super::NodeRemover; } + +/// Sleeps for the specified amount of time. +/// +/// This function might sleep for slightly longer than the specified duration but never less. +/// +/// This function is an async version of std::thread::sleep, its timer starts just after the +/// function call. +#[cfg(target_arch = "wasm32")] +pub async fn sleep(duration:Duration) { + use wasm_bindgen_futures::JsFuture; + + let performance = performance(); + let call_milliseconds = performance.now(); + let future : JsFuture = js_sys::Promise::new(&mut |resolve:Function,_| { + let milliseconds_from_call = ((performance.now() - call_milliseconds) * 1000.0) as i32; + let duration = duration.as_millis() as i32; + let duration = (duration - milliseconds_from_call).max(0); + let window = window(); + let err = "Calling setTimeout failed."; + window.set_timeout_with_callback_and_timeout_and_arguments_0(&resolve,duration).expect(err); + }).into(); + // We don't expect any error coming from this Promise. + future.await.expect("setTimeout's future failed."); +} + +#[cfg(not(target_arch = "wasm32"))] +pub use async_std::task::sleep; + + + +// ============ +// === Test === +// ============ + +#[cfg(test)] +mod tests { + use super::*; + + use wasm_bindgen_test::wasm_bindgen_test; + use wasm_bindgen_test::wasm_bindgen_test_configure; + + wasm_bindgen_test_configure!(run_in_browser); + + #[cfg(target_arch = "wasm32")] + mod helpers { + type Instant = f64; + + pub fn now() -> Instant { + super::performance().now() + } + + pub fn elapsed(instant: Instant) -> f64 { + super::performance().now() - instant + } + } + + #[cfg(not(target_arch = "wasm32"))] + mod helpers { + use std::time::Instant; + + pub fn now() -> Instant { + Instant::now() + } + + pub fn elapsed(instant: Instant) -> f64 { + instant.elapsed().as_secs_f64() + } + } + + #[wasm_bindgen_test(async)] + async fn async_sleep() { + let instant = helpers::now(); + sleep(Duration::new(1,0)).await; + assert!(helpers::elapsed(instant) >= 1.0); + sleep(Duration::new(2,0)).await; + assert!(helpers::elapsed(instant) >= 3.0); + } + + #[test] + #[cfg(not(target_arch = "wasm32"))] + fn async_sleep_native() { + async_std::task::block_on(async_sleep()) + } +} From 72242565693e47b30c54f3821219d9e30ee8b655 Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 15 Apr 2020 17:47:12 +0200 Subject: [PATCH 24/27] where went this --- src/js/lib/common/package.js | 5 + src/js/lib/common/src/animation.js | 18 ++ src/js/lib/common/src/html_utils.js | 33 ++++ src/js/lib/common/src/loader.js | 239 +++++++++++++++++++++++++ src/js/lib/common/src/math.js | 21 +++ src/js/lib/common/src/server.js | 81 +++++++++ src/js/lib/common/src/svg.js | 32 ++++ src/js/lib/content/package.js | 17 ++ src/js/lib/content/src/index.html | 56 ++++++ src/js/lib/content/src/index.js | 182 +++++++++++++++++++ src/js/lib/content/src/wasm_imports.js | 14 ++ src/js/lib/content/webpack.config.js | 46 +++++ src/js/lib/icons/package.js | 12 ++ src/js/lib/icons/src/index.js | 178 ++++++++++++++++++ 14 files changed, 934 insertions(+) create mode 100644 src/js/lib/common/package.js create mode 100644 src/js/lib/common/src/animation.js create mode 100644 src/js/lib/common/src/html_utils.js create mode 100644 src/js/lib/common/src/loader.js create mode 100644 src/js/lib/common/src/math.js create mode 100644 src/js/lib/common/src/server.js create mode 100644 src/js/lib/common/src/svg.js create mode 100644 src/js/lib/content/package.js create mode 100644 src/js/lib/content/src/index.html create mode 100644 src/js/lib/content/src/index.js create mode 100644 src/js/lib/content/src/wasm_imports.js create mode 100644 src/js/lib/content/webpack.config.js create mode 100644 src/js/lib/icons/package.js create mode 100644 src/js/lib/icons/src/index.js diff --git a/src/js/lib/common/package.js b/src/js/lib/common/package.js new file mode 100644 index 0000000000..6b476adb58 --- /dev/null +++ b/src/js/lib/common/package.js @@ -0,0 +1,5 @@ +let config = { + name: "enso-studio-common", +} + +module.exports = {config} diff --git a/src/js/lib/common/src/animation.js b/src/js/lib/common/src/animation.js new file mode 100644 index 0000000000..976eb98e2e --- /dev/null +++ b/src/js/lib/common/src/animation.js @@ -0,0 +1,18 @@ +/// This module defines a simple set of animation utils. Follow the link to learn more: +/// https://easings.net/en + +// ================= +// === Animation === +// ================= + +export function ease_in_out_cubic(t) { + return t<.5 ? 4*t*t*t : 1 - (-2*t+2) * (-2*t+2) * (-2*t+2) / 2 +} + +export function ease_in_out_quad(t) { + return t<.5 ? 2*t*t : 1 - (-2*t+2)*(-2*t+2) / 2 +} + +export function ease_out_quart(t) { + return 1-(--t)*t*t*t +} diff --git a/src/js/lib/common/src/html_utils.js b/src/js/lib/common/src/html_utils.js new file mode 100644 index 0000000000..f452ab43eb --- /dev/null +++ b/src/js/lib/common/src/html_utils.js @@ -0,0 +1,33 @@ +// ================== +// === HTML Utils === +// ================== + +/// Remove the given node if it exists. +export function remove_node(node) { + if (node) { + node.parentNode.removeChild(node) + } +} + +/// Creates a new top-level div which occupy full size of its parent's space. +export function new_top_level_div() { + let node = document.createElement('div') + node.style.width = '100%' + node.style.height = '100%' + document.body.appendChild(node) + return node +} + +/// Log subsequent messages in a group. +export async function log_group_collapsed(msg,f) { + console.groupCollapsed(msg) + let out + try { + out = await f() + } catch (error) { + console.groupEnd() + throw error + } + console.groupEnd() + return out +} diff --git a/src/js/lib/common/src/loader.js b/src/js/lib/common/src/loader.js new file mode 100644 index 0000000000..4a58cf0c06 --- /dev/null +++ b/src/js/lib/common/src/loader.js @@ -0,0 +1,239 @@ +import * as animation from './animation' +import * as html_utils from './html_utils' +import * as math from './math' +import * as svg from './svg' + + + +// ========================= +// === ProgressIndicator === +// ========================= + +let bg_color = "#e8e7e6" +let loader_color = "#303030" + +/// Visual representation of the loader. +export class ProgressIndicator { + constructor(cfg) { + this.dom = html_utils.new_top_level_div() + this.dom.id = 'loader' + this.dom.style.position = 'absolute' + this.dom.style.zIndex = 1 + + let center = document.createElement('div') + center.style.width = '100%' + center.style.height = '100%' + center.style.display = 'flex' + center.style.justifyContent = 'center' + center.style.alignItems = 'center' + this.dom.appendChild(center) + + let progress_bar_svg = this.init_svg() + let progress_bar = document.createElement('div') + progress_bar.innerHTML = progress_bar_svg + center.appendChild(progress_bar) + + this.progress_indicator = document.getElementById("progress_indicator") + this.progress_indicator_mask = document.getElementById("progress_indicator_mask") + this.progress_indicator_corner = document.getElementById("progress_indicator_corner") + + this.set(0) + this.set_opacity(0) + + if(!cfg.no_loader) { + this.initialized = this.animate_show() + } else { + this.initialized = new Promise((resolve) => {resolve()}) + } + this.animate_rotation() + this.destroyed = false + } + + /// Initializes the SVG view. + init_svg() { + let width = 128 + let height = 128 + let alpha = 0.9 + let inner_radius = 48 + let outer_radius = 60 + let mid_radius = (inner_radius + outer_radius) / 2 + let bar_width = outer_radius - inner_radius + + return svg.new_svg(width,height,` + + + + + + + + + + + + + + + `) + } + + /// Destroys the component. Removes it from the stage and destroys attached callbacks. + destroy() { + html_utils.remove_node(this.dom) + this.destroyed = true + } + + /// Set the value of the loader [0..1]. + set(value) { + let min_angle = 0 + let max_angle = 359 + let angle_span = max_angle - min_angle + let mask_angle = (1-value)*angle_span - min_angle + let corner_pos = math.polar_to_cartesian(54, -mask_angle) + this.progress_indicator_mask.setAttribute("d", svg.arc(128, -mask_angle)) + this.progress_indicator_corner.setAttribute("cx", corner_pos.x) + this.progress_indicator_corner.setAttribute("cy", corner_pos.y) + } + + /// Set the opacity of the loader. + set_opacity(val) { + this.progress_indicator.setAttribute("opacity",val) + } + + /// Set the rotation of the loader (angles). + set_rotation(val) { + this.progress_indicator.setAttribute("transform",`rotate(${val},0,0)`) + } + + /// Start show animation. It is used after the loader is created. + animate_show() { + let indicator = this + return new Promise(function(resolve, reject) { + let alpha = 0 + function show_step() { + if (alpha > 1) { alpha = 1 } + indicator.set_opacity(animation.ease_in_out_quad(alpha)) + alpha += 0.02 + if (alpha < 1) { + window.requestAnimationFrame(show_step) + } else { + console.log("SHOW END") + resolve() + } + } + window.requestAnimationFrame(show_step) + }) + } + + /// Start the spinning animation. + animate_rotation() { + let indicator = this + let rotation = 0 + function rotate_step(timestamp) { + indicator.set_rotation(rotation) + rotation += 6 + if (!indicator.destroyed) { + window.requestAnimationFrame(rotate_step) + } + } + window.requestAnimationFrame(rotate_step) + } +} + + + +// ============== +// === Loader === +// ============== + +/// The main loader class. It connects to the provided fetch responses and tracks their status. +export class Loader { + constructor(resources, cfg) { + this.indicator = new ProgressIndicator(cfg) + this.total_bytes = 0 + this.received_bytes = 0 + this.download_speed = 0 + this.last_receive_time = performance.now() + this.initialized = this.indicator.initialized + + let self = this + this.done_resolve = null + this.done = new Promise((resolve) => {self.done_resolve = resolve}) + + for (let resource of resources) { + this.total_bytes += parseInt(resource.headers.get('Content-Length')) + resource.clone().body.pipeTo(this.input_stream()) + } + + if (Number.isNaN(this.total_bytes)) { + console.error("Loader error. Server is not configured to send the 'Content-Length' metadata.") + this.total_bytes = 0 + } + } + + /// The current loading progress [0..1]. + value() { + if (this.total_bytes == 0) { + return 0.3 + } else { + return this.received_bytes / this.total_bytes + } + } + + /// Returns true if the loader finished. + is_done() { + return this.received_bytes == this.total_bytes + } + + /// Removes the loader with it's dom element. + destroy() { + this.indicator.destroy() + } + + /// Callback run on every new received byte stream. + on_receive(new_bytes) { + this.received_bytes += new_bytes + let time = performance.now() + let time_diff = time - this.last_receive_time + this.download_speed = new_bytes / time_diff + this.last_receive_time = time + + let percent = this.show_percentage_value() + let speed = this.show_download_speed() + let received = this.show_received_bytes() + console.log(`${percent}% (${received}) (${speed}).`) + + this.indicator.set(this.value()) + if (this.is_done()) { this.done_resolve() } + } + + /// Download percentage value. + show_percentage_value() { + return Math.round(100 * this.value()) + } + + /// Download total size value. + show_total_bytes() { + return `${math.format_mb(this.total_bytes)} MB` + } + + /// Download received bytes value. + show_received_bytes() { + return `${math.format_mb(this.received_bytes)} MB` + } + + /// Download speed value. + show_download_speed() { + return `${math.format_mb(1000 * this.download_speed)} MB/s` + } + + /// Internal function for attaching new fetch responses. + input_stream() { + let loader = this + return new WritableStream({ + write(t) { + loader.on_receive(t.length) + } + }) + } +} diff --git a/src/js/lib/common/src/math.js b/src/js/lib/common/src/math.js new file mode 100644 index 0000000000..3b77d132ef --- /dev/null +++ b/src/js/lib/common/src/math.js @@ -0,0 +1,21 @@ +/// This module defines a common math operations. + + + +// ============ +// === Math === +// ============ + +/// Converts the polar coordinates to cartesian ones. +export function polar_to_cartesian(radius, angle_degrees) { + let angle = (angle_degrees-90) * Math.PI / 180.0 + return { + x : radius * Math.cos(angle), + y : radius * Math.sin(angle) + } +} + +/// Format bytes as megabytes with a single precision number. +export function format_mb(bytes) { + return Math.round(10 * bytes / (1024 * 1024)) / 10 +} diff --git a/src/js/lib/common/src/server.js b/src/js/lib/common/src/server.js new file mode 100644 index 0000000000..b502a76181 --- /dev/null +++ b/src/js/lib/common/src/server.js @@ -0,0 +1,81 @@ +import * as createServers from 'create-servers' +import * as fs from 'fs' +import * as mime from 'mime-types' +import * as path from 'path' +import * as portfinder from 'portfinder' + + + +// ============ +// === Port === +// ============ + +export const DEFAULT_PORT = 8080 + +async function findPort(cfg) { + if (!cfg.port) { + portfinder.basePort = DEFAULT_PORT + cfg.port = await portfinder.getPortPromise() + } +} + + + +// ============== +// === Server === +// ============== + +/// A simple server implementation. +/// +/// Initially it was based on `union`, but later we migrated to `create-servers`. Read this topic to +/// learn why: https://github.com/http-party/http-server/issues/483 +class Server { + constructor(cfg) { + let self = this + this.dir = cfg.dir + this.port = cfg.port + this.fallback = cfg.fallback + this.server = createServers({ + http: this.port, + handler: function (request, response) { + self.process(request.url, response) + } + }, + function (errs) { + if (errs) { return console.log(errs.http) } + console.log(`Server started on port ${this.port}.`) + console.log(`Serving files from '${process.cwd()}/${this.dir}'.`) + }.bind(this)) + } + + process(resource,response) { + let resource_file = `${this.dir}${resource}` + fs.readFile(resource_file, function (err,data) { + if(err) { + let fallback = this.fallback + if(fallback) { + if(resource === fallback) { + console.error(`Fallback resource '${resource}' not found.`) + } else { + this.process(fallback,response) + } + } else { + console.error(`Resource '${resource}' not found.`) + } + } else { + let contentType = mime.contentType(path.extname(resource_file)) + let contentLength = data.length + response.setHeader('Content-Type' , contentType) + response.setHeader('Content-Length', contentLength) + response.writeHead(200) + response.end(data) + } + }.bind(this)) + } +} + +export async function create(cfg) { + let local_cfg = Object.assign({},cfg) + await findPort(local_cfg) + return new Server(local_cfg) +} diff --git a/src/js/lib/common/src/svg.js b/src/js/lib/common/src/svg.js new file mode 100644 index 0000000000..a86d216c4a --- /dev/null +++ b/src/js/lib/common/src/svg.js @@ -0,0 +1,32 @@ +/// This module defines a set of utils for generating and modifying the SVG images. + +import * as math from './math' + + + +// =========== +// === SVG === +// =========== + +/// Defines a new SVG with the provided source. +export function new_svg(width, height, str) { + return ` + + ${str} + ` +} + +/// Returns SVG code for an arc with a defined radius and angle. +export function arc(radius, end_angle){ + let start_angle = 0 + if (end_angle < 0) { + start_angle = end_angle + end_angle = 0 + } + let start = math.polar_to_cartesian(radius, end_angle) + let end = math.polar_to_cartesian(radius, start_angle) + let large_arc = end_angle - start_angle <= 180 ? "0" : "1" + return `M 0 0 L ${start.x} ${start.y} A ${radius} ${radius} 0 ${large_arc} 0 ${end.x} ${end.y}` +} diff --git a/src/js/lib/content/package.js b/src/js/lib/content/package.js new file mode 100644 index 0000000000..44c73f271c --- /dev/null +++ b/src/js/lib/content/package.js @@ -0,0 +1,17 @@ +let config = { + name: "enso-studio-content", + scripts: { + "build": "webpack", + "watch": "webpack-dev-server" + }, + dependencies: { + "enso-studio-common": "2.0.0-alpha.0", + "copy-webpack-plugin": "^5.1.1" + }, + devDependencies: { + "compression-webpack-plugin": "^3.1.0", + "copy-webpack-plugin": "^5.1.1" + } +} + +module.exports = {config} diff --git a/src/js/lib/content/src/index.html b/src/js/lib/content/src/index.html new file mode 100644 index 0000000000..7531e09e76 --- /dev/null +++ b/src/js/lib/content/src/index.html @@ -0,0 +1,56 @@ + + + + + + + + + + Enso IDE + + + + + +
+ + + diff --git a/src/js/lib/content/src/index.js b/src/js/lib/content/src/index.js new file mode 100644 index 0000000000..8fce020d14 --- /dev/null +++ b/src/js/lib/content/src/index.js @@ -0,0 +1,182 @@ +/// This module is responsible for loading the WASM binary, its dependencies, and providing the +/// user with a visual representation of this process (welcome screen). It also implements a view +/// allowing to choose a debug rendering test from. + +import * as loader_module from 'enso-studio-common/src/loader' +import * as html_utils from 'enso-studio-common/src/html_utils' +import * as animation from 'enso-studio-common/src/animation' + + + +// ======================== +// === Content Download === +// ======================== + +let incorrect_mime_type_warning = ` +'WebAssembly.instantiateStreaming' failed because your server does not serve wasm with +'application/wasm' MIME type. Falling back to 'WebAssembly.instantiate' which is slower. +` + +function wasm_instantiate_streaming(resource,imports) { + return WebAssembly.instantiateStreaming(resource,imports).catch(e => { + return wasm_fetch.then(r => { + if (r.headers.get('Content-Type') != 'application/wasm') { + console.warn(`${incorrect_mime_type_warning} Original error:\n`, e) + return r.arrayBuffer() + } else { + throw("Server not configured to serve WASM with 'application/wasm' mime type.") + } + }).then(bytes => WebAssembly.instantiate(bytes,imports)) + }) +} + + +/// Downloads the WASM binary and its dependencies. Displays loading progress bar unless provided +/// with `{no_loader:true}` option. +async function download_content(cfg) { + let wasm_glue_fetch = await fetch('/assets/wasm_imports.js') + let wasm_fetch = await fetch('/assets/gui.wasm') + let loader = new loader_module.Loader([wasm_glue_fetch,wasm_fetch],cfg) + + loader.done.then(() => { + console.groupEnd() + console.log("Download finished. Finishing WASM compilation.") + }) + + let download_size = loader.show_total_bytes() + let download_info = `Downloading WASM binary and its dependencies (${download_size}).` + let wasm_loader = html_utils.log_group_collapsed(download_info, async () => { + let wasm_glue_js = await wasm_glue_fetch.text() + let wasm_glue = Function("let exports = {};" + wasm_glue_js + "; return exports")() + let imports = wasm_glue.wasm_imports() + console.log("WASM dependencies loaded.") + console.log("Starting online WASM compilation.") + let wasm_loader = await wasm_instantiate_streaming(wasm_fetch,imports) + wasm_loader.wasm_glue = wasm_glue + return wasm_loader + }) + + let wasm = await wasm_loader.then(({instance,module,wasm_glue}) => { + let wasm = instance.exports + wasm_glue.after_load(wasm,module) + return wasm + }) + console.log("WASM Compiled.") + + await loader.initialized + return {wasm,loader} +} + + + +// ==================== +// === Debug Screen === +// ==================== + +/// The name of the main scene in the WASM binary. +let main_scene_name = 'ide' + +/// Prefix name of each scene defined in the WASM binary. +let wasm_fn_pfx = "run_example_" + + +/// Displays a debug screen which allows the user to run one of predefined debug examples. +function show_debug_screen(wasm,msg) { + let names = [] + for (let fn of Object.getOwnPropertyNames(wasm)) { + if (fn.startsWith(wasm_fn_pfx)) { + let name = fn.replace(wasm_fn_pfx,"") + names.push(name) + } + } + + if(msg==="" || msg===null || msg===undefined) { msg = "" } + let debug_screen_div = html_utils.new_top_level_div() + let newDiv = document.createElement("div") + let newContent = document.createTextNode(msg + "Choose an example:") + let currentDiv = document.getElementById("app") + let ul = document.createElement('ul') + debug_screen_div.style.position = 'absolute' + debug_screen_div.style.zIndex = 1 + newDiv.appendChild(newContent) + debug_screen_div.appendChild(newDiv) + newDiv.appendChild(ul) + + for (let name of names) { + let li = document.createElement('li') + let a = document.createElement('a') + let linkText = document.createTextNode(name) + ul.appendChild(li) + a.appendChild(linkText) + a.title = name + a.href = "javascript:{}" + a.onclick = () => { + html_utils.remove_node(debug_screen_div) + let fn_name = wasm_fn_pfx + name + let fn = wasm[fn_name] + fn() + } + li.appendChild(a) + } +} + + + +// ======================== +// === Main Entry Point === +// ======================== + +let root = document.getElementById('root') + +function prepare_root(cfg) { + root.style.backgroundColor = '#e8e7e699' +} + +function getUrlParams() { + let url = window.location.search + let query = url.substr(1) + let result = {} + query.split("&").forEach(function(part) { + let item = part.split("=") + result[item[0]] = decodeURIComponent(item[1]) + }) + return result +} + +/// Waits for the window to finish its show animation. It is used when the website is run in +/// Electron. Please note that it returns immediately in the web browser. +async function windowShowAnimation() { + await window.showAnimation +} + +/// Main entry point. Loads WASM, initializes it, chooses the scene to run. +async function main() { + let target = window.location.pathname.split('/') + target.splice(0,1) + let cfg = getUrlParams() + prepare_root(cfg) + + let debug_mode = target[0] == "debug" + let debug_target = target[1] + let no_loader = debug_mode && debug_target + + await windowShowAnimation() + let {wasm,loader} = await download_content({no_loader}) + + if (debug_mode) { + loader.destroy() + if (debug_target) { + let fn_name = wasm_fn_pfx + debug_target + let fn = wasm[fn_name] + if (fn) { fn() } else { + show_debug_screen(wasm,"WASM function '" + fn_name + "' not found! ") + } + } else { + show_debug_screen(wasm) + } + } else { + wasm[wasm_fn_pfx + main_scene_name]() + } +} + +main() diff --git a/src/js/lib/content/src/wasm_imports.js b/src/js/lib/content/src/wasm_imports.js new file mode 100644 index 0000000000..1a60b97d6a --- /dev/null +++ b/src/js/lib/content/src/wasm_imports.js @@ -0,0 +1,14 @@ +import * as wasm_rust_glue from "wasm_rust_glue" + +/// WARNING +/// This module is a hacky binding to wasm_pack. It works only if the wasm_pack output is +/// preprocessed by the build scripts. See the following link to learn more: +/// https://github.com/rustwasm/wasm-pack/issues/790 + +exports.wasm_imports = function() { + return wasm_rust_glue.default() +} + +exports.after_load = function (w, module) { + return wasm_rust_glue.after_load(w,module) +} diff --git a/src/js/lib/content/webpack.config.js b/src/js/lib/content/webpack.config.js new file mode 100644 index 0000000000..f2b298e655 --- /dev/null +++ b/src/js/lib/content/webpack.config.js @@ -0,0 +1,46 @@ +const CopyWebpackPlugin = require('copy-webpack-plugin') +const CompressionPlugin = require('compression-webpack-plugin') +const path = require('path') + +const thisPath = path.resolve(__dirname) +const root = path.resolve(thisPath,'..','..','..','..') +const distPath = path.resolve(root,'dist') +const wasmPath = path.resolve(distPath,'wasm') + +module.exports = { + entry: { + index: path.resolve(thisPath,'src','index.js'), + wasm_imports: './src/wasm_imports.js', + }, + output: { + path: path.resolve(root,'dist','content','assets'), + filename: '[name].js', + libraryTarget: 'umd', + }, + node: { + fs: 'empty' + }, + plugins: [ + new CompressionPlugin(), + new CopyWebpackPlugin([ + path.resolve(thisPath,'src','index.html'), + path.resolve(wasmPath,'gui.wasm'), + ]), + ], + devServer: { + publicPath: '/assets/', + historyApiFallback: { + index: '/assets/' + } + }, + resolve: { + alias: { + wasm_rust_glue$: path.resolve(wasmPath,'gui.js') + } + }, + performance: { + hints: false, + }, + mode: 'none', + stats: 'minimal' +} diff --git a/src/js/lib/icons/package.js b/src/js/lib/icons/package.js new file mode 100644 index 0000000000..fd1331c257 --- /dev/null +++ b/src/js/lib/icons/package.js @@ -0,0 +1,12 @@ +let config = { + name: "enso-studio-icons", + scripts: { + "build": "node src/index.js" + }, + devDependencies: { + "sharp": "^0.24.1", + "to-ico": "^1.1.5" + } +} + +module.exports = {config} diff --git a/src/js/lib/icons/src/index.js b/src/js/lib/icons/src/index.js new file mode 100644 index 0000000000..2784dff1a6 --- /dev/null +++ b/src/js/lib/icons/src/index.js @@ -0,0 +1,178 @@ +/// This file generates the product logo as SVG and then converts it to set of PNGs, MacOS ICNS, and +/// Windows ICO formats. + +class Logo { + constructor(size = 64, compatibleMode = true) { + this.xsize = size + this.size = 64 + this.compatibleMode = compatibleMode + this.borderMax = 10 + this.borderSpread = 0 + this.init() + } + + init() { + var scaleStop = 128 + var scaleLog = Math.log2(scaleStop) + this.borderWidth = 6 + this.topRadius = 32 + this.borderOffset = this.borderWidth - this.borderSpread + this.innerRadius = this.topRadius - this.borderWidth - this.borderOffset + this.atomRadius = this.innerRadius / 2 + this.atomDiff = 0 + this.d = 4 + let innerSize = 56 + this.scale1 = innerSize / 64 + this.scale = (this.xsize / 64) + this.tx = (64 - innerSize) / 2 + if (this.compatibleMode) { this.ref = "xlink:href" } else { this.ref = "href" } + this.defs = '' + } + + generate() { + return ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${this.defs} + + + + +` + } +} + +class MinimalWhiteLogo extends Logo { + constructor(size, compatibleMode) { + super(size, compatibleMode) + this.borderMax = 10 + this.borderSpread = 0 + this.init() + } +} + +fastGenerate = (cons) => (...args) => new cons(...args).generate() + +exports.generateMinimalWhiteLogo = fastGenerate(MinimalWhiteLogo) + + +const fss = require('fs') +const fs = fss.promises +const exec = require('child_process').exec +const spawn = require('child_process').spawn +const toIco = require('to-ico') +const sharp = require("sharp") +const path = require('path') + +const thisPath = path.resolve(__dirname) +const root = path.resolve(thisPath,'..','..','..','..','..') +const distPath = path.resolve(root,'dist','icons') +const donePath = path.resolve(distPath,'init') + + +async function genIcons() { + let sizes = [16,32,64,128,256,512,1024] + let win_sizes = [16,32,64,128,256] + + if(fss.existsSync(donePath)) { + console.log(`The ${donePath} file exists. Icons will not be regenerated.`) + return + } + + console.log("Generating SVG icons.") + await fs.mkdir(path.resolve(distPath,'svg'), {recursive:true}) + await fs.mkdir(path.resolve(distPath,'png'), {recursive:true}) + for (let size of sizes) { + let name = `icon_${size}x${size}.svg` + await fs.writeFile(`${distPath}/svg/${name}`,exports.generateMinimalWhiteLogo(size,true)) + } + + /// Please note that this function converts the SVG to PNG + /// AND KEEPS THE METADATA INFORMATION ABOUT DPI OF 144. + /// It is required to properly display png images on MacOS. + /// There is currently no other way in `sharp` to do it. + console.log("Generating PNG icons.") + for (let size of sizes) { + let inName = `icon_${size}x${size}.svg` + let outName = `icon_${size}x${size}.png` + await sharp(`${distPath}/svg/${inName}`,{density:144}).png().resize({ + width : size, + kernel : sharp.kernel.mitchell + }).toFile(`${distPath}/png/${outName}`) + } + + for (let size of sizes.slice(1)) { + let size2 = size / 2 + let inName = `icon_${size}x${size}.svg` + let outName = `icon_${size2}x${size2}@2x.png` + await sharp(`${distPath}/svg/${inName}`,{density:144}).png().resize({ + width : size, + kernel : sharp.kernel.mitchell + }).toFile(`${distPath}/png/${outName}`) + } + + console.log("Generating ICNS.") + exec(`cp -R ${distPath}/png ${distPath}/png.iconset`) + exec(`iconutil --convert icns --output ${distPath}/icon.icns ${distPath}/png.iconset`) + + console.log("Generating ICO.") + let files = [] + for (let size of win_sizes) { + let inName = `icon_${size}x${size}.png` + let data = await fs.readFile(`${distPath}/png/${inName}`) + files.push(data) + } + toIco(files).then(buf => { fss.writeFileSync(`${distPath}/icon.ico`, buf) }) + + await fs.open(donePath,'w') +} + +genIcons() From 3d546326a4652757c4dea08ede3b84c0f4bbb981 Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 15 Apr 2020 19:33:56 +0200 Subject: [PATCH 25/27] CR feedback --- .../double_representation/alias_analysis/test_utils.rs | 9 +++++---- src/rust/ide/src/double_representation/definition.rs | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs b/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs index 852022aaab..55c1936f5e 100644 --- a/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs +++ b/src/rust/ide/src/double_representation/alias_analysis/test_utils.rs @@ -168,10 +168,11 @@ impl<'a> IdentifierValidator<'a> { for identifier in identifiers { self.validate_identifier(&identifier.item); - let crumbs = &identifier.crumbs; - let ast = self.node.ast().get_traversing(&crumbs).expect("failed to retrieve ast from crumb"); - let name_err = || iformat!("Failed to use AST {ast.repr()} as an identifier name"); - let name = NormalizedName::try_from_ast(ast).expect(&name_err()); + let crumbs = &identifier.crumbs; + let ast_result = self.node.ast().get_traversing(&crumbs); + let ast = ast_result.expect("failed to retrieve ast from crumb"); + let name_err = || iformat!("Failed to use AST {ast.repr()} as an identifier name"); + let name = NormalizedName::try_from_ast(ast).expect(&name_err()); assert_eq!(name,identifier.item) } } diff --git a/src/rust/ide/src/double_representation/definition.rs b/src/rust/ide/src/double_representation/definition.rs index e759dcb442..6b6a630987 100644 --- a/src/rust/ide/src/double_representation/definition.rs +++ b/src/rust/ide/src/double_representation/definition.rs @@ -169,7 +169,7 @@ impl DefinitionName { ast::Shape::SectionSides(sides) => ast::identifier::name(&sides.opr), // Shape::Cons is intentionally omitted. // It serves to pattern-match, not as definition name. - _ => None + _ => None }?; (Vec::new(), name.clone()) } From 0edfa08211c2a40ffa2e25ade56acf80e97b49dc Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 15 Apr 2020 19:35:02 +0200 Subject: [PATCH 26/27] i don't want this in my pr --- src/js/package-lock.json | 3033 +++++++++++++++++++++++++++++++++----- 1 file changed, 2653 insertions(+), 380 deletions(-) diff --git a/src/js/package-lock.json b/src/js/package-lock.json index 7ad8994ebf..524a969ce1 100644 --- a/src/js/package-lock.json +++ b/src/js/package-lock.json @@ -4,6 +4,46 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "7zip-bin": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.0.3.tgz", + "integrity": "sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA==" + }, + "@develar/schema-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.1.0.tgz", + "integrity": "sha512-qjCqB4ctMig9Gz5bd6lkdFr3bO6arOdQqptdBSpF1ZpCnjofieCciEzkoS9ujY9cMGyllYSCSmBJ3x9OKHXzoA==", + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + }, + "@electron/get": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-1.9.0.tgz", + "integrity": "sha512-OBIKtF6ttIJotDXe4KJMUyTBO4xMii+mFjlA8R4CORuD4HvCUaCK3lPjhdTRCvuEv6gzWNbAvd9DNBv0v780lw==", + "requires": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "global-agent": "^2.0.2", + "global-tunnel-ng": "^2.7.1", + "got": "^9.6.0", + "progress": "^2.0.3", + "sanitize-filename": "^1.6.2", + "sumchecker": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, "@evocateur/libnpmaccess": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@evocateur/libnpmaccess/-/libnpmaccess-3.1.2.tgz", @@ -1162,20 +1202,51 @@ } }, "@octokit/types": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.8.1.tgz", - "integrity": "sha512-1fzZcYTvPkrJsS9MX7oTMun447Q/tJo5XOtXQsKqmbTbwQV1f+R58pDmjDbzeFbQ7KzMJaDN7Sq4bCh/WHmgLg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.5.1.tgz", + "integrity": "sha512-q4Wr7RexkPRrkQpXzUYF5Fj/14Mr65RyOHj6B9d/sQACpqGcStkHZj4qMEtlMY5SnD/69jlL9ItGPbDM0dR/dA==", "dev": true, "requires": { "@types/node": ">= 8" } }, + "@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" + }, + "@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "requires": { + "defer-to-connect": "^1.0.1" + } + }, + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==" + }, + "@types/debug": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.5.tgz", + "integrity": "sha512-Q1y515GcOdTHgagaVFhHnIFQ38ygs/kmxdNpvpou+raI9UO3YZcHDngBSYKQklcKlvA7iuQlmIKbzvmxcOE9CQ==" + }, "@types/events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", "dev": true }, + "@types/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-UoOfVEzAUpeSPmjm7h1uk5MH6KZma2z2O7a75onTGjnNvAvMVrPzPL/vBbT65iIGHWj6rokwfmYcmxmlSf2uwg==", + "requires": { + "@types/node": "*" + } + }, "@types/glob": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", @@ -1196,8 +1267,20 @@ "@types/node": { "version": "13.7.7", "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.7.tgz", - "integrity": "sha512-Uo4chgKbnPNlxQwoFmYIwctkQVkMMmsAoGGU4JKwLuvBefF0pCq4FybNSnfkfRCpC7ZW7kttcC/TrRtAJsvGtg==", - "dev": true + "integrity": "sha512-Uo4chgKbnPNlxQwoFmYIwctkQVkMMmsAoGGU4JKwLuvBefF0pCq4FybNSnfkfRCpC7ZW7kttcC/TrRtAJsvGtg==" + }, + "@types/yargs": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-15.0.0.tgz", + "integrity": "sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw==" }, "@webassemblyjs/ast": { "version": "1.9.0", @@ -1423,6 +1506,11 @@ "negotiator": "0.6.2" } }, + "accessibility-developer-tools": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/accessibility-developer-tools/-/accessibility-developer-tools-2.12.0.tgz", + "integrity": "sha1-PaDM6dbsY3OWS4TzXbfPw996tRQ=" + }, "acorn": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", @@ -1447,11 +1535,26 @@ "humanize-ms": "^1.2.1" } }, + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + } + } + }, "ajv": { "version": "6.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -1462,20 +1565,55 @@ "ajv-errors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", - "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", - "dev": true + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==" }, "ajv-keywords": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", - "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", - "dev": true + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==" + }, + "ansi-align": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", + "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "requires": { + "string-width": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } }, "ansi-colors": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", - "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", - "dev": true + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==" }, "ansi-escapes": { "version": "3.2.0", @@ -1492,8 +1630,7 @@ "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "3.2.1", @@ -1531,17 +1668,72 @@ } } }, + "app-builder-bin": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-3.5.5.tgz", + "integrity": "sha512-ZcHzJ9Xl+azPqdKzXZKdRZmkNmbxHHZyl4cbobNf8qMQpoPChpcov8riVrZSbu/0cT/JqJ8LOwJjy1OAwbChaQ==" + }, + "app-builder-lib": { + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-22.4.1.tgz", + "integrity": "sha512-epwUzIM+2pcdy/If9koTP74CKx4v7xGPj75a2Z5cM4rrGN9yVZ3eDUBbfF0e0qE4Qmcv5pd0BAZJ26bGm8NWsQ==", + "requires": { + "7zip-bin": "~5.0.3", + "@develar/schema-utils": "~2.1.0", + "async-exit-hook": "^2.0.1", + "bluebird-lst": "^1.0.9", + "builder-util": "22.4.1", + "builder-util-runtime": "8.6.2", + "chromium-pickle-js": "^0.2.0", + "debug": "^4.1.1", + "ejs": "^3.0.1", + "electron-publish": "22.4.1", + "fs-extra": "^8.1.0", + "hosted-git-info": "^3.0.4", + "is-ci": "^2.0.0", + "isbinaryfile": "^4.0.4", + "js-yaml": "^3.13.1", + "lazy-val": "^1.0.4", + "minimatch": "^3.0.4", + "normalize-package-data": "^2.5.0", + "read-config-file": "5.0.2", + "sanitize-filename": "^1.6.3", + "semver": "^7.1.3", + "temp-file": "^3.3.7" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "hosted-git-info": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-3.0.4.tgz", + "integrity": "sha512-4oT62d2jwSDBbLLFLZE+1vPuQ1h8p9wjrJ8Mqx5TjsyWmBMV5B13eJqn8pvluqubLf3cJPTfiYCIwNwDNmzScQ==", + "requires": { + "lru-cache": "^5.1.1" + } + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==" + } + } + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", - "dev": true, "requires": { "delegates": "^1.0.0", "readable-stream": "^2.0.6" @@ -1551,7 +1743,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } @@ -1602,7 +1793,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, "requires": { "array-uniq": "^1.0.1" } @@ -1610,8 +1800,7 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { "version": "0.3.2", @@ -1622,8 +1811,7 @@ "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "asap": { "version": "2.0.6", @@ -1635,7 +1823,6 @@ "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -1681,8 +1868,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, "assign-symbols": { "version": "1.0.0", @@ -1705,6 +1891,11 @@ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, + "async-exit-hook": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz", + "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==" + }, "async-limiter": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", @@ -1714,8 +1905,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, "atob": { "version": "2.1.2", @@ -1732,20 +1922,17 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", - "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==", - "dev": true + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -1805,8 +1992,7 @@ "base64-js": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", - "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", - "dev": true + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" }, "batch": { "version": "0.6.1", @@ -1818,7 +2004,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -1832,8 +2017,12 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" + }, + "bignumber.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=" }, "binary-extensions": { "version": "1.13.1", @@ -1851,11 +2040,45 @@ "file-uri-to-path": "1.0.0" } }, + "bl": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.2.tgz", + "integrity": "sha512-j4OH8f6Qg2bGuWfRiltT2HYGx0e1QcBTrK9KAHNMwMZdQnDZFk0ZSYIpADjYCB3U12nicC5tVJwSIhwOWjb4RQ==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "bluebird-lst": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", + "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", + "requires": { + "bluebird": "^3.5.5" + } + }, + "bmp-js": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.1.tgz", + "integrity": "sha1-WtAUcJnROp84qnuZrx1ueGZu038=" }, "bn.js": { "version": "4.11.8", @@ -1924,11 +2147,115 @@ "multicast-dns-service-types": "^1.1.0" } }, + "boolean": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.0.1.tgz", + "integrity": "sha512-HRZPIjPcbwAVQvOTxR4YE3o8Xs98NqbbL1iEZDCz7CL8ql0Lt5iOyJFxfnAB0oFs8Oh02F/lLlg30Mexv46LjA==", + "optional": true + }, + "boxen": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz", + "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==", + "requires": { + "ansi-align": "^3.0.0", + "camelcase": "^5.3.1", + "chalk": "^3.0.0", + "cli-boxes": "^2.2.0", + "string-width": "^4.1.0", + "term-size": "^2.1.0", + "type-fest": "^0.8.1", + "widest-line": "^3.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==" + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2046,11 +2373,48 @@ "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=", "dev": true }, + "buffer": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", + "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4" + } + }, + "buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "requires": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "buffer-equal": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz", + "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=" + }, + "buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-indexof": { "version": "1.1.1", @@ -2064,46 +2428,139 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", - "dev": true - }, - "byline": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", - "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", - "dev": true - }, - "byte-size": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", - "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==", - "dev": true - }, - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", - "dev": true - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "dev": true, + "builder-util": { + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-22.4.1.tgz", + "integrity": "sha512-+ysLc7cC4w6P7rBxmZ5X2aU3QvcwFoWCl1us+mcUKdsGmJAtFUMPJqueeptdxjyPrPShIUOKHzA8uk5A3d1fHg==", "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", + "7zip-bin": "~5.0.3", + "@types/debug": "^4.1.5", + "@types/fs-extra": "^8.1.0", + "app-builder-bin": "3.5.5", + "bluebird-lst": "^1.0.9", + "builder-util-runtime": "8.6.2", + "chalk": "^3.0.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0", + "is-ci": "^2.0.0", + "js-yaml": "^3.13.1", + "source-map-support": "^0.5.16", + "stat-mode": "^1.0.0", + "temp-file": "^3.3.7" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "builder-util-runtime": { + "version": "8.6.2", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-8.6.2.tgz", + "integrity": "sha512-9QnIBISfhgQ2BxtRLidVqf/v5HD73vSKZDllpUmGd2L6VORGQk7cZAPmPtw4HQM3gPBelyVJ5yIjMNZ8xjmd1A==", + "requires": { + "debug": "^4.1.1", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "dev": true + }, + "byte-size": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/byte-size/-/byte-size-5.0.1.tgz", + "integrity": "sha512-/XuKeqWocKsYa/cBY1YbSJSWWqTi4cFgr9S6OyM7PBaPbr9zvNGwWP33vt0uqGhwDdN+y3yhbXVILEUpnwEWGw==", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", "graceful-fs": "^4.1.15", "infer-owner": "^1.0.3", "lru-cache": "^5.1.1", @@ -2134,6 +2591,45 @@ "unset-value": "^1.0.0" } }, + "cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "dependencies": { + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "requires": { + "pump": "^3.0.0" + } + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "normalize-url": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz", + "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==" + } + } + }, "call-me-maybe": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", @@ -2167,8 +2663,7 @@ "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "camelcase-keys": { "version": "4.2.0", @@ -2192,8 +2687,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, "chalk": { "version": "2.4.2", @@ -2258,8 +2752,7 @@ "chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "chrome-trace-event": { "version": "1.0.2", @@ -2270,11 +2763,15 @@ "tslib": "^1.9.0" } }, + "chromium-pickle-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz", + "integrity": "sha1-BKEGZywYsIWrd02YPfo+oTjyIgU=" + }, "ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" }, "cipher-base": { "version": "1.0.4", @@ -2309,6 +2806,16 @@ } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==" + }, + "cli-boxes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.0.tgz", + "integrity": "sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==" + }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -2386,11 +2893,18 @@ "shallow-clone": "^3.0.0" } }, + "clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "requires": { + "mimic-response": "^1.0.0" + } + }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "collection-visit": { "version": "1.0.0", @@ -2402,11 +2916,19 @@ "object-visit": "^1.0.0" } }, + "color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", + "requires": { + "color-convert": "^1.9.1", + "color-string": "^1.5.2" + } + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -2414,8 +2936,16 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "color-string": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", + "requires": { + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" + } }, "columnify": { "version": "1.5.4", @@ -2431,7 +2961,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -2445,8 +2974,7 @@ "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" }, "compare-func": { "version": "1.3.2", @@ -2522,17 +3050,102 @@ } } }, + "compression-webpack-plugin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-3.1.0.tgz", + "integrity": "sha512-iqTHj3rADN4yHwXMBrQa/xrncex/uEQy8QHlaTKxGchT/hC0SdlJlmL/5eRqffmWq2ep0/Romw6Ld39JjTR/ug==", + "requires": { + "cacache": "^13.0.1", + "find-cache-dir": "^3.0.0", + "neo-async": "^2.5.0", + "schema-utils": "^2.6.1", + "serialize-javascript": "^2.1.2", + "webpack-sources": "^1.0.1" + }, + "dependencies": { + "cacache": { + "version": "13.0.1", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-13.0.1.tgz", + "integrity": "sha512-5ZvAxd05HDDU+y9BVvcqYu2LLXmPnQ0hW62h32g4xBTgL/MppR4/04NHfj/ycM2y6lmTnbw6HVi+1eN0Psba6w==", + "requires": { + "chownr": "^1.1.2", + "figgy-pudding": "^3.5.1", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.2", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "minipass": "^3.0.0", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "p-map": "^3.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^2.7.1", + "ssri": "^7.0.0", + "unique-filename": "^1.1.1" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + }, + "p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "schema-utils": { + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.5.tgz", + "integrity": "sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ==", + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + }, + "ssri": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-7.1.0.tgz", + "integrity": "sha512-77/WrDZUWocK0mvA5NTRQyveUf+wsrIc6vyrxpS8tVvYBcX215QbafrJR3KtkpskIzoFLqqNuuYQvxaMjXJ/0g==", + "requires": { + "figgy-pudding": "^3.5.1", + "minipass": "^3.1.1" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -2544,18 +3157,69 @@ "version": "1.1.12", "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz", "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==", - "dev": true, "requires": { "ini": "^1.3.4", "proto-list": "~1.2.1" } }, + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "requires": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", + "requires": { + "is-obj": "^2.0.0" + } + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "requires": { + "semver": "^6.0.0" + } + }, + "write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + } + } + }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, + "connected": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/connected/-/connected-0.0.2.tgz", + "integrity": "sha1-e1dVshbOMf+rzMOOn04d/Bw7fG0=" + }, "console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", @@ -2565,8 +3229,7 @@ "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" }, "constants-browserify": { "version": "1.0.0", @@ -2784,7 +3447,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "dev": true, "requires": { "aproba": "^1.1.1", "fs-write-stream-atomic": "^1.0.8", @@ -2800,11 +3462,110 @@ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", "dev": true }, + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "requires": { + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + } + } + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "optional": true + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "5.2.1", @@ -2855,6 +3616,16 @@ "sha.js": "^2.4.8" } }, + "create-servers": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/create-servers/-/create-servers-3.1.0.tgz", + "integrity": "sha512-3buM1fpmIN6EJuEBlPg9rtP0UwsJtHItpf89jNnvaFcVsncZZbhGNWTZqImDHWP4q+Q2qwQtxyNSmjBAG1wIGA==", + "requires": { + "connected": "~0.0.2", + "errs": "~0.3.0", + "object-assign": "^4.1.0" + } + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -2895,6 +3666,11 @@ "randomfill": "^1.0.3" } }, + "crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -2907,8 +3683,7 @@ "cyclist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", - "dev": true + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "dargs": { "version": "4.1.0", @@ -2923,7 +3698,6 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -2960,8 +3734,7 @@ "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decamelize-keys": { "version": "1.1.0", @@ -2987,6 +3760,14 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "requires": { + "mimic-response": "^1.0.0" + } + }, "dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", @@ -3007,6 +3788,11 @@ "regexp.prototype.flags": "^1.2.0" } }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, "default-gateway": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", @@ -3026,11 +3812,15 @@ "clone": "^1.0.2" } }, + "defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, "requires": { "object-keys": "^1.0.12" } @@ -3117,14 +3907,12 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" }, "depd": { "version": "1.1.2", @@ -3166,11 +3954,25 @@ "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", "dev": true }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, "detect-node": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", - "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", - "dev": true + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==" + }, + "devtron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/devtron/-/devtron-1.4.0.tgz", + "integrity": "sha1-tedIvW6Vu+cL/MaKrm/mlhGUQeE=", + "requires": { + "accessibility-developer-tools": "^2.11.0", + "highlight.js": "^9.3.0", + "humanize-plus": "^1.8.1" + } }, "dezalgo": { "version": "1.0.3", @@ -3197,11 +3999,34 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", - "dev": true, "requires": { "path-type": "^3.0.0" } }, + "dmg-builder": { + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-22.4.1.tgz", + "integrity": "sha512-hEemh7n0zoVt7zPPwvn7iOttP03oENjJ4ApttPmt8oDnX8T4q42MjGWyDlLkPMplMJfoTxkkNqmm296f0OYM8Q==", + "requires": { + "app-builder-lib": "~22.4.1", + "bluebird-lst": "^1.0.9", + "builder-util": "~22.4.1", + "fs-extra": "^8.1.0", + "iconv-lite": "^0.5.1", + "js-yaml": "^3.13.1", + "sanitize-filename": "^1.6.3" + }, + "dependencies": { + "iconv-lite": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.1.tgz", + "integrity": "sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", @@ -3227,6 +4052,11 @@ "buffer-indexof": "^1.0.0" } }, + "dom-walk": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", + "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=" + }, "domain-browser": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", @@ -3242,17 +4072,31 @@ "is-obj": "^1.0.0" } }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, + "dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -3264,7 +4108,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -3276,6 +4119,166 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "ejs": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.0.2.tgz", + "integrity": "sha512-IncmUpn1yN84hy2shb0POJ80FWrfGNY0cxO9f4v+/sG7qcBvAtVWUA1IdzY/8EYUmOVhoKJVdJjNd3AZcnxOjA==" + }, + "electron": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-8.1.1.tgz", + "integrity": "sha512-t+5zzFo7VOgckJc9YpImHJkpqeWxwpmEjywWbAa4IT5MULS7h1XU52H9gMswK/y8xc5lBNwxLhJSty/15+gi1A==", + "requires": { + "@electron/get": "^1.0.1", + "@types/node": "^12.0.12", + "extract-zip": "^1.0.3" + }, + "dependencies": { + "@types/node": { + "version": "12.12.34", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.12.34.tgz", + "integrity": "sha512-BneGN0J9ke24lBRn44hVHNeDlrXRYF+VRp0HbSUNnEZahXGAysHZIqnf/hER6aabdBgzM4YOV4jrR8gj4Zfi0g==" + } + } + }, + "electron-builder": { + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-22.4.1.tgz", + "integrity": "sha512-13CjZcGeJS+c3EKRwFT/Oty5Niif5g1FwDioBLEbjkPCPQgxdtDsr+rJtCu9qxkiKDYpAoPS+t/clNk0efONvQ==", + "requires": { + "@types/yargs": "^15.0.4", + "app-builder-lib": "22.4.1", + "bluebird-lst": "^1.0.9", + "builder-util": "22.4.1", + "builder-util-runtime": "8.6.2", + "chalk": "^3.0.0", + "dmg-builder": "22.4.1", + "fs-extra": "^8.1.0", + "is-ci": "^2.0.0", + "lazy-val": "^1.0.4", + "read-config-file": "5.0.2", + "sanitize-filename": "^1.6.3", + "update-notifier": "^4.1.0", + "yargs": "^15.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "electron-is-dev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/electron-is-dev/-/electron-is-dev-1.1.0.tgz", + "integrity": "sha512-Z1qA/1oHNowGtSBIcWk0pcLEqYT/j+13xUw/MYOrBUOL4X7VN0i0KCTf5SqyvMPmW5pSPKbo28wkxMxzZ20YnQ==" + }, + "electron-publish": { + "version": "22.4.1", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-22.4.1.tgz", + "integrity": "sha512-nwKNum3KXm+01rtWX2pc1jhazdzDy2zYnQx+zmXphZchjd6UOMX3ZN0xyZUCKugw5ZliflT6LkgbrcBXBtYD3A==", + "requires": { + "@types/fs-extra": "^8.1.0", + "bluebird-lst": "^1.0.9", + "builder-util": "~22.4.1", + "builder-util-runtime": "8.6.2", + "chalk": "^3.0.0", + "fs-extra": "^8.1.0", + "lazy-val": "^1.0.4", + "mime": "^2.4.4" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "mime": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "elliptic": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", @@ -3294,20 +4297,17 @@ "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "encoding": { "version": "0.1.12", @@ -3322,7 +4322,6 @@ "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, "requires": { "once": "^1.4.0" } @@ -3353,8 +4352,7 @@ "env-paths": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", - "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", - "dev": true + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==" }, "envinfo": { "version": "7.5.0", @@ -3386,6 +4384,11 @@ "is-arrayish": "^0.2.1" } }, + "errs": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/errs/-/errs-0.3.2.tgz", + "integrity": "sha1-eYCZstvTfKK8dJ5TinwTB9C1BJk=" + }, "es-abstract": { "version": "1.17.4", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", @@ -3416,6 +4419,12 @@ "is-symbol": "^1.0.2" } }, + "es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "optional": true + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -3431,6 +4440,11 @@ "es6-promise": "^4.0.3" } }, + "escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3456,8 +4470,7 @@ "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esrecurse": { "version": "4.2.1", @@ -3526,6 +4539,11 @@ "strip-eof": "^1.0.0" } }, + "exif-parser": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/exif-parser/-/exif-parser-0.1.12.tgz", + "integrity": "sha1-WKnS1ywCwfbwKg70qRZicrd2CSI=" + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -3576,6 +4594,11 @@ } } }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -3661,8 +4684,7 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "3.0.2", @@ -3761,17 +4783,41 @@ } } }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", - "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", - "dev": true + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" }, "fast-glob": { "version": "2.2.7", @@ -3813,8 +4859,7 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "faye-websocket": { "version": "0.10.0", @@ -3825,11 +4870,18 @@ "websocket-driver": ">=0.5.1" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" + } + }, "figgy-pudding": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", - "dev": true + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" }, "figures": { "version": "2.0.0", @@ -3840,6 +4892,11 @@ "escape-string-regexp": "^1.0.5" } }, + "file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -3902,11 +4959,68 @@ } } }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "dependencies": { + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "make-dir": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.2.tgz", + "integrity": "sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w==", + "requires": { + "semver": "^6.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "requires": { + "find-up": "^4.0.0" + } + } + } + }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, "requires": { "locate-path": "^3.0.0" } @@ -3927,7 +5041,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, "requires": { "inherits": "^2.0.3", "readable-stream": "^2.3.6" @@ -3951,14 +5064,12 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -3990,17 +5101,20 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "dev": true, "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" } }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, "fs-extra": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, "requires": { "graceful-fs": "^4.2.0", "jsonfile": "^4.0.0", @@ -4020,7 +5134,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "dev": true, "requires": { "graceful-fs": "^4.1.2", "iferr": "^0.1.5", @@ -4031,8 +5144,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "1.2.11", @@ -4602,7 +5714,6 @@ "version": "2.7.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, "requires": { "aproba": "^1.0.3", "console-control-strings": "^1.0.0", @@ -4623,8 +5734,7 @@ "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, "get-pkg-repo": { "version": "1.4.0", @@ -4819,7 +5929,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, "requires": { "pump": "^3.0.0" } @@ -4834,7 +5943,6 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -4946,11 +6054,15 @@ "ini": "^1.3.2" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=" + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4975,6 +6087,46 @@ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", "dev": true }, + "global": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", + "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "requires": { + "min-document": "^2.19.0", + "process": "~0.5.1" + } + }, + "global-agent": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-2.1.8.tgz", + "integrity": "sha512-VpBe/rhY6Rw2VDOTszAMNambg+4Qv8j0yiTNDYEXXXxkUNGWLHp8A3ztK4YDBbFNcWF4rgsec6/5gPyryya/+A==", + "optional": true, + "requires": { + "boolean": "^3.0.0", + "core-js": "^3.6.4", + "es6-error": "^4.1.1", + "matcher": "^2.1.0", + "roarr": "^2.15.2", + "semver": "^7.1.2", + "serialize-error": "^5.0.0" + }, + "dependencies": { + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", + "optional": true + } + } + }, + "global-dirs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz", + "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==", + "requires": { + "ini": "^1.3.5" + } + }, "global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -5010,6 +6162,27 @@ "which": "^1.2.14" } }, + "global-tunnel-ng": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", + "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", + "optional": true, + "requires": { + "encodeurl": "^1.0.2", + "lodash": "^4.17.10", + "npm-conf": "^1.1.3", + "tunnel": "^0.0.6" + } + }, + "globalthis": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.1.tgz", + "integrity": "sha512-mJPRTc/P39NH/iNG4mXa9aIhNymaQikTrnspeCa2ZuJ+mH2QN/rXwtX3XwKrHqWgUQFbNZKtHM105aHzJalElw==", + "optional": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globby": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", @@ -5026,11 +6199,28 @@ "slash": "^2.0.0" } }, + "got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + } + }, "graceful-fs": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", - "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==", - "dev": true + "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" }, "handle-thing": { "version": "2.0.0", @@ -5039,37 +6229,95 @@ "dev": true }, "handlebars": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", - "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.5.tgz", + "integrity": "sha512-PiM2ZRLZ0X+CIRSX66u7tkQi3rzrlSHAuioMBI1XP8DsfDaXEA+sD7Iyyoz4QACFuhX5z+IimN+n3BFWvvgWrQ==", "dev": true, "requires": { - "minimist": "^1.2.5", "neo-async": "^2.6.0", "source-map": "^0.6.1", "uglify-js": "^3.1.4", - "wordwrap": "^1.0.0" + "yargs": "^14.2.3" }, "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "yargs": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, "requires": { "ajv": "^6.5.5", "har-schema": "^2.0.0" @@ -5099,8 +6347,7 @@ "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, "has-value": { "version": "1.0.0", @@ -5134,6 +6381,11 @@ } } }, + "has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" + }, "hash-base": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", @@ -5154,6 +6406,11 @@ "minimalistic-assert": "^1.0.1" } }, + "highlight.js": { + "version": "9.18.1", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz", + "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg==" + }, "hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -5177,8 +6434,7 @@ "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", - "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", - "dev": true + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" }, "hpack.js": { "version": "2.1.6", @@ -5282,7 +6538,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -5314,6 +6569,11 @@ "ms": "^2.0.0" } }, + "humanize-plus": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/humanize-plus/-/humanize-plus-1.8.2.tgz", + "integrity": "sha1-pls0RZrWNnrbs3B6gqPJ+RYWcDA=" + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -5326,14 +6586,12 @@ "ieee754": { "version": "1.1.13", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", - "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", - "dev": true + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "iferr": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", - "dev": true + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" }, "ignore": { "version": "4.0.6", @@ -5350,6 +6608,11 @@ "minimatch": "^3.0.4" } }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=" + }, "import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", @@ -5368,6 +6631,11 @@ } } }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, "import-local": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", @@ -5381,8 +6649,7 @@ "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { "version": "3.2.0", @@ -5393,14 +6660,12 @@ "infer-owner": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", - "dev": true + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -5409,14 +6674,12 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" }, "init-package-json": { "version": "1.10.3", @@ -5618,7 +6881,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, "requires": { "ci-info": "^2.0.0" } @@ -5683,8 +6945,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { "version": "1.1.0", @@ -5696,20 +6957,44 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, + "is-function": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-function/-/is-function-1.0.1.tgz", + "integrity": "sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU=" + }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } }, + "is-installed-globally": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.1.tgz", + "integrity": "sha512-oiEcGoQbGc+3/iijAijrK2qFpkNoNjsHOm/5V5iaeydyrS/hnwaRCEgH5cpW0P3T1lSjV5piB7S5b5lEugNLhg==", + "requires": { + "global-dirs": "^2.0.1", + "is-path-inside": "^3.0.1" + }, + "dependencies": { + "is-path-inside": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", + "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==" + } + } + }, + "is-npm": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-4.0.0.tgz", + "integrity": "sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==" + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -5826,8 +7111,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-utf8": { "version": "0.2.1", @@ -5847,11 +7131,20 @@ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, + "is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.5.tgz", + "integrity": "sha512-Jvz0gpTh1AILHMCBUyqq7xv1ZOQrxTDwyp1/QUq1xFpOBvp4AH5uEobPePJht8KnBGqQIH7We6OR73mXsjG0cA==" }, "isexe": { "version": "2.0.0", @@ -5868,14 +7161,70 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jimp": { + "version": "0.2.28", + "resolved": "https://registry.npmjs.org/jimp/-/jimp-0.2.28.tgz", + "integrity": "sha1-3VKak3GQ9ClXp5N9Gsw6d2KZbqI=", + "requires": { + "bignumber.js": "^2.1.0", + "bmp-js": "0.0.3", + "es6-promise": "^3.0.2", + "exif-parser": "^0.1.9", + "file-type": "^3.1.0", + "jpeg-js": "^0.2.0", + "load-bmfont": "^1.2.3", + "mime": "^1.3.4", + "mkdirp": "0.5.1", + "pixelmatch": "^4.0.0", + "pngjs": "^3.0.0", + "read-chunk": "^1.0.1", + "request": "^2.65.0", + "stream-to-buffer": "^0.1.0", + "tinycolor2": "^1.1.2", + "url-regex": "^3.0.0" + }, + "dependencies": { + "bmp-js": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/bmp-js/-/bmp-js-0.0.3.tgz", + "integrity": "sha1-ZBE+nHzxICs3btYHvzBibr5XsYo=" + }, + "es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=" + }, + "jpeg-js": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.2.0.tgz", + "integrity": "sha1-U+RI7J0mPmgyZkZ+lELSxaLvVII=" + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + } + } + }, + "jpeg-js": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.1.2.tgz", + "integrity": "sha1-E1uZLAV1yYXPoPSUoyJ+0jhYPs4=" }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", - "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" @@ -5884,8 +7233,12 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, "json-parse-better-errors": { "version": "1.0.2", @@ -5896,20 +7249,17 @@ "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { "version": "3.3.3", @@ -5921,7 +7271,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, "requires": { "minimist": "^1.2.0" }, @@ -5929,8 +7278,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" } } }, @@ -5938,7 +7286,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, "requires": { "graceful-fs": "^4.1.6" } @@ -5953,7 +7300,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -5961,6 +7307,14 @@ "verror": "1.10.0" } }, + "keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "requires": { + "json-buffer": "3.0.0" + } + }, "killable": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", @@ -5973,6 +7327,19 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "requires": { + "package-json": "^6.3.0" + } + }, + "lazy-val": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-val/-/lazy-val-1.0.4.tgz", + "integrity": "sha512-u93kb2fPbIrfzBuLjZE+w+fJbUUMhNDXxNmMfaqNgpfQf1CO5ZSe2LfsnBqVAk7i/2NF48OSoRj+Xe2VT+lE8Q==" + }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -6008,6 +7375,21 @@ "npmlog": "^4.1.2" } }, + "load-bmfont": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz", + "integrity": "sha512-kT63aTAlNhZARowaNYcY29Fn/QYkc52M3l6V1ifRcPewg2lvUZDAj7R6dXjOL9D0sict76op3T5+odumDSF81g==", + "requires": { + "buffer-equal": "0.0.1", + "mime": "^1.3.4", + "parse-bmfont-ascii": "^1.0.3", + "parse-bmfont-binary": "^1.0.5", + "parse-bmfont-xml": "^1.1.4", + "phin": "^2.9.1", + "xhr": "^2.0.1", + "xtend": "^4.0.0" + } + }, "load-json-file": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", @@ -6031,7 +7413,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -6042,7 +7423,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" @@ -6051,8 +7431,7 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash._reinterpolate": { "version": "3.0.0", @@ -6131,11 +7510,15 @@ "signal-exit": "^3.0.0" } }, + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "requires": { "yallist": "^3.0.2" } @@ -6212,6 +7595,23 @@ "object-visit": "^1.0.0" } }, + "matcher": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-2.1.0.tgz", + "integrity": "sha512-o+nZr+vtJtgPNklyeUKkkH42OsK8WAfdgaJE2FNxcjLPg+5QbeEoT6vRj8Xq/iv18JlQ9cmKsEu0b94ixWf1YQ==", + "optional": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "optional": true + } + } + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -6344,20 +7744,17 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { "version": "1.43.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", - "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==", - "dev": true + "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" }, "mime-types": { "version": "2.1.26", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", - "dev": true, "requires": { "mime-db": "1.43.0" } @@ -6368,6 +7765,19 @@ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" + }, + "min-document": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", + "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", + "requires": { + "dom-walk": "^0.1.0" + } + }, "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -6384,7 +7794,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6392,8 +7801,7 @@ "minimist": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", - "dev": true + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, "minimist-options": { "version": "3.0.2", @@ -6415,6 +7823,75 @@ "yallist": "^3.0.0" } }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "minipass-pipeline": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz", + "integrity": "sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA==", + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "minizlib": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", @@ -6428,7 +7905,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "dev": true, "requires": { "concat-stream": "^1.5.0", "duplexify": "^3.4.2", @@ -6467,11 +7943,15 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, "requires": { "minimist": "^1.2.5" } }, + "mkdirp-classic": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.2.tgz", + "integrity": "sha512-ejdnDQcR75gwknmMw/tx02AuRs8jCtqFoFqDZMjiNxsu85sRIJVXDKHuLYvUUPRBUtV2FpSZa9bL1BUa3BdR2g==" + }, "mkdirp-promise": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/mkdirp-promise/-/mkdirp-promise-5.0.1.tgz", @@ -6491,7 +7971,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "dev": true, "requires": { "aproba": "^1.1.1", "copy-concurrently": "^1.0.0", @@ -6504,8 +7983,7 @@ "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { "version": "6.2.3", @@ -6554,10 +8032,8 @@ }, "nan": { "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "dev": true, - "optional": true + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" }, "nanomatch": { "version": "1.2.13", @@ -6578,6 +8054,11 @@ "to-regex": "^3.0.1" } }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "negotiator": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", @@ -6587,8 +8068,7 @@ "neo-async": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", - "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", - "dev": true + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==" }, "nice-try": { "version": "1.0.5", @@ -6596,6 +8076,21 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-abi": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.15.0.tgz", + "integrity": "sha512-FeLpTS0F39U7hHZU1srAK4Vx+5AHNVOTP+hxBNQknR/54laTHSFIJkDWDqiquY1LeLUgTfPN7sLPhMubx0PLAg==", + "requires": { + "semver": "^5.4.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } + } + }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", @@ -6702,6 +8197,11 @@ } } }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=" + }, "nopt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", @@ -6716,7 +8216,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -6727,16 +8226,14 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-url": { "version": "3.3.0", @@ -6753,6 +8250,24 @@ "npm-normalize-package-bin": "^1.0.1" } }, + "npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "optional": true, + "requires": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "optional": true + } + } + }, "npm-lifecycle": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-3.1.5.tgz", @@ -6838,7 +8353,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "dev": true, "requires": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", @@ -6849,20 +8363,17 @@ "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", - "dev": true + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-copy": { "version": "0.1.0", @@ -6910,8 +8421,7 @@ "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", @@ -6984,7 +8494,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -7065,6 +8574,11 @@ "os-tmpdir": "^1.0.0" } }, + "p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" + }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", @@ -7087,7 +8601,6 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz", "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -7096,7 +8609,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, "requires": { "p-limit": "^2.0.0" } @@ -7157,8 +8669,7 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "p-waterfall": { "version": "1.0.0", @@ -7169,6 +8680,17 @@ "p-reduce": "^1.0.0" } }, + "package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "requires": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + } + }, "pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", @@ -7179,7 +8701,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "dev": true, "requires": { "cyclist": "^1.0.1", "inherits": "^2.0.3", @@ -7200,12 +8721,36 @@ "safe-buffer": "^5.1.1" } }, + "parse-bmfont-ascii": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-ascii/-/parse-bmfont-ascii-1.0.6.tgz", + "integrity": "sha1-Eaw8P/WPfCAgqyJ2kHkQjU36AoU=" + }, + "parse-bmfont-binary": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/parse-bmfont-binary/-/parse-bmfont-binary-1.0.6.tgz", + "integrity": "sha1-0Di0dtPp3Z2x4RoLDlOiJ5K2kAY=" + }, + "parse-bmfont-xml": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/parse-bmfont-xml/-/parse-bmfont-xml-1.1.4.tgz", + "integrity": "sha512-bjnliEOmGv3y1aMEfREMBJ9tfL3WR0i0CKPj61DnSLaoxWR3nLrsQrEbCId/8rF4NyRF0cCqisSVXyQYWM+mCQ==", + "requires": { + "xml-parse-from-string": "^1.0.0", + "xml2js": "^0.4.5" + } + }, "parse-github-repo-url": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", "dev": true }, + "parse-headers": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/parse-headers/-/parse-headers-2.0.3.tgz", + "integrity": "sha512-QhhZ+DCCit2Coi2vmAKbq5RGTRcQUOE2+REgv8vdyu7MnYx2eZztegqtTx99TZ86GTIwqiy3+4nQTWZ2tgmdCA==" + }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", @@ -7232,6 +8777,14 @@ "protocols": "^1.4.0" } }, + "parse-png": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-1.1.2.tgz", + "integrity": "sha1-9cKtfHmTSQmGAgooTBmu5FlxH/I=", + "requires": { + "pngjs": "^3.2.0" + } + }, "parse-url": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-5.0.1.tgz", @@ -7265,20 +8818,17 @@ "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -7295,8 +8845,7 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { "version": "0.1.7", @@ -7308,7 +8857,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, "requires": { "pify": "^3.0.0" }, @@ -7316,8 +8864,7 @@ "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" } } }, @@ -7334,42 +8881,60 @@ "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "phin": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/phin/-/phin-2.9.3.tgz", + "integrity": "sha512-CzFr90qM24ju5f88quFC/6qohjC144rehe5n6DH900lgXmUe86+xCKc10ev56gRKC4/BkHUoG4uSiQgBiIXwDA==" }, "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" }, "pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, "requires": { "pinkie": "^2.0.0" } }, + "pixelmatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pixelmatch/-/pixelmatch-4.0.2.tgz", + "integrity": "sha1-j0fc7FARtHe2fbA8JDvB8wheiFQ=", + "requires": { + "pngjs": "^3.0.0" + } + }, "pkg-dir": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, "requires": { "find-up": "^3.0.0" } }, + "pngjs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", + "integrity": "sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==" + }, "portfinder": { "version": "1.0.25", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", @@ -7407,17 +8972,52 @@ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", "dev": true }, + "prebuild-install": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.3.tgz", + "integrity": "sha512-GV+nsUXuPW2p8Zy7SarF/2W/oiK8bFQgJcncoJ0d7kRpekEA0ftChjfEaF9/Y+QJEc/wFR7RAEa8lYByuUIe2g==", + "requires": { + "detect-libc": "^1.0.3", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "napi-build-utils": "^1.0.1", + "node-abi": "^2.7.0", + "noop-logger": "^0.1.1", + "npmlog": "^4.0.1", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^3.0.3", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0", + "which-pm-runs": "^1.0.0" + } + }, + "prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" + }, + "process": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", + "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=" + }, "process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", - "dev": true + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" }, "promise-retry": { "version": "1.1.1", @@ -7441,8 +9041,7 @@ "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=", - "dev": true + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" }, "protocols": { "version": "1.4.7", @@ -7478,8 +9077,7 @@ "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", - "dev": true + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, "public-encrypt": { "version": "4.0.3", @@ -7499,7 +9097,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -7509,7 +9106,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, "requires": { "duplexify": "^3.6.0", "inherits": "^2.0.3", @@ -7520,7 +9116,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -7531,8 +9126,15 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "pupa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz", + "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==", + "requires": { + "escape-goat": "^2.0.0" + } }, "q": { "version": "1.5.1", @@ -7543,8 +9145,7 @@ "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "querystring": { "version": "0.2.0", @@ -7615,6 +9216,17 @@ } } }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -7624,6 +9236,11 @@ "mute-stream": "~0.0.4" } }, + "read-chunk": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-1.0.1.tgz", + "integrity": "sha1-X2jKswfmY/GZk1J9m1icrORmEZQ=" + }, "read-cmd-shim": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.5.tgz", @@ -7633,6 +9250,29 @@ "graceful-fs": "^4.1.2" } }, + "read-config-file": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-5.0.2.tgz", + "integrity": "sha512-tVt1lsiSjs+FtL/vtfCivqtKR1UNk3BB3uPJQvJqkgtAYDvZjo0xyXFYSVmzaTcO+Jdi5G7O2K2vDV+p1M/oug==", + "requires": { + "dotenv": "^8.2.0", + "dotenv-expand": "^5.1.0", + "fs-extra": "^8.1.0", + "js-yaml": "^3.13.1", + "json5": "^2.1.1", + "lazy-val": "^1.0.4" + }, + "dependencies": { + "json5": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", + "requires": { + "minimist": "^1.2.5" + } + } + } + }, "read-package-json": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.1.tgz", @@ -7747,7 +9387,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -7761,8 +9400,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, @@ -7819,6 +9457,22 @@ "es-abstract": "^1.17.0-next.1" } }, + "registry-auth-token": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.1.1.tgz", + "integrity": "sha512-9bKS7nTl9+/A1s7tnPeGrUpRcVY+LUh7bfFgzpndALdPfXQBfQV77rQVtqgUV3ti4vc/Ik81Ex8UJDWDQ12zQA==", + "requires": { + "rc": "^1.2.8" + } + }, + "registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "requires": { + "rc": "^1.2.8" + } + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -7850,7 +9504,6 @@ "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -7877,14 +9530,12 @@ "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" }, "requires-port": { "version": "1.0.0", @@ -7892,11 +9543,34 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, + "resize-img": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/resize-img/-/resize-img-1.1.2.tgz", + "integrity": "sha1-+tZQ+vPvLFPqYxErwnLZXp2SVQ4=", + "requires": { + "bmp-js": "0.0.1", + "file-type": "^3.8.0", + "get-stream": "^2.0.0", + "jimp": "^0.2.21", + "jpeg-js": "^0.1.1", + "parse-png": "^1.1.1" + }, + "dependencies": { + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + } + } + }, "resolve": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz", "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==", - "dev": true, "requires": { "path-parse": "^1.0.6" } @@ -7953,6 +9627,14 @@ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, + "responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "requires": { + "lowercase-keys": "^1.0.0" + } + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -7979,7 +9661,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -7994,6 +9675,28 @@ "inherits": "^2.0.1" } }, + "roarr": { + "version": "2.15.3", + "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.3.tgz", + "integrity": "sha512-AEjYvmAhlyxOeB9OqPUzQCo3kuAkNfuDk/HqWbZdFsqDFpapkTjiw+p4svNEoRLvuqNTxqfL+s+gtD4eDgZ+CA==", + "optional": true, + "requires": { + "boolean": "^3.0.0", + "detect-node": "^2.0.4", + "globalthis": "^1.0.1", + "json-stringify-safe": "^5.0.1", + "semver-compare": "^1.0.0", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "optional": true + } + } + }, "run-async": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", @@ -8007,7 +9710,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "dev": true, "requires": { "aproba": "^1.1.1" } @@ -8024,8 +9726,7 @@ "safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", - "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", - "dev": true + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" }, "safe-regex": { "version": "1.1.0", @@ -8039,14 +9740,25 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sanitize-filename": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/sanitize-filename/-/sanitize-filename-1.6.3.tgz", + "integrity": "sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==", + "requires": { + "truncate-utf8-bytes": "^1.0.0" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, "schema-utils": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, "requires": { "ajv": "^6.1.0", "ajv-errors": "^1.0.0", @@ -8071,8 +9783,21 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "optional": true + }, + "semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "requires": { + "semver": "^6.3.0" + } }, "send": { "version": "0.17.1", @@ -8120,11 +9845,27 @@ } } }, + "serialize-error": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-5.0.0.tgz", + "integrity": "sha512-/VtpuyzYf82mHYTtI4QKtwHa79vAdU5OQpNPAmE/0UDdlGT0ZxHwC+J6gXkw29wwoVI8fMPsfcVHOwXtUQYYQA==", + "optional": true, + "requires": { + "type-fest": "^0.8.0" + }, + "dependencies": { + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "optional": true + } + } + }, "serialize-javascript": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==" }, "serve-index": { "version": "1.9.1", @@ -8197,8 +9938,7 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.1", @@ -8254,6 +9994,77 @@ "kind-of": "^6.0.2" } }, + "sharp": { + "version": "0.24.1", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.24.1.tgz", + "integrity": "sha512-1Lph6o7D6bU8WrcbG/kT7cVzi2UBi2xrrBfS/WUaD+ZcGd4MZ7+LbtFoGwbMVJH95d5aziBGyExYF4Urm2pjOQ==", + "requires": { + "color": "^3.1.2", + "detect-libc": "^1.0.3", + "nan": "^2.14.0", + "npmlog": "^4.1.2", + "prebuild-install": "^5.3.3", + "semver": "^7.1.3", + "simple-get": "^3.1.0", + "tar": "^6.0.1", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.1.tgz", + "integrity": "sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.0.tgz", + "integrity": "sha512-EzTZN/fjSvifSX0SlqUERCN39o6T40AMarPbv0MrarSFtIITCBh7bi+dU8nxGFHuqs9jdIAeoYoKuQAAASsPPA==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.3.tgz", + "integrity": "sha512-6uCP4Qc0sWsgMLy1EOqqS/3rjDHOEnsStVr/4vtAIK2Y5i2kA7lFFejYrpIyiN9w0pYf4ckeCYT9f1r1P9KX5g==" + }, + "semver": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", + "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==" + }, + "tar": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.0.1.tgz", + "integrity": "sha512-bKhKrrz2FJJj5s7wynxy/fyxpE0CmCjmOQ1KV4KkgXFWOgoIT/NbTMnB1n+LFNrNk0SSBVGGxcK5AGsyC+pW5Q==", + "requires": { + "chownr": "^1.1.3", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.0", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -8272,8 +10083,52 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "simple-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", + "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=" + }, + "simple-get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", + "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "requires": { + "decompress-response": "^4.2.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", + "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", + "requires": { + "mimic-response": "^2.0.0" + } + }, + "mimic-response": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", + "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" + } + } + }, + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" + } + } }, "slash": { "version": "2.0.0", @@ -8502,8 +10357,7 @@ "source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", - "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", - "dev": true + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" }, "source-map": { "version": "0.5.7", @@ -8528,7 +10382,6 @@ "version": "0.5.16", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -8537,8 +10390,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -8552,7 +10404,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -8561,14 +10412,12 @@ "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -8577,8 +10426,7 @@ "spdx-license-ids": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", - "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", - "dev": true + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==" }, "spdy": { "version": "4.0.1", @@ -8670,14 +10518,12 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { "version": "1.16.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -8694,11 +10540,15 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", - "dev": true, "requires": { "figgy-pudding": "^3.5.1" } }, + "stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==" + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -8740,7 +10590,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "dev": true, "requires": { "end-of-stream": "^1.1.0", "stream-shift": "^1.0.0" @@ -8762,14 +10611,25 @@ "stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "stream-to": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-to/-/stream-to-0.2.2.tgz", + "integrity": "sha1-hDBgmNhf25kLn6MAsbPM9V6O8B0=" + }, + "stream-to-buffer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-to-buffer/-/stream-to-buffer-0.1.0.tgz", + "integrity": "sha1-JnmdkDqyAlyb1VCsRxcbAPjdgKk=", + "requires": { + "stream-to": "~0.2.0" + } }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -8800,7 +10660,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" }, @@ -8808,8 +10667,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" } } }, @@ -8817,7 +10675,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } @@ -8840,6 +10697,11 @@ "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", "dev": true }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, "strong-log-transformer": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", @@ -8851,6 +10713,24 @@ "through": "^2.3.4" } }, + "sumchecker": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", + "integrity": "sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==", + "requires": { + "debug": "^4.1.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + } + } + }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -8881,12 +10761,56 @@ "yallist": "^3.0.3" } }, + "tar-fs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.1.tgz", + "integrity": "sha512-6tzWDMeroL87uF/+lin46k+Q+46rAJ0SyPGz7OW7wTgblI273hsBqk2C1j0/xNadNLKDTUL9BukSjB7cwgmlPA==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.0.0" + } + }, + "tar-stream": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.2.tgz", + "integrity": "sha512-UaF6FoJ32WqALZGOIAApXx+OdxhekNMChu6axLJR85zMMjXKWFGjbIRe+J6P4UnRGg9rAwWvbTT0oI7hD/Un7Q==", + "requires": { + "bl": "^4.0.1", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "temp-dir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", "dev": true }, + "temp-file": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/temp-file/-/temp-file-3.3.7.tgz", + "integrity": "sha512-9tBJKt7GZAQt/Rg0QzVWA8Am8c1EFl+CAv04/aBVqlx5oyfQ508sFIABshQ0xbZu6mBrFLWIUXO/bbLYghW70g==", + "requires": { + "async-exit-hook": "^2.0.1", + "fs-extra": "^8.1.0" + } + }, "temp-write": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.4.0.tgz", @@ -8909,6 +10833,11 @@ } } }, + "term-size": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz", + "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==" + }, "terser": { "version": "4.6.10", "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.10.tgz", @@ -9014,7 +10943,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, "requires": { "readable-stream": "~2.3.6", "xtend": "~4.0.1" @@ -9035,6 +10963,11 @@ "setimmediate": "^1.0.4" } }, + "tinycolor2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.1.tgz", + "integrity": "sha1-9PrTM0R7wLB9TcjpIJ2POaisd+g=" + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -9050,6 +10983,18 @@ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", "dev": true }, + "to-ico": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/to-ico/-/to-ico-1.1.5.tgz", + "integrity": "sha512-5kIh7m7bkIlqIESEZkL8gAMMzucXKfPe3hX2FoDY5HEAfD9OJU+Qh9b6Enp74w0qRcxVT5ejss66PHKqc3AVkg==", + "requires": { + "arrify": "^1.0.1", + "buffer-alloc": "^1.1.0", + "image-size": "^0.5.0", + "parse-png": "^1.0.0", + "resize-img": "^1.1.0" + } + }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -9070,6 +11015,11 @@ } } }, + "to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==" + }, "to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", @@ -9102,7 +11052,6 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "dev": true, "requires": { "psl": "^1.1.28", "punycode": "^2.1.1" @@ -9129,6 +11078,14 @@ "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", "dev": true }, + "truncate-utf8-bytes": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", + "integrity": "sha1-QFkjkJWS1W94pYGENLC3hInKXys=", + "requires": { + "utf8-byte-length": "^1.0.1" + } + }, "tslib": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", @@ -9141,11 +11098,16 @@ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, + "tunnel": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", + "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", + "optional": true + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -9153,8 +11115,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "type-fest": { "version": "0.3.1", @@ -9175,8 +11136,15 @@ "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } }, "uglify-js": { "version": "3.8.1", @@ -9226,7 +11194,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "dev": true, "requires": { "unique-slug": "^2.0.0" } @@ -9235,11 +11202,18 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "dev": true, "requires": { "imurmurhash": "^0.1.4" } }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" + } + }, "universal-user-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", @@ -9252,8 +11226,7 @@ "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unpipe": { "version": "1.0.0", @@ -9307,11 +11280,76 @@ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", "dev": true }, + "update-notifier": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-4.1.0.tgz", + "integrity": "sha512-w3doE1qtI0/ZmgeoDoARmI5fjDoT93IfKgEGqm26dGUOh8oNpaSTsGNdYRN/SjOuo10jcJGwkEL3mroKzktkew==", + "requires": { + "boxen": "^4.2.0", + "chalk": "^3.0.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.3.1", + "is-npm": "^4.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.0.0", + "pupa": "^2.0.1", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -9350,12 +11388,40 @@ "requires-port": "^1.0.0" } }, + "url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "requires": { + "prepend-http": "^2.0.0" + } + }, + "url-regex": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/url-regex/-/url-regex-3.2.0.tgz", + "integrity": "sha1-260eDJ4p4QXdCx8J9oYvf9tIJyQ=", + "requires": { + "ip-regex": "^1.0.1" + }, + "dependencies": { + "ip-regex": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-1.0.3.tgz", + "integrity": "sha1-3FiQdvZZ9BnCIgOaMzFvHHOH7/0=" + } + } + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, + "utf8-byte-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", + "integrity": "sha1-9F8VDExm7uloGGUFq5P8u4rWv2E=" + }, "util": { "version": "0.11.1", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", @@ -9376,8 +11442,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "util-promisify": { "version": "2.1.0", @@ -9397,8 +11462,7 @@ "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, "v8-compile-cache": { "version": "2.0.3", @@ -9410,7 +11474,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -9435,7 +11498,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -9857,7 +11919,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, "requires": { "ansi-colors": "^3.0.0", "uuid": "^3.3.2" @@ -9867,7 +11928,6 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", - "dev": true, "requires": { "source-list-map": "^2.0.0", "source-map": "~0.6.1" @@ -9876,8 +11936,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" } } }, @@ -9921,33 +11980,73 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "which-pm-runs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", + "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, "requires": { "string-width": "^1.0.2 || 2" } }, + "widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "requires": { + "string-width": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, "windows-release": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.0.tgz", - "integrity": "sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", + "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", "dev": true, "requires": { "execa": "^1.0.0" } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, "worker-farm": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", @@ -10005,8 +12104,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { "version": "2.4.3", @@ -10092,23 +12190,198 @@ "async-limiter": "~1.0.0" } }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" + }, + "xhr": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/xhr/-/xhr-2.5.0.tgz", + "integrity": "sha512-4nlO/14t3BNUZRXIXfXe+3N6w3s1KoxcJUUURctd64BLRe67E4gRwp4PjywtDY72fXpZ1y6Ch0VZQRY/gMPzzQ==", + "requires": { + "global": "~4.3.0", + "is-function": "^1.0.1", + "parse-headers": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "xml-parse-from-string": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz", + "integrity": "sha1-qQKekp09vN7RafPG4oI42VpdWig=" + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "yargs": { + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, + "yargs-parser": { + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } } } } From 5830edce98d7f10078c6535ae0884d0d376fa437 Mon Sep 17 00:00:00 2001 From: mwu Date: Wed, 15 Apr 2020 20:03:19 +0200 Subject: [PATCH 27/27] use impls! to reduce boilerplate --- src/rust/lib/data/src/text.rs | 28 ++++++---------------------- src/rust/lib/prelude/src/macros.rs | 25 +++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/src/rust/lib/data/src/text.rs b/src/rust/lib/data/src/text.rs index a897581efb..1d0285ada8 100644 --- a/src/rust/lib/data/src/text.rs +++ b/src/rust/lib/data/src/text.rs @@ -126,29 +126,13 @@ impl Span { } } -impl From> for Span { - fn from(range:Range) -> Self { - Span::from_indices(Index::new(range.start), Index::new(range.end)) - } -} - -impl From<&Range> for Span { - fn from(range:&Range) -> Self { - Span::from_indices(Index::new(range.start), Index::new(range.end)) - } -} +impls! { From + &From > for Span { |range| + Span::from_indices(Index::new(range.start), Index::new(range.end)) +}} -impl Into> for Span { - fn into(self) -> Range { - self.range() - } -} - -impl Into> for &Span { - fn into(self) -> Range { - self.range() - } -} +impls! { Into + &Into > for Span { |this| + this.range() +}} impl PartialEq> for Span { fn eq(&self, other:&Range) -> bool { diff --git a/src/rust/lib/prelude/src/macros.rs b/src/rust/lib/prelude/src/macros.rs index 65c932f7ee..c2c66b92e1 100644 --- a/src/rust/lib/prelude/src/macros.rs +++ b/src/rust/lib/prelude/src/macros.rs @@ -20,6 +20,11 @@ /// ``` /// /// This macro is meant to support many standard traits (like From) and should grow in the future. +/// Currently supported ones are: +/// * From<…> +/// * From + &From<…> +/// * Into + &Into<…> +/// * PhantomFrom<…> #[macro_export] macro_rules! impls { ($([$($impl_params:tt)*])? From<$ty:ty> for $target:ty $(where [$($bounds:tt)*])? { @@ -53,6 +58,26 @@ macro_rules! impls { } }; + ($([$($impl_params:tt)*])? Into + &Into <$ty:ty> for $target:ty $(where [$($bounds:tt)*])? { + |$arg:tt| $($result:tt)* + } ) => { + #[allow(clippy::redundant_closure_call)] + #[allow(clippy::identity_conversion)] + impl <$($($impl_params)*)?> Into <$ty> for $target $(where $($bounds)*)? { + fn into(self) -> $ty { + (|$arg:Self| $($result)*)(self) + } + } + + #[allow(clippy::redundant_closure_call)] + #[allow(clippy::identity_conversion)] + impl <$($($impl_params)*)?> Into <$ty> for &$target $(where $($bounds)*)? { + fn into(self) -> $ty { + (|$arg:Self| $($result)*)(self) + } + } + }; + ($([$($impl_params:tt)*])? PhantomFrom<$ty:ty> for $target:ty { $($result:tt)* } ) => {