diff --git a/src/build/buildApp.js b/src/build/buildApp.js index 1fc9e6d..f2fb022 100644 --- a/src/build/buildApp.js +++ b/src/build/buildApp.js @@ -1,85 +1,10 @@ import fs from 'fs'; -import path from 'path'; import crypto from 'crypto'; -import packager from 'electron-packager'; -import tmp from 'tmp'; -import ncp from 'ncp'; -import async from 'async'; import _ from 'lodash'; -import hasBinary from 'hasbin'; - -import optionsFactory from './../options'; -import iconBuild from './iconBuild'; -import helpers from './../helpers/helpers'; +import path from 'path'; +import ncp from 'ncp'; const copy = ncp.ncp; -const isWindows = helpers.isWindows; - -/** - * @callback buildAppCallback - * @param error - * @param {string} appPath - */ - -/** - * - * @param {{}} options - * @param {buildAppCallback} callback - */ -function buildApp(options, callback) { - // pre process app - - var tmpObj = tmp.dirSync({unsafeCleanup: true}); - const tmpPath = tmpObj.name; - - async.waterfall([ - callback => { - optionsFactory(options, callback); - }, - (options, callback) => { - copyPlaceholderApp(options.dir, tmpPath, options, error => { - if (error) { - callback(error); - return; - } - // dir now correctly references the app folder to package - options.dir = tmpPath; - callback(null, options); - }); - }, - (options, callback) => { - iconBuild(options, (error, optionsWithIcon) => { - callback(null, optionsWithIcon); - }); - }, - (options, callback) => { - // maybe skip passing icon parameter to electron packager - const packageOptions = maybeNoIconOption(options); - packager(packageOptions, (error, appPathArray) => { - // pass options which still contains the icon to waterfall - callback(error, options, appPathArray); - }); - }, - (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]; - maybeCopyIcons(options, appPath, error => { - callback(error, appPath); - }); - } - ], callback); -} /** * Creates a temporary directory and copies the './app folder' inside, and adds a text file with the configuration @@ -90,7 +15,7 @@ function buildApp(options, callback) { * @param {{}} options * @param callback */ -function copyPlaceholderApp(src, dest, options, callback) { +function buildApp(src, dest, options, callback) { const appArgs = selectAppArgs(options); copy(src, dest, error => { if (error) { @@ -137,39 +62,4 @@ function normalizeAppName(appName) { return `${normalized}-nativefier-${postFixHash}`; } -function maybeNoIconOption(options) { - const packageOptions = JSON.parse(JSON.stringify(options)); - if (options.platform === 'win32' && !isWindows()) { - if (!hasBinary.sync('wine')) { - packageOptions.icon = null; - } - } - return packageOptions; -} - -/** - * For windows and linux, we have to copy over the icon to the resources/app folder, which the - * BrowserWindow is hard coded to read the icon from - * @param {{}} options - * @param {string} appPath - * @param callback - */ -function maybeCopyIcons(options, appPath, callback) { - if (!options.icon) { - callback(); - return; - } - - if (options.platform === 'darwin') { - callback(); - return; - } - - // windows & linux - const destIconPath = path.join(appPath, 'resources/app'); - copy(options.icon, path.join(destIconPath, 'icon.png'), error => { - callback(error); - }); -} - export default buildApp; diff --git a/src/build/buildMain.js b/src/build/buildMain.js new file mode 100644 index 0000000..1ddb0fb --- /dev/null +++ b/src/build/buildMain.js @@ -0,0 +1,134 @@ +import path from 'path'; +import packager from 'electron-packager'; +import tmp from 'tmp'; +import ncp from 'ncp'; +import async from 'async'; +import hasBinary from 'hasbin'; + +import optionsFactory from './../options'; +import iconBuild from './iconBuild'; +import helpers from './../helpers/helpers'; +import buildApp from './buildApp'; + +const copy = ncp.ncp; +const isWindows = helpers.isWindows; + +/** + * @callback buildAppCallback + * @param error + * @param {string} appPath + */ + +/** + * + * @param {{}} options + * @param {buildAppCallback} callback + */ +function buildMain(options, callback) { + // pre process app + + var tmpObj = tmp.dirSync({unsafeCleanup: true}); + const tmpPath = tmpObj.name; + + async.waterfall([ + callback => { + optionsFactory(options, callback); + }, + (options, callback) => { + buildApp(options.dir, tmpPath, options, error => { + if (error) { + callback(error); + return; + } + // dir now correctly references the app folder to package + options.dir = tmpPath; + callback(null, options); + }); + }, + (options, callback) => { + iconBuild(options, (error, optionsWithIcon) => { + callback(null, optionsWithIcon); + }); + }, + (options, callback) => { + // maybe skip passing icon parameter to electron packager + const packageOptions = maybeNoIconOption(options); + packager(packageOptions, (error, appPathArray) => { + // pass options which still contains the icon to waterfall + callback(error, options, appPathArray); + }); + }, + (options, appPathArray, callback) => { + // somehow appPathArray is a 1 element array + const appPath = getAppPath(appPathArray); + if (!appPath) { + callback(); + return; + } + + maybeCopyIcons(options, appPath, error => { + callback(error, appPath); + }); + } + ], callback); +} + +/** + * Checks the app path array to determine if the packaging was completed successfully + * @param appPathArray Result from electron-packager + * @returns {*} + */ +function getAppPath(appPathArray) { + if (appPathArray.length === 0) { + // directory already exists, --overwrite is not set + // exit here + return null; + } + + if (appPathArray.length > 1) { + console.warn('Warning: This should not be happening, packaged app path contains more than one element:', appPathArray); + } + + return appPathArray[0]; +} + +/** + * Removes the `icon` parameter from options if building for Windows while not on Windows and Wine is not installed + * @param options + */ +function maybeNoIconOption(options) { + const packageOptions = JSON.parse(JSON.stringify(options)); + if (options.platform === 'win32' && !isWindows()) { + if (!hasBinary.sync('wine')) { + packageOptions.icon = null; + } + } + return packageOptions; +} + +/** + * For windows and linux, we have to copy over the icon to the resources/app folder, which the + * BrowserWindow is hard coded to read the icon from + * @param {{}} options + * @param {string} appPath + * @param callback + */ +function maybeCopyIcons(options, appPath, callback) { + if (!options.icon) { + callback(); + return; + } + + if (options.platform === 'darwin') { + callback(); + return; + } + + // windows & linux + const destIconPath = path.join(appPath, 'resources/app'); + copy(options.icon, path.join(destIconPath, 'icon.png'), error => { + callback(error); + }); +} + +export default buildMain; diff --git a/src/cli.js b/src/cli.js index be6a42e..7796929 100755 --- a/src/cli.js +++ b/src/cli.js @@ -4,7 +4,7 @@ import 'source-map-support/register'; import path from 'path'; import program from 'commander'; -import buildApp from './build/buildApp'; +import nativefier from './index'; const packageJson = require(path.join('..', 'package')); if (require.main === module) { @@ -35,7 +35,7 @@ if (require.main === module) { program.help(); } - buildApp(program, (error, appPath) => { + nativefier(program, (error, appPath) => { if (error) { console.error(error); return; diff --git a/src/index.js b/src/index.js index 55d2cf8..014faa6 100644 --- a/src/index.js +++ b/src/index.js @@ -1,5 +1,5 @@ import 'source-map-support/register'; -import buildApp from './build/buildApp'; +import buildApp from './build/buildMain'; export default buildApp; diff --git a/src/infer/inferIcon.js b/src/infer/inferIcon.js index 4338291..6e482dd 100644 --- a/src/infer/inferIcon.js +++ b/src/infer/inferIcon.js @@ -5,6 +5,7 @@ import tmp from 'tmp'; tmp.setGracefulCleanup(); const BEST_ICON_API = 'http://45.55.116.63:8080/icon'; + /** * * @param {string} targetUrl