auto-install
Advanced tools
Comparing version 1.2.6 to 1.3.0
131
helpers.js
@@ -20,3 +20,10 @@ 'use strict' | ||
let installedModules = []; | ||
for (let key in content.dependencies) installedModules.push(key); | ||
for (let key in content.dependencies) installedModules.push({ | ||
name: key, | ||
dev: false | ||
}); | ||
for (let key in content.devDependencies) installedModules.push({ | ||
name: key, | ||
dev: true | ||
}); | ||
return installedModules; | ||
@@ -32,10 +39,8 @@ }; | ||
let usedModules = []; | ||
for (let i = 0; i < files.length; i++) { | ||
let modulesFromFile = getModulesFromFile(files[i]); | ||
usedModules = usedModules.concat(modulesFromFile); | ||
for (let fileName of files) { | ||
let modulesFromFile = getModulesFromFile(fileName); | ||
let dev = isTestFile(fileName); | ||
for (let name of modulesFromFile) usedModules.push({name, dev}); | ||
} | ||
// De-duplicate | ||
usedModules = usedModules.filter((module, position) => { | ||
return usedModules.indexOf(module) === position; | ||
}); | ||
usedModules = deduplicate(usedModules); | ||
return usedModules; | ||
@@ -48,11 +53,18 @@ }; | ||
let installModule = (module) => { | ||
let spinner = startSpinner('Installing ' + module, 'green'); | ||
if (secureMode && !isModulePopular(module)) { | ||
stopSpinner(spinner, module + ' not trusted', 'yellow'); | ||
let installModule = ({name, dev}) => { | ||
let spinner = startSpinner('Installing ' + name, 'green'); | ||
if (secureMode && !isModulePopular(name)) { | ||
stopSpinner(spinner, name + ' not trusted', 'yellow'); | ||
return; | ||
} | ||
let success = runCommand('npm install ' + module + ' --save'); | ||
if (success) stopSpinner(spinner, module + ' installed', 'green'); | ||
else stopSpinner(spinner, module + ' installation failed', 'yellow'); | ||
let command = 'npm install ' + name + ' --save'; | ||
let message = name + ' installed'; | ||
if (dev) command += '-dev'; | ||
if (dev) message += ' in devDependencies'; | ||
let success = runCommand(command); | ||
if (success) stopSpinner(spinner, message, 'green'); | ||
else stopSpinner(spinner, name + ' installation failed', 'yellow'); | ||
}; | ||
@@ -62,6 +74,13 @@ | ||
let uninstallModule = (module) => { | ||
let spinner = startSpinner('Uninstalling ' + module, 'red'); | ||
runCommand('npm uninstall ' + module + ' --save'); | ||
stopSpinner(spinner, module + ' removed', 'red'); | ||
let uninstallModule = ({name, dev}) => { | ||
let spinner = startSpinner('Uninstalling ' + name, 'red'); | ||
let command = 'npm uninstall ' + name + ' --save'; | ||
let message = name + ' removed'; | ||
if (dev) command += '-dev'; | ||
if (dev) message += ' from devDependencies'; | ||
runCommand(command); | ||
stopSpinner(spinner, message, 'red'); | ||
}; | ||
@@ -130,5 +149,5 @@ | ||
let isValidModule = (module) => { | ||
let isValidModule = ({name, dev}) => { | ||
let regex = new RegExp("^([a-z0-9-_]{1,})$"); | ||
return regex.test(module); | ||
return regex.test(name); | ||
}; | ||
@@ -148,3 +167,3 @@ | ||
modules = modules.filter((module) => { | ||
return !isBuiltInModule(module); | ||
return !isBuiltInModule(module.name); | ||
}); | ||
@@ -158,3 +177,3 @@ return modules; | ||
modules = modules.filter((module) => { | ||
return (module.indexOf('./') !== 0) | ||
return (module.name.indexOf('./') !== 0) | ||
}); | ||
@@ -164,6 +183,7 @@ return modules; | ||
/* Array diff prototype */ | ||
/* Modules diff */ | ||
Array.prototype.diff = function(a) { | ||
return this.filter(function(i) {return a.indexOf(i) < 0;}); | ||
let diff = (first, second) => { | ||
let namesFromSecond = getNamesFromModules(second); | ||
return first.filter(module => namesFromSecond.indexOf(module.name) < 0); | ||
}; | ||
@@ -187,8 +207,58 @@ | ||
const POPULARITY_THRESHOLD = 10000; | ||
let isModulePopular = (module) => { | ||
let result = request('GET', 'https://api.npmjs.org/downloads/point/last-month/' + module); | ||
let downloads = JSON.parse(result.body).downloads; | ||
return (downloads > POPULARITY_THRESHOLD); | ||
let isModulePopular = ({name, dev}) => { | ||
let url = 'https://api.npmjs.org/downloads/point/last-month/' + name; | ||
request('GET', url, (error, response, body) => { | ||
let downloads = JSON.parse(body).downloads; | ||
return (downloads > POPULARITY_THRESHOLD); | ||
}); | ||
}; | ||
/* Is test file? */ | ||
let isTestFile = (name) => { | ||
return (name.endsWith('.spec.js') || name.endsWith('.test.js')); | ||
}; | ||
/* Get module names from array of module objects */ | ||
let getNamesFromModules = (modules) => { | ||
return modules.map(module => module.name); | ||
}; | ||
/* Dedup modules | ||
* Divide modules into prod and dev | ||
* Deduplicates each list | ||
*/ | ||
let deduplicate = (modules) => { | ||
let dedupedModules = []; | ||
let testModules = modules.filter(module => module.dev); | ||
dedupedModules = dedupedModules.concat(deduplicateSimilarModules(testModules)); | ||
let prodModules = modules.filter(module => !module.dev); | ||
dedupedModules = dedupedModules.concat(deduplicateSimilarModules(prodModules)); | ||
return dedupedModules; | ||
}; | ||
/* Dedup similar modules | ||
* Deduplicates list | ||
* Ignores/assumes type of the modules in list | ||
*/ | ||
let deduplicateSimilarModules = (modules) => { | ||
let dedupedModules = []; | ||
let dedupedModuleNames = []; | ||
for (let module of modules) { | ||
if (dedupedModuleNames.indexOf(module.name) === -1) { | ||
dedupedModules.push(module); | ||
dedupedModuleNames.push(module.name); | ||
} | ||
} | ||
return dedupedModules; | ||
}; | ||
/* Public helper functions */ | ||
@@ -202,4 +272,5 @@ | ||
uninstallModule, | ||
diff, | ||
reinstall | ||
}; | ||
@@ -24,8 +24,8 @@ #!/usr/bin/env node | ||
//installModules | ||
let modulesNotInstalled = usedModules.diff(installedModules); | ||
for (let i = 0; i < modulesNotInstalled.length; i++) helpers.installModule(modulesNotInstalled[i]); | ||
let modulesNotInstalled = helpers.diff(usedModules, installedModules); | ||
for (let module of modulesNotInstalled) helpers.installModule(module); | ||
//removeUnusedModules | ||
let unusedModules = installedModules.diff(usedModules); | ||
for (let i = 0; i < unusedModules.length; i++) helpers.uninstallModule(unusedModules[i]); | ||
let unusedModules = helpers.diff(installedModules, usedModules); | ||
for (let module of unusedModules) helpers.uninstallModule(module); | ||
@@ -32,0 +32,0 @@ helpers.reinstall(); |
{ | ||
"name": "auto-install", | ||
"version": "1.2.6", | ||
"version": "1.3.0", | ||
"description": "Auto installs dependencies as you code", | ||
@@ -5,0 +5,0 @@ "keywords": "auto, dependencies, install, package, watch", |
@@ -17,2 +17,4 @@ #### auto-install | ||
Modules in `.spec.js` and `.test.js` are added to `devDependencies` | ||
#### Show your support | ||
@@ -19,0 +21,0 @@ |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
503664
249
30