check-version-modules
Advanced tools
Comparing version 1.2.1 to 1.3.0
@@ -14,3 +14,3 @@ #!/usr/bin/env node | ||
const checker = require(join(__dirname, "..", "lib", "main.js")); | ||
const getFormatedTime = require(join(__dirname, "..", "lib", "getFormatedTime.js")); | ||
const getFormatedTime = require(join(__dirname, "..", "lib", "utils", "getFormatedTime.js")); | ||
@@ -17,0 +17,0 @@ // consts |
286
lib/main.js
@@ -6,132 +6,18 @@ | ||
// natives | ||
const { lstat } = require("fs"); | ||
// externals | ||
const { join } = require("path"); | ||
require("colors"); | ||
// locals | ||
const getFormatedTime = require(require("path").join(__dirname, "getFormatedTime.js")); | ||
const downloadPackageData = require(require("path").join(__dirname, "downloadPackageData.js")); | ||
// consts | ||
const extractAndFormateDeps = require(join(__dirname, "deps", "extractAndFormateDeps.js")); | ||
const checkDependenciesUpdates = require(join(__dirname, "deps", "checkDependenciesUpdates.js")); | ||
const DEFAULT_OPTIONS = { | ||
"failAtMajor": true, | ||
"failAtMinor": true, | ||
"failAtPatch": false, | ||
"dev": true, | ||
"console": true | ||
}; | ||
const checkFile = require(join(__dirname, "utils", "checkFile.js")); | ||
const checkAndFormateOptions = require(join(__dirname, "utils", "checkAndFormateOptions.js")); | ||
const getFormatedTime = require(join(__dirname, "utils", "getFormatedTime.js")); | ||
const REGEX = RegExp("^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$"); | ||
// private | ||
// methods | ||
/** | ||
* Check dependencies | ||
* @param {Array} dependencies : dependencies to check | ||
* @param {object} options : compilation's options | ||
* @param {boolean} valid : is tests passed | ||
* @returns {Promise} : Result operation | ||
*/ | ||
function _checkDependenciesUpdates (dependencies, options, valid = true) { | ||
if (!dependencies.length) { | ||
return Promise.resolve(valid); | ||
} | ||
else { | ||
const dependency = dependencies.shift(); | ||
return !REGEX.test(dependency.version) ? Promise.reject(new Error( | ||
"Dependency version (" + dependency.version + ") must be strict : ^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$" | ||
)) : Promise.resolve().then(() => { | ||
// get registery data | ||
return downloadPackageData(dependency.name) | ||
// extract last version | ||
.then((data) => { | ||
return !data["dist-tags"] || !data["dist-tags"].latest ? | ||
Promise.reject(new Error("\"" + dependency.name + "\" registry does not return latest version")) : | ||
Promise.resolve(data["dist-tags"].latest); | ||
// diff | ||
}).then((latest) => { | ||
let result = valid; | ||
const latestVersions = latest.split("."); | ||
const versions = dependency.version.split("."); | ||
if (parseInt(latestVersions[0], 10) > parseInt(versions[0], 10)) { | ||
if (options.failAtMajor) { | ||
result = false; | ||
} | ||
if (options.console) { | ||
(0, console).log(getFormatedTime(), | ||
dependency.path, "=>", (dependency.version + " < " + latest).bgRed | ||
); | ||
} | ||
} | ||
else if (parseInt(latestVersions[1], 10) > parseInt(versions[1], 10)) { | ||
if (options.failAtMinor) { | ||
result = false; | ||
} | ||
if (options.console) { | ||
(0, console).log(getFormatedTime(), | ||
dependency.path, "=>", (dependency.version + " < " + latest).red | ||
); | ||
} | ||
} | ||
else if (parseInt(latestVersions[2], 10) > parseInt(versions[2], 10)) { | ||
if (options.failAtPatch) { | ||
result = false; | ||
} | ||
if (options.console) { | ||
(0, console).log(getFormatedTime(), | ||
dependency.path, "=>", (dependency.version + " < " + latest).yellow | ||
); | ||
} | ||
} | ||
else if (options.console) { | ||
(0, console).log(getFormatedTime(), | ||
dependency.path, "=>", "Ok".green | ||
); | ||
} | ||
return !dependencies.length ? Promise.resolve(result) : _checkDependenciesUpdates(dependencies, options, result); | ||
}); | ||
}); | ||
} | ||
} | ||
// module | ||
module.exports = (file, options = DEFAULT_OPTIONS) => { | ||
module.exports = (file, _options) => { | ||
@@ -141,159 +27,23 @@ // check params | ||
if ("undefined" === typeof file) { | ||
return Promise.reject(new ReferenceError("Missing \"file\" parameter")); | ||
} | ||
else if ("string" !== typeof file) { | ||
return Promise.reject(new TypeError("\"file\" parameter is not a string")); | ||
} | ||
else if ("" === file.trim()) { | ||
return Promise.reject(new Error("\"file\" parameter is empty")); | ||
} | ||
return checkFile(file); | ||
else if ("object" !== typeof options) { | ||
return Promise.reject(new TypeError("\"options\" parameter is not an object")); | ||
} | ||
else { | ||
return Promise.resolve().then(() => { | ||
options.failAtMajor = "undefined" === typeof options.failAtMajor ? DEFAULT_OPTIONS.failAtMajor : options.failAtMajor; | ||
options.failAtMinor = "undefined" === typeof options.failAtMinor ? DEFAULT_OPTIONS.failAtMinor : options.failAtMinor; | ||
options.failAtPatch = "undefined" === typeof options.failAtPatch ? DEFAULT_OPTIONS.failAtPatch : options.failAtPatch; | ||
options.dev = "undefined" === typeof options.dev ? DEFAULT_OPTIONS.dev : options.dev; | ||
options.console = "undefined" === typeof options.console ? DEFAULT_OPTIONS.console : options.console; | ||
if ("boolean" !== typeof options.failAtMajor) { | ||
return Promise.reject(new TypeError("\"options.failAtMajor\" parameter is not a boolean")); | ||
} | ||
else if ("boolean" !== typeof options.failAtMinor) { | ||
return Promise.reject(new TypeError("\"options.failAtMinor\" parameter is not a boolean")); | ||
} | ||
else if ("boolean" !== typeof options.failAtPatch) { | ||
return Promise.reject(new TypeError("\"options.failAtPatch\" parameter is not a boolean")); | ||
} | ||
else if ("boolean" !== typeof options.dev) { | ||
return Promise.reject(new TypeError("\"options.dev\" parameter is not a boolean")); | ||
} | ||
else if ("boolean" !== typeof options.console) { | ||
return Promise.reject(new TypeError("\"options.console\" parameter is not a boolean")); | ||
} | ||
else { | ||
return Promise.resolve(); | ||
} | ||
}); | ||
} | ||
// check file existance | ||
}).then(() => { | ||
return new Promise((resolve) => { | ||
return checkAndFormateOptions(_options); | ||
lstat(file, (err, stats) => { | ||
}).then((options) => { | ||
if (err || !stats.isFile()) { | ||
resolve(false); | ||
} | ||
else { | ||
resolve(true); | ||
} | ||
return extractAndFormateDeps(file, options.dev).then((dependencies) => { | ||
}); | ||
}).then((exists) => { | ||
return exists ? Promise.resolve() : Promise.reject(new Error("File \"" + file + "\" does not exists.")); | ||
}); | ||
// extract deps | ||
}).then(() => { | ||
const packageData = require(file); | ||
const result = []; | ||
const packageDependencies = packageData.dependencies; | ||
Object.keys(packageDependencies).forEach((dependency) => { | ||
result.push({ | ||
"dev": false, | ||
"name": dependency, | ||
"version": packageDependencies[dependency] | ||
}); | ||
}); | ||
if (options.dev) { | ||
const packageDevDependencies = packageData.devDependencies; | ||
if (packageDevDependencies) { | ||
Object.keys(packageDevDependencies).forEach((dependency) => { | ||
result.push({ | ||
"dev": true, | ||
"name": dependency, | ||
"version": packageDevDependencies[dependency] | ||
}); | ||
}); | ||
} | ||
if (options.console) { | ||
(0, console).log(getFormatedTime(), file); | ||
} | ||
return Promise.resolve(result); | ||
// sort deps | ||
}).then((dependencies) => { | ||
const result = []; | ||
dependencies.sort((compared, compareTo) => { | ||
if (compared.dev && !compareTo.dev) { | ||
return 1; | ||
} | ||
else if (!compared.dev && compareTo.dev) { | ||
return -1; | ||
} | ||
else if (compared.name > compareTo.name) { | ||
return 1; | ||
} | ||
else if (compared.name < compareTo.name) { | ||
return -1; | ||
} | ||
else { | ||
return 0; | ||
} | ||
}).forEach((dependency) => { | ||
let path = dependency.name; | ||
path = dependency.dev ? "dev/" + path : path; | ||
result.push({ | ||
path, | ||
"name": dependency.name, | ||
"version": dependency.version | ||
}); | ||
return checkDependenciesUpdates(dependencies, { | ||
"failAtMajor": options.failAtMajor, | ||
"failAtMinor": options.failAtMinor, | ||
"failAtPatch": options.failAtPatch, | ||
"console": options.console | ||
}); | ||
return Promise.resolve(result); | ||
// execute task | ||
}).then((dependencies) => { | ||
if (options.console) { | ||
(0, console).log(getFormatedTime(), file); | ||
} | ||
return _checkDependenciesUpdates(dependencies, { | ||
"failAtMajor": options.failAtMajor, | ||
"failAtMinor": options.failAtMinor, | ||
"failAtPatch": options.failAtPatch, | ||
"console": options.console | ||
}); | ||
@@ -300,0 +50,0 @@ |
{ | ||
"name": "check-version-modules", | ||
"version": "1.2.1", | ||
"version": "1.3.0", | ||
"description": "Check modules's version for the package.", | ||
@@ -17,2 +17,6 @@ "main": "lib/main.js", | ||
}, | ||
"files": [ | ||
"/bin", | ||
"/lib" | ||
], | ||
"husky": { | ||
@@ -46,7 +50,7 @@ "hooks": { | ||
"devDependencies": { | ||
"@types/node": "12.6.3", | ||
"@types/node": "12.6.9", | ||
"coveralls": "3.0.5", | ||
"eslint": "6.0.1", | ||
"husky": "3.0.0", | ||
"mocha": "6.1.4", | ||
"eslint": "6.1.0", | ||
"husky": "3.0.2", | ||
"mocha": "6.2.0", | ||
"nyc": "14.1.1" | ||
@@ -53,0 +57,0 @@ }, |
@@ -11,4 +11,2 @@ # check-version-modules | ||
> /!\ Warning ! This package is designed to work only with strict version, without artefacts ("^", "~", etc...) | ||
## Installation | ||
@@ -28,2 +26,20 @@ | ||
### Supported patterns | ||
> does not support artifacts like "-beta" | ||
> each "*" character will be understood like a "x"' | ||
> here, "n" is a whatever number sample, like "1" | ||
Does support following patterns: | ||
* x (=> x.x.x) | ||
* x.x.n (=> x.x.x) | ||
* x.n.n (=> x.x.x) | ||
* n (=> n.x.x) | ||
* n.x (=> n.x.x) | ||
* n.n (=> n.n.x) | ||
* n.n.n | ||
* ^n.n.n (=> n.x.x) | ||
* ~n.n.n (=> n.n.x) | ||
### Methods | ||
@@ -37,5 +53,5 @@ | ||
interface iOptions { | ||
"failAtMajor": boolean; // default: true => used for the returned boolean | ||
"failAtMinor": boolean; // default: true => used for the returned boolean | ||
"failAtPatch": boolean; // default: false => used for the returned boolean | ||
"failAtMajor": boolean; // default: true => if no pattern, used for the returned boolean | ||
"failAtMinor": boolean; // default: true => if no pattern, used for the returned boolean | ||
"failAtPatch": boolean; // default: false => if no pattern, used for the returned boolean | ||
"dev": boolean; // default: true => analyse dev deps too | ||
@@ -100,2 +116,6 @@ "console": boolean; // default: true => print analyse's result in the terminal | ||
$ npm run-script tests | ||
$ git clone git://github.com/Psychopoulet/check-version-modules.git | ||
$ cd ./check-version-modules | ||
$ npm install | ||
$ npm run-script tests | ||
``` | ||
@@ -102,0 +122,0 @@ |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
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
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
122
24712
22
586
22