aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Klaas de Vries <[email protected]>2019-01-15 14:24:04 +0000
committerAleksey Kladov <[email protected]>2019-01-19 12:37:25 +0000
commitafaa26636e4391ebacfc09e9c994c11bab58b834 (patch)
tree79d66f1d2eb70f3092285ab37f1e21c3832ea8b8
parent0a82d9cdc975da27e78839e1a8cb873ba99ae64b (diff)
Add additional pattern variants
-rw-r--r--crates/ra_hir/src/code_model_impl/function/scope.rs11
-rw-r--r--crates/ra_hir/src/expr.rs67
-rw-r--r--crates/ra_hir/src/ty.rs5
-rw-r--r--crates/ra_hir/src/ty/tests.rs15
-rw-r--r--crates/ra_syntax/src/ast/generated.rs12
-rw-r--r--crates/ra_syntax/src/grammar.ron4
-rw-r--r--editors/code/package-lock.json90
7 files changed, 142 insertions, 62 deletions
diff --git a/crates/ra_hir/src/code_model_impl/function/scope.rs b/crates/ra_hir/src/code_model_impl/function/scope.rs
index afca1e9f8..c551e445a 100644
--- a/crates/ra_hir/src/code_model_impl/function/scope.rs
+++ b/crates/ra_hir/src/code_model_impl/function/scope.rs
@@ -47,9 +47,11 @@ impl FnScopes {
47 compute_expr_scopes(body.body_expr(), &body, &mut scopes, root); 47 compute_expr_scopes(body.body_expr(), &body, &mut scopes, root);
48 scopes 48 scopes
49 } 49 }
50
50 pub fn entries(&self, scope: ScopeId) -> &[ScopeEntry] { 51 pub fn entries(&self, scope: ScopeId) -> &[ScopeEntry] {
51 &self.scopes[scope].entries 52 &self.scopes[scope].entries
52 } 53 }
54
53 pub fn scope_chain_for<'a>(&'a self, expr: ExprId) -> impl Iterator<Item = ScopeId> + 'a { 55 pub fn scope_chain_for<'a>(&'a self, expr: ExprId) -> impl Iterator<Item = ScopeId> + 'a {
54 generate(self.scope_for(expr), move |&scope| { 56 generate(self.scope_for(expr), move |&scope| {
55 self.scopes[scope].parent 57 self.scopes[scope].parent
@@ -76,12 +78,14 @@ impl FnScopes {
76 entries: vec![], 78 entries: vec![],
77 }) 79 })
78 } 80 }
81
79 fn new_scope(&mut self, parent: ScopeId) -> ScopeId { 82 fn new_scope(&mut self, parent: ScopeId) -> ScopeId {
80 self.scopes.alloc(ScopeData { 83 self.scopes.alloc(ScopeData {
81 parent: Some(parent), 84 parent: Some(parent),
82 entries: vec![], 85 entries: vec![],
83 }) 86 })
84 } 87 }
88
85 fn add_bindings(&mut self, body: &Body, scope: ScopeId, pat: PatId) { 89 fn add_bindings(&mut self, body: &Body, scope: ScopeId, pat: PatId) {
86 match &body[pat] { 90 match &body[pat] {
87 Pat::Bind { name } => self.scopes[scope].entries.push(ScopeEntry { 91 Pat::Bind { name } => self.scopes[scope].entries.push(ScopeEntry {
@@ -91,15 +95,18 @@ impl FnScopes {
91 p => p.walk_child_pats(|pat| self.add_bindings(body, scope, pat)), 95 p => p.walk_child_pats(|pat| self.add_bindings(body, scope, pat)),
92 } 96 }
93 } 97 }
98
94 fn add_params_bindings(&mut self, scope: ScopeId, params: &[PatId]) { 99 fn add_params_bindings(&mut self, scope: ScopeId, params: &[PatId]) {
95 let body = Arc::clone(&self.body); 100 let body = Arc::clone(&self.body);
96 params 101 params
97 .into_iter() 102 .into_iter()
98 .for_each(|pat| self.add_bindings(&body, scope, *pat)); 103 .for_each(|pat| self.add_bindings(&body, scope, *pat));
99 } 104 }
105
100 fn set_scope(&mut self, node: ExprId, scope: ScopeId) { 106 fn set_scope(&mut self, node: ExprId, scope: ScopeId) {
101 self.scope_for.insert(node, scope); 107 self.scope_for.insert(node, scope);
102 } 108 }
109
103 fn scope_for(&self, expr: ExprId) -> Option<ScopeId> { 110 fn scope_for(&self, expr: ExprId) -> Option<ScopeId> {
104 self.scope_for.get(&expr).map(|&scope| scope) 111 self.scope_for.get(&expr).map(|&scope| scope)
105 } 112 }
@@ -121,6 +128,7 @@ impl ScopeEntryWithSyntax {
121 pub fn name(&self) -> &Name { 128 pub fn name(&self) -> &Name {
122 &self.name 129 &self.name
123 } 130 }
131
124 pub fn ptr(&self) -> LocalSyntaxPtr { 132 pub fn ptr(&self) -> LocalSyntaxPtr {
125 self.ptr 133 self.ptr
126 } 134 }
@@ -132,6 +140,7 @@ impl ScopesWithSyntaxMapping {
132 self.scopes.scopes[scope].parent 140 self.scopes.scopes[scope].parent
133 }) 141 })
134 } 142 }
143
135 pub fn scope_chain_for_offset<'a>( 144 pub fn scope_chain_for_offset<'a>(
136 &'a self, 145 &'a self,
137 offset: TextUnit, 146 offset: TextUnit,
@@ -152,6 +161,7 @@ impl ScopesWithSyntaxMapping {
152 161
153 generate(scope, move |&scope| self.scopes.scopes[scope].parent) 162 generate(scope, move |&scope| self.scopes.scopes[scope].parent)
154 } 163 }
164
155 // XXX: during completion, cursor might be outside of any particular 165 // XXX: during completion, cursor might be outside of any particular
156 // expression. Try to figure out the correct scope... 166 // expression. Try to figure out the correct scope...
157 fn adjust(&self, ptr: LocalSyntaxPtr, original_scope: ScopeId, offset: TextUnit) -> ScopeId { 167 fn adjust(&self, ptr: LocalSyntaxPtr, original_scope: ScopeId, offset: TextUnit) -> ScopeId {
@@ -225,6 +235,7 @@ impl ScopeEntry {
225 pub fn name(&self) -> &Name { 235 pub fn name(&self) -> &Name {
226 &self.name 236 &self.name
227 } 237 }
238
228 pub fn pat(&self) -> PatId { 239 pub fn pat(&self) -> PatId {
229 self.pat 240 self.pat
230 } 241 }
diff --git a/crates/ra_hir/src/expr.rs b/crates/ra_hir/src/expr.rs
index 6e98ebc69..8f7e75309 100644
--- a/crates/ra_hir/src/expr.rs
+++ b/crates/ra_hir/src/expr.rs
@@ -329,9 +329,25 @@ impl Expr {
329pub struct PatId(RawId); 329pub struct PatId(RawId);
330impl_arena_id!(PatId); 330impl_arena_id!(PatId);
331 331
332/// Close relative to rustc's hir::PatKind
332#[derive(Debug, Clone, Eq, PartialEq)] 333#[derive(Debug, Clone, Eq, PartialEq)]
333pub enum Pat { 334pub enum Pat {
334 Missing, 335 Missing, // do we need this?
336 Wild,
337 Tuple(Vec<PatId>),
338 Struct, // TODO
339 Range {
340 start: ExprId,
341 end: ExprId,
342 },
343 Box(PatId),
344 Slice {
345 prefix: Vec<PatId>,
346 rest: Option<PatId>,
347 suffix: Vec<PatId>,
348 },
349 Path(Path),
350 Lit(ExprId),
335 Bind { 351 Bind {
336 name: Name, 352 name: Name,
337 }, 353 },
@@ -348,11 +364,25 @@ pub enum Pat {
348impl Pat { 364impl Pat {
349 pub fn walk_child_pats(&self, mut f: impl FnMut(PatId)) { 365 pub fn walk_child_pats(&self, mut f: impl FnMut(PatId)) {
350 match self { 366 match self {
351 Pat::Missing | Pat::Bind { .. } => {} 367 Pat::Range { .. }
352 Pat::TupleStruct { args, .. } => { 368 | Pat::Lit(..)
369 | Pat::Path(..)
370 | Pat::Wild
371 | Pat::Missing
372 | Pat::Bind { .. } => {}
373 Pat::Tuple(args) | Pat::TupleStruct { args, .. } => {
353 args.iter().map(|pat| *pat).for_each(f); 374 args.iter().map(|pat| *pat).for_each(f);
354 } 375 }
355 Pat::Ref { pat, .. } => f(*pat), 376 Pat::Ref { pat, .. } | Pat::Box(pat) => f(*pat),
377 Pat::Slice {
378 prefix,
379 rest,
380 suffix,
381 } => {
382 let total_iter = prefix.iter().chain(rest.iter()).chain(suffix.iter());
383 total_iter.map(|pat| *pat).for_each(f);
384 }
385 Pat::Struct { .. } => {} // TODO
356 } 386 }
357 } 387 }
358} 388}
@@ -745,30 +775,41 @@ impl ExprCollector {
745 } 775 }
746 776
747 fn collect_pat(&mut self, pat: &ast::Pat) -> PatId { 777 fn collect_pat(&mut self, pat: &ast::Pat) -> PatId {
748 let syntax_ptr = LocalSyntaxPtr::new(pat.syntax()); 778 let pattern = match pat.kind() {
749 match pat.kind() {
750 ast::PatKind::BindPat(bp) => { 779 ast::PatKind::BindPat(bp) => {
751 let name = bp 780 let name = bp
752 .name() 781 .name()
753 .map(|nr| nr.as_name()) 782 .map(|nr| nr.as_name())
754 .unwrap_or_else(Name::missing); 783 .unwrap_or_else(Name::missing);
755 self.alloc_pat(Pat::Bind { name }, syntax_ptr) 784 Pat::Bind { name }
756 } 785 }
757 ast::PatKind::TupleStructPat(p) => { 786 ast::PatKind::TupleStructPat(p) => {
758 let path = p.path().and_then(Path::from_ast); 787 let path = p.path().and_then(Path::from_ast);
759 let args = p.args().map(|p| self.collect_pat(p)).collect(); 788 let args = p.args().map(|p| self.collect_pat(p)).collect();
760 self.alloc_pat(Pat::TupleStruct { path, args }, syntax_ptr) 789 Pat::TupleStruct { path, args }
761 } 790 }
762 ast::PatKind::RefPat(p) => { 791 ast::PatKind::RefPat(p) => {
763 let pat = self.collect_pat_opt(p.pat()); 792 let pat = self.collect_pat_opt(p.pat());
764 let mutability = Mutability::from_mutable(p.is_mut()); 793 let mutability = Mutability::from_mutable(p.is_mut());
765 self.alloc_pat(Pat::Ref { pat, mutability }, syntax_ptr) 794 Pat::Ref { pat, mutability }
766 } 795 }
767 _ => { 796 ast::PatKind::PathPat(p) => {
768 // TODO 797 let path = p.path().and_then(Path::from_ast);
769 self.alloc_pat(Pat::Missing, syntax_ptr) 798 path.map(|path| Pat::Path(path)).unwrap_or(Pat::Missing)
770 } 799 }
771 } 800 ast::PatKind::TuplePat(p) => {
801 let args = p.args().map(|p| self.collect_pat(p)).collect();
802 Pat::Tuple(args)
803 }
804 ast::PatKind::PlaceholderPat(_) => Pat::Wild,
805 // TODO: implement
806 ast::PatKind::FieldPatList(_)
807 | ast::PatKind::SlicePat(_)
808 | ast::PatKind::StructPat(_)
809 | ast::PatKind::RangePat(_) => Pat::Missing,
810 };
811 let syntax_ptr = LocalSyntaxPtr::new(pat.syntax());
812 self.alloc_pat(pattern, syntax_ptr)
772 } 813 }
773 814
774 fn collect_pat_opt(&mut self, pat: Option<&ast::Pat>) -> PatId { 815 fn collect_pat_opt(&mut self, pat: Option<&ast::Pat>) -> PatId {
diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs
index c7c063601..854d3e3d9 100644
--- a/crates/ra_hir/src/ty.rs
+++ b/crates/ra_hir/src/ty.rs
@@ -1168,6 +1168,8 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
1168 decl_ty 1168 decl_ty
1169 }; 1169 };
1170 1170
1171 // TODO: walk the pattern here?
1172
1171 self.write_pat_ty(*pat, ty); 1173 self.write_pat_ty(*pat, ty);
1172 } 1174 }
1173 Statement::Expr(expr) => { 1175 Statement::Expr(expr) => {
@@ -1188,6 +1190,9 @@ impl<'a, D: HirDatabase> InferenceContext<'a, D> {
1188 for (type_ref, pat) in signature.params().iter().zip(body.params()) { 1190 for (type_ref, pat) in signature.params().iter().zip(body.params()) {
1189 let ty = self.make_ty(type_ref); 1191 let ty = self.make_ty(type_ref);
1190 let ty = self.insert_type_vars(ty); 1192 let ty = self.insert_type_vars(ty);
1193
1194 // TODO: walk pattern?
1195
1191 self.write_pat_ty(*pat, ty); 1196 self.write_pat_ty(*pat, ty);
1192 } 1197 }
1193 self.return_ty = { 1198 self.return_ty = {
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs
index a430cbe88..fc1e5b09c 100644
--- a/crates/ra_hir/src/ty/tests.rs
+++ b/crates/ra_hir/src/ty/tests.rs
@@ -358,6 +358,21 @@ fn test(x: &str, y: isize) {
358 ); 358 );
359} 359}
360 360
361#[test]
362fn infer_pattern() {
363 check_inference(
364 r#"
365fn test(x: &i32) {
366 let y = x;
367 let &z = x;
368 let a = z;
369 let (c, d) = (1, "hello");
370}
371"#,
372 "pattern.txt",
373 );
374}
375
361fn infer(content: &str) -> String { 376fn infer(content: &str) -> String {
362 let (db, _, file_id) = MockDatabase::with_single_file(content); 377 let (db, _, file_id) = MockDatabase::with_single_file(content);
363 let source_file = db.source_file(file_id); 378 let source_file = db.source_file(file_id);
diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs
index 2d9603d90..2fd146bf1 100644
--- a/crates/ra_syntax/src/ast/generated.rs
+++ b/crates/ra_syntax/src/ast/generated.rs
@@ -2285,7 +2285,11 @@ impl AstNode for PathPat {
2285} 2285}
2286 2286
2287 2287
2288impl PathPat {} 2288impl PathPat {
2289 pub fn path(&self) -> Option<&Path> {
2290 super::child_opt(self)
2291 }
2292}
2289 2293
2290// PathSegment 2294// PathSegment
2291#[derive(Debug, PartialEq, Eq, Hash)] 2295#[derive(Debug, PartialEq, Eq, Hash)]
@@ -3219,7 +3223,11 @@ impl AstNode for TuplePat {
3219} 3223}
3220 3224
3221 3225
3222impl TuplePat {} 3226impl TuplePat {
3227 pub fn args(&self) -> impl Iterator<Item = &Pat> {
3228 super::children(self)
3229 }
3230}
3223 3231
3224// TupleStructPat 3232// TupleStructPat
3225#[derive(Debug, PartialEq, Eq, Hash)] 3233#[derive(Debug, PartialEq, Eq, Hash)]
diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron
index 2aaad46b1..b524c8aaf 100644
--- a/crates/ra_syntax/src/grammar.ron
+++ b/crates/ra_syntax/src/grammar.ron
@@ -490,14 +490,14 @@ Grammar(
490 "RefPat": ( options: [ "Pat" ]), 490 "RefPat": ( options: [ "Pat" ]),
491 "BindPat": ( traits: ["NameOwner"] ), 491 "BindPat": ( traits: ["NameOwner"] ),
492 "PlaceholderPat": (), 492 "PlaceholderPat": (),
493 "PathPat": (), 493 "PathPat": ( options: ["Path"] ),
494 "StructPat": (), 494 "StructPat": (),
495 "FieldPatList": (), 495 "FieldPatList": (),
496 "TupleStructPat": ( 496 "TupleStructPat": (
497 options: ["Path"], 497 options: ["Path"],
498 collections: [["args", "Pat"]], 498 collections: [["args", "Pat"]],
499 ), 499 ),
500 "TuplePat": (), 500 "TuplePat": ( collections: [["args", "Pat"]] ),
501 "SlicePat": (), 501 "SlicePat": (),
502 "RangePat": (), 502 "RangePat": (),
503 503
diff --git a/editors/code/package-lock.json b/editors/code/package-lock.json
index 86313d4cc..a36fb2f1c 100644
--- a/editors/code/package-lock.json
+++ b/editors/code/package-lock.json
@@ -183,7 +183,7 @@
183 "dependencies": { 183 "dependencies": {
184 "chalk": { 184 "chalk": {
185 "version": "1.1.3", 185 "version": "1.1.3",
186 "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 186 "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
187 "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 187 "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
188 "dev": true, 188 "dev": true,
189 "requires": { 189 "requires": {
@@ -348,7 +348,7 @@
348 "dependencies": { 348 "dependencies": {
349 "readable-stream": { 349 "readable-stream": {
350 "version": "2.3.6", 350 "version": "2.3.6",
351 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 351 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
352 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 352 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
353 "dev": true, 353 "dev": true,
354 "requires": { 354 "requires": {
@@ -363,7 +363,7 @@
363 }, 363 },
364 "string_decoder": { 364 "string_decoder": {
365 "version": "1.1.1", 365 "version": "1.1.1",
366 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 366 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
367 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 367 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
368 "dev": true, 368 "dev": true,
369 "requires": { 369 "requires": {
@@ -425,7 +425,7 @@
425 }, 425 },
426 "css-select": { 426 "css-select": {
427 "version": "1.2.0", 427 "version": "1.2.0",
428 "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", 428 "resolved": "http://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
429 "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", 429 "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
430 "dev": true, 430 "dev": true,
431 "requires": { 431 "requires": {
@@ -461,7 +461,7 @@
461 }, 461 },
462 "deep-assign": { 462 "deep-assign": {
463 "version": "1.0.0", 463 "version": "1.0.0",
464 "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", 464 "resolved": "http://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz",
465 "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", 465 "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=",
466 "dev": true, 466 "dev": true,
467 "requires": { 467 "requires": {
@@ -507,7 +507,7 @@
507 "dependencies": { 507 "dependencies": {
508 "domelementtype": { 508 "domelementtype": {
509 "version": "1.1.3", 509 "version": "1.1.3",
510 "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", 510 "resolved": "http://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
511 "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", 511 "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
512 "dev": true 512 "dev": true
513 } 513 }
@@ -540,7 +540,7 @@
540 }, 540 },
541 "duplexer": { 541 "duplexer": {
542 "version": "0.1.1", 542 "version": "0.1.1",
543 "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 543 "resolved": "http://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
544 "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 544 "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
545 "dev": true 545 "dev": true
546 }, 546 },
@@ -558,7 +558,7 @@
558 "dependencies": { 558 "dependencies": {
559 "readable-stream": { 559 "readable-stream": {
560 "version": "2.3.6", 560 "version": "2.3.6",
561 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 561 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
562 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 562 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
563 "dev": true, 563 "dev": true,
564 "requires": { 564 "requires": {
@@ -573,7 +573,7 @@
573 }, 573 },
574 "string_decoder": { 574 "string_decoder": {
575 "version": "1.1.1", 575 "version": "1.1.1",
576 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 576 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
577 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 577 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
578 "dev": true, 578 "dev": true,
579 "requires": { 579 "requires": {
@@ -627,7 +627,7 @@
627 }, 627 },
628 "event-stream": { 628 "event-stream": {
629 "version": "3.3.4", 629 "version": "3.3.4",
630 "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", 630 "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
631 "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", 631 "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
632 "dev": true, 632 "dev": true,
633 "requires": { 633 "requires": {
@@ -694,7 +694,7 @@
694 "dependencies": { 694 "dependencies": {
695 "readable-stream": { 695 "readable-stream": {
696 "version": "2.3.6", 696 "version": "2.3.6",
697 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 697 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
698 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 698 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
699 "dev": true, 699 "dev": true,
700 "requires": { 700 "requires": {
@@ -709,7 +709,7 @@
709 }, 709 },
710 "string_decoder": { 710 "string_decoder": {
711 "version": "1.1.1", 711 "version": "1.1.1",
712 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 712 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
713 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 713 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
714 "dev": true, 714 "dev": true,
715 "requires": { 715 "requires": {
@@ -828,7 +828,7 @@
828 "dependencies": { 828 "dependencies": {
829 "readable-stream": { 829 "readable-stream": {
830 "version": "2.3.6", 830 "version": "2.3.6",
831 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 831 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
832 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 832 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
833 "dev": true, 833 "dev": true,
834 "requires": { 834 "requires": {
@@ -843,7 +843,7 @@
843 }, 843 },
844 "string_decoder": { 844 "string_decoder": {
845 "version": "1.1.1", 845 "version": "1.1.1",
846 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 846 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
847 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 847 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
848 "dev": true, 848 "dev": true,
849 "requires": { 849 "requires": {
@@ -904,7 +904,7 @@
904 }, 904 },
905 "readable-stream": { 905 "readable-stream": {
906 "version": "1.0.34", 906 "version": "1.0.34",
907 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", 907 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
908 "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", 908 "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
909 "dev": true, 909 "dev": true,
910 "requires": { 910 "requires": {
@@ -916,13 +916,13 @@
916 }, 916 },
917 "string_decoder": { 917 "string_decoder": {
918 "version": "0.10.31", 918 "version": "0.10.31",
919 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 919 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
920 "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", 920 "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
921 "dev": true 921 "dev": true
922 }, 922 },
923 "through2": { 923 "through2": {
924 "version": "0.6.5", 924 "version": "0.6.5",
925 "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", 925 "resolved": "http://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
926 "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", 926 "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
927 "dev": true, 927 "dev": true,
928 "requires": { 928 "requires": {
@@ -1192,7 +1192,7 @@
1192 }, 1192 },
1193 "is-obj": { 1193 "is-obj": {
1194 "version": "1.0.1", 1194 "version": "1.0.1",
1195 "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", 1195 "resolved": "http://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
1196 "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", 1196 "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
1197 "dev": true 1197 "dev": true
1198 }, 1198 },
@@ -1319,7 +1319,7 @@
1319 }, 1319 },
1320 "kind-of": { 1320 "kind-of": {
1321 "version": "1.1.0", 1321 "version": "1.1.0",
1322 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", 1322 "resolved": "http://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
1323 "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", 1323 "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
1324 "dev": true 1324 "dev": true
1325 }, 1325 },
@@ -1334,7 +1334,7 @@
1334 "dependencies": { 1334 "dependencies": {
1335 "readable-stream": { 1335 "readable-stream": {
1336 "version": "2.3.6", 1336 "version": "2.3.6",
1337 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1337 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1338 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1338 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1339 "dev": true, 1339 "dev": true,
1340 "requires": { 1340 "requires": {
@@ -1349,7 +1349,7 @@
1349 }, 1349 },
1350 "string_decoder": { 1350 "string_decoder": {
1351 "version": "1.1.1", 1351 "version": "1.1.1",
1352 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1352 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1353 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1353 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1354 "dev": true, 1354 "dev": true,
1355 "requires": { 1355 "requires": {
@@ -1384,7 +1384,7 @@
1384 }, 1384 },
1385 "map-stream": { 1385 "map-stream": {
1386 "version": "0.1.0", 1386 "version": "0.1.0",
1387 "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", 1387 "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
1388 "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", 1388 "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
1389 "dev": true 1389 "dev": true
1390 }, 1390 },
@@ -1439,13 +1439,13 @@
1439 }, 1439 },
1440 "minimist": { 1440 "minimist": {
1441 "version": "0.0.8", 1441 "version": "0.0.8",
1442 "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1442 "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1443 "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 1443 "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1444 "dev": true 1444 "dev": true
1445 }, 1445 },
1446 "mkdirp": { 1446 "mkdirp": {
1447 "version": "0.5.1", 1447 "version": "0.5.1",
1448 "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1448 "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1449 "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1449 "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1450 "dev": true, 1450 "dev": true,
1451 "requires": { 1451 "requires": {
@@ -1618,7 +1618,7 @@
1618 "dependencies": { 1618 "dependencies": {
1619 "readable-stream": { 1619 "readable-stream": {
1620 "version": "2.3.6", 1620 "version": "2.3.6",
1621 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1621 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1622 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1622 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1623 "dev": true, 1623 "dev": true,
1624 "requires": { 1624 "requires": {
@@ -1633,7 +1633,7 @@
1633 }, 1633 },
1634 "string_decoder": { 1634 "string_decoder": {
1635 "version": "1.1.1", 1635 "version": "1.1.1",
1636 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1636 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1637 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1637 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1638 "dev": true, 1638 "dev": true,
1639 "requires": { 1639 "requires": {
@@ -1644,13 +1644,13 @@
1644 }, 1644 },
1645 "os-homedir": { 1645 "os-homedir": {
1646 "version": "1.0.2", 1646 "version": "1.0.2",
1647 "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1647 "resolved": "http://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1648 "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1648 "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
1649 "dev": true 1649 "dev": true
1650 }, 1650 },
1651 "os-tmpdir": { 1651 "os-tmpdir": {
1652 "version": "1.0.2", 1652 "version": "1.0.2",
1653 "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1653 "resolved": "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1654 "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 1654 "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1655 "dev": true 1655 "dev": true
1656 }, 1656 },
@@ -1666,7 +1666,7 @@
1666 }, 1666 },
1667 "parse-semver": { 1667 "parse-semver": {
1668 "version": "1.1.1", 1668 "version": "1.1.1",
1669 "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz", 1669 "resolved": "http://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz",
1670 "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=", 1670 "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=",
1671 "dev": true, 1671 "dev": true,
1672 "requires": { 1672 "requires": {
@@ -1690,7 +1690,7 @@
1690 }, 1690 },
1691 "path-is-absolute": { 1691 "path-is-absolute": {
1692 "version": "1.0.1", 1692 "version": "1.0.1",
1693 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1693 "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1694 "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1694 "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1695 "dev": true 1695 "dev": true
1696 }, 1696 },
@@ -1702,7 +1702,7 @@
1702 }, 1702 },
1703 "pause-stream": { 1703 "pause-stream": {
1704 "version": "0.0.11", 1704 "version": "0.0.11",
1705 "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", 1705 "resolved": "http://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
1706 "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", 1706 "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
1707 "dev": true, 1707 "dev": true,
1708 "requires": { 1708 "requires": {
@@ -1955,7 +1955,7 @@
1955 }, 1955 },
1956 "split": { 1956 "split": {
1957 "version": "0.3.3", 1957 "version": "0.3.3",
1958 "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", 1958 "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz",
1959 "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", 1959 "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
1960 "dev": true, 1960 "dev": true,
1961 "requires": { 1961 "requires": {
@@ -1964,7 +1964,7 @@
1964 }, 1964 },
1965 "sprintf-js": { 1965 "sprintf-js": {
1966 "version": "1.0.3", 1966 "version": "1.0.3",
1967 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1967 "resolved": "http://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1968 "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1968 "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1969 "dev": true 1969 "dev": true
1970 }, 1970 },
@@ -1993,7 +1993,7 @@
1993 }, 1993 },
1994 "stream-combiner": { 1994 "stream-combiner": {
1995 "version": "0.0.4", 1995 "version": "0.0.4",
1996 "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", 1996 "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
1997 "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", 1997 "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
1998 "dev": true, 1998 "dev": true,
1999 "requires": { 1999 "requires": {
@@ -2017,7 +2017,7 @@
2017 "dependencies": { 2017 "dependencies": {
2018 "readable-stream": { 2018 "readable-stream": {
2019 "version": "2.3.6", 2019 "version": "2.3.6",
2020 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2020 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
2021 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2021 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
2022 "dev": true, 2022 "dev": true,
2023 "requires": { 2023 "requires": {
@@ -2032,7 +2032,7 @@
2032 }, 2032 },
2033 "string_decoder": { 2033 "string_decoder": {
2034 "version": "1.1.1", 2034 "version": "1.1.1",
2035 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2035 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2036 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2036 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2037 "dev": true, 2037 "dev": true,
2038 "requires": { 2038 "requires": {
@@ -2058,7 +2058,7 @@
2058 }, 2058 },
2059 "strip-ansi": { 2059 "strip-ansi": {
2060 "version": "3.0.1", 2060 "version": "3.0.1",
2061 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2061 "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
2062 "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2062 "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
2063 "dev": true, 2063 "dev": true,
2064 "requires": { 2064 "requires": {
@@ -2073,7 +2073,7 @@
2073 }, 2073 },
2074 "tar": { 2074 "tar": {
2075 "version": "2.2.1", 2075 "version": "2.2.1",
2076 "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", 2076 "resolved": "http://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
2077 "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", 2077 "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
2078 "dev": true, 2078 "dev": true,
2079 "requires": { 2079 "requires": {
@@ -2084,7 +2084,7 @@
2084 }, 2084 },
2085 "through": { 2085 "through": {
2086 "version": "2.3.8", 2086 "version": "2.3.8",
2087 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2087 "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
2088 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 2088 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
2089 "dev": true 2089 "dev": true
2090 }, 2090 },
@@ -2100,7 +2100,7 @@
2100 "dependencies": { 2100 "dependencies": {
2101 "readable-stream": { 2101 "readable-stream": {
2102 "version": "2.3.6", 2102 "version": "2.3.6",
2103 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2103 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
2104 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2104 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
2105 "dev": true, 2105 "dev": true,
2106 "requires": { 2106 "requires": {
@@ -2115,7 +2115,7 @@
2115 }, 2115 },
2116 "string_decoder": { 2116 "string_decoder": {
2117 "version": "1.1.1", 2117 "version": "1.1.1",
2118 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2118 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2119 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2119 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2120 "dev": true, 2120 "dev": true,
2121 "requires": { 2121 "requires": {
@@ -2223,7 +2223,7 @@
2223 }, 2223 },
2224 "tunnel": { 2224 "tunnel": {
2225 "version": "0.0.4", 2225 "version": "0.0.4",
2226 "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz", 2226 "resolved": "http://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz",
2227 "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=", 2227 "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=",
2228 "dev": true 2228 "dev": true
2229 }, 2229 },
@@ -2254,7 +2254,7 @@
2254 "dependencies": { 2254 "dependencies": {
2255 "underscore": { 2255 "underscore": {
2256 "version": "1.8.3", 2256 "version": "1.8.3",
2257 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", 2257 "resolved": "http://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
2258 "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", 2258 "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
2259 "dev": true 2259 "dev": true
2260 } 2260 }
@@ -2397,7 +2397,7 @@
2397 }, 2397 },
2398 "readable-stream": { 2398 "readable-stream": {
2399 "version": "2.3.6", 2399 "version": "2.3.6",
2400 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2400 "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
2401 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2401 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
2402 "dev": true, 2402 "dev": true,
2403 "requires": { 2403 "requires": {
@@ -2412,7 +2412,7 @@
2412 }, 2412 },
2413 "string_decoder": { 2413 "string_decoder": {
2414 "version": "1.1.1", 2414 "version": "1.1.1",
2415 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2415 "resolved": "http://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
2416 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2416 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
2417 "dev": true, 2417 "dev": true,
2418 "requires": { 2418 "requires": {