browser-sync
Advanced tools
Comparing version 0.1.5 to 0.1.6
@@ -25,3 +25,3 @@ 'use strict'; | ||
lib: { | ||
src: ['lib/**/*.js'] | ||
src: ['lib/**/*.js', '!lib/browser-sync-client.min.js'] | ||
}, | ||
@@ -28,0 +28,0 @@ test: { |
@@ -0,1 +1,7 @@ | ||
'use strict'; | ||
/*global window*/ | ||
/*global document*/ | ||
/*global location*/ | ||
/*global ___socket___*/ | ||
(function (window, socket) { | ||
@@ -118,3 +124,3 @@ | ||
attr: attr | ||
} | ||
}; | ||
}, | ||
@@ -145,3 +151,3 @@ /** | ||
for (var i = 0, len = elems.length; i < len; i += 1) { | ||
if (elems[i][attr].indexOf(url) != -1) { | ||
if (elems[i][attr].indexOf(url) !== -1) { | ||
match = i; | ||
@@ -201,4 +207,4 @@ } | ||
if (window.pageYOffset != undefined) { | ||
return [pageXOffset, pageYOffset]; | ||
if (window.pageYOffset !== undefined) { | ||
return [window.pageXOffset, window.pageYOffset]; | ||
} | ||
@@ -240,3 +246,8 @@ | ||
return elem; | ||
} else return false; | ||
} else { | ||
return false; | ||
} | ||
} | ||
@@ -343,3 +354,3 @@ }, | ||
if (elem.parentNode.tagName === "A") { | ||
return elem.parentNode.href | ||
return elem.parentNode.href; | ||
} else { | ||
@@ -387,3 +398,3 @@ return elem.parentNode; | ||
checkboxes: checkboxes | ||
} | ||
}; | ||
}, | ||
@@ -424,3 +435,5 @@ listeners: { | ||
var target = event.target || event.srcElement; | ||
if (!target.id) return; // don't submit the event if we can't identify the input field. | ||
if (!target.id) { | ||
return; // don't submit the event if we can't identify the input field. | ||
} | ||
ghost.emitEvent("input:type", { | ||
@@ -427,0 +440,0 @@ id: target.id, |
@@ -1,1 +0,1 @@ | ||
!function(a,b){var c={ghostMode:{enabled:!0,cache:{}}},d={tagNames:{css:"link",jpg:"img",png:"img",svg:"img",gif:"img",js:"script"},attrs:{link:"href",img:"src",script:"src"}},e={processOptions:function(a,b,c,d){a.options=b,b.ghostMode&&this.initGhostMode(b.ghostMode,c,d)},initGhostMode:function(a,b,d){if(a.links&&g.initClickEvents(c,b,d.click),a.scroll&&g.initEvents(c,["scroll"],b,d),a.forms)for(var e=g.getInputs(),f=[[e.texts,"keyup","keyup"],[e.radios,"click","forceChange"],[e.radios,"change","radioChange"],[e.checkboxes,"click","forceChange"],[e.checkboxes,"change","checkboxChange"],["textarea","keyup","keyup"],["select","change","selectChange"],["form","submit","formSubmit"],["form","reset","formReset"]],h=0,i=f.length;i>h;h+=1)g.addBrowserEvents(f[h][0],f[h][1],d[f[h][2]],b)},reloadEvent:function(a,b,c){var d;if(b.url&&c.reloadBrowser(!0),b.assetFileName&&b.fileExtension){var e=this.getElems(b.fileExtension),f=this.getMatches(e.elems,b.assetFileName,e.attr);d=c.swapFile(f,e.attr)}return d},getElems:function(a){var b=this.getTagName(a),c=this.getAttr(b);return{elems:document.getElementsByTagName(b),attr:c}},getTagName:function(a){return d.tagNames[a]},getAttr:function(a){return d.attrs[a]},getMatches:function(a,b,c){for(var d,e=0,f=a.length;f>e;e+=1)-1!=a[e][c].indexOf(b)&&(d=e);return a[d]||null}},f={reloadBrowser:function(a){a&&location.reload()},swapFile:function(a,b){var c=a[b],d=/^[^\?]+(?=\?)/.exec(c);d&&(c=d[0]);var e=(new Date).getTime();return a[b]=c+"?rel="+e,{elem:a,timeStamp:e}}},g={getScroll:function(){if(void 0!=a.pageYOffset)return[pageXOffset,pageYOffset];var b,c,d=document,e=d.documentElement,f=d.body;return b=e.scrollLeft||f.scrollLeft||0,c=e.scrollTop||f.scrollTop||0,[b,c]},getScrollTop:function(){return this.getScroll()[1]},setScrollTop:function(b,c){b.enabled=!1,a.scrollTo(0,c)},checkCache:function(a,b){var c;return a[b]?a[b].elem:(a.called=a.called?a.called+=1:1,c=document.getElementById(b),c?(a[b]={},a[b].elem=c,c):!1)},initClickEvents:function(a,b,c){for(var d=document.getElementsByTagName("a"),e=0,f=d.length;f>e;e+=1)this.composeElementEvent(d[e],b,"click",c)},initEvents:function(a,b,c,d){for(var e="scroll",f=0,g=b.length;g>f;f+=1)b[f]===e&&this.composeSingleEvent(c,e,d[e])},composeSingleEvent:function(b,c,d){a[b.eventListener](b.prefix+c,d,!1)},composeElementEvent:function(a,b,c,d){a[b.eventListener](b.prefix+"click",d,!1)},emitEvent:function(a,c){b.emit(a,c)},addBrowserEvents:function(a,b,c,d){"string"==typeof a&&(a=document.getElementsByTagName(a));for(var e=0,f=a.length;f>e;e+=1)a[e][d.eventListener](d.prefix+b,c,!1)},getHref:function(a,b){var c,d=a.tagName;return c=b&&b.href?b.href:"A"===d?a.href:this.getParentHref(a,5)},getParentHref:function(a,b){for(var c,d=function(a){return"A"===a.parentNode.tagName?a.parentNode.href:a.parentNode},e=a,f=0;b>f;f+=1){if(c=d(e),"string"==typeof c)return c;e=c}return!1},getInputs:function(){for(var a=document.getElementsByTagName("input"),b=[],c=[],d=[],e=0,f=a.length;f>e;e+=1)"text"===a[e].type&&b.push(a[e]),"radio"===a[e].type&&c.push(a[e]),"checkbox"===a[e].type&&d.push(a[e]);return{texts:b,radios:c,checkboxes:d}},listeners:{scroll:function(){var b=g.getScrollTop(),d=(new Date).getTime();c.ghostMode.lastScroll||(c.ghostMode.scrollTop=b[0],c.ghostMode.lastScroll=(new Date).getTime()),d>c.ghostMode.lastScroll+50&&c.ghostMode.enabled&&(c.ghostMode.lastScroll=d,g.emitEvent("scroll",{pos:b,url:a.location.href})),c.ghostMode.enabled=!0},click:function(a){var b={url:g.getHref(a.target||a.srcElement,this)};g.emitEvent("location",b)},keyup:function(a){var b=a.target||a.srcElement;b.id&&g.emitEvent("input:type",{id:b.id,value:b.value})},forceChange:function(){this.blur(),this.focus()},radioChange:function(a){var b=a.target||a.srcElement;g.emitEvent("input:radio",{id:b.id,value:b.value})},checkboxChange:function(a){var b=a.target||a.srcElement;g.emitEvent("input:checkbox",{id:b.id,checked:b.checked})},selectChange:function(a){var b=a.target||a.srcElement;g.emitEvent("input:select",{id:b.id,value:b.value})},formSubmit:function(a){var b=a.target||a.srcElement;g.emitEvent("form:submit",{id:b.id})},formReset:function(a){var b=a.target||a.srcElement;g.emitEvent("form:reset",{id:b.id})}},utils:{eventListener:a.addEventListener?"addEventListener":"attachEvent",removeEventListener:a.removeEventListener?"removeEventListener":"detachEvent",prefix:a.addEventListener?"":"on"}};a.__karma__&&(a.browserSync=e,a.browserSyncActions=f,a.ghost=g,a.scope=c,b.on=function(){}),b.on("connection",function(a){e.processOptions(c,a,g.utils,g.listeners)}),b.on("reload",function(a){a&&e.reloadEvent(c,a,f)}),b.on("location:update",function(b){b.url&&(a.location=b.url)}),b.on("scroll:update",function(b){b.url===a.location.href&&(c.ghostMode.enabled=!1,a.scrollTo(0,b.position))}),b.on("input:update",function(a){c.ghostMode.enabled=!1;var b=g.checkCache(c.ghostMode.cache,a.id);b.value=a.value}),b.on("input:update:radio",function(a){c.ghostMode.enabled=!1;var b=g.checkCache(c.ghostMode.cache,a.id);b.checked=!0}),b.on("input:update:checkbox",function(a){c.ghostMode.enabled=!1;var b=g.checkCache(c.ghostMode.cache,a.id);b.checked=a.checked}),b.on("form:submit",function(a){c.ghostMode.enabled=!1,document.forms[a.id].submit()}),b.on("form:reset",function(a){c.ghostMode.enabled=!1,document.forms[a.id].reset()})}(window,"undefined"==typeof ___socket___?{}:___socket___); | ||
"use strict";!function(a,b){var c={ghostMode:{enabled:!0,cache:{}}},d={tagNames:{css:"link",jpg:"img",png:"img",svg:"img",gif:"img",js:"script"},attrs:{link:"href",img:"src",script:"src"}},e={processOptions:function(a,b,c,d){a.options=b,b.ghostMode&&this.initGhostMode(b.ghostMode,c,d)},initGhostMode:function(a,b,d){if(a.links&&g.initClickEvents(c,b,d.click),a.scroll&&g.initEvents(c,["scroll"],b,d),a.forms)for(var e=g.getInputs(),f=[[e.texts,"keyup","keyup"],[e.radios,"click","forceChange"],[e.radios,"change","radioChange"],[e.checkboxes,"click","forceChange"],[e.checkboxes,"change","checkboxChange"],["textarea","keyup","keyup"],["select","change","selectChange"],["form","submit","formSubmit"],["form","reset","formReset"]],h=0,i=f.length;i>h;h+=1)g.addBrowserEvents(f[h][0],f[h][1],d[f[h][2]],b)},reloadEvent:function(a,b,c){var d;if(b.url&&c.reloadBrowser(!0),b.assetFileName&&b.fileExtension){var e=this.getElems(b.fileExtension),f=this.getMatches(e.elems,b.assetFileName,e.attr);d=c.swapFile(f,e.attr)}return d},getElems:function(a){var b=this.getTagName(a),c=this.getAttr(b);return{elems:document.getElementsByTagName(b),attr:c}},getTagName:function(a){return d.tagNames[a]},getAttr:function(a){return d.attrs[a]},getMatches:function(a,b,c){for(var d,e=0,f=a.length;f>e;e+=1)-1!==a[e][c].indexOf(b)&&(d=e);return a[d]||null}},f={reloadBrowser:function(a){a&&location.reload()},swapFile:function(a,b){var c=a[b],d=/^[^\?]+(?=\?)/.exec(c);d&&(c=d[0]);var e=(new Date).getTime();return a[b]=c+"?rel="+e,{elem:a,timeStamp:e}}},g={getScroll:function(){if(void 0!==a.pageYOffset)return[a.pageXOffset,a.pageYOffset];var b,c,d=document,e=d.documentElement,f=d.body;return b=e.scrollLeft||f.scrollLeft||0,c=e.scrollTop||f.scrollTop||0,[b,c]},getScrollTop:function(){return this.getScroll()[1]},setScrollTop:function(b,c){b.enabled=!1,a.scrollTo(0,c)},checkCache:function(a,b){var c;return a[b]?a[b].elem:(a.called=a.called?a.called+=1:1,c=document.getElementById(b),c?(a[b]={},a[b].elem=c,c):!1)},initClickEvents:function(a,b,c){for(var d=document.getElementsByTagName("a"),e=0,f=d.length;f>e;e+=1)this.composeElementEvent(d[e],b,"click",c)},initEvents:function(a,b,c,d){for(var e="scroll",f=0,g=b.length;g>f;f+=1)b[f]===e&&this.composeSingleEvent(c,e,d[e])},composeSingleEvent:function(b,c,d){a[b.eventListener](b.prefix+c,d,!1)},composeElementEvent:function(a,b,c,d){a[b.eventListener](b.prefix+"click",d,!1)},emitEvent:function(a,c){b.emit(a,c)},addBrowserEvents:function(a,b,c,d){"string"==typeof a&&(a=document.getElementsByTagName(a));for(var e=0,f=a.length;f>e;e+=1)a[e][d.eventListener](d.prefix+b,c,!1)},getHref:function(a,b){var c,d=a.tagName;return c=b&&b.href?b.href:"A"===d?a.href:this.getParentHref(a,5)},getParentHref:function(a,b){for(var c,d=function(a){return"A"===a.parentNode.tagName?a.parentNode.href:a.parentNode},e=a,f=0;b>f;f+=1){if(c=d(e),"string"==typeof c)return c;e=c}return!1},getInputs:function(){for(var a=document.getElementsByTagName("input"),b=[],c=[],d=[],e=0,f=a.length;f>e;e+=1)"text"===a[e].type&&b.push(a[e]),"radio"===a[e].type&&c.push(a[e]),"checkbox"===a[e].type&&d.push(a[e]);return{texts:b,radios:c,checkboxes:d}},listeners:{scroll:function(){var b=g.getScrollTop(),d=(new Date).getTime();c.ghostMode.lastScroll||(c.ghostMode.scrollTop=b[0],c.ghostMode.lastScroll=(new Date).getTime()),d>c.ghostMode.lastScroll+50&&c.ghostMode.enabled&&(c.ghostMode.lastScroll=d,g.emitEvent("scroll",{pos:b,url:a.location.href})),c.ghostMode.enabled=!0},click:function(a){var b={url:g.getHref(a.target||a.srcElement,this)};g.emitEvent("location",b)},keyup:function(a){var b=a.target||a.srcElement;b.id&&g.emitEvent("input:type",{id:b.id,value:b.value})},forceChange:function(){this.blur(),this.focus()},radioChange:function(a){var b=a.target||a.srcElement;g.emitEvent("input:radio",{id:b.id,value:b.value})},checkboxChange:function(a){var b=a.target||a.srcElement;g.emitEvent("input:checkbox",{id:b.id,checked:b.checked})},selectChange:function(a){var b=a.target||a.srcElement;g.emitEvent("input:select",{id:b.id,value:b.value})},formSubmit:function(a){var b=a.target||a.srcElement;g.emitEvent("form:submit",{id:b.id})},formReset:function(a){var b=a.target||a.srcElement;g.emitEvent("form:reset",{id:b.id})}},utils:{eventListener:a.addEventListener?"addEventListener":"attachEvent",removeEventListener:a.removeEventListener?"removeEventListener":"detachEvent",prefix:a.addEventListener?"":"on"}};a.__karma__&&(a.browserSync=e,a.browserSyncActions=f,a.ghost=g,a.scope=c,b.on=function(){}),b.on("connection",function(a){e.processOptions(c,a,g.utils,g.listeners)}),b.on("reload",function(a){a&&e.reloadEvent(c,a,f)}),b.on("location:update",function(b){b.url&&(a.location=b.url)}),b.on("scroll:update",function(b){b.url===a.location.href&&(c.ghostMode.enabled=!1,a.scrollTo(0,b.position))}),b.on("input:update",function(a){c.ghostMode.enabled=!1;var b=g.checkCache(c.ghostMode.cache,a.id);b.value=a.value}),b.on("input:update:radio",function(a){c.ghostMode.enabled=!1;var b=g.checkCache(c.ghostMode.cache,a.id);b.checked=!0}),b.on("input:update:checkbox",function(a){c.ghostMode.enabled=!1;var b=g.checkCache(c.ghostMode.cache,a.id);b.checked=a.checked}),b.on("form:submit",function(a){c.ghostMode.enabled=!1,document.forms[a.id].submit()}),b.on("form:reset",function(a){c.ghostMode.enabled=!1,document.forms[a.id].reset()})}(window,"undefined"==typeof ___socket___?{}:___socket___); |
@@ -11,2 +11,3 @@ var portScanner = require('portscanner'); | ||
var loadSnippet = require('./loadSnippet'); | ||
var devIp = require('dev-ip'); | ||
@@ -214,21 +215,3 @@ var parser = new UAParser(); | ||
var os = require('os'); | ||
var networkInterfaces = os.networkInterfaces(); | ||
var matches = []; | ||
// loop through results and check that it's an IPv4 address & it's not internal | ||
_.each(networkInterfaces, function (_interface) { | ||
return _.each(_interface, function (address) { | ||
if (address.internal === false && address.family === "IPv4") { | ||
matches.push(address.address); | ||
} | ||
}); | ||
}); | ||
if (matches.length) { | ||
return matches[0]; | ||
} | ||
return externalIp; | ||
return devIp.getIp() || externalIp; | ||
}, | ||
@@ -235,0 +218,0 @@ /** |
@@ -54,7 +54,7 @@ #! /usr/bin/env node | ||
baseDir: argv.server | ||
} | ||
}; | ||
} else { | ||
defaultConfig.server = { | ||
baseDir: "./" | ||
} | ||
}; | ||
} | ||
@@ -119,3 +119,3 @@ } | ||
var files = setup.getFiles(filesArg, function (files) { | ||
setup.getFiles(filesArg, function (files) { | ||
setup.kickoff(files, config); | ||
@@ -122,0 +122,0 @@ }); |
var clc = require("cli-color"); | ||
var exec = require("child_process").exec; | ||
@@ -10,6 +9,6 @@ // _todo - Make string outputs nicer with underscore templates | ||
init: function (hostIp, socketIoPort, scriptPort) { | ||
return clc.yellow('\n\nAll Set Up! Now copy & paste this snippet just before the closing </body> tag in your website.\n\n') | ||
+ this.scriptTags(hostIp, socketIoPort, scriptPort, false); | ||
return clc.yellow('\n\nAll Set Up! Now copy & paste this snippet just before the closing </body> tag in your website.\n\n') + | ||
this.scriptTags(hostIp, socketIoPort, scriptPort, false); | ||
}, | ||
initServer: function (hostIp, scriptPort, baseDir, options) { | ||
initServer: function (hostIp, scriptPort, baseDir) { | ||
@@ -41,3 +40,3 @@ return clc.green("\nOK, Server running at ") + clc.magenta("http://" + hostIp + ":" + scriptPort +"\n\n") + | ||
if (numFiles > 1) { | ||
return "Watching "+ numFiles + " files" | ||
return "Watching "+ numFiles + " files"; | ||
} | ||
@@ -63,4 +62,4 @@ return "Not watching any files..."; | ||
}, | ||
clientScript: "/browser-sync-client.js", | ||
clientScript: "/browser-sync-client.min.js", | ||
socketIoScript: "/socket.io/socket.io.js" | ||
}; |
137
package.json
{ | ||
"name": "browser-sync", | ||
"description": "Live CSS Reload & Browser Syncing", | ||
"version": "0.1.5", | ||
"homepage": "https://github.com/shakyshane/browser-sync", | ||
"author": { | ||
"name": "Shane Osbourne" | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "git://github.com/shakyshane/browser-sync.git" | ||
}, | ||
"bugs": { | ||
"url": "https://github.com/shakyshane/browser-sync/issues" | ||
}, | ||
"licenses": [ | ||
{ | ||
"type": "MIT", | ||
"url": "https://github.com/shakyshane/browser-sync/blob/master/LICENSE-MIT" | ||
} | ||
], | ||
"main": "lib/index.js", | ||
"engines": { | ||
"node": ">= 0.8.0" | ||
}, | ||
"scripts": { | ||
"test": "grunt jasmine_node" | ||
}, | ||
"dependencies": { | ||
"portscanner": "~0.1.3", | ||
"path": "*", | ||
"url": "*", | ||
"open": "*", | ||
"chokidar": "~0.6.2", | ||
"lodash": "~1.3.1", | ||
"cli-color": "~0.2.2", | ||
"socket.io": "~0.9.16", | ||
"connect": "~2.8.4", | ||
"ua-parser-js": "~0.6.2", | ||
"optimist": "0.6.0", | ||
"glob": "~3.2.6" | ||
}, | ||
"devDependencies": { | ||
"grunt-contrib-jshint": "~0.6.0", | ||
"grunt-contrib-clean": "~0.4.0", | ||
"grunt-contrib-nodeunit": "~0.2.0", | ||
"grunt-contrib-uglify": "~0.2.2", | ||
"karma-script-launcher": "~0.1.0", | ||
"karma-firefox-launcher": "~0.1.0", | ||
"karma-chrome-launcher": "~0.1.0", | ||
"karma-html2js-preprocessor": "~0.1.0", | ||
"karma-jasmine": "~0.1.3", | ||
"karma-requirejs": "~0.1.0", | ||
"karma-coffee-preprocessor": "~0.1.0", | ||
"karma": "~0.10.2", | ||
"grunt-karma": "~0.6.2", | ||
"grunt-cli": "*", | ||
"grunt": "~0.4.1", | ||
"grunt-jasmine-node": "~0.1.0", | ||
"socket.io-client": "~0.9.16", | ||
"optimist": "~0.6.0", | ||
"grunt-contrib-watch": "~0.5.3" | ||
}, | ||
"keywords": ["browser sync", "css", "live reload", "sync"], | ||
"preferGlobal": "true", | ||
"bin": { | ||
"browser-sync": "lib/index.js" | ||
"name": "browser-sync", | ||
"description": "Live CSS Reload & Browser Syncing", | ||
"version": "0.1.6", | ||
"homepage": "https://github.com/shakyshane/browser-sync", | ||
"author": { | ||
"name": "Shane Osbourne" | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "git://github.com/shakyshane/browser-sync.git" | ||
}, | ||
"bugs": { | ||
"url": "https://github.com/shakyshane/browser-sync/issues" | ||
}, | ||
"licenses": [ | ||
{ | ||
"type": "MIT", | ||
"url": "https://github.com/shakyshane/browser-sync/blob/master/LICENSE-MIT" | ||
} | ||
], | ||
"main": "lib/index.js", | ||
"engines": { | ||
"node": ">= 0.8.0" | ||
}, | ||
"scripts": { | ||
"test": "grunt jasmine_node" | ||
}, | ||
"dependencies": { | ||
"portscanner": "~0.1.3", | ||
"path": "*", | ||
"url": "*", | ||
"open": "*", | ||
"chokidar": "~0.6.2", | ||
"lodash": "~1.3.1", | ||
"cli-color": "~0.2.2", | ||
"socket.io": "~0.9.16", | ||
"connect": "~2.8.4", | ||
"ua-parser-js": "~0.6.2", | ||
"optimist": "0.6.0", | ||
"glob": "~3.2.6", | ||
"dev-ip": "~0.1.5" | ||
}, | ||
"devDependencies": { | ||
"grunt-contrib-jshint": "~0.6.0", | ||
"grunt-contrib-clean": "~0.4.0", | ||
"grunt-contrib-nodeunit": "~0.2.0", | ||
"grunt-contrib-uglify": "~0.2.2", | ||
"karma-script-launcher": "~0.1.0", | ||
"karma-firefox-launcher": "~0.1.0", | ||
"karma-chrome-launcher": "~0.1.0", | ||
"karma-html2js-preprocessor": "~0.1.0", | ||
"karma-jasmine": "~0.1.3", | ||
"karma-requirejs": "~0.1.0", | ||
"karma-coffee-preprocessor": "~0.1.0", | ||
"karma": "~0.10.2", | ||
"grunt-karma": "~0.6.2", | ||
"grunt-cli": "*", | ||
"grunt": "~0.4.1", | ||
"grunt-jasmine-node": "~0.1.0", | ||
"optimist": "~0.6.0", | ||
"socket.io-client": "~0.9.16", | ||
"grunt-contrib-watch": "~0.5.3" | ||
}, | ||
"keywords": [ | ||
"browser sync", | ||
"css", | ||
"live reload", | ||
"sync" | ||
], | ||
"bin": { | ||
"browser-sync": "lib/index.js" | ||
} | ||
} |
@@ -51,3 +51,3 @@ var si = require("../../lib/browser-sync"); | ||
socket = clientIo.connect("http://localhost:" + ports[0], {'force new connection':true}); | ||
socket = clientIo.connect("http://0.0.0.0:" + ports[0], {'force new connection':true}); | ||
socket.emit("inputchange", {}); | ||
@@ -54,0 +54,0 @@ socket.emit("random", {}); |
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Found 1 instance in 1 package
2
104425
13
2350
+ Addeddev-ip@~0.1.5
+ Addeddev-ip@0.1.7(transitive)
+ Addedlodash@2.2.1(transitive)