tasks/install_native_module.js
// Install native module from npm and compile it for Electron.
// Usage: npm run install-native -- name_of_native_module
'use strict';
var childProcess = require('child_process');
var Q = require('q');
var appDir = require('fs-jetpack').cwd(__dirname, '../app');
var utils = require('./utils');
var ensureElectronRebuildInstalled = function () {
var deferred = Q.defer();
try {
// If require is successful it means module is already installed.
require('electron-rebuild');
deferred.resolve();
} catch (err) {
childProcess.spawn(utils.spawnablePath('npm'), [
'install', '--save-dev', 'electron-rebuild'
], {
stdio: 'inherit'
})
.on('error', deferred.reject)
.on('close', deferred.resolve);
}
return deferred.promise;
};
var ensurePostinstallRunsElectronRebuild = function () {
var postinstallScript = 'node ../tasks/rebuild_native_modules';
var appManifest = appDir.read('package.json', 'json');
if (typeof appManifest.scripts === 'undefined') {
appManifest.scripts = {};
}
// Let's do it 100% bulletproof and check if programmer didn't
// pust some custom stuff into postinstall script already.
if (typeof appManifest.scripts.postinstall === 'undefined') {
appManifest.scripts.postinstall = postinstallScript;
appDir.write('package.json', appManifest);
} else if (appManifest.scripts.postinstall.indexOf(postinstallScript) === -1) {
appManifest.scripts.postinstall += ' && ' + postinstallScript;
appDir.write('package.json', appManifest);
}
return Q();
};
var installNativeModule = function () {
var deferred = Q.defer();
var moduleToInstallAndOtherParams = process.argv.slice(2);
if (!moduleToInstallAndOtherParams.length === 0) {
deferred.reject('Module name not specified! Correct usage is "npm run install-native -- name_of_native_module" (remember about space after "--").');
} else {
childProcess.spawn(
utils.spawnablePath('npm'),
['install', '--save'].concat(moduleToInstallAndOtherParams),
{
cwd: appDir.cwd(),
stdio: 'inherit'
}
)
.on('error', deferred.reject)
.on('close', deferred.resolve);
}
return deferred.promise;
};
var runRebuild = function () {
var deferred = Q.defer();
childProcess.spawn(utils.spawnablePath('npm'), [
'run', 'postinstall'
], {
cwd: appDir.cwd(),
stdio: 'inherit'
})
.on('error', deferred.reject)
.on('close', deferred.resolve);
return deferred.promise;
};
ensureElectronRebuildInstalled()
.then(ensurePostinstallRunsElectronRebuild)
.then(installNativeModule)
.then(runRebuild)
.catch(function (err) {
console.error(err); // eslint-disable-line no-console
});