diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..63f0349 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,25 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true + +# Matches multiple files with brace expansion notation +# Set default charset +[*.{js,py}] +charset = utf-8 +indent_style = space +indent_size = 4 + +# 2 space indentation +[*.{html,css,less,scss,yml,json}] +indent_style = space +indent_size = 2 + +# Tab indentation (no size specified) +[Makefile] +indent_style = tab diff --git a/.gitignore b/.gitignore index e6bba47..4cd9577 100644 --- a/.gitignore +++ b/.gitignore @@ -1,52 +1,43 @@ -node_modules +# OSX .DS_Store -build/ +# Node.js +# ignore compiled lib files +lib +dist +# Logs +logs +*.log +npm-debug.log* -# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git +node_modules + +# IntelliJ project files +.idea *.iml - -## Directory-based project format: -.idea/ -# if you remove the above rule, at least ignore the following: - -# User-specific stuff: -# .idea/workspace.xml -# .idea/tasks.xml -# .idea/dictionaries - -# Sensitive or high-churn files: -# .idea/dataSources.ids -# .idea/dataSources.xml -# .idea/sqlDataSources.xml -# .idea/dynamic.xml -# .idea/uiDesigner.xml - -# Gradle: -# .idea/gradle.xml -# .idea/libraries - -# Mongo Explorer plugin: -# .idea/mongoSettings.xml - -## File-based project format: -*.ipr -*.iws - -## Plugin-specific files: - -# IntelliJ -/out/ - -# mpeltonen/sbt-idea plugin -.idea_modules/ - -# JIRA plugin -atlassian-ide-plugin.xml - -# Crashlytics plugin (for Android Studio and IntelliJ) -com_crashlytics_export_strings.xml -crashlytics.properties -crashlytics-build.properties \ No newline at end of file +out +gen diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index dd5ab9b..0000000 --- a/.travis.yml +++ /dev/null @@ -1,3 +0,0 @@ -language: node_js -node_js: - - '0.12' diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 77b7956..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,9 +0,0 @@ -Please provide the following information when opening issues: - -- Which version of electron-packager are you using? -- What cli arguments are you passing? -- What platform are you running electron-packager on? What platform(s) are you building for? -- Is there a stack trace in the error message you're seeing? -- If possible, please provide instructions to reproduce your problem - -Thanks! diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 7fc1645..0000000 --- a/LICENSE +++ /dev/null @@ -1,23 +0,0 @@ -Copyright (c) 2015 Max Ogden -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -* Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -* Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/cli.js b/cli.js deleted file mode 100755 index aec93ea..0000000 --- a/cli.js +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env node -var fs = require('fs'); -var args = require('minimist')(process.argv.slice(2), {boolean: ['prune', 'asar', 'all', 'overwrite']}); -var packager = require('./'); -var usage = fs.readFileSync(__dirname + '/usage.txt').toString(); -var validator = require('validator'); -var tempDir = require('./tempDir'); - - -args.dir = 'blah'; // set to true first -args.name = args._[0]; -args.target = args._[1]; - -var protocolSchemes = [].concat(args.protocol || []); -var protocolNames = [].concat(args['protocol-name'] || []); - -if (protocolSchemes && protocolNames && protocolNames.length === protocolSchemes.length) { - args.protocols = protocolSchemes.map(function (scheme, i) { - return {schemes: [scheme], name: protocolNames[i]}; - }) -} - -if (!args.dir || !args.name || !args.version || !args.target || (!args.all && (!args.platform || !args.arch))) { - console.error(usage); - - process.exit(1); -} - - -if (!validator.isURL(args.target)) { - console.error('Enter a valid target url'); - process.exit(1); -} - -tempDir(args.name, args.target, args.badge, args.width, args.height, function (error, appDir) { - - if (error) { - console.error(error); - process.exit(1); - } else { - - args.dir = appDir; - packager(args, function done(err, appPaths) { - if (err) { - if (err.message) console.error(err.message); - else console.error(err, err.stack); - process.exit(1); - } - - if (appPaths.length > 1) console.error('Wrote new apps to:\n' + appPaths.join('\n')); - else if (appPaths.length === 1) console.error('Wrote new app to', appPaths[0]); - }); - } - -}); diff --git a/collaborators.md b/collaborators.md deleted file mode 100644 index 0e4014a..0000000 --- a/collaborators.md +++ /dev/null @@ -1,15 +0,0 @@ -## Collaborators - -electron-packager is only possible due to the excellent work of the following collaborators: - - - - - - - - - - - -
maleptGitHub/malept
maxogdenGitHub/maxogden
shamaGitHub/shama
ferossGitHub/feross
sindresorhusGitHub/sindresorhus
mafintoshGitHub/mafintosh
kfranqueiroGitHub/kfranqueiro
jdenGitHub/jden
stefanbuckGitHub/stefanbuck
remixzGitHub/remixz
diff --git a/common.js b/common.js deleted file mode 100644 index 84ccd7f..0000000 --- a/common.js +++ /dev/null @@ -1,139 +0,0 @@ -var child = require('child_process') -var fs = require('fs') -var os = require('os') -var path = require('path') - -var asar = require('asar') -var mkdirp = require('mkdirp') -var ncp = require('ncp').ncp -var rimraf = require('rimraf') -var series = require('run-series') - -function asarApp (appPath, cb) { - var src = path.join(appPath) - var dest = path.join(appPath, '..', 'app.asar') - asar.createPackage(src, dest, function (err) { - if (err) return cb(err) - rimraf(src, function (err) { - if (err) return cb(err) - cb(null, dest) - }) - }) -} - -function generateFinalBasename (opts) { - return opts.name + '-' + opts.platform + '-' + opts.arch -} - -function generateFinalPath (opts) { - return path.join(opts.out || process.cwd(), generateFinalBasename(opts)) -} - -function userIgnoreFilter (opts) { - return function filter (file) { - file = file.split(path.resolve(opts.dir))[1] - - if (path.sep === '\\') { - // convert slashes so unix-format ignores work - file = file.replace(/\\/g, '/') - } - - var ignore = opts.ignore || [] - if (!Array.isArray(ignore)) ignore = [ignore] - for (var i = 0; i < ignore.length; i++) { - if (file.match(ignore[i])) { - return false - } - } - return true - } -} - -module.exports = { - generateFinalPath: generateFinalPath, - - initializeApp: function initializeApp (opts, templatePath, appRelativePath, callback) { - // Performs the following initial operations for an app: - // * Creates temporary directory - // * Copies template into temporary directory - // * Copies user's app into temporary directory - // * Prunes non-production node_modules (if opts.prune is set) - // * Creates an asar (if opts.asar is set) - - var tempParent = path.join(os.tmpdir(), 'electron-packager', opts.platform + '-' + opts.arch) - var tempPath = path.join(tempParent, generateFinalBasename(opts)) - // Path to `app` directory - var appPath = path.join(tempPath, appRelativePath) - - var operations = [ - function (cb) { - rimraf(tempParent, function () { - // Ignore errors (e.g. directory didn't exist anyway) - cb() - }) - }, - function (cb) { - mkdirp(tempPath, cb) - }, - function (cb) { - ncp(templatePath, tempPath, cb) - }, - function (cb) { - ncp(opts.dir, appPath, {filter: userIgnoreFilter(opts), dereference: true}, cb) - } - ] - - // Prune and asar are now performed before platform-specific logic, primarily so that - // appPath is predictable (e.g. before .app is renamed for mac) - if (opts.prune) { - operations.push(function (cb) { - child.exec('npm prune --production', {cwd: appPath}, cb) - }) - } - - if (opts.asar) { - operations.push(function (cb) { - asarApp(path.join(appPath), cb) - }) - } - - series(operations, function (err) { - if (err) return callback(err) - // Resolve to path to temporary app folder for platform-specific processes to use - callback(null, tempPath) - }) - }, - - moveApp: function finalizeApp (opts, tempPath, callback) { - var finalPath = generateFinalPath(opts) - // Prefer ncp over mv (which seems to cause issues on Win8) - series([ - function (cb) { - mkdirp(finalPath, cb) - }, - function (cb) { - ncp(tempPath, finalPath, cb) - } - ], function (err) { - callback(err, finalPath) - }) - }, - - normalizeExt: function normalizeExt (filename, targetExt, cb) { - // Forces a filename to a given extension and fires the given callback with the normalized filename, - // if it exists. Otherwise reports the error from the fs.stat call. - // (Used for resolving icon filenames, particularly during --all runs.) - - // This error path is used by win32.js if no icon is specified - if (!filename) return cb(new Error('No filename specified to normalizeExt')) - - var ext = path.extname(filename) - if (ext !== targetExt) { - filename = filename.slice(0, filename.length - ext.length) + targetExt - } - - fs.stat(filename, function (err) { - cb(err, err ? null : filename) - }) - } -} diff --git a/index.js b/index.js deleted file mode 100644 index b506245..0000000 --- a/index.js +++ /dev/null @@ -1,169 +0,0 @@ -var path = require('path') -var fs = require('fs') -var os = require('os') - -var download = require('electron-download') -var extract = require('extract-zip') -var mkdirp = require('mkdirp') -var rimraf = require('rimraf') -var series = require('run-series') -var common = require('./common') - -var supportedArchs = { - ia32: 1, - x64: 1 -} - -var supportedPlatforms = { - // Maps to module ID for each platform (lazy-required if used) - darwin: './mac', - linux: './linux', - win32: './win32' -} - -var tempBase = path.join(os.tmpdir(), 'electron-packager') - -function testSymlink (cb) { - var testPath = path.join(tempBase, 'symlink-test') - var testFile = path.join(testPath, 'test') - var testLink = path.join(testPath, 'testlink') - series([ - function (cb) { - mkdirp(testPath, cb) - }, - function (cb) { - fs.writeFile(testFile, '', cb) - }, - function (cb) { - fs.symlink(testFile, testLink, cb) - } - ], function (err) { - var result = !err - rimraf(testPath, function () { - cb(result) // ignore errors on cleanup - }) - }) -} - -function validateList (list, supported, name) { - // Validates list of architectures or platforms. - // Returns a normalized array if successful, or an error message string otherwise. - - if (!list) return 'Must specify ' + name - if (list === 'all') return Object.keys(supported) - - if (!Array.isArray(list)) list = list.split(',') - for (var i = list.length; i--;) { - if (!supported[list[i]]) { - return 'Unsupported ' + name + ' ' + list[i] + '; must be one of: ' + Object.keys(supported).join(', ') - } - } - - return list -} - -function createSeries (opts, archs, platforms) { - var combinations = [] - archs.forEach(function (arch) { - platforms.forEach(function (platform) { - // Electron does not have 32-bit releases for Mac OS X, so skip that combination - if (platform === 'darwin' && arch === 'ia32') return - combinations.push({ - platform: platform, - arch: arch, - version: opts.version - }) - }) - }) - - return [ - function (cb) { - rimraf(tempBase, cb) - } - ].concat(combinations.map(function (combination) { - var arch = combination.arch - var platform = combination.platform - var version = combination.version - - return function (callback) { - download(combination, function (err, zipPath) { - if (err) return callback(err) - - var tmpDir = path.join(tempBase, platform + '-' + arch + '-template') - - var operations = [ - function (cb) { - mkdirp(tmpDir, cb) - }, - function (cb) { - extract(zipPath, {dir: tmpDir}, cb) - } - ] - - function createApp (comboOpts) { - console.error('Packaging app for platform', platform + ' ' + arch, 'using electron v' + version) - series(operations, function () { - require(supportedPlatforms[platform]).createApp(comboOpts, tmpDir, callback) - }) - } - - function checkOverwrite () { - // Create delegated options object with specific platform and arch, for output directory naming - var comboOpts = Object.create(opts) - comboOpts.arch = arch - comboOpts.platform = platform - - var finalPath = common.generateFinalPath(comboOpts) - fs.exists(finalPath, function (exists) { - if (exists) { - if (opts.overwrite) { - rimraf(finalPath, function () { - createApp(comboOpts) - }) - } else { - console.error('Skipping ' + platform + ' ' + arch + - ' (output dir already exists, use --overwrite to force)') - callback() - } - } else { - createApp(comboOpts) - } - }) - } - - if (combination.platform === 'darwin') { - testSymlink(function (result) { - if (result) return checkOverwrite() - - console.error('Cannot create symlinks; skipping darwin platform') - callback() - }) - } else { - checkOverwrite() - } - }) - } - })) -} - -module.exports = function packager (opts, cb) { - var archs = validateList(opts.all ? 'all' : opts.arch, supportedArchs, 'arch') - var platforms = validateList(opts.all ? 'all' : opts.platform, supportedPlatforms, 'platform') - if (!opts.version) return cb(new Error('Must specify version')) - if (!Array.isArray(archs)) return cb(new Error(archs)) - if (!Array.isArray(platforms)) return cb(new Error(platforms)) - - // Ignore this and related modules by default - var defaultIgnores = ['/node_modules/electron-prebuilt($|/)', '/node_modules/electron-packager($|/)', '/\.git($|/)'] - if (opts.ignore && !Array.isArray(opts.ignore)) opts.ignore = [opts.ignore] - opts.ignore = (opts.ignore) ? opts.ignore.concat(defaultIgnores) : defaultIgnores - - series(createSeries(opts, archs, platforms), function (err, appPaths) { - if (err) return cb(err) - - cb(null, appPaths.filter(function (appPath) { - // Remove falsy entries (e.g. skipped platforms) - return appPath - })) - }) -} diff --git a/linux.js b/linux.js deleted file mode 100644 index 5e05ae1..0000000 --- a/linux.js +++ /dev/null @@ -1,15 +0,0 @@ -var path = require('path') -var mv = require('mv') -var common = require('./common') - -module.exports = { - createApp: function createApp (opts, templatePath, callback) { - common.initializeApp(opts, templatePath, path.join('resources', 'app'), function buildLinuxApp (err, tempPath) { - if (err) return callback(err) - mv(path.join(tempPath, 'electron'), path.join(tempPath, opts.name), function (err) { - if (err) return callback(err) - common.moveApp(opts, tempPath, callback) - }) - }) - } -} diff --git a/mac.js b/mac.js deleted file mode 100644 index 6045488..0000000 --- a/mac.js +++ /dev/null @@ -1,87 +0,0 @@ -var path = require('path') -var fs = require('fs') -var child = require('child_process') - -var plist = require('plist') -var mv = require('mv') -var ncp = require('ncp').ncp -var series = require('run-series') -var common = require('./common') - -module.exports = { - createApp: function createApp (opts, templatePath, callback) { - var appRelativePath = path.join('Electron.app', 'Contents', 'Resources', 'app') - common.initializeApp(opts, templatePath, appRelativePath, function buildMacApp (err, tempPath) { - if (err) return callback(err) - - var contentsPath = path.join(tempPath, 'Electron.app', 'Contents') - var helperPath = path.join(contentsPath, 'Frameworks', 'Electron Helper.app') - var appPlistFilename = path.join(contentsPath, 'Info.plist') - var helperPlistFilename = path.join(helperPath, 'Contents', 'Info.plist') - var appPlist = plist.parse(fs.readFileSync(appPlistFilename).toString()) - var helperPlist = plist.parse(fs.readFileSync(helperPlistFilename).toString()) - - // Update plist files - var defaultBundleName = 'com.electron.' + opts.name.toLowerCase().replace(/ /g, '_') - var appVersion = opts['app-version'] - - appPlist.CFBundleDisplayName = opts.name - appPlist.CFBundleIdentifier = opts['app-bundle-id'] || defaultBundleName - appPlist.CFBundleName = opts.name - helperPlist.CFBundleIdentifier = opts['helper-bundle-id'] || defaultBundleName + '.helper' - helperPlist.CFBundleName = opts.name - - if (appVersion) { - appPlist.CFBundleVersion = appVersion - } - - if (opts.protocols) { - helperPlist.CFBundleURLTypes = appPlist.CFBundleURLTypes = opts.protocols.map(function (protocol) { - return { - CFBundleURLName: protocol.name, - CFBundleURLSchemes: [].concat(protocol.schemes) - } - }) - } - - fs.writeFileSync(appPlistFilename, plist.build(appPlist)) - fs.writeFileSync(helperPlistFilename, plist.build(helperPlist)) - - var operations = [] - - if (opts.icon) { - operations.push(function (cb) { - common.normalizeExt(opts.icon, '.icns', function (err, icon) { - if (err) { - // Ignore error if icon doesn't exist, in case it's only available for other OS - cb(null) - } else { - ncp(icon, path.join(contentsPath, 'Resources', 'atom.icns'), cb) - } - }) - }) - } - - // Move Helper binary, then Helper.app, then top-level .app - var finalAppPath = path.join(tempPath, opts.name + '.app') - operations.push(function (cb) { - var helperBinaryPath = path.join(helperPath, 'Contents', 'MacOS') - mv(path.join(helperBinaryPath, 'Electron Helper'), path.join(helperBinaryPath, opts.name + ' Helper'), cb) - }, function (cb) { - mv(helperPath, path.join(path.dirname(helperPath), opts.name + ' Helper.app'), cb) - }, function (cb) { - mv(path.dirname(contentsPath), finalAppPath, cb) - }) - - if (opts.sign) { - operations.push(function (cb) { - child.exec('codesign --deep --force --sign "' + opts.sign + '" ' + finalAppPath, cb) - }) - } - - series(operations, function () { - common.moveApp(opts, tempPath, callback) - }) - }) - } -} diff --git a/package.json b/package.json index b2726d8..09b1860 100644 --- a/package.json +++ b/package.json @@ -1,56 +1,37 @@ { "name": "nativefier", - "version": "5.1.1", - "description": "Wrap single-page web apps natively", + "version": "6.0.0", + "description": "Wrap web apps natively", "main": "index.js", - "bin": { - "nativefier": "cli.js" + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "build": "babel src -d lib", + "watch": "babel --watch src -d lib" }, "repository": { "type": "git", - "url": "git+https://github.com/skewedlines/Nativefier.git" + "url": "git+https://github.com/jiahaog/nativefier.git" }, - "author": "Jia Hao", - "license": "BSD-2-Clause", + "author": "", + "license": "MIT", "bugs": { - "url": "https://github.com/skewedlines/Nativefier/issues" + "url": "https://github.com/jiahaog/nativefier/issues" }, - "homepage": "https://github.com/skewedlines/Nativefier", + "homepage": "https://github.com/jiahaog/nativefier#readme", "dependencies": { - "asar": "^0.6.1", - "electron-download": "^1.0.0", - "extract-zip": "^1.0.3", - "minimist": "^1.1.1", - "mkdirp": "^0.5.0", - "mv": "^2.0.3", + "async": "^1.5.2", + "commander": "^2.9.0", + "electron-packager": "^5.2.1", "ncp": "^2.0.0", - "plist": "^1.1.0", - "rcedit": "^0.3.0", - "rimraf": "^2.3.2", - "run-series": "^1.1.1", - "temp": "^0.8.3", - "validator": "^3.40.1" + "tmp": "0.0.28" }, - "devDependencies": { - "run-waterfall": "^1.1.1", - "standard": "^3.3.2", - "tape": "^4.0.0" - }, - "scripts": { - "test": "standard && tape test" - }, - "standard": { - "ignore": [ - "test/fixtures/**/node_modules" + "babel": { + "presets": [ + "es2015" ] }, - "directories": { - "test": "test" - }, - "keywords": [ - "native", - "electron", - "package", - "cli" - ] + "devDependencies": { + "babel-cli": "^6.4.0", + "babel-preset-es2015": "^6.3.13" + } } diff --git a/src/cli.js b/src/cli.js new file mode 100644 index 0000000..9f83d85 --- /dev/null +++ b/src/cli.js @@ -0,0 +1,161 @@ +import os from 'os'; +import fs from 'fs'; +import path from 'path'; + +import packager from 'electron-packager'; +import commander from 'commander'; +import tmp from 'tmp'; +import ncp from 'ncp'; +import async from 'async'; + +const copy = ncp.ncp; + +const TEMPLATE_APP_DIR = path.join(__dirname, '../', 'app'); +const ELECTRON_VERSION = '0.36.4'; + +function optionsFactory(name = 'MyApp', + targetUrl = 'http://google.com', + platform = detectPlatform(), + architecture = detectArch(), + version = ELECTRON_VERSION, + outDir = os.homedir(), + overwrite = true, + conceal = true, + iconDir, + badge = false, + width = 1280, + height = 800) { + return { + dir: TEMPLATE_APP_DIR, + + name: name, + targetUrl: targetUrl, + + platform: platform, + arch: architecture, + version: version, + + out: outDir, + + // optionals + overwrite: overwrite, + asar: conceal, + icon: iconDir, + + // app configuration + badge: badge, + width: width, + height: height + } +} + +/** + * @callback buildAppCallback + * @param error + * @param 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([ + function (callback) { + console.log("Dir: ", tmpobj.name); + + copyPlaceholderApp(options.dir, tmpPath, options.name, options.targetUrl, options.badge, options.width, options.height, callback); + }, + function (tempDir, callback) { + console.log('copied to ', tempDir); + options.dir = tempDir; + packager(options, callback); + }, + function (appPath, callback) { + tmpobj.removeCallback(); + callback(null, appPath); + } + ], callback); +} + + +function detectPlatform() { + const platform = os.platform(); + if (platform === 'darwin' || platform === 'win32' || platform === 'linux') { + return platform; + } + + console.warn(`Warning: Untested platform ${platform} detected, assuming linux`); + return 'linux'; +} + +function detectArch() { + const arch = os.arch(); + if (arch !== 'ia32' && arch !== 'x64') { + throw `Incompatible architecture ${arch} detected`; + } + return os.arch(); +} + +function main() { + const options = optionsFactory(); + buildApp(options, (error, appPath) => { + if (error) { + console.trace(error); + return; + } + + console.log(`App built to ${appPath}`); + }); + +} + +/** + * @callback tempDirCallback + * @param error + * @param [tempDirPath] + */ + +/** + * 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} badge + * @param {number} [width] + * @param {number} [height] + * @param {tempDirCallback} callback + */ +function copyPlaceholderApp(srcAppDir, tempDir, name, targetURL, badge, width, height, callback) { + copy(srcAppDir, tempDir, function (error) { + + if (error) { + console.error(error); + callback(`Error Copying temporary directory: ${error}`); + return; + } + + const appArgs = { + name: name, + targetUrl: targetURL, + badge: badge, + width: width, + height: height + }; + + fs.writeFileSync(path.join(tempDir, '/targetUrl.txt'), JSON.stringify(appArgs)); + callback(null, tempDir); + }); +}; + + +main(); \ No newline at end of file diff --git a/tempDir.js b/tempDir.js deleted file mode 100644 index f0b5123..0000000 --- a/tempDir.js +++ /dev/null @@ -1,51 +0,0 @@ -/** - * Created by JiaHao on 5/7/15. - */ - -var fs = require('fs'); -var temp = require('temp').track(); -var ncp = require('ncp').ncp; - -/** - * @callback tempDirCallback - * @param error - * @param tempDirPath - */ - -/** - * 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} name - * @param {string} targetURL - * @param {boolean} badge - * @param width - * @param height - * @param {tempDirCallback} callback - */ -module.exports = function (name, targetURL, badge, width, height, callback) { - - var tempDir = temp.path(); - ncp(__dirname + '/app', tempDir, function (error) { - if (error) { - console.error(error); - callback('Error Copying temporary directory\n' + error, null); - - } else { - - var appArgs = { - name: name, - targetUrl: targetURL, - badge: badge, - width: width, - height: height - }; - - fs.writeFileSync(tempDir + '/targetUrl.txt', JSON.stringify(appArgs)); - - callback(error, tempDir); - } - }); -}; - - diff --git a/test/basic.js b/test/basic.js deleted file mode 100644 index cd05aa7..0000000 --- a/test/basic.js +++ /dev/null @@ -1,273 +0,0 @@ -var fs = require('fs') -var path = require('path') - -var packager = require('..') -var waterfall = require('run-waterfall') - -var config = require('./config.json') -var util = require('./util') - -function generateBasename (opts) { - return opts.name + '-' + opts.platform + '-' + opts.arch -} - -function generateNamePath (opts) { - // Generates path to verify reflects the name given in the options. - // Returns the Helper.app location on darwin since the top-level .app is already tested for the resources path; - // returns the executable for other OSes - if (opts.platform === 'darwin') { - return path.join(opts.name + '.app', 'Contents', 'Frameworks', opts.name + ' Helper.app') - } - - return opts.name + (opts.platform === 'win32' ? '.exe' : '') -} - -function createDefaultsTest (combination) { - return function (t) { - t.timeoutAfter(config.timeout) - - var opts = Object.create(combination) - opts.name = 'basicTest' - opts.dir = path.join(__dirname, 'fixtures', 'basic') - - var finalPath - var resourcesPath - - waterfall([ - function (cb) { - packager(opts, cb) - }, function (paths, cb) { - t.true(Array.isArray(paths), 'packager call should resolve to an array') - t.equal(paths.length, 1, 'Single-target run should resolve to a 1-item array') - - finalPath = paths[0] - t.equal(finalPath, path.join(util.getWorkCwd(), generateBasename(opts)), - 'Path should follow the expected format and be in the cwd') - fs.stat(finalPath, cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'The expected output directory should exist') - resourcesPath = path.join(finalPath, util.generateResourcesPath(opts)) - fs.stat(path.join(finalPath, generateNamePath(opts)), cb) - }, function (stats, cb) { - if (opts.platform === 'darwin') { - t.true(stats.isDirectory(), 'The Helper.app should reflect opts.name') - } else { - t.true(stats.isFile(), 'The executable should reflect opts.name') - } - fs.stat(resourcesPath, cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'The output directory should contain the expected resources subdirectory') - fs.stat(path.join(resourcesPath, 'app', 'node_modules', 'run-waterfall'), cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'The output directory should contain devDependencies by default (no prune)') - util.areFilesEqual(path.join(opts.dir, 'main.js'), path.join(resourcesPath, 'app', 'main.js'), cb) - }, function (equal, cb) { - t.true(equal, 'File under packaged app directory should match source file') - util.areFilesEqual(path.join(opts.dir, 'ignore', 'this.txt'), - path.join(resourcesPath, 'app', 'ignore', 'this.txt'), - cb) - }, function (equal, cb) { - t.true(equal, - 'File under subdirectory of packaged app directory should match source file and not be ignored by default') - cb() - } - ], function (err) { - t.end(err) - }) - } -} - -function createOutTest (combination) { - return function (t) { - t.timeoutAfter(config.timeout) - - var opts = Object.create(combination) - opts.name = 'basicTest' - opts.dir = path.join(__dirname, 'fixtures', 'basic') - opts.out = 'dist' - - var finalPath - - waterfall([ - function (cb) { - packager(opts, cb) - }, function (paths, cb) { - finalPath = paths[0] - t.equal(finalPath, path.join('dist', generateBasename(opts)), - 'Path should follow the expected format and be under the folder specifed in `out`') - fs.stat(finalPath, cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'The expected output directory should exist') - fs.stat(path.join(finalPath, util.generateResourcesPath(opts)), cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'The output directory should contain the expected resources subdirectory') - cb() - } - ], function (err) { - t.end(err) - }) - } -} - -function createAsarTest (combination) { - return function (t) { - t.timeoutAfter(config.timeout) - - var opts = Object.create(combination) - opts.name = 'basicTest' - opts.dir = path.join(__dirname, 'fixtures', 'basic') - opts.asar = true - - var finalPath - var resourcesPath - - waterfall([ - function (cb) { - packager(opts, cb) - }, function (paths, cb) { - finalPath = paths[0] - fs.stat(finalPath, cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'The expected output directory should exist') - resourcesPath = path.join(finalPath, util.generateResourcesPath(opts)) - fs.stat(resourcesPath, cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'The output directory should contain the expected resources subdirectory') - fs.stat(path.join(resourcesPath, 'app.asar'), cb) - }, function (stats, cb) { - t.true(stats.isFile(), 'app.asar should exist under the resources subdirectory when opts.asar is true') - fs.exists(path.join(resourcesPath, 'app'), function (exists) { - t.false(exists, 'app subdirectory should NOT exist when app.asar is built') - cb() - }) - } - ], function (err) { - t.end(err) - }) - } -} - -function createPruneTest (combination) { - return function (t) { - t.timeoutAfter(config.timeout) - - var opts = Object.create(combination) - opts.name = 'basicTest' - opts.dir = path.join(__dirname, 'fixtures', 'basic') - opts.prune = true - - var finalPath - var resourcesPath - - waterfall([ - function (cb) { - packager(opts, cb) - }, function (paths, cb) { - finalPath = paths[0] - fs.stat(finalPath, cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'The expected output directory should exist') - resourcesPath = path.join(finalPath, util.generateResourcesPath(opts)) - fs.stat(resourcesPath, cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'The output directory should contain the expected resources subdirectory') - fs.stat(path.join(resourcesPath, 'app', 'node_modules', 'run-series'), cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'npm dependency should exist under app/node_modules') - fs.exists(path.join(resourcesPath, 'app', 'node_modules', 'run-waterfall'), function (exists) { - t.false(exists, 'npm devDependency should NOT exist under app/node_modules') - cb() - }) - } - ], function (err) { - t.end(err) - }) - } -} - -function createIgnoreTest (combination, ignorePattern, ignoredFile) { - return function (t) { - t.timeoutAfter(config.timeout) - - var opts = Object.create(combination) - opts.name = 'basicTest' - opts.dir = path.join(__dirname, 'fixtures', 'basic') - opts.ignore = ignorePattern - - var appPath - - waterfall([ - function (cb) { - packager(opts, cb) - }, function (paths, cb) { - appPath = path.join(paths[0], util.generateResourcesPath(opts), 'app') - fs.stat(path.join(appPath, 'package.json'), cb) - }, function (stats, cb) { - t.true(stats.isFile(), 'The expected output directory should exist and contain files') - fs.exists(path.join(appPath, ignoredFile), function (exists) { - t.false(exists, 'Ignored file should not exist in output app directory') - cb() - }) - } - ], function (err) { - t.end(err) - }) - } -} - -function createOverwriteTest (combination) { - return function (t) { - t.timeoutAfter(config.timeout * 2) // Multiplied since this test packages the application twice - - var opts = Object.create(combination) - opts.name = 'basicTest' - opts.dir = path.join(__dirname, 'fixtures', 'basic') - - var finalPath - var testPath - - waterfall([ - function (cb) { - packager(opts, cb) - }, function (paths, cb) { - finalPath = paths[0] - fs.stat(finalPath, cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'The expected output directory should exist') - // Create a dummy file to detect whether the output directory is replaced in subsequent runs - testPath = path.join(finalPath, 'test.txt') - fs.writeFile(testPath, 'test', cb) - }, function (cb) { - // Run again, defaulting to overwrite false - packager(opts, cb) - }, function (paths, cb) { - fs.stat(testPath, cb) - }, function (stats, cb) { - t.true(stats.isFile(), 'The existing output directory should exist as before (skipped by default)') - // Run a third time, explicitly setting overwrite to true - opts.overwrite = true - packager(opts, cb) - }, function (paths, cb) { - fs.exists(testPath, function (exists) { - t.false(exists, 'The output directory should be regenerated when overwrite is true') - cb() - }) - } - ], function (err) { - t.end(err) - }) - } -} - -util.testAllPlatforms('defaults test', createDefaultsTest) -util.testAllPlatforms('out test', createOutTest) -util.testAllPlatforms('asar test', createAsarTest) -util.testAllPlatforms('prune test', createPruneTest) -util.testAllPlatforms('ignore test: string in array', createIgnoreTest, ['ignorethis'], 'ignorethis.txt') -util.testAllPlatforms('ignore test: string', createIgnoreTest, 'ignorethis', 'ignorethis.txt') -util.testAllPlatforms('ignore test: RegExp', createIgnoreTest, /ignorethis/, 'ignorethis.txt') -util.testAllPlatforms('ignore test: string with slash', createIgnoreTest, 'ignore/this', - path.join('ignore', 'this.txt')) -util.testAllPlatforms('ignore test: only match subfolder of app', createIgnoreTest, 'electron-packager', - path.join('electron-packager', 'readme.txt')) -util.testAllPlatforms('overwrite test', createOverwriteTest) diff --git a/test/config.json b/test/config.json deleted file mode 100644 index d090330..0000000 --- a/test/config.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "timeout": 15000, - "version": "0.28.3" -} diff --git a/test/fixtures/basic/electron-packager/readme.txt b/test/fixtures/basic/electron-packager/readme.txt deleted file mode 100644 index 346ca28..0000000 --- a/test/fixtures/basic/electron-packager/readme.txt +++ /dev/null @@ -1,2 +0,0 @@ -This file exists to test ability to ignore paths under app, without also -ignoring the entire app folder due to a match above it (#54 / #55). diff --git a/test/fixtures/basic/ignore/this.txt b/test/fixtures/basic/ignore/this.txt deleted file mode 100644 index e69de29..0000000 diff --git a/test/fixtures/basic/ignorethis.txt b/test/fixtures/basic/ignorethis.txt deleted file mode 100644 index 8b13789..0000000 --- a/test/fixtures/basic/ignorethis.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/test/fixtures/basic/index.html b/test/fixtures/basic/index.html deleted file mode 100644 index c0617ee..0000000 --- a/test/fixtures/basic/index.html +++ /dev/null @@ -1,4 +0,0 @@ - - - Hello, world! - diff --git a/test/fixtures/basic/main.js b/test/fixtures/basic/main.js deleted file mode 100644 index bbe90c7..0000000 --- a/test/fixtures/basic/main.js +++ /dev/null @@ -1,22 +0,0 @@ -var app = require('app') -var BrowserWindow = require('browser-window') -var mainWindow - -app.on('window-all-closed', function () { - app.quit() -}) - -app.on('ready', function () { - mainWindow = new BrowserWindow({ - center: true, - title: 'Basic Test', - width: 800, - height: 600 - }) - - mainWindow.loadUrl('file://' + require('path').resolve(__dirname, 'index.html')) - - mainWindow.on('closed', function () { - mainWindow = null - }) -}) diff --git a/test/fixtures/basic/package.json b/test/fixtures/basic/package.json deleted file mode 100644 index b52b350..0000000 --- a/test/fixtures/basic/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "main": "main.js", - "dependencies": { - "run-series": "^1.1.1" - }, - "devDependencies": { - "run-waterfall": "^1.1.1" - } -} diff --git a/test/fixtures/monochrome.icns b/test/fixtures/monochrome.icns deleted file mode 100644 index dc02de9..0000000 Binary files a/test/fixtures/monochrome.icns and /dev/null differ diff --git a/test/index.js b/test/index.js deleted file mode 100644 index 3450386..0000000 --- a/test/index.js +++ /dev/null @@ -1,27 +0,0 @@ -var exec = require('child_process').exec -var path = require('path') - -var series = require('run-series') - -var config = require('./config.json') -var util = require('./util') - -// Download all Electron distributions before running tests to avoid timing out due to network speed -series([ - function (cb) { - console.log('Calling electron-download before running tests...') - util.downloadAll(config.version, cb) - }, function (cb) { - console.log('Running npm install in fixtures/basic...') - exec('npm install', {cwd: path.join(__dirname, 'fixtures', 'basic')}, cb) - } -], function () { - console.log('Running tests...') - require('./basic') - require('./multitarget') - - if (process.platform !== 'win32') { - // Perform additional tests specific to building for OS X - require('./mac') - } -}) diff --git a/test/mac.js b/test/mac.js deleted file mode 100644 index 012b5ee..0000000 --- a/test/mac.js +++ /dev/null @@ -1,94 +0,0 @@ -var exec = require('child_process').exec -var fs = require('fs') -var path = require('path') - -var packager = require('..') -var test = require('tape') -var waterfall = require('run-waterfall') - -var config = require('./config.json') -var util = require('./util') - -function createIconTest (icon, iconPath) { - return function (t) { - t.timeoutAfter(config.timeout) - - var opts = { - name: 'basicTest', - dir: path.join(__dirname, 'fixtures', 'basic'), - version: config.version, - arch: 'x64', - platform: 'darwin', - icon: icon - } - - var resourcesPath - - waterfall([ - function (cb) { - packager(opts, cb) - }, function (paths, cb) { - resourcesPath = path.join(paths[0], util.generateResourcesPath(opts)) - fs.stat(resourcesPath, cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'The output directory should contain the expected resources subdirectory') - util.areFilesEqual(iconPath, path.join(resourcesPath, 'atom.icns'), cb) - }, function (equal, cb) { - t.true(equal, 'atom.icns should be identical to the specified icon file') - cb() - } - ], function (err) { - t.end(err) - }) - } -} - -var iconBase = path.join(__dirname, 'fixtures', 'monochrome') -var icnsPath = iconBase + '.icns' -util.setup() -test('icon test: .icns specified', createIconTest(icnsPath, icnsPath)) -util.teardown() - -util.setup() -test('icon test: .ico specified (should replace with .icns)', createIconTest(iconBase + '.ico', icnsPath)) -util.teardown() - -util.setup() -test('icon test: basename only (should add .icns)', createIconTest(iconBase, icnsPath)) -util.teardown() - -util.setup() -test('codesign test', function (t) { - t.timeoutAfter(config.timeout) - - var opts = { - name: 'basicTest', - dir: path.join(__dirname, 'fixtures', 'basic'), - version: config.version, - arch: 'x64', - platform: 'darwin', - sign: '-' // Ad-hoc - } - - var appPath - - waterfall([ - function (cb) { - packager(opts, cb) - }, function (paths, cb) { - appPath = path.join(paths[0], opts.name + '.app') - fs.stat(appPath, cb) - }, function (stats, cb) { - t.true(stats.isDirectory(), 'The expected .app directory should exist') - exec('codesign --verify --deep ' + appPath, cb) - }, function (stdout, stderr, cb) { - t.pass('codesign should verify successfully') - cb() - } - ], function (err) { - var notFound = err && err.code === 127 - if (notFound) console.log('codesign not installed; skipped') - t.end(notFound ? null : err) - }) -}) -util.teardown() diff --git a/test/multitarget.js b/test/multitarget.js deleted file mode 100644 index 1c9240d..0000000 --- a/test/multitarget.js +++ /dev/null @@ -1,145 +0,0 @@ -var fs = require('fs') -var path = require('path') - -var packager = require('..') -var series = require('run-series') -var test = require('tape') -var waterfall = require('run-waterfall') - -var config = require('./config.json') -var util = require('./util') - -function verifyPackageExistence (finalPaths, callback) { - series(finalPaths.map(function (finalPath) { - return function (cb) { - fs.stat(finalPath, cb) - } - }), function (err, statsResults) { - if (err) return callback(null, false) - - callback(null, statsResults.every(function (stats) { - return stats.isDirectory() - })) - }) -} - -util.setup() -test('all test', function (t) { - t.timeoutAfter(config.timeout * 5) // 4-5 packages will be built during this test - - var opts = { - name: 'basicTest', - dir: path.join(__dirname, 'fixtures', 'basic'), - version: config.version, - all: true - } - - waterfall([ - function (cb) { - packager(opts, cb) - }, function (finalPaths, cb) { - // Windows skips packaging for OS X, and OS X only has 64-bit releases - t.equal(finalPaths.length, process.platform === 'win32' ? 4 : 5, - 'packager call should resolve with expected number of paths') - verifyPackageExistence(finalPaths, cb) - }, function (exists, cb) { - t.true(exists, 'Packages should be generated for all possible platforms') - cb() - } - ], function (err) { - t.end(err) - }) -}) -util.teardown() - -util.setup() -test('platform=all test (one arch)', function (t) { - t.timeoutAfter(config.timeout * 2) // 2 packages will be built during this test - - var opts = { - name: 'basicTest', - dir: path.join(__dirname, 'fixtures', 'basic'), - version: config.version, - arch: 'ia32', - platform: 'all' - } - - waterfall([ - function (cb) { - packager(opts, cb) - }, function (finalPaths, cb) { - t.equal(finalPaths.length, 2, 'packager call should resolve with expected number of paths') - verifyPackageExistence(finalPaths, cb) - }, function (exists, cb) { - t.true(exists, 'Packages should be generated for both 32-bit platforms') - cb() - } - ], function (err) { - t.end(err) - }) -}) -util.teardown() - -util.setup() -test('arch=all test (one platform)', function (t) { - t.timeoutAfter(config.timeout * 2) // 2 packages will be built during this test - - var opts = { - name: 'basicTest', - dir: path.join(__dirname, 'fixtures', 'basic'), - version: config.version, - arch: 'all', - platform: 'linux' - } - - waterfall([ - function (cb) { - packager(opts, cb) - }, function (finalPaths, cb) { - t.equal(finalPaths.length, 2, 'packager call should resolve with expected number of paths') - verifyPackageExistence(finalPaths, cb) - }, function (exists, cb) { - t.true(exists, 'Packages should be generated for both architectures') - cb() - } - ], function (err) { - t.end(err) - }) -}) -util.teardown() - -function createMultiTest (arch, platform) { - return function (t) { - t.timeoutAfter(config.timeout * 4) // 4 packages will be built during this test - - var opts = { - name: 'basicTest', - dir: path.join(__dirname, 'fixtures', 'basic'), - version: config.version, - arch: arch, - platform: platform - } - - waterfall([ - function (cb) { - packager(opts, cb) - }, function (finalPaths, cb) { - t.equal(finalPaths.length, 4, 'packager call should resolve with expected number of paths') - verifyPackageExistence(finalPaths, cb) - }, function (exists, cb) { - t.true(exists, 'Packages should be generated for all combinations of specified archs and platforms') - cb() - } - ], function (err) { - t.end(err) - }) - } -} - -util.setup() -test('multi-platform / multi-arch test, from arrays', createMultiTest(['ia32', 'x64'], ['linux', 'win32'])) -util.teardown() - -util.setup() -test('multi-platform / multi-arch test, from strings', createMultiTest('ia32,x64', 'linux,win32')) -util.teardown() diff --git a/test/util.js b/test/util.js deleted file mode 100644 index f3b23cc..0000000 --- a/test/util.js +++ /dev/null @@ -1,100 +0,0 @@ -var fs = require('fs') -var path = require('path') -var test = require('tape') - -var download = require('electron-download') -var mkdirp = require('mkdirp') -var rimraf = require('rimraf') -var series = require('run-series') - -var ORIGINAL_CWD = process.cwd() -var WORK_CWD = path.join(__dirname, 'work') - -var archs = ['ia32', 'x64'] -var platforms = ['darwin', 'linux', 'win32'] -var slice = Array.prototype.slice -var version = require('./config.json').version - -var combinations = [] -archs.forEach(function (arch) { - platforms.forEach(function (platform) { - // Electron does not have 32-bit releases for Mac OS X, so skip that combination - // Also skip testing darwin target on Windows since electron-packager itself skips it - // (see https://github.com/maxogden/electron-packager/issues/71) - if (platform === 'darwin' && (arch === 'ia32' || require('os').platform() === 'win32')) return - - combinations.push({ - arch: arch, - platform: platform, - version: version - }) - }) -}) - -exports.areFilesEqual = function areFilesEqual (file1, file2, callback) { - series([ - function (cb) { - fs.readFile(file1, cb) - }, - function (cb) { - fs.readFile(file2, cb) - } - ], function (err, buffers) { - callback(err, slice.call(buffers[0]).every(function (b, i) { - return b === buffers[1][i] - })) - }) -} - -exports.downloadAll = function downloadAll (version, callback) { - series(combinations.map(function (combination) { - return function (cb) { - download(combination, cb) - } - }), callback) -} - -exports.forEachCombination = function forEachCombination (cb) { - combinations.forEach(cb) -} - -exports.generateResourcesPath = function generateResourcesPath (opts) { - return opts.platform === 'darwin' ? path.join(opts.name + '.app', 'Contents', 'Resources') : 'resources' -} - -exports.getWorkCwd = function getWorkCwd () { - return WORK_CWD -} - -// tape doesn't seem to have a provision for before/beforeEach/afterEach/after, -// so run setup/teardown and cleanup tasks as additional "tests" to put them in sequence -// and run them irrespective of test failures - -exports.setup = function setup () { - test('setup', function (t) { - mkdirp(WORK_CWD, function (err) { - if (err) t.end(err) - process.chdir(WORK_CWD) - t.end() - }) - }) -} - -exports.teardown = function teardown () { - test('teardown', function (t) { - process.chdir(ORIGINAL_CWD) - rimraf(WORK_CWD, function (err) { - t.end(err) - }) - }) -} - -exports.testAllPlatforms = function testAllPlatforms (name, createTest /*, ...createTestArgs */) { - var args = slice.call(arguments, 2) - exports.setup() - exports.forEachCombination(function (combination) { - test(name + ': ' + combination.platform + '-' + combination.arch, - createTest.apply(null, [combination].concat(args))) - }) - exports.teardown() -} diff --git a/usage.txt b/usage.txt deleted file mode 100644 index c2f4511..0000000 --- a/usage.txt +++ /dev/null @@ -1,40 +0,0 @@ -Usage: nativefier --platform= --arch= --version= - -Required options - -appname name for the app -target target url for the single page app -platform all, or one or more of: linux, win32, darwin (comma-delimited if multiple) -arch all, ia32, x64 -version see https://github.com/atom/electron/releases - -Example nativefier Messenger "http://messenger.com" --platform=darwin --arch=x64 --version=0.28.2 - -Optional options - -all equivalent to --platform=all --arch=all -out the dir to put the app into at the end. defaults to current working dir -icon the icon file to use as the icon for the app (should be a .icns file on OSX) -app-bundle-id bundle identifier to use in the app plist -app-version version to set for the app -helper-bundle-id bundle identifier to use in the app helper plist -ignore do not copy files into App whose filenames regex .match this string -prune runs `npm prune --production` on the app -overwrite if output directory for a platform already exists, replaces it rather than skipping it -asar packages the source code within your app into an archive -sign should contain the identity to be used when running `codesign` (OS X only) -version-string should contain a hash of the application metadata to be embedded into the executable (Windows only). - These can be specified on the command line via dot notation, - e.g. --version-string.CompanyName="Company Inc." --version-string.ProductName="Product" - Keys supported: - - CompanyName - - LegalCopyright - - FileDescription - - OriginalFilename - - FileVersion - - ProductVersion - - ProductName - - InternalName -badge if the target app should show badges in the OSX dock on receipt of desktop notifications -width window width (default=1280) -height window height (default=800) diff --git a/win32.js b/win32.js deleted file mode 100644 index 0f7abaa..0000000 --- a/win32.js +++ /dev/null @@ -1,40 +0,0 @@ -var path = require('path') - -var mv = require('mv') -var series = require('run-series') -var common = require('./common') - -module.exports = { - createApp: function createApp (opts, templatePath, callback) { - common.initializeApp(opts, templatePath, path.join('resources', 'app'), function buildWinApp (err, tempPath) { - if (err) return callback(err) - - var newExePath = path.join(tempPath, opts.name + '.exe') - var operations = [ - function (cb) { - mv(path.join(tempPath, 'electron.exe'), newExePath, cb) - } - ] - - if (opts.icon || opts['version-string']) { - operations.push(function (cb) { - common.normalizeExt(opts.icon, '.ico', function (err, icon) { - var rcOpts = {} - if (opts['version-string']) rcOpts['version-string'] = opts['version-string'] - - // Icon might be omitted or only exist in one OS's format, so skip it if normalizeExt reports an error - if (!err) { - rcOpts.icon = icon - } - - require('rcedit')(newExePath, rcOpts, cb) - }) - }) - } - - series(operations, function () { - common.moveApp(opts, tempPath, callback) - }) - }) - } -}