From 6fb3b92eb82bec77ff96075b28e5e93987e32b9f Mon Sep 17 00:00:00 2001 From: Ronan Jouchet Date: Tue, 14 Nov 2017 08:05:01 -0500 Subject: [PATCH] Upgrade dependencies and default to latest Electron 1.7.9 (PR #483) * Update deps except eslint * Update eslint and lint:fix (WIP, needs manual fixing for remaining 44 problems) * Manually fix remaining eslint errors * Document deprecation of `version-string` as of electron-packager 9.0.0 * Upgrade to Electron 1.7.9 (chrome-58, node-7.9.0, v8-5.8) * npm: Disable generation of package-lock.json and gitignore it --Trying this, package-lock is a pain in PRs. May not be a good idea (obviously we lose deps pinning), will revert if necessary.-- * npm tasks: add dev-up-win for Windows developers, and e2e for end-to-end tests. Update docs. * Move normalizeUrl test to a jest unit test, makes no sense to be in the mocha e2e tests * Switch from babel-preset-es2015 to babel-preset-env, with target.node=4.0. Seem like it's today's most convenient way to support the latest ES and let babel transpile to what makes sense for our currently minimal node version --- .eslintrc.yml | 2 + .gitignore | 1 + .npmrc | 1 + app/.npmrc | 1 + app/package-lock.json | 113 -------------------- app/package.json | 8 +- app/src/components/mainWindow/mainWindow.js | 6 +- app/src/components/menu/menu.js | 34 +++--- app/src/components/trayIcon/trayIcon.js | 4 +- app/src/main.js | 4 +- docs/api.md | 2 +- docs/development.md | 25 +++-- gulp/build/build-app.js | 4 +- gulp/build/build-static.js | 2 +- gulp/helpers/gulp-helpers.js | 10 +- gulp/watch.js | 8 +- package.json | 77 +++++++------ src/build/buildApp.js | 10 +- src/build/buildMain.js | 39 ++++--- src/constants.js | 2 +- src/helpers/convertToIcns.js | 2 +- src/helpers/helpers.js | 7 +- src/helpers/iconShellHelpers.js | 5 +- src/helpers/packagerConsole.js | 1 - src/infer/inferUserAgent.js | 10 +- src/options/fields/icon.test.js | 2 +- src/options/fields/name.test.js | 2 +- src/options/normalizeUrl.test.js | 13 +++ test/module/getIconSpec.js | 2 +- test/module/indexSpec.js | 14 +-- test/module/inferUserAgentSpec.js | 42 ++++---- test/module/options/normalizeUrlSpec.js | 25 ----- webpack.config.js | 2 +- 33 files changed, 190 insertions(+), 290 deletions(-) create mode 100644 .npmrc create mode 100644 app/.npmrc delete mode 100644 app/package-lock.json create mode 100644 src/options/normalizeUrl.test.js delete mode 100644 test/module/options/normalizeUrlSpec.js diff --git a/.eslintrc.yml b/.eslintrc.yml index 15f66cb..c223837 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -7,5 +7,7 @@ plugins: rules: # TODO: Remove this when we have shifted away from the async package no-shadow: 'warn' + # Remove no-console when we have moved to a proper logging lib with logging levels + no-console: 'off' # Gulpfiles and tests use dev dependencies import/no-extraneous-dependencies: ['error', { devDependencies: ['gulpfile.babel.js', 'gulp/**/**.js', 'test/**/**.js']}] diff --git a/.gitignore b/.gitignore index 5206a3c..d9a44d1 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,7 @@ .DS_Store # Node.js +package-lock.json # ignore compiled lib files lib/* diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..43c97e7 --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/app/.npmrc b/app/.npmrc new file mode 100644 index 0000000..43c97e7 --- /dev/null +++ b/app/.npmrc @@ -0,0 +1 @@ +package-lock=false diff --git a/app/package-lock.json b/app/package-lock.json deleted file mode 100644 index 8fb2a18..0000000 --- a/app/package-lock.json +++ /dev/null @@ -1,113 +0,0 @@ -{ - "name": "nativefier-placeholder", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "electron-dl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/electron-dl/-/electron-dl-1.8.0.tgz", - "integrity": "sha1-VmUtpVqv2kpwB09jE/33+UHsdSo=", - "requires": { - "pupa": "1.0.0", - "unused-filename": "0.1.0" - }, - "dependencies": { - "pupa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-1.0.0.tgz", - "integrity": "sha1-mpVopa9+ZXuEYqbp1TKHQ1YM7/Y=" - }, - "unused-filename": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/unused-filename/-/unused-filename-0.1.0.tgz", - "integrity": "sha1-5fM7yeSmP4f2TTwR0xl53vXS5/s=", - "requires": { - "modify-filename": "1.1.0", - "path-exists": "3.0.0" - }, - "dependencies": { - "modify-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/modify-filename/-/modify-filename-1.1.0.tgz", - "integrity": "sha1-mi3sg4Bvuy2XXyK+7IWcoms5OqE=" - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" - } - } - } - } - }, - "electron-window-state": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/electron-window-state/-/electron-window-state-4.1.1.tgz", - "integrity": "sha1-azT9wxs4UU3+yLfI97XUrdtnYy0=", - "requires": { - "deep-equal": "1.0.1", - "jsonfile": "2.4.0", - "mkdirp": "0.5.1" - }, - "dependencies": { - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "4.1.11" - }, - "dependencies": { - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "optional": true - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - } - } - } - } - }, - "source-map-support": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.14.tgz", - "integrity": "sha1-nURjdyWYuGJxtPUj9sH04Cp9au8=", - "requires": { - "source-map": "0.5.6" - }, - "dependencies": { - "source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" - } - } - }, - "wurl": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wurl/-/wurl-2.1.0.tgz", - "integrity": "sha1-ciS9DmYuUTUiHSWdjWAUHC0T0xA=" - } - } -} diff --git a/app/package.json b/app/package.json index 80bbd71..355782b 100644 --- a/app/package.json +++ b/app/package.json @@ -4,10 +4,10 @@ "description": "Placeholder for the nativefier cli to override with a target url", "main": "lib/main.js", "dependencies": { - "electron-dl": "^1.1.0", - "electron-window-state": "^4.1.0", - "source-map-support": "^0.4.0", - "wurl": "^2.1.0" + "electron-dl": "^1.10.0", + "electron-window-state": "^4.1.1", + "source-map-support": "^0.5.0", + "wurl": "^2.5.2" }, "devDependencies": {}, "scripts": { diff --git a/app/src/components/mainWindow/mainWindow.js b/app/src/components/mainWindow/mainWindow.js index 4bc5525..254fcc6 100644 --- a/app/src/components/mainWindow/mainWindow.js +++ b/app/src/components/mainWindow/mainWindow.js @@ -6,7 +6,9 @@ import helpers from './../../helpers/helpers'; import createMenu from './../menu/menu'; import initContextMenu from './../contextMenu/contextMenu'; -const { isOSX, linkIsInternal, getCssToInject, shouldInjectCss } = helpers; +const { + isOSX, linkIsInternal, getCssToInject, shouldInjectCss, +} = helpers; const ZOOM_INTERVAL = 0.1; @@ -125,7 +127,7 @@ function createMainWindow(inpOptions, onAppQuit, setDockBadge) { if (response !== 0) { return; } - const session = mainWindow.webContents.session; + const { session } = mainWindow.webContents; session.clearStorageData(() => { session.clearCache(() => { mainWindow.loadURL(options.targetUrl); diff --git a/app/src/components/menu/menu.js b/app/src/components/menu/menu.js index 82479cf..295be0b 100644 --- a/app/src/components/menu/menu.js +++ b/app/src/components/menu/menu.js @@ -13,23 +13,25 @@ import { Menu, shell, clipboard } from 'electron'; * @param clearAppData * @param disableDevTools */ -function createMenu({ nativefierVersion, - appQuit, - zoomIn, - zoomOut, - zoomReset, - zoomBuildTimeValue, - goBack, - goForward, - getCurrentUrl, - clearAppData, - disableDevTools }) { +function createMenu({ + nativefierVersion, + appQuit, + zoomIn, + zoomOut, + zoomReset, + zoomBuildTimeValue, + goBack, + goForward, + getCurrentUrl, + clearAppData, + disableDevTools, +}) { if (Menu.getApplicationMenu()) { return; } const zoomResetLabel = (zoomBuildTimeValue === 1.0) ? - 'Reset Zoom' : - `Reset Zoom (to ${zoomBuildTimeValue * 100}%, set at build time)`; + 'Reset Zoom' : + `Reset Zoom (to ${zoomBuildTimeValue * 100}%, set at build time)`; const template = [ { @@ -221,8 +223,8 @@ function createMenu({ nativefierVersion, ]; if (disableDevTools) { - // remove last item (dev tools) from menu > view - const submenu = template[1].submenu; + // remove last item (dev tools) from menu > view + const { submenu } = template[1]; submenu.splice(submenu.length - 1, 1); } @@ -272,7 +274,7 @@ function createMenu({ nativefierVersion, label: 'Bring All to Front', role: 'front', }, - ); + ); } const menu = Menu.buildFromTemplate(template); diff --git a/app/src/components/trayIcon/trayIcon.js b/app/src/components/trayIcon/trayIcon.js index 4a507be..b1fa49f 100644 --- a/app/src/components/trayIcon/trayIcon.js +++ b/app/src/components/trayIcon/trayIcon.js @@ -1,6 +1,8 @@ import path from 'path'; -const { app, Tray, Menu, ipcMain } = require('electron'); +const { + app, Tray, Menu, ipcMain, +} = require('electron'); /** * diff --git a/app/src/main.js b/app/src/main.js index 914478c..c136d7a 100644 --- a/app/src/main.js +++ b/app/src/main.js @@ -72,7 +72,7 @@ app.on('window-all-closed', () => { app.on('activate', (event, hasVisibleWindows) => { if (isOSX()) { - // this is called when the dock is clicked + // this is called when the dock is clicked if (!hasVisibleWindows) { mainWindow.show(); } @@ -108,7 +108,7 @@ app.on('ready', () => { }); app.on('login', (event, webContents, request, authInfo, callback) => { - // for http authentication + // for http authentication event.preventDefault(); if (appArgs.basicAuthUsername !== null && appArgs.basicAuthPassword !== null) { diff --git a/docs/api.md b/docs/api.md index e22f861..f45b85b 100644 --- a/docs/api.md +++ b/docs/api.md @@ -498,7 +498,7 @@ nativefier(options, function(error, appPath) { #### [version-string] -*Object* (**deprecated** and will be removed in a future major version (of `electron-packager`), please use the +*Object* (**deprecated** as removed in `electron-packager` 9.0.0, please use the [`win32metadata`](#win32metadata) parameter instead) #### [win32metadata] diff --git a/docs/development.md b/docs/development.md index 5d8a117..7992090 100644 --- a/docs/development.md +++ b/docs/development.md @@ -2,41 +2,39 @@ ## Environment Setup -First clone the project +First, clone the project ```bash git clone https://github.com/jiahaog/nativefier.git cd nativefier ``` -Install dependencies +Install dependencies and build: ```bash -# OSX and Linux +# macOS and Linux npm run dev-up # Windows -npm install -cd app -npm install +npm run dev-up-win ``` -Don't forget to compile source files: +If dependencies are installed and you just want to re-build, ```bash npm run build ``` -You can set up symlinks so that you can run `nativefier` for your local changes +You can set up a symbolic link so that running `nativefier` invokes your development version including your changes: ```bash npm link ``` -After doing so, you can then run Nativefier with your test parameters +After doing so (and not forgetting to build with `npm run build`), you can run Nativefier with your test parameters: ```bash -nativefier <...> +nativefier <--your-awesome-new-flag> ``` Or you can automatically watch the files for changes with: @@ -48,5 +46,12 @@ npm run watch ## Tests ```bash +# To run all tests (unit, end-to-end), npm test + +# To run only unit tests, +npm run jest + +# To run only end-to-end tests, +npm run e2e ``` diff --git a/gulp/build/build-app.js b/gulp/build/build-app.js index ab0b3e1..7df56d2 100644 --- a/gulp/build/build-app.js +++ b/gulp/build/build-app.js @@ -5,5 +5,5 @@ import PATHS from './../helpers/src-paths'; const webpackConfig = require('./../../webpack.config.js'); gulp.task('build-app', ['build-static'], () => gulp.src(PATHS.APP_MAIN_JS) - .pipe(webpack(webpackConfig)) - .pipe(gulp.dest(PATHS.APP_DEST))); + .pipe(webpack(webpackConfig)) + .pipe(gulp.dest(PATHS.APP_DEST))); diff --git a/gulp/build/build-static.js b/gulp/build/build-static.js index 543b4a4..1ecd88e 100644 --- a/gulp/build/build-static.js +++ b/gulp/build/build-static.js @@ -5,7 +5,7 @@ import helpers from './../helpers/gulp-helpers'; const { buildES6 } = helpers; gulp.task('build-static-not-js', () => gulp.src([PATHS.APP_STATIC_ALL, '!**/*.js']) - .pipe(gulp.dest(PATHS.APP_STATIC_DEST))); + .pipe(gulp.dest(PATHS.APP_STATIC_DEST))); gulp.task('build-static-js', done => buildES6(PATHS.APP_STATIC_JS, PATHS.APP_STATIC_DEST, done)); diff --git a/gulp/helpers/gulp-helpers.js b/gulp/helpers/gulp-helpers.js index 432a5ba..82149d8 100644 --- a/gulp/helpers/gulp-helpers.js +++ b/gulp/helpers/gulp-helpers.js @@ -15,11 +15,11 @@ function shellExec(cmd, silent, callback) { function buildES6(src, dest, callback) { return gulp.src(src) - .pipe(sourcemaps.init()) - .pipe(babel()) - .on('error', callback) - .pipe(sourcemaps.write('.')) - .pipe(gulp.dest(dest)); + .pipe(sourcemaps.init()) + .pipe(babel()) + .on('error', callback) + .pipe(sourcemaps.write('.')) + .pipe(gulp.dest(dest)); } export default { diff --git a/gulp/watch.js b/gulp/watch.js index 9bc325d..6bf762c 100644 --- a/gulp/watch.js +++ b/gulp/watch.js @@ -2,15 +2,15 @@ import gulp from 'gulp'; import PATHS from './helpers/src-paths'; gulp.task('watch', ['build'], () => { - const handleError = function (error) { + const handleError = function watch(error) { console.error(error); }; gulp.watch(PATHS.APP_ALL, ['build-app']) - .on('error', handleError); + .on('error', handleError); gulp.watch(PATHS.CLI_SRC_JS, ['build-cli']) - .on('error', handleError); + .on('error', handleError); gulp.watch(PATHS.TEST_SRC_JS, ['build-tests']) - .on('error', handleError); + .on('error', handleError); }); diff --git a/package.json b/package.json index 1cd81b4..72a5d01 100644 --- a/package.json +++ b/package.json @@ -12,8 +12,10 @@ "main": "lib/index.js", "scripts": { "dev-up": "npm install && (cd ./app && npm install) && npm run build", + "dev-up-win": "npm install & cd app & npm install & cd .. & npm run build", "test": "jest && gulp test", "jest": "jest", + "e2e": "gulp test", "tdd": "gulp tdd", "lint": "eslint .", "lint:fix": "eslint . --fix", @@ -39,54 +41,61 @@ }, "homepage": "https://github.com/jiahaog/nativefier#readme", "dependencies": { - "async": "^2.3.0", - "axios": "^0.16.1", - "babel-polyfill": "^6.7.2", - "cheerio": "^0.22.0", - "commander": "^2.9.0", - "electron-packager": "^8.6.0", + "async": "^2.6.0", + "axios": "^0.17.1", + "babel-polyfill": "^6.26.0", + "cheerio": "^1.0.0-rc.2", + "commander": "^2.11.0", + "electron-packager": "^9.1.0", "gitcloud": "^0.1.0", - "hasbin": "^1.2.0", - "lodash": "^4.0.0", - "loglevel": "^1.4.0", + "hasbin": "^1.2.3", + "lodash": "^4.17.4", + "loglevel": "^1.5.1", "ncp": "^2.0.0", "page-icon": "^0.3.0", "progress": "^2.0.0", - "sanitize-filename": "^1.5.3", - "shelljs": "^0.7.0", - "source-map-support": "^0.4.0", - "tmp": "0.0.31", - "validator": "^7.0.0" + "sanitize-filename": "^1.6.1", + "shelljs": "^0.7.8", + "source-map-support": "^0.5.0", + "tmp": "0.0.33", + "validator": "^9.1.1" }, "devDependencies": { - "babel-core": "^6.4.5", - "babel-jest": "^19.0.0", - "babel-loader": "^6.2.1", - "babel-preset-es2015": "^6.6.0", - "babel-register": "^6.6.0", - "chai": "^3.4.1", - "del": "^2.2.0", - "eslint": "^3.19.0", - "eslint-config-airbnb-base": "^11.1.3", - "eslint-plugin-import": "^2.2.0", - "gulp": "^3.9.0", - "gulp-babel": "^6.1.1", - "gulp-istanbul": "^1.1.1", - "gulp-mocha": "^4.3.0", - "gulp-sourcemaps": "^2.6.0", + "babel-core": "^6.26.0", + "babel-jest": "^21.2.0", + "babel-loader": "^7.1.2", + "babel-preset-env": "^1.6.1", + "babel-register": "^6.26.0", + "chai": "^4.1.2", + "del": "^3.0.0", + "eslint": "^4.11.0", + "eslint-config-airbnb-base": "^12.1.0", + "eslint-plugin-import": "^2.8.0", + "gulp": "^3.9.1", + "gulp-babel": "^7.0.0", + "gulp-istanbul": "^1.1.2", + "gulp-mocha": "^4.3.1", + "gulp-sourcemaps": "^2.6.1", "isparta": "^4.0.0", - "jest": "^20.0.3", - "regenerator-runtime": "^0.10.5", + "jest": "^21.2.1", + "regenerator-runtime": "^0.11.0", "require-dir": "^0.3.2", - "run-sequence": "^1.1.5", - "webpack-stream": "^3.1.0" + "run-sequence": "^2.2.0", + "webpack-stream": "^4.0.0" }, "engines": { "node": ">= 4.0" }, "babel": { "presets": [ - "es2015" + [ + "env", + { + "targets": { + "node": "4.0.0" + } + } + ] ] }, "jest": { diff --git a/src/build/buildApp.js b/src/build/buildApp.js index 01b903d..0aabb5b 100644 --- a/src/build/buildApp.js +++ b/src/build/buildApp.js @@ -60,7 +60,7 @@ function maybeCopyScripts(srcs, dest) { } const promises = srcs.map(src => new Promise((resolve, reject) => { if (!fs.existsSync(src)) { - reject('Error copying injection files: file not found'); + reject(new Error('Error copying injection files: file not found')); return; } @@ -76,7 +76,7 @@ function maybeCopyScripts(srcs, dest) { copy(src, path.join(dest, 'inject', destFileName), (error) => { if (error) { - reject(`Error Copying injection files: ${error}`); + reject(new Error(`Error Copying injection files: ${error}`)); return; } resolve(); @@ -95,7 +95,7 @@ function maybeCopyScripts(srcs, dest) { } function normalizeAppName(appName, url) { - // use a simple 3 byte random string to prevent collision + // use a simple 3 byte random string to prevent collision const hash = crypto.createHash('md5'); hash.update(url); const postFixHash = hash.digest('hex').substring(0, 6); @@ -130,8 +130,8 @@ function buildApp(src, dest, options, callback) { fs.writeFileSync(path.join(dest, '/nativefier.json'), JSON.stringify(appArgs)); maybeCopyScripts(options.inject, dest) - .catch((error) => { - console.warn(error); + .catch((err) => { + console.warn(err); }) .then(() => { changeAppPackageJsonName(dest, appArgs.name, appArgs.targetUrl); diff --git a/src/build/buildMain.js b/src/build/buildMain.js index f3cfca7..10318b8 100644 --- a/src/build/buildMain.js +++ b/src/build/buildMain.js @@ -13,7 +13,7 @@ import PackagerConsole from './../helpers/packagerConsole'; import buildApp from './buildApp'; const copy = ncp.ncp; -const isWindows = helpers.isWindows; +const { isWindows } = helpers; /** * Checks the app path array to determine if the packaging was completed successfully @@ -153,7 +153,6 @@ function buildMain(inpOptions, callback) { const options = Object.assign({}, inpOptions); // pre process app - const tmpObj = tmp.dirSync({ unsafeCleanup: true }); const tmpPath = tmpObj.name; @@ -163,37 +162,37 @@ function buildMain(inpOptions, callback) { const progress = new DishonestProgress(5); async.waterfall([ - (callback) => { + (cb) => { progress.tick('inferring'); optionsFactory(options) .then((result) => { - callback(null, result); + cb(null, result); }).catch((error) => { - callback(error); + cb(error); }); }, - (options, callback) => { + (opts, cb) => { progress.tick('copying'); - buildApp(options.dir, tmpPath, options, (error) => { + buildApp(opts.dir, tmpPath, opts, (error) => { if (error) { - callback(error); + cb(error); return; } // Change the reference file for the Electron app to be the temporary path - const newOptions = Object.assign({}, options, { dir: tmpPath }); - callback(null, newOptions); + const newOptions = Object.assign({}, opts, { dir: tmpPath }); + cb(null, newOptions); }); }, - (options, callback) => { + (opts, cb) => { progress.tick('icons'); - iconBuild(options, (error, optionsWithIcon) => { - callback(null, optionsWithIcon); + iconBuild(opts, (error, optionsWithIcon) => { + cb(null, optionsWithIcon); }); }, - (options, callback) => { + (opts, cb) => { progress.tick('packaging'); // maybe skip passing icon parameter to electron packager - let packageOptions = maybeNoIconOption(options); + let packageOptions = maybeNoIconOption(opts); // maybe skip passing other parameters to electron packager packageOptions = maybeNoAppCopyrightOption(packageOptions); packageOptions = maybeNoAppVersionOption(packageOptions); @@ -208,20 +207,20 @@ function buildMain(inpOptions, callback) { packagerConsole.restore(); // pass options which still contains the icon to waterfall - callback(error, options, appPathArray); + cb(error, opts, appPathArray); }); }, - (options, appPathArray, callback) => { + (opts, appPathArray, cb) => { progress.tick('finalizing'); // somehow appPathArray is a 1 element array const appPath = getAppPath(appPathArray); if (!appPath) { - callback(); + cb(); return; } - maybeCopyIcons(options, appPath, (error) => { - callback(error, appPath); + maybeCopyIcons(opts, appPath, (error) => { + cb(error, appPath); }); }, ], (error, appPath) => { diff --git a/src/constants.js b/src/constants.js index 6801592..03cc7c6 100644 --- a/src/constants.js +++ b/src/constants.js @@ -1,5 +1,5 @@ import path from 'path'; export const DEFAULT_APP_NAME = 'APP'; -export const ELECTRON_VERSION = '1.6.6'; +export const ELECTRON_VERSION = '1.7.9'; export const PLACEHOLDER_APP_DIR = path.join(__dirname, './../', 'app'); diff --git a/src/helpers/convertToIcns.js b/src/helpers/convertToIcns.js index 5c86199..439820d 100644 --- a/src/helpers/convertToIcns.js +++ b/src/helpers/convertToIcns.js @@ -3,7 +3,7 @@ import path from 'path'; import tmp from 'tmp'; import helpers from './helpers'; -const isOSX = helpers.isOSX; +const { isOSX } = helpers; tmp.setGracefulCleanup(); const PNG_TO_ICNS_BIN_PATH = path.join(__dirname, '../..', 'bin/convertToIcns'); diff --git a/src/helpers/helpers.js b/src/helpers/helpers.js index 1341650..ac7e1af 100644 --- a/src/helpers/helpers.js +++ b/src/helpers/helpers.js @@ -12,10 +12,9 @@ function isWindows() { } function downloadFile(fileUrl) { - return axios.get( - fileUrl, { - responseType: 'arraybuffer', - }) + return axios.get(fileUrl, { + responseType: 'arraybuffer', + }) .then((response) => { if (!response.data) { return null; diff --git a/src/helpers/iconShellHelpers.js b/src/helpers/iconShellHelpers.js index 947edb7..3a8cfa4 100644 --- a/src/helpers/iconShellHelpers.js +++ b/src/helpers/iconShellHelpers.js @@ -23,12 +23,13 @@ const SCRIPT_PATHS = { function iconShellHelper(shellScriptPath, icoSrc, dest) { return new Promise((resolve, reject) => { if (isWindows()) { - reject('OSX or Linux is required'); + reject(new Error('OSX or Linux is required')); return; } shell.exec(`${shellScriptPath} ${icoSrc} ${dest}`, { silent: true }, (exitCode, stdOut, stdError) => { if (exitCode) { + // eslint-disable-next-line prefer-promise-reject-errors reject({ stdOut, stdError, @@ -66,7 +67,7 @@ function convertToIco(icoSrc) { function convertToIcns(icoSrc) { if (!isOSX()) { - return new Promise((resolve, reject) => reject('OSX is required to convert to a .icns icon')); + return new Promise((resolve, reject) => reject(new Error('OSX is required to convert to a .icns icon'))); } return iconShellHelper(SCRIPT_PATHS.convertToIcns, icoSrc, `${getTmpDirPath()}/icon.icns`); } diff --git a/src/helpers/packagerConsole.js b/src/helpers/packagerConsole.js index a7ea9b6..8e3939d 100644 --- a/src/helpers/packagerConsole.js +++ b/src/helpers/packagerConsole.js @@ -1,6 +1,5 @@ // TODO: remove this file and use quiet mode of new version of electron packager class PackagerConsole { - constructor() { this.logs = []; } diff --git a/src/infer/inferUserAgent.js b/src/infer/inferUserAgent.js index 7f9258e..d643c41 100644 --- a/src/infer/inferUserAgent.js +++ b/src/infer/inferUserAgent.js @@ -3,7 +3,7 @@ import _ from 'lodash'; import log from 'loglevel'; const ELECTRON_VERSIONS_URL = 'https://atom.io/download/atom-shell/index.json'; -const DEFAULT_CHROME_VERSION = '56.0.2924.87'; +const DEFAULT_CHROME_VERSION = '58.0.3029.110'; function getChromeVersionForElectronVersion(electronVersion, url = ELECTRON_VERSIONS_URL) { return axios.get(url, { timeout: 5000 }) @@ -12,9 +12,11 @@ function getChromeVersionForElectronVersion(electronVersion, url = ELECTRON_VERS throw new Error(`Bad request: Status code ${response.status}`); } - const data = response.data; - const electronVersionToChromeVersion = _.zipObject(data.map(d => d.version), - data.map(d => d.chrome)); + const { data } = response; + const electronVersionToChromeVersion = _.zipObject( + data.map(d => d.version), + data.map(d => d.chrome), + ); if (!(electronVersion in electronVersionToChromeVersion)) { throw new Error(`Electron version '${electronVersion}' not found in retrieved version list!`); diff --git a/src/options/fields/icon.test.js b/src/options/fields/icon.test.js index 92ac5ba..11ff6f0 100644 --- a/src/options/fields/icon.test.js +++ b/src/options/fields/icon.test.js @@ -29,7 +29,7 @@ describe('when the icon parameter is not passed', () => { describe('when inferIcon resolves with an error', () => { test('it should handle the error', () => { - inferIcon.mockImplementationOnce(() => Promise.reject('some error')); + inferIcon.mockImplementationOnce(() => Promise.reject(new Error('some error'))); const params = { targetUrl: 'some url', platform: 'mac' }; return icon(params).then((result) => { diff --git a/src/options/fields/name.test.js b/src/options/fields/name.test.js index 6ccebff..e4913e0 100644 --- a/src/options/fields/name.test.js +++ b/src/options/fields/name.test.js @@ -75,7 +75,7 @@ describe('handling inferTitle results', () => { describe('when inferTitle resolves with an error', () => { test('it should return the default app name', () => { - inferTitle.mockImplementationOnce(() => Promise.reject('some error')); + inferTitle.mockImplementationOnce(() => Promise.reject(new Error('some error'))); return name(params).then((result) => { expect(result).toBe(DEFAULT_APP_NAME); diff --git a/src/options/normalizeUrl.test.js b/src/options/normalizeUrl.test.js new file mode 100644 index 0000000..08d9425 --- /dev/null +++ b/src/options/normalizeUrl.test.js @@ -0,0 +1,13 @@ +import normalizeUrl from './normalizeUrl'; + +test("a proper URL shouldn't be mangled", () => { + expect(normalizeUrl('http://www.google.com')).toEqual('http://www.google.com'); +}); + +test('missing protocol should default to http', () => { + expect(normalizeUrl('www.google.com')).toEqual('http://www.google.com'); +}); + +test("a proper URL shouldn't be mangled", () => { + expect(() => { normalizeUrl('http://ssddfoo bar'); }).toThrow('Your Url: "http://ssddfoo bar" is invalid!'); +}); diff --git a/test/module/getIconSpec.js b/test/module/getIconSpec.js index af487aa..06b5012 100644 --- a/test/module/getIconSpec.js +++ b/test/module/getIconSpec.js @@ -7,7 +7,7 @@ import os from 'os'; import path from 'path'; import convertToIcns from './../../lib/helpers/convertToIcns'; -const assert = chai.assert; +const { assert } = chai; // Prerequisite for test: to use OSX with sips, iconutil and imagemagick convert diff --git a/test/module/indexSpec.js b/test/module/indexSpec.js index 27e8ede..6ad3bd3 100644 --- a/test/module/indexSpec.js +++ b/test/module/indexSpec.js @@ -8,7 +8,7 @@ import nativefier from './../../lib/index'; const PLATFORMS = ['darwin', 'linux']; tmp.setGracefulCleanup(); -const assert = chai.assert; +const { assert } = chai; function checkApp(appPath, inputOptions, callback) { try { @@ -32,16 +32,16 @@ function checkApp(appPath, inputOptions, callback) { const nativefierConfig = JSON.parse(fs.readFileSync(nativefierConfigPath)); assert.strictEqual(inputOptions.targetUrl, nativefierConfig.targetUrl, 'Packaged app must have the same targetUrl as the input parameters'); - // app name is not consistent for linux - // assert.strictEqual(inputOptions.appName, nativefierConfig.name, - // 'Packaged app must have the same name as the input parameters'); + // app name is not consistent for linux + // assert.strictEqual(inputOptions.appName, nativefierConfig.name, + // 'Packaged app must have the same name as the input parameters'); callback(); } catch (exception) { callback(exception); } } -describe('Nativefier Module', function () { +describe('Nativefier Module', function testNativefierModule() { this.timeout(240000); it('Can build an app from a target url', (done) => { async.eachSeries(PLATFORMS, (platform, callback) => { @@ -63,8 +63,8 @@ describe('Nativefier Module', function () { return; } - checkApp(appPath, options, (error) => { - callback(error); + checkApp(appPath, options, (err) => { + callback(err); }); }); }, (error) => { diff --git a/test/module/inferUserAgentSpec.js b/test/module/inferUserAgentSpec.js index db8acc3..f5be960 100644 --- a/test/module/inferUserAgentSpec.js +++ b/test/module/inferUserAgentSpec.js @@ -2,7 +2,7 @@ import chai from 'chai'; import _ from 'lodash'; import inferUserAgent from './../../lib/infer/inferUserAgent'; -const assert = chai.assert; +const { assert } = chai; const TEST_RESULT = { darwin: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36', @@ -12,36 +12,36 @@ const TEST_RESULT = { function testPlatform(platform) { return inferUserAgent('0.37.1', platform) - .then((userAgent) => { - assert.equal(userAgent, TEST_RESULT[platform], 'Correct user agent should be inferred'); - }); + .then((userAgent) => { + assert.equal(userAgent, TEST_RESULT[platform], 'Correct user agent should be inferred'); + }); } -describe('Infer User Agent', function () { +describe('Infer User Agent', function testInferUserAgent() { this.timeout(15000); it('Can infer userAgent for all platforms', (done) => { const testPromises = _.keys(TEST_RESULT).map(platform => testPlatform(platform)); Promise - .all(testPromises) - .then(() => { - done(); - }) - .catch((error) => { - done(error); - }); + .all(testPromises) + .then(() => { + done(); + }) + .catch((error) => { + done(error); + }); }); it('Connection error will still get a user agent', (done) => { const TIMEOUT_URL = 'http://www.google.com:81/'; inferUserAgent('1.6.7', 'darwin', TIMEOUT_URL) - .then((userAgent) => { - assert.equal( - userAgent, - 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36', - 'Expect default user agent on connection error', - ); - done(); - }) - .catch(done); + .then((userAgent) => { + assert.equal( + userAgent, + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36', + 'Expect default user agent on connection error', + ); + done(); + }) + .catch(done); }); }); diff --git a/test/module/options/normalizeUrlSpec.js b/test/module/options/normalizeUrlSpec.js deleted file mode 100644 index 3b64b2c..0000000 --- a/test/module/options/normalizeUrlSpec.js +++ /dev/null @@ -1,25 +0,0 @@ -import chai from 'chai'; -import normalizeUrl from '../../../src/options/normalizeUrl'; - -const assert = chai.assert; -const expect = chai.expect; - -describe('Normalize URL', () => { - describe('given a valid URL without a protocol', () => { - it('should allow the url', () => { - assert.equal(normalizeUrl('http://www.google.com'), 'http://www.google.com'); - }); - }); - - describe('given a valid URL without a protocol', () => { - it('should allow the url and prepend the HTTP protocol', () => { - assert.equal(normalizeUrl('www.google.com'), 'http://www.google.com'); - }); - }); - - describe('given an invalid URL', () => { - it('should throw an exception', () => { - expect(() => normalizeUrl('http://ssddfoo bar')).to.throw('Your Url: "http://ssddfoo bar" is invalid!'); - }); - }); -}); diff --git a/webpack.config.js b/webpack.config.js index 14f7c1a..6de0624 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -17,7 +17,7 @@ module.exports = { externals: nodeModules, module: { loaders: [ - { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader' }, + { test: /\.js$/, exclude: /node_modules/, loader: 'babel-loader' }, ], }, devtool: 'source-map',