|
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'; |
5 | 2 |
|
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); |
25 | 6 | }
|
26 | 7 |
|
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; |
58 | 10 |
|
59 |
| - var moduleName = modulesToInstall.shift(); |
60 |
| - installNodeModule(moduleName, function(err) { |
| 11 | + console.log('Installing "' + module + '"'); |
| 12 | + exec(install, function(err, stdout, stderr) { |
61 | 13 | 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); |
64 | 19 | }
|
65 |
| - |
66 |
| - printLog('Module ' + moduleName + ' is installed'); |
67 |
| - installRequiredNodeModules(modulesToInstall); |
68 | 20 | });
|
69 | 21 | }
|
70 | 22 |
|
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; |
82 | 35 | }
|
83 | 36 |
|
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) { |
97 | 38 | try {
|
98 |
| - var content = fs.readFileSync(pathToInstallFlag); |
99 |
| - isInstalled = true; |
| 39 | + var exists = filesave.readFileSync(installFlagLocation); |
| 40 | + return true; |
100 | 41 | } catch (err) {
|
| 42 | + return false; |
101 | 43 | }
|
102 |
| - |
103 |
| - return isInstalled; |
104 | 44 | }
|
105 | 45 |
|
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')); |
139 | 48 | }
|
140 | 49 |
|
141 | 50 | // 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)) { |
145 | 62 | return;
|
146 | 63 | }
|
147 | 64 |
|
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 | + }); |
152 | 75 |
|
153 |
| - createPluginInstalledFlag(ctx); |
| 76 | + return async.promise; |
154 | 77 | };
|
0 commit comments