From 3a6ae0d66045c3d6e18198e085f0e8a628cf9461 Mon Sep 17 00:00:00 2001 From: Jia Hao Date: Thu, 10 Mar 2016 23:36:00 +0800 Subject: [PATCH] Implement conversion to .png on linux Refactored icon shell helpers to a single file with helper functions --- src/build/iconBuild.js | 39 +++++++++++------- src/helpers/iconShellHelpers.js | 72 +++++++++++++++++++++++++++++++++ src/helpers/singleIco.js | 52 ------------------------ 3 files changed, 97 insertions(+), 66 deletions(-) create mode 100644 src/helpers/iconShellHelpers.js delete mode 100644 src/helpers/singleIco.js diff --git a/src/build/iconBuild.js b/src/build/iconBuild.js index 2568a72..de16436 100644 --- a/src/build/iconBuild.js +++ b/src/build/iconBuild.js @@ -1,8 +1,9 @@ import path from 'path'; import helpers from './../helpers/helpers'; -import convertToIcns from './../helpers/convertToIcns'; -import singleIco from './../helpers/singleIco'; -const isOSX = helpers.isOSX; +import iconShellHelpers from './../helpers/iconShellHelpers'; + +const {isOSX} = helpers; +const {singleIco, convertToPng, convertToIcns} = iconShellHelpers; /** * @callback augmentIconsCallback @@ -50,10 +51,18 @@ function iconBuild(options, callback) { if (options.platform === 'linux') { if (iconIsPng(options.icon)) { returnCallback(); - } else { - console.warn('Icon should be a .png to package for Linux'); - returnCallback(); + return; } + + convertToPng(options.icon) + .then(outPath => { + options.icon = outPath; + returnCallback(); + }) + .catch(error => { + console.warn('Skipping icon conversion to .png', error); + returnCallback(); + }); return; } @@ -63,18 +72,20 @@ function iconBuild(options, callback) { } if (!isOSX()) { - console.warn('Conversion of `.png` to `.icns` for OSX app is only supported on OSX'); + console.warn('Skipping icon conversion to .icns, conversion is only supported on OSX'); returnCallback(); return; } - convertToIcns(options.icon, (error, icnsPath) => { - options.icon = icnsPath; - if (error) { - console.warn('Skipping icon conversion from `.png` to `.icns`: ', error); - } - returnCallback(); - }); + convertToIcns(options.icon) + .then(outPath => { + options.icon = outPath; + returnCallback(); + }) + .catch(error => { + console.warn('Skipping icon conversion to .icns', error); + returnCallback(); + }); } function iconIsIco(iconPath) { diff --git a/src/helpers/iconShellHelpers.js b/src/helpers/iconShellHelpers.js new file mode 100644 index 0000000..4eaa486 --- /dev/null +++ b/src/helpers/iconShellHelpers.js @@ -0,0 +1,72 @@ +import shell from 'shelljs'; +import path from 'path'; +import tmp from 'tmp'; +import helpers from './helpers'; +const {isWindows, isOSX} = helpers; + +tmp.setGracefulCleanup(); + +const SCRIPT_PATHS = { + singleIco: path.join(__dirname, '../..', 'bin/singleIco'), + convertToPng: path.join(__dirname, '../..', 'bin/convertToPng'), + convertToIcns: path.join(__dirname, '../..', 'bin/convertToIcns') +}; + +/** + * Executes a shell script with the form "./pathToScript param1 param2" + * @param {string} shellScriptPath + * @param {string} icoSrc input .ico + * @param {string} dest has to be a .ico path + */ +function iconShellHelper(shellScriptPath, icoSrc, dest) { + return new Promise((resolve, reject) => { + if (isWindows()) { + reject('OSX or Linux is required'); + return; + } + + shell.exec(`${shellScriptPath} ${icoSrc} ${dest}`, {silent: true}, (exitCode, stdOut, stdError) => { + if (exitCode) { + reject({ + stdOut: stdOut, + stdError: stdError + }); + return; + } + + resolve(dest); + }); + }); +} + +function getTmpDirPath() { + const tempIconDirObj = tmp.dirSync({unsafeCleanup: true}); + return tempIconDirObj.name; +} + +/** + * Converts the ico to a temporary directory which will be cleaned up on process exit + * @param {string} icoSrc path to a .ico file + * @return {Promise} + */ + +function singleIco(icoSrc) { + return iconShellHelper(SCRIPT_PATHS.singleIco, icoSrc, `${getTmpDirPath()}/icon.ico`); +} + +function convertToPng(icoSrc) { + return iconShellHelper(SCRIPT_PATHS.convertToPng, icoSrc, `${getTmpDirPath()}/icon.ico`); +} + +function convertToIcns(icoSrc) { + if (!isOSX()) { + return new Promise((resolve, reject) => reject('OSX is required to convert to a .icns icon')); + } + return iconShellHelper(SCRIPT_PATHS.convertToIcns, icoSrc, `${getTmpDirPath()}/icon.icns`); +} + +export default { + singleIco, + convertToPng, + convertToIcns +}; diff --git a/src/helpers/singleIco.js b/src/helpers/singleIco.js deleted file mode 100644 index c2c0b81..0000000 --- a/src/helpers/singleIco.js +++ /dev/null @@ -1,52 +0,0 @@ -import shell from 'shelljs'; -import path from 'path'; -import tmp from 'tmp'; -import helpers from './helpers'; -const {isWindows} = helpers; - -tmp.setGracefulCleanup(); - -const EXTRACT_ICO_PATH = path.join(__dirname, '../..', 'bin/singleIco'); - -/** - * - * @param {string} icoSrc input .ico - * @param {string} dest has to be a .ico path - */ -function singleIco(icoSrc, dest) { - return new Promise((resolve, reject) => { - if (isWindows()) { - reject('OSX or Linux is required'); - return; - } - - shell.exec(`${EXTRACT_ICO_PATH} ${icoSrc} ${dest}`, {silent: true}, (exitCode, stdOut, stdError) => { - if (stdOut.includes('icon.iconset:error') || exitCode) { - if (exitCode) { - reject({ - stdOut: stdOut, - stdError: stdError - }); - return; - } - - reject(stdOut); - return; - } - - resolve(dest); - }); - }); -} - -/** - * Converts the ico to a temporary directory which will be cleaned up on process exit - * @param {string} icoSrc path to a .ico file - */ -function singleIcoTmp(icoSrc) { - const tempIconDirObj = tmp.dirSync({unsafeCleanup: true}); - const tempIconDirPath = tempIconDirObj.name; - return singleIco(icoSrc, `${tempIconDirPath}/icon.ico`); -} - -export default singleIcoTmp;