1
0
mirror of https://github.com/jiahaog/Nativefier synced 2024-06-26 07:38:59 +02:00
Nativefier/src/buildApp.js

168 lines
5.0 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 optionsFactory from './options';
import iconBuild from './iconBuild';
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
import packageJson from './../package.json';
2016-01-18 15:07:22 +01:00
const copy = ncp.ncp;
/**
* @callback buildAppCallback
* @param error
* @param appPath
*/
/**
*
2016-01-23 19:02:23 +01:00
* @param {{}} options
2016-01-18 15:07:22 +01:00
* @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 => {
optionsFactory(
options.appName,
options.targetUrl,
options.platform,
options.arch,
options.electronVersion,
options.outDir,
options.overwrite,
options.conceal,
options.icon,
options.counter,
options.width,
options.height,
options.showMenuBar,
options.userAgent,
options.honest,
options.insecure,
callback);
2016-01-18 15:07:22 +01:00
},
(options, callback) => {
copyPlaceholderApp(options.dir, tmpPath, options.name, options.targetUrl, options.counter, options.width, options.height, options.showMenuBar, options.userAgent, options.insecure, (error, tempDirPath) => {
callback(error, tempDirPath, options);
});
},
(tempDir, options, callback) => {
iconBuild(options, (error, optionsWithIcon) => {
callback(null, tempDir, optionsWithIcon);
});
},
(tempDir, options, callback) => {
2016-01-18 15:07:22 +01:00
options.dir = tempDir;
packager(options, (error, appPathArray) => {
callback(error, options, appPathArray);
});
2016-01-18 15:07:22 +01:00
},
(options, appPathArray, callback) => {
// somehow appPathArray is a 1 element array
if (appPathArray.length === 0) {
// directory already exists, --overwrite is not set
// exit here
callback();
return;
}
if (appPathArray.length > 1) {
console.warn('Warning: Packaged app path contains more than one element:', appPathArray);
}
const appPath = appPathArray[0];
if (!options.icon) {
callback(null, appPath);
return;
}
if (options.platform === 'darwin') {
callback(null, appPath);
return;
}
// windows & linux
const destIconPath = path.join(appPath, 'resources/app');
copy(options.icon, path.join(destIconPath, 'icon.png'), error => {
callback(error, appPath);
});
2016-01-18 15:07:22 +01:00
}
], 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} counter
* @param {number} width
* @param {number} height
2016-01-22 15:42:56 +01:00
* @param {boolean} showMenuBar
* @param {string} userAgent
2016-01-18 15:07:22 +01:00
* @param {tempDirCallback} callback
*/
function copyPlaceholderApp(srcAppDir, tempDir, name, targetURL, counter, width, height, showMenuBar, userAgent, insecure, callback) {
const loadedPackageJson = packageJson;
copy(srcAppDir, tempDir, function(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,
counter: counter,
2016-01-18 15:07:22 +01:00
width: width,
height: height,
2016-01-22 15:42:56 +01:00
showMenuBar: showMenuBar,
userAgent: userAgent,
nativefierVersion: loadedPackageJson.version,
insecure: insecure
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;