From 0215671c6aab24e1885074761f44c502f0bb00e2 Mon Sep 17 00:00:00 2001 From: Igor Pashev Date: Fri, 27 Sep 2019 16:05:42 +0200 Subject: Initial PoC --- npmPackages/_scripts/resolve.js | 96 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 npmPackages/_scripts/resolve.js (limited to 'npmPackages/_scripts/resolve.js') diff --git a/npmPackages/_scripts/resolve.js b/npmPackages/_scripts/resolve.js new file mode 100644 index 0000000..e482e72 --- /dev/null +++ b/npmPackages/_scripts/resolve.js @@ -0,0 +1,96 @@ +const process = require('process'); +const fs = require('fs'); + +const { + pipeThrough, + readPackage +} = require('./package.js'); + +const semver = require('./vendor/semver/semver.js'); + +var jailbreak = false; +var npmPackages = []; + +function resolveDeps(pkgMap, deps, missed, unsatisfied) { + for (var d in deps) { + if (d in pkgMap) { + const actual = pkgMap[d].info.version; + var required = deps[d]; + if (semver.valid(required)) { + required = `>=${required}`; + } + if (!semver.satisfies(actual, required)) { + unsatisfied(`want ${d}:"${required}", but "${actual}" provided`); + } + deps[d] = `file:${pkgMap[d].path}`; + } else { + missed(`${d}:${deps[d]}`); + } + } + + return deps; +} + +function resolvePackage(pkg, depPkgs) { + const pkgMap = depPkgs.reduce((pkgs, pkg) => { + pkgs[pkg.info.name] = pkg; + return pkgs; + }, {}); + + var unsatisfied = []; + var missed = []; + + function missedCallback(msg) { + missed.push(msg); + } + + function unsatisfiedCallback(msg) { + unsatisfied.push(msg); + } + + pkg.dependencies = resolveDeps(pkgMap, pkg.dependencies, missedCallback, unsatisfiedCallback); + pkg.devDependencies = resolveDeps(pkgMap, pkg.devDependencies, missedCallback, unsatisfiedCallback); + + if (missed.length > 0) { + console.error(`** ERROR: missing dependencies: ${missed.join('; ')}.`); + } + + if (unsatisfied.length > 0) { + console.error(`** ${jailbreak ? 'WARNING' : 'ERROR'}: unsatisfied dependencies: ${unsatisfied.join('; ')}.`); + } + + if (missed.length > 0) { + process.exit(1); + } + + if (unsatisfied.length > 0 && !jailbreak) { + process.exit(1); + } + + return pkg; +} + +const args = process.argv.slice(2); + +for (var i = 0; i < args.length; i++) { + switch (args[i]) { + case '--jailbreak': + jailbreak = true; + break; + default: + npmPackages.push(args[i]); + } +} + +console.error('Building with:', npmPackages); + +Promise.all(npmPackages.map(readPackage)).then((pkgs) => { + pipeThrough((pkg, done) => { + pkg.dependencies = pkg.dependencies || {}; + pkg.devDependencies = pkg.devDependencies || {}; + done(resolvePackage(pkg, pkgs)); + }); +}).catch((err) => { + console.error(err); + process.exit(1); +}); -- cgit v1.2.3