Skip to content

Commit 0ade207

Browse files
committed
fix: added async to before hook
1 parent 0e2f6f5 commit 0ade207

File tree

4 files changed

+107
-264
lines changed

4 files changed

+107
-264
lines changed

hooks.es6/beforePluginInstallHook.js

Lines changed: 53 additions & 130 deletions
Original file line numberDiff line numberDiff line change
@@ -1,154 +1,77 @@
1-
/**
2-
Hook is executed when plugin is added to the project.
3-
It will check all necessary module dependencies and install the missing ones locally.
4-
*/
1+
'use strict';
52

6-
var exec = require('child_process').exec,
7-
path = require('path'),
8-
fs = require('fs'),
9-
INSTALLATION_FLAG_FILE_NAME = '.installed';
10-
11-
// region NPM specific
12-
13-
/**
14-
* Check if node package is installed.
15-
*
16-
* @param {String} moduleName
17-
* @return {Boolean} true if package already installed
18-
*/
19-
function isNodeModuleInstalled(moduleName) {
20-
var installed = true;
21-
try {
22-
var module = require(moduleName);
23-
} catch (err) {
24-
installed = false;
3+
function installNodeModule(exec, modules, callback) {
4+
if (modules.length <= 0) {
5+
return callback(false);
256
}
267

27-
return installed;
28-
}
29-
30-
/**
31-
* Install node module locally.
32-
* Basically, it runs 'npm install module_name'.
33-
*
34-
* @param {String} moduleName
35-
* @param {Callback(error)} callback
36-
*/
37-
function installNodeModule(moduleName, callback) {
38-
if (isNodeModuleInstalled(moduleName)) {
39-
printLog('Node module ' + moduleName + ' is found');
40-
callback(null);
41-
return;
42-
}
43-
printLog('Can\'t find module ' + moduleName + ', running npm install');
44-
45-
var cmd = 'cd plugins/io.branch.sdk && npm install -D ' + moduleName;
46-
exec(cmd, function(err, stdout, stderr) {
47-
callback(err);
48-
});
49-
}
50-
51-
/**
52-
* Install all required node packages.
53-
*/
54-
function installRequiredNodeModules(modulesToInstall) {
55-
if (!modulesToInstall.length) {
56-
return;
57-
}
8+
var module = modules.pop();
9+
var install = 'npm install --prefix ./plugins/io.branch.sdk -D ' + module;
5810

59-
var moduleName = modulesToInstall.shift();
60-
installNodeModule(moduleName, function(err) {
11+
console.log('Installing "' + module + '"');
12+
exec(install, function(err, stdout, stderr) {
6113
if (err) {
62-
printLog('Failed to install module ' + moduleName + ':' + err);
63-
return;
14+
console.error('Failed to install Branch Dependency: "' + module + '"');
15+
return callback(true);
16+
}
17+
else {
18+
installNodeModule(exec, modules, callback);
6419
}
65-
66-
printLog('Module ' + moduleName + ' is installed');
67-
installRequiredNodeModules(modulesToInstall);
6820
});
6921
}
7022

71-
// endregion
72-
73-
// region Logging
74-
75-
function logStart() {
76-
console.log('Checking dependencies:');
77-
}
78-
79-
function printLog(msg) {
80-
var formattedMsg = ' ' + msg;
81-
console.log(formattedMsg);
23+
function getUninstalledNodeModules(dependencies) {
24+
var modules = [];
25+
for (var module in dependencies) {
26+
if (dependencies.hasOwnProperty(module)) {
27+
try {
28+
var exists = require(module);
29+
} catch (err) {
30+
modules.push(module);
31+
}
32+
}
33+
}
34+
return modules;
8235
}
8336

84-
// endregion
85-
86-
// region Private API
87-
88-
/**
89-
* Check if we already executed this hook.
90-
*
91-
* @param {Object} ctx - cordova context
92-
* @return {Boolean} true if already executed; otherwise - false
93-
*/
94-
function isInstallationAlreadyPerformed(ctx) {
95-
var pathToInstallFlag = path.join(ctx.opts.projectRoot, 'plugins', ctx.opts.plugin.id, INSTALLATION_FLAG_FILE_NAME),
96-
isInstalled = false;
37+
function getPackageInstalled(filesave, installFlagLocation) {
9738
try {
98-
var content = fs.readFileSync(pathToInstallFlag);
99-
isInstalled = true;
39+
var exists = filesave.readFileSync(installFlagLocation);
40+
return true;
10041
} catch (err) {
42+
return false;
10143
}
102-
103-
return isInstalled;
10444
}
10545

106-
/**
107-
* Create empty file - indicator, that we tried to install dependency modules after installation.
108-
* We have to do that, or this hook is gonna be called on any plugin installation.
109-
*/
110-
function createPluginInstalledFlag(ctx) {
111-
var pathToInstallFlag = path.join(ctx.opts.projectRoot, 'plugins', ctx.opts.plugin.id, INSTALLATION_FLAG_FILE_NAME);
112-
113-
fs.closeSync(fs.openSync(pathToInstallFlag, 'w'));
114-
}
115-
116-
// endregion
117-
118-
/**
119-
* Read dependencies from the package.json.
120-
* We will install them on the next step.
121-
*
122-
* @param {Object} ctx - cordova context
123-
* @return {Array} list of modules to install
124-
*/
125-
function readDependenciesFromPackageJson(ctx) {
126-
var data = require(path.join(ctx.opts.projectRoot, 'plugins', ctx.opts.plugin.id, 'package.json')),
127-
dependencies = data['dependencies'],
128-
modules = [];
129-
130-
if (!dependencies) {
131-
return modules;
132-
}
133-
134-
for (var module in dependencies) {
135-
modules.push(module);
136-
}
137-
138-
return modules;
46+
function setPackageInstalled(filesave, installFlagLocation) {
47+
filesave.closeSync(filesave.openSync(installFlagLocation, 'w'));
13948
}
14049

14150
// hook's entry point
142-
module.exports = function(ctx) {
143-
// exit if we already executed this hook once
144-
if (isInstallationAlreadyPerformed(ctx)) {
51+
module.exports = function(context) {
52+
var q = context.requireCordovaModule('q');
53+
var async = new q.defer();
54+
var filesave = require('fs');
55+
var path = require('path');
56+
var exec = require('child_process').exec;
57+
var installFlagName = '.installed';
58+
var installFlagLocation = path.join(context.opts.projectRoot, 'plugins', context.opts.plugin.id, installFlagName);
59+
var dependencies = require(path.join(context.opts.projectRoot, 'plugins', context.opts.plugin.id, 'package.json')).dependencies;
60+
61+
if (getPackageInstalled(filesave, installFlagLocation)) {
14562
return;
14663
}
14764

148-
logStart();
149-
150-
var modules = readDependenciesFromPackageJson(ctx);
151-
installRequiredNodeModules(modules);
65+
var modules = getUninstalledNodeModules(dependencies);
66+
installNodeModule(exec, modules, function(err) {
67+
if (err) {
68+
console.error('Failed to install the Branch SDK');
69+
}
70+
else {
71+
setPackageInstalled(filesave, installFlagLocation);
72+
}
73+
async.resolve();
74+
});
15275

153-
createPluginInstalledFlag(ctx);
76+
return async.promise;
15477
};

0 commit comments

Comments
 (0)