Nativefier/src/buildApp.js

105 lines
2.7 KiB
JavaScript
Raw Normal View History

2016-01-18 15:07:22 +01:00
import fs from 'fs';
import path from 'path';
import crypto from 'crypto';
2016-01-18 15:07:22 +01:00
import packager from 'electron-packager';
import tmp from 'tmp';
import ncp from 'ncp';
import async from 'async';
import _ from 'lodash';
2016-01-18 15:07:22 +01:00
const copy = ncp.ncp;
/**
* @callback buildAppCallback
* @param error
* @param appPath
*/
/**
*
* @param options
* @param {buildAppCallback} callback
*/
function buildApp(options, callback) {
// pre process app
var tmpObj = tmp.dirSync({unsafeCleanup: true});
const tmpPath = tmpObj.name;
2016-01-18 15:07:22 +01:00
async.waterfall([
callback => {
2016-01-19 13:28:58 +01:00
copyPlaceholderApp(options.dir, tmpPath, options.name, options.targetUrl, options.badge, options.width, options.height, options.userAgent, callback);
2016-01-18 15:07:22 +01:00
},
(tempDir, callback) => {
2016-01-18 15:07:22 +01:00
options.dir = tempDir;
packager(options, callback);
},
(appPath, callback) => {
2016-01-18 15:07:22 +01:00
callback(null, appPath);
}
], callback);
}
/**
* @callback tempDirCallback
* @param error
* @param {string} [tempDirPath]
2016-01-18 15:07:22 +01:00
*/
/**
* Creates a temporary directory and copies the './app folder' inside, and adds a text file with the configuration
* for the single page app.
*
* @param {string} srcAppDir
* @param {string} tempDir
* @param {string} name
* @param {string} targetURL
* @param {boolean} badge
* @param {number} width
* @param {number} height
* @param {string} userAgent
2016-01-18 15:07:22 +01:00
* @param {tempDirCallback} callback
*/
2016-01-19 13:28:58 +01:00
function copyPlaceholderApp(srcAppDir, tempDir, name, targetURL, badge, width, height, userAgent, callback) {
copy(srcAppDir, tempDir, error => {
2016-01-18 15:07:22 +01:00
if (error) {
console.error(error);
callback(`Error Copying temporary directory: ${error}`);
return;
}
const appArgs = {
name: name,
targetUrl: targetURL,
badge: badge,
width: width,
height: height,
2016-01-19 13:28:58 +01:00
userAgent: userAgent
2016-01-18 15:07:22 +01:00
};
fs.writeFileSync(path.join(tempDir, '/nativefier.json'), JSON.stringify(appArgs));
// change name of packageJson so that temporary files will not be shared across different app instances
const packageJsonPath = path.join(tempDir, '/package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath));
packageJson.name = normalizeAppName(appArgs.name);
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson));
2016-01-18 15:07:22 +01:00
callback(null, tempDir);
});
}
function normalizeAppName(appName) {
// use a simple 3 byte random string to prevent collision
const postFixHash = crypto.randomBytes(3).toString('hex');
const normalized = _.kebabCase(appName.toLowerCase());
return `${normalized}-nativefier-${postFixHash}`;
}
2016-01-18 15:07:22 +01:00
export default buildApp;