UNPKG

pesdk-cordova-plugin

Version:

Cordova/Phonegap plugin for the PhotoEditor SDK.

172 lines (150 loc) 5.93 kB
#!/usr/bin/env node /** * Check all necessary module dependencies are installed. * @module resolveDependencies */ (function () { /********** * Modules **********/ var exec, fs, path, deferral; /********************** * Internal properties *********************/ var sourcePackageJson, targetPackageJson, tempPackageJson, hooksPath, logger; /********************* * File utilities *********************/ function copyFile(source, target, cb) { var cbCalled = false; var rd = fs.createReadStream(source); rd.on("error", function (err) { done(err); }); var wr = fs.createWriteStream(target); wr.on("error", function (err) { done(err); }); wr.on("close", function (ex) { done(); }); rd.pipe(wr); function done(err) { if (!cbCalled) { cb(err); cbCalled = true; } } } function fileExists(target, cb) { fs.stat(target, function (err, stat) { cb(err === null); }); } function deleteFile(target, cb) { fs.unlink(target, cb); } /********************* * Internal procedures *********************/ // Install modules via npm CLI function installModules(cb) { logger.log("Installing plugin dependencies..."); var cmd = 'npm install'; logger.verbose("Running " + cmd); exec(cmd, function (err, stdout, stderr) { logger.verbose("Completed " + cmd); cb(err); }); } // Check if a real package.json exists in the project root function checkForRealPackageJson(){ fileExists(targetPackageJson, function (exists) { if (exists) { logger.verbose("package.json already exists"); copyFile(targetPackageJson, tempPackageJson, function (err) { if (err) { deferral.reject("Error copying package.json to package.json.tmp: " + err); return -1; } logger.verbose("Copied existing package.json to package.json.tmp"); deployPluginPackageJson(); }); } else { deployPluginPackageJson(); } }); } // Dependency resolution is complete function complete() { logger.verbose("Dependency resolution complete"); deferral.resolve(); } // Deploy our plugin's package.json and execute npm install function deployPluginPackageJson() { logger.verbose("Copying package.json"); copyFile(sourcePackageJson, targetPackageJson, function (err) { if (err) { deferral.reject("Error copying plugin's package.json: " + err); return -1; } logger.verbose("Copied package.json"); installModules(function(err) { if (err) { deferral.reject("Error installing modules: " + err); return -1; } logger.verbose("Installed modules"); fileExists(tempPackageJson, function (exists) { if (exists) { logger.verbose("package.json.tmp exists"); copyFile(tempPackageJson, targetPackageJson, function (err) { if (err) { deferral.reject("Error restoring package.json.tmp to package.json: " + err); return -1; } logger.verbose("Overwrote our package.json with original package.json.tmp"); logger.verbose("Removing package.json.tmp"); deleteFile(tempPackageJson, function (err) { if (err) { deferral.reject("Error removing package.json.tmp: " + err); return -1; } logger.verbose("Removed package.json.tmp"); complete(); }) }); } else { deleteFile(targetPackageJson, function (err) { if (err) { deferral.reject("Error removing our package.json: " + err); return -1; } logger.verbose("Removed our package.json"); complete(); }) } }); }); }); } module.exports = function (ctx) { // resolve modules exec = ctx.requireCordovaModule('child_process').exec, fs = ctx.requireCordovaModule('fs'), path = ctx.requireCordovaModule('path'), deferral = ctx.requireCordovaModule('q').defer(); // resolve paths hooksPath = path.resolve(ctx.opts.projectRoot, "plugins", ctx.opts.plugin.id, "hooks"); logger = require(path.resolve(hooksPath, "logger.js"))(ctx), sourcePackageJson = path.resolve(ctx.opts.projectRoot, "plugins", ctx.opts.plugin.id, "package.json"), targetPackageJson = path.resolve(ctx.opts.projectRoot, "package.json"), tempPackageJson = path.resolve(ctx.opts.projectRoot, "package.json.tmp"); checkForRealPackageJson(); return deferral.promise; }; })();