aboutsummaryrefslogtreecommitdiff
path: root/npmPackages/_scripts/resolve.js
diff options
context:
space:
mode:
Diffstat (limited to 'npmPackages/_scripts/resolve.js')
-rw-r--r--npmPackages/_scripts/resolve.js96
1 files changed, 96 insertions, 0 deletions
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);
+});