#! /usr/bin/env node import 'source-map-support/register'; import program from 'commander'; import nativefier from './index'; const dns = require('dns'); const log = require('loglevel'); const packageJson = require('./../package'); function collect(val, memo) { memo.push(val); return memo; } function parseJson(val) { if (!val) return {}; return JSON.parse(val); } function getProcessEnvs(val) { if (!val) return {}; const pEnv = {}; pEnv.processEnvs = parseJson(val); return pEnv; } function checkInternet() { dns.lookup('npmjs.com', (err) => { if (err && err.code === 'ENOTFOUND') { log.warn( '\nNo Internet Connection\nTo offline build, download electron from https://github.com/electron/electron/releases\nand place in ~/AppData/Local/electron/Cache/ on Windows,\n~/.cache/electron on Linux or ~/Library/Caches/electron/ on Mac\nUse --electron-version to specify the version you downloaded.', ); } }); } if (require.main === module) { program .version(packageJson.version, '--version, -V, -v') .arguments(' [dest]') .action((targetUrl, appDir) => { program.targetUrl = targetUrl; program.out = appDir; }) .option('-n, --name ', 'app name') .option('-p, --platform ', "'osx', 'mas', 'linux' or 'windows'") .option('-a, --arch ', "'ia32' or 'x64' or 'armv7l'") .option( '--app-version ', 'The release version of the application. Maps to the `ProductVersion` metadata property on Windows, and `CFBundleShortVersionString` on OS X.', ) .option( '--build-version ', 'The build version of the application. Maps to the `FileVersion` metadata property on Windows, and `CFBundleVersion` on OS X.', ) .option( '--app-copyright ', 'The human-readable copyright line for the app. Maps to the `LegalCopyright` metadata property on Windows, and `NSHumanReadableCopyright` on OS X', ) .option( '--win32metadata ', 'a JSON string of key/value pairs of application metadata (ProductName, InternalName, FileDescription) to embed into the executable (Windows only).', parseJson, ) .option( '-e, --electron-version ', "electron version to package, without the 'v', see https://github.com/atom/electron/releases", ) .option( '--no-overwrite', 'do not override output directory if it already exists, defaults to false', ) .option( '-c, --conceal', 'packages the source code within your app into an archive, defaults to false, see http://electron.atom.io/docs/v0.36.0/tutorial/application-packaging/', ) .option( '--counter', 'if the target app should use a persistent counter badge in the dock (macOS only), defaults to false', ) .option( '--bounce', 'if the the dock icon should bounce when counter increases (macOS only), defaults to false', ) .option( '-i, --icon ', 'the icon file to use as the icon for the app (should be a .png)', ) .option( '--width ', 'set window default width, defaults to 1280px', parseInt, ) .option( '--height ', 'set window default height, defaults to 800px', parseInt, ) .option( '--min-width ', 'set window minimum width, defaults to 0px', parseInt, ) .option( '--min-height ', 'set window minimum height, defaults to 0px', parseInt, ) .option( '--max-width ', 'set window maximum width, default is no limit', parseInt, ) .option( '--max-height ', 'set window maximum height, default is no limit', parseInt, ) .option('--x ', 'set window x location', parseInt) .option('--y ', 'set window y location', parseInt) .option('-m, --show-menu-bar', 'set menu bar visible, defaults to false') .option( '-f, --fast-quit', 'quit app after window close (macOS only), defaults to false', ) .option('-u, --user-agent ', 'set the user agent string for the app') .option( '--honest', 'prevent the nativefied app from changing the user agent string to masquerade as a regular chrome browser', ) .option('--ignore-certificate', 'ignore certificate related errors') .option('--disable-gpu', 'disable hardware acceleration') .option( '--ignore-gpu-blacklist', 'allow WebGl apps to work on non supported graphics cards', ) .option('--enable-es3-apis', 'force activation of WebGl 2.0') .option( '--insecure', 'enable loading of insecure content, defaults to false', ) .option('--flash', 'if flash should be enabled') .option( '--flash-path ', 'path to Chrome flash plugin, find it in `Chrome://plugins`', ) .option( '--disk-cache-size ', 'forces the maximum disk space (in bytes) to be used by the disk cache', ) .option( '--inject ', 'path to a CSS/JS file to be injected', collect, [], ) .option( '--full-screen', 'if the app should always be started in full screen', ) .option('--maximize', 'if the app should always be started maximized') .option('--hide-window-frame', 'disable window frame and controls') .option('--verbose', 'if verbose logs should be displayed') .option('--disable-context-menu', 'disable the context menu') .option('--disable-dev-tools', 'disable developer tools') .option( '--zoom ', 'default zoom factor to use when the app is opened, defaults to 1.0', parseFloat, ) .option( '--internal-urls ', 'regular expression of URLs to consider "internal"; all other URLs will be opened in an external browser. (default: URLs on same second-level domain as app)', ) .option( '--crash-reporter ', 'remote server URL to send crash reports', ) .option( '--single-instance', 'allow only a single instance of the application', ) .option( '--processEnvs ', 'a JSON string of key/value pairs to be set as environment variables before any browser windows are opened.', getProcessEnvs, ) .option( '--file-download-options ', 'a JSON string of key/value pairs to be set as file download options. See https://github.com/sindresorhus/electron-dl for available options.', parseJson, ) .option('--tray', 'allow app to stay in system tray') .option('--basic-auth-username ', 'basic http(s) auth username') .option('--basic-auth-password ', 'basic http(s) auth password') .option('--always-on-top', 'enable always on top window') .option( '--title-bar-style ', "(macOS only) set title bar style ('hidden', 'hiddenInset'). Consider injecting custom CSS (via --inject) for better integration.", ) .parse(process.argv); if (!process.argv.slice(2).length) { program.help(); } checkInternet(); nativefier(program, (error, appPath) => { if (error) { log.error(error); return; } if (!appPath) { // app exists and --overwrite is not passed return; } log.info(`App built to ${appPath}`); }); }