From c31417e8b8003cbbb4b23ed519c0a2c1a265a3f5 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Fri, 16 Feb 2018 17:00:53 +1100 Subject: [PATCH 01/40] temp --- .appveyor.yml | 5 +- .babelrc | 24 + .gitignore | 7 +- .travis.yml | 5 +- ci/docker.sh | 4 +- ci/script.sh | 2 +- gulpfile.babel.js | 2 + package.json | 157 +- .../api/core/.editorconfig | 0 .esdoc.json => packages/api/core/.esdoc.json | 0 .../api/core/.eslintignore | 0 packages/api/core/.gitignore | 6 + .npmignore => packages/api/core/.npmignore | 0 .../api/core/CHANGELOG.md | 0 packages/api/core/package.json | 98 + .../api/core/script}/vscode.cmd | 0 .../api/core/script}/vscode.sh | 0 {src => packages/api/core/src}/api/import.js | 0 {src => packages/api/core/src}/api/index.js | 0 {src => packages/api/core/src}/api/init.js | 0 {src => packages/api/core/src}/api/install.js | 0 {src => packages/api/core/src}/api/lint.js | 0 {src => packages/api/core/src}/api/make.js | 0 {src => packages/api/core/src}/api/package.js | 0 {src => packages/api/core/src}/api/publish.js | 0 {src => packages/api/core/src}/api/start.js | 0 .../api/core/src}/electron-forge-import.js | 0 .../api/core/src}/electron-forge-init.js | 0 .../api/core/src}/electron-forge-install.js | 0 .../api/core/src}/electron-forge-lint.js | 0 .../api/core/src}/electron-forge-make.js | 0 .../api/core/src}/electron-forge-package.js | 0 .../api/core/src}/electron-forge-publish.js | 0 .../api/core/src}/electron-forge-start.js | 0 .../api/core/src}/electron-forge.js | 0 .../api/core/src}/init/init-custom.js | 0 .../api/core/src}/init/init-directory.js | 0 .../api/core/src}/init/init-git.js | 0 .../api/core/src}/init/init-npm.js | 0 .../api/core/src}/init/init-starter-files.js | 0 .../api/core/src}/installers/darwin/dmg.js | 0 .../api/core/src}/installers/darwin/zip.js | 0 .../api/core/src}/installers/linux/deb.js | 0 .../api/core/src}/installers/linux/rpm.js | 0 .../api/core/src}/installers/win32/exe.js | 0 .../api/core/src}/makers/darwin/dmg.js | 0 .../api/core/src}/makers/generic/zip.js | 0 .../api/core/src}/makers/linux/deb.js | 0 .../api/core/src}/makers/linux/flatpak.js | 0 .../api/core/src}/makers/linux/rpm.js | 0 .../api/core/src}/makers/linux/snap.js | 0 .../api/core/src}/makers/win32/appx.js | 0 .../api/core/src}/makers/win32/squirrel.js | 0 .../api/core/src}/makers/win32/wix.js | 0 .../publishers/electron-release-server.js | 0 .../api/core/src}/publishers/github.js | 0 .../api/core/src}/publishers/s3.js | 0 .../api/core/src}/publishers/snapcraft.js | 0 .../api/core/src}/util/author-name.js | 0 .../api/core/src}/util/check-system.js | 0 .../api/core/src}/util/config-fn.js | 0 {src => packages/api/core/src}/util/config.js | 0 .../core/src}/util/confirm-if-interactive.js | 0 .../api/core/src}/util/deprecate.js | 0 .../api/core/src}/util/electron-version.js | 0 .../api/core/src}/util/ensure-output.js | 0 .../api/core/src}/util/forge-config.js | 0 {src => packages/api/core/src}/util/github.js | 0 .../api/core/src}/util/hdiutil.js | 0 {src => packages/api/core/src}/util/hook.js | 0 .../core/src}/util/install-dependencies.js | 0 .../api/core/src}/util/is-installed.js | 0 .../api/core/src}/util/linux-config.js | 0 .../api/core/src}/util/linux-installer.js | 0 .../api/core/src}/util/messages.js | 0 .../api/core/src}/util/move-app.js | 0 .../api/core/src}/util/ora-handler.js | 0 {src => packages/api/core/src}/util/ora.js | 0 .../api/core/src}/util/out-dir.js | 0 .../api/core/src}/util/parse-archs.js | 0 .../api/core/src}/util/plugin-interface.js | 0 .../api/core/src}/util/publish-state.js | 0 .../api/core/src}/util/read-package-json.js | 0 .../api/core/src}/util/rebuild.js | 0 .../api/core/src}/util/require-search.js | 0 .../api/core/src}/util/resolve-dir.js | 0 .../api/core/src}/util/terminate.js | 0 .../api/core/src}/util/yarn-or-npm.js | 0 .../api/core/tabtab-install.js | 0 {test => packages/api/core/test}/.eslintrc | 0 .../api/core/test}/fast/author-name_spec.js | 0 .../api/core/test}/fast/config_spec.js | 0 .../test}/fast/confirm-if-interactive_spec.js | 0 .../test}/fast/electron_forge_start_spec.js | 0 .../api/core/test}/fast/ensure-output_spec.js | 0 .../api/core/test}/fast/forge-config_spec.js | 0 .../api/core/test}/fast/github_spec.js | 0 .../api/core/test}/fast/hook_spec.js | 0 .../test}/fast/install-dependencies_spec.js | 0 .../api/core/test}/fast/makers/appx_spec.js | 0 .../api/core/test}/fast/makers/deb_spec.js | 0 .../api/core/test}/fast/makers/dmg_spec.js | 0 .../core/test}/fast/makers/flatpak_spec.js | 0 .../api/core/test}/fast/makers/rpm_spec.js | 0 .../api/core/test}/fast/makers/snap_spec.js | 0 .../api/core/test}/fast/makers_spec.js | 0 .../api/core/test}/fast/ora-handler_spec.js | 0 .../api/core/test}/fast/out-dir_spec.js | 0 .../api/core/test}/fast/parse-archs_spec.js | 0 .../api/core/test}/fast/publish_spec.js | 0 .../core/test}/fast/read-package-json_spec.js | 0 .../core/test}/fast/require-search_spec.js | 0 .../api/core/test}/fast/resolve-dir_spec.js | 0 .../api/core/test}/fast/start_spec.js | 0 .../api/core/test}/fast/system_spec.js | 0 .../api/core/test}/fast/yarn-or-npm_spec.js | 0 .../core/test}/fixture/bogus-private-key.pvk | Bin .../core/test}/fixture/custom_init/index.js | 0 .../test}/fixture/custom_init/package.json | 0 .../core/test}/fixture/custom_init/tmpl/_bar | 0 .../test}/fixture/custom_init/tmpl/src/foo.js | 0 .../api/core/test}/fixture/dummy_app/foo/null | 0 .../core/test}/fixture/dummy_app/package.json | 0 .../fixture/dummy_js_conf/forge.config.js | 0 .../test}/fixture/dummy_js_conf/package.json | 0 .../core/test}/fixture/maker-incompatible.js | 0 .../core/test}/fixture/maker-unsupported.js | 0 .../test}/fixture/native_app/package.json | 0 {test => packages/api/core/test}/mocha.opts | 0 .../api/core/test}/slow/api_spec_slow.js | 0 .../slow/install-dependencies_spec_slow.js | 0 .../api/core/test}/slow/install_spec_slow.js | 0 .../api/core/test}/slow/rebuild_spec_slow.js | 0 .../api/core/tmpl}/_appveyor.yml | 0 {tmpl => packages/api/core/tmpl}/_gitignore | 0 {tmpl => packages/api/core/tmpl}/_travis.yml | 0 {tmpl => packages/api/core/tmpl}/index.html | 0 {tmpl => packages/api/core/tmpl}/index.js | 0 {tmpl => packages/api/core/tmpl}/package.json | 0 yarn.lock | 7563 +++++++++++++++++ 140 files changed, 7748 insertions(+), 125 deletions(-) create mode 100644 .babelrc rename .editorconfig => packages/api/core/.editorconfig (100%) rename .esdoc.json => packages/api/core/.esdoc.json (100%) rename .eslintignore => packages/api/core/.eslintignore (100%) create mode 100644 packages/api/core/.gitignore rename .npmignore => packages/api/core/.npmignore (100%) rename CHANGELOG.md => packages/api/core/CHANGELOG.md (100%) create mode 100644 packages/api/core/package.json rename {script => packages/api/core/script}/vscode.cmd (100%) rename {script => packages/api/core/script}/vscode.sh (100%) rename {src => packages/api/core/src}/api/import.js (100%) rename {src => packages/api/core/src}/api/index.js (100%) rename {src => packages/api/core/src}/api/init.js (100%) rename {src => packages/api/core/src}/api/install.js (100%) rename {src => packages/api/core/src}/api/lint.js (100%) rename {src => packages/api/core/src}/api/make.js (100%) rename {src => packages/api/core/src}/api/package.js (100%) rename {src => packages/api/core/src}/api/publish.js (100%) rename {src => packages/api/core/src}/api/start.js (100%) rename {src => packages/api/core/src}/electron-forge-import.js (100%) rename {src => packages/api/core/src}/electron-forge-init.js (100%) rename {src => packages/api/core/src}/electron-forge-install.js (100%) rename {src => packages/api/core/src}/electron-forge-lint.js (100%) rename {src => packages/api/core/src}/electron-forge-make.js (100%) rename {src => packages/api/core/src}/electron-forge-package.js (100%) rename {src => packages/api/core/src}/electron-forge-publish.js (100%) rename {src => packages/api/core/src}/electron-forge-start.js (100%) rename {src => packages/api/core/src}/electron-forge.js (100%) rename {src => packages/api/core/src}/init/init-custom.js (100%) rename {src => packages/api/core/src}/init/init-directory.js (100%) rename {src => packages/api/core/src}/init/init-git.js (100%) rename {src => packages/api/core/src}/init/init-npm.js (100%) rename {src => packages/api/core/src}/init/init-starter-files.js (100%) rename {src => packages/api/core/src}/installers/darwin/dmg.js (100%) rename {src => packages/api/core/src}/installers/darwin/zip.js (100%) rename {src => packages/api/core/src}/installers/linux/deb.js (100%) rename {src => packages/api/core/src}/installers/linux/rpm.js (100%) rename {src => packages/api/core/src}/installers/win32/exe.js (100%) rename {src => packages/api/core/src}/makers/darwin/dmg.js (100%) rename {src => packages/api/core/src}/makers/generic/zip.js (100%) rename {src => packages/api/core/src}/makers/linux/deb.js (100%) rename {src => packages/api/core/src}/makers/linux/flatpak.js (100%) rename {src => packages/api/core/src}/makers/linux/rpm.js (100%) rename {src => packages/api/core/src}/makers/linux/snap.js (100%) rename {src => packages/api/core/src}/makers/win32/appx.js (100%) rename {src => packages/api/core/src}/makers/win32/squirrel.js (100%) rename {src => packages/api/core/src}/makers/win32/wix.js (100%) rename {src => packages/api/core/src}/publishers/electron-release-server.js (100%) rename {src => packages/api/core/src}/publishers/github.js (100%) rename {src => packages/api/core/src}/publishers/s3.js (100%) rename {src => packages/api/core/src}/publishers/snapcraft.js (100%) rename {src => packages/api/core/src}/util/author-name.js (100%) rename {src => packages/api/core/src}/util/check-system.js (100%) rename {src => packages/api/core/src}/util/config-fn.js (100%) rename {src => packages/api/core/src}/util/config.js (100%) rename {src => packages/api/core/src}/util/confirm-if-interactive.js (100%) rename {src => packages/api/core/src}/util/deprecate.js (100%) rename {src => packages/api/core/src}/util/electron-version.js (100%) rename {src => packages/api/core/src}/util/ensure-output.js (100%) rename {src => packages/api/core/src}/util/forge-config.js (100%) rename {src => packages/api/core/src}/util/github.js (100%) rename {src => packages/api/core/src}/util/hdiutil.js (100%) rename {src => packages/api/core/src}/util/hook.js (100%) rename {src => packages/api/core/src}/util/install-dependencies.js (100%) rename {src => packages/api/core/src}/util/is-installed.js (100%) rename {src => packages/api/core/src}/util/linux-config.js (100%) rename {src => packages/api/core/src}/util/linux-installer.js (100%) rename {src => packages/api/core/src}/util/messages.js (100%) rename {src => packages/api/core/src}/util/move-app.js (100%) rename {src => packages/api/core/src}/util/ora-handler.js (100%) rename {src => packages/api/core/src}/util/ora.js (100%) rename {src => packages/api/core/src}/util/out-dir.js (100%) rename {src => packages/api/core/src}/util/parse-archs.js (100%) rename {src => packages/api/core/src}/util/plugin-interface.js (100%) rename {src => packages/api/core/src}/util/publish-state.js (100%) rename {src => packages/api/core/src}/util/read-package-json.js (100%) rename {src => packages/api/core/src}/util/rebuild.js (100%) rename {src => packages/api/core/src}/util/require-search.js (100%) rename {src => packages/api/core/src}/util/resolve-dir.js (100%) rename {src => packages/api/core/src}/util/terminate.js (100%) rename {src => packages/api/core/src}/util/yarn-or-npm.js (100%) rename tabtab-install.js => packages/api/core/tabtab-install.js (100%) rename {test => packages/api/core/test}/.eslintrc (100%) rename {test => packages/api/core/test}/fast/author-name_spec.js (100%) rename {test => packages/api/core/test}/fast/config_spec.js (100%) rename {test => packages/api/core/test}/fast/confirm-if-interactive_spec.js (100%) rename {test => packages/api/core/test}/fast/electron_forge_start_spec.js (100%) rename {test => packages/api/core/test}/fast/ensure-output_spec.js (100%) rename {test => packages/api/core/test}/fast/forge-config_spec.js (100%) rename {test => packages/api/core/test}/fast/github_spec.js (100%) rename {test => packages/api/core/test}/fast/hook_spec.js (100%) rename {test => packages/api/core/test}/fast/install-dependencies_spec.js (100%) rename {test => packages/api/core/test}/fast/makers/appx_spec.js (100%) rename {test => packages/api/core/test}/fast/makers/deb_spec.js (100%) rename {test => packages/api/core/test}/fast/makers/dmg_spec.js (100%) rename {test => packages/api/core/test}/fast/makers/flatpak_spec.js (100%) rename {test => packages/api/core/test}/fast/makers/rpm_spec.js (100%) rename {test => packages/api/core/test}/fast/makers/snap_spec.js (100%) rename {test => packages/api/core/test}/fast/makers_spec.js (100%) rename {test => packages/api/core/test}/fast/ora-handler_spec.js (100%) rename {test => packages/api/core/test}/fast/out-dir_spec.js (100%) rename {test => packages/api/core/test}/fast/parse-archs_spec.js (100%) rename {test => packages/api/core/test}/fast/publish_spec.js (100%) rename {test => packages/api/core/test}/fast/read-package-json_spec.js (100%) rename {test => packages/api/core/test}/fast/require-search_spec.js (100%) rename {test => packages/api/core/test}/fast/resolve-dir_spec.js (100%) rename {test => packages/api/core/test}/fast/start_spec.js (100%) rename {test => packages/api/core/test}/fast/system_spec.js (100%) rename {test => packages/api/core/test}/fast/yarn-or-npm_spec.js (100%) rename {test => packages/api/core/test}/fixture/bogus-private-key.pvk (100%) rename {test => packages/api/core/test}/fixture/custom_init/index.js (100%) rename {test => packages/api/core/test}/fixture/custom_init/package.json (100%) rename {test => packages/api/core/test}/fixture/custom_init/tmpl/_bar (100%) rename {test => packages/api/core/test}/fixture/custom_init/tmpl/src/foo.js (100%) rename {test => packages/api/core/test}/fixture/dummy_app/foo/null (100%) rename {test => packages/api/core/test}/fixture/dummy_app/package.json (100%) rename {test => packages/api/core/test}/fixture/dummy_js_conf/forge.config.js (100%) rename {test => packages/api/core/test}/fixture/dummy_js_conf/package.json (100%) rename {test => packages/api/core/test}/fixture/maker-incompatible.js (100%) rename {test => packages/api/core/test}/fixture/maker-unsupported.js (100%) rename {test => packages/api/core/test}/fixture/native_app/package.json (100%) rename {test => packages/api/core/test}/mocha.opts (100%) rename {test => packages/api/core/test}/slow/api_spec_slow.js (100%) rename {test => packages/api/core/test}/slow/install-dependencies_spec_slow.js (100%) rename {test => packages/api/core/test}/slow/install_spec_slow.js (100%) rename {test => packages/api/core/test}/slow/rebuild_spec_slow.js (100%) rename {tmpl => packages/api/core/tmpl}/_appveyor.yml (100%) rename {tmpl => packages/api/core/tmpl}/_gitignore (100%) rename {tmpl => packages/api/core/tmpl}/_travis.yml (100%) rename {tmpl => packages/api/core/tmpl}/index.html (100%) rename {tmpl => packages/api/core/tmpl}/index.js (100%) rename {tmpl => packages/api/core/tmpl}/package.json (100%) create mode 100644 yarn.lock diff --git a/.appveyor.yml b/.appveyor.yml index f65c2b5538..0d2e2060ac 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -14,7 +14,8 @@ branches: install: - ps: Install-Product node $env:nodejs_version $env:platform - set PATH=%APPDATA%\npm;%PATH% -- yarn +- yarn global add bolt +- bolt - ps: | $wixToolsetBinPath = ";C:\Program Files (x86)\WiX Toolset v3.11\bin;" $env:PATH = $env:PATH + $wixToolsetBinPath @@ -27,6 +28,6 @@ install: test_script: - node --version - yarn --version -- yarn test --installer=%node_installer% +- bolt ws test build: off diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000000..6c8cf0c63a --- /dev/null +++ b/.babelrc @@ -0,0 +1,24 @@ +{ + "sourceMaps": "inline", + "presets": [ + [ + "env", + { + "targets": { + "node": "6" + } + } + ] + ], + "plugins": [ + "transform-runtime", + "syntax-async-functions", + [ + "transform-async-to-module-method", + { + "module": "bluebird", + "method": "coroutine" + } + ] + ] +} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1c988ca8c8..b512c09d47 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1 @@ -dist -node_modules -docs -.nyc_output -coverage -npm-debug.log +node_modules \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 3df331ba6c..2d0ae083af 100644 --- a/.travis.yml +++ b/.travis.yml @@ -20,10 +20,9 @@ branches: only: - master - /^v\d+\.\d+\.\d+/ -before_install: if [[ "$NODE_INSTALLER" = "yarn" ]]; then npm install -g yarn@0.23.3; fi install: -- npm install -- npm update +- yarn global add bolt +- bolt script: ci/script.sh after_success: ci/coverage.sh notifications: diff --git a/ci/docker.sh b/ci/docker.sh index 7b6673685d..430c7b18da 100755 --- a/ci/docker.sh +++ b/ci/docker.sh @@ -2,8 +2,8 @@ NODE_INSTALLER="$1" -if [[ "$NODE_INSTALLER" = "yarn" ]]; then npm i -g yarn; fi +npm i -g yarn cd /code -CI=true npm run test -- --installer=$NODE_INSTALLER +CI=true bolt ws test -- --installer=$NODE_INSTALLER diff --git a/ci/script.sh b/ci/script.sh index 37e179b812..cd9911f05e 100755 --- a/ci/script.sh +++ b/ci/script.sh @@ -3,5 +3,5 @@ if [[ "$TRAVIS_OS_NAME" = "linux" ]]; then sudo docker run --privileged --interactive --tty --volume $(pwd):/code malept/electron-forge-container:latest /code/ci/docker.sh $NODE_INSTALLER else - npm run test-coverage -- --installer=$NODE_INSTALLER + bolt ws test fi diff --git a/gulpfile.babel.js b/gulpfile.babel.js index 90fa041b27..ac5eef6b5f 100644 --- a/gulpfile.babel.js +++ b/gulpfile.babel.js @@ -6,6 +6,8 @@ import babel from 'gulp-babel'; import fs from 'fs'; import path from 'path'; +console.log(process.cwd(), process.argv); + gulp.task('transpile', () => gulp.src('./src/**/*.js') .pipe(babel()) diff --git a/package.json b/package.json index 7a673d0e28..556debb881 100644 --- a/package.json +++ b/package.json @@ -1,109 +1,24 @@ { "name": "electron-forge", - "version": "5.1.1", - "description": "A complete tool for building modern Electron applications", - "repository": "https://github.com/electron-userland/electron-forge", - "main": "dist/api/index.js", - "bin": { - "electron-forge": "dist/electron-forge.js", - "forge": "dist/electron-forge.js", - "electron-forge-vscode-nix": "script/vscode.sh", - "electron-forge-vscode-win": "script/vscode.cmd" - }, - "scripts": { - "build": "gulp build", - "precommit": "npm run lint", - "commit": "git-cz", - "docs": "esdoc", - "install": "node tabtab-install.js", - "lint": "eslint src test gulpfile.babel.js tabtab-install.js", - "prepublish": "gulp build", - "pretest": "gulp build", - "test": "npm run lint && npm run test-all", - "test-coverage": "npm run lint && npm run test-all-coverage", - "test-all": "mocha test/**/*_spec*.js test/**/**/*_spec*.js", - "test-fast": "mocha test/**/*_spec.js test/**/**/*_spec.js --timeout=10000", - "test-all-coverage": "cross-env NODE_ENV=test nyc npm run test-all", - "test-fast-coverage": "cross-env NODE_ENV=test nyc npm run test-fast", - "release:patch": "changelog -p && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version patch && git push origin && git push origin --tags", - "release:minor": "changelog -m && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version minor && git push origin && git push origin --tags", - "release:major": "changelog -M && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version major && git push origin && git push origin --tags", - "watch": "gulp watch", - "watch-link": "nodemon --watch src --exec \"npm link\"" - }, - "author": "Samuel Attard", - "license": "MIT", - "devDependencies": { - "asar": "^0.14.0", - "babel-eslint": "^7.0.0", - "babel-plugin-istanbul": "^4.0.0", - "babel-plugin-syntax-async-functions": "^6.13.0", - "babel-plugin-transform-async-to-module-method": "^6.16.0", - "babel-plugin-transform-runtime": "^6.15.0", - "babel-preset-env": "^1.6.0", - "chai": "^4.0.0", - "chai-as-promised": "^7.0.0", - "commitizen": "^2.8.6", - "coveralls": "^3.0.0", - "cross-env": "^5.0.0", - "cz-customizable": "^5.0.0", - "esdoc": "^1.0.1", - "esdoc-importpath-plugin": "^1.0.0", - "esdoc-standard-plugin": "^1.0.0", - "eslint": "^3.7.1", - "eslint-config-airbnb-base": "^8.0.0", - "eslint-plugin-import": "^1.16.0", - "eslint-plugin-mocha": "^4.8.0", - "fetch-mock": "^6.0.0", - "generate-changelog": "^1.0.2", - "gulp": "^3.9.1", - "gulp-babel": "^6.1.2", - "mocha": "^5.0.0", - "nodemon": "^1.11.0", - "nyc": "^11.0.0", - "proxyquire": "^1.7.10", - "sinon": "^4.1.2" + "private": true, + "bolt": { + "workspaces": [ + "packages/api/*", + "packages/makers/*", + "packages/publishers/*" + ] }, - "babel": { - "sourceMaps": "inline", - "env": { - "test": { - "plugins": [ - "istanbul" - ] - } + "config": { + "commitizen": { + "path": "./node_modules/cz-customizable" }, - "presets": [ - [ - "env", - { - "targets": { - "node": "6" - } - } - ] - ], - "plugins": [ - "transform-runtime", - "syntax-async-functions", - [ - "transform-async-to-module-method", - { - "module": "bluebird", - "method": "coroutine" - } - ] - ] + "cz-customizable": { + "config": "./.cz.js" + } }, - "nyc": { - "reporter": [ - "lcov", - "text-summary", - "html" - ], - "sourceMap": false, - "instrument": false, - "cache": true + "scripts": { + "commit": "git-cz", + "lint": "eslint packages/**/src packages/**/test gulpfile.babel.js" }, "dependencies": { "@octokit/rest": "^14.0.4", @@ -144,13 +59,36 @@ "yarn-or-npm": "^2.0.2", "zip-folder": "^1.0.0" }, - "config": { - "commitizen": { - "path": "./node_modules/cz-customizable" - }, - "cz-customizable": { - "config": "./.cz.js" - } + "devDependencies": { + "asar": "^0.14.0", + "babel-eslint": "^7.0.0", + "babel-plugin-istanbul": "^4.0.0", + "babel-plugin-syntax-async-functions": "^6.13.0", + "babel-plugin-transform-async-to-module-method": "^6.16.0", + "babel-plugin-transform-runtime": "^6.15.0", + "babel-preset-env": "^1.6.0", + "chai": "^4.0.0", + "chai-as-promised": "^7.0.0", + "commitizen": "^2.8.6", + "coveralls": "^3.0.0", + "cross-env": "^5.0.0", + "cz-customizable": "^5.0.0", + "esdoc": "^1.0.1", + "esdoc-importpath-plugin": "^1.0.0", + "esdoc-standard-plugin": "^1.0.0", + "eslint": "^3.7.1", + "eslint-config-airbnb-base": "^8.0.0", + "eslint-plugin-import": "^1.16.0", + "eslint-plugin-mocha": "^4.8.0", + "fetch-mock": "^6.0.0", + "generate-changelog": "^1.0.2", + "gulp": "^3.9.1", + "gulp-babel": "^6.1.2", + "mocha": "^5.0.0", + "nodemon": "^1.11.0", + "nyc": "^11.0.0", + "proxyquire": "^1.7.10", + "sinon": "^4.1.2" }, "optionalDependencies": { "electron-installer-debian": "^0.8.0", @@ -161,8 +99,5 @@ "electron-windows-store": "^0.12.0", "electron-winstaller": "^2.5.0", "electron-wix-msi": "^1.3.0" - }, - "engines": { - "node": ">= 6.0" } } diff --git a/.editorconfig b/packages/api/core/.editorconfig similarity index 100% rename from .editorconfig rename to packages/api/core/.editorconfig diff --git a/.esdoc.json b/packages/api/core/.esdoc.json similarity index 100% rename from .esdoc.json rename to packages/api/core/.esdoc.json diff --git a/.eslintignore b/packages/api/core/.eslintignore similarity index 100% rename from .eslintignore rename to packages/api/core/.eslintignore diff --git a/packages/api/core/.gitignore b/packages/api/core/.gitignore new file mode 100644 index 0000000000..1c988ca8c8 --- /dev/null +++ b/packages/api/core/.gitignore @@ -0,0 +1,6 @@ +dist +node_modules +docs +.nyc_output +coverage +npm-debug.log diff --git a/.npmignore b/packages/api/core/.npmignore similarity index 100% rename from .npmignore rename to packages/api/core/.npmignore diff --git a/CHANGELOG.md b/packages/api/core/CHANGELOG.md similarity index 100% rename from CHANGELOG.md rename to packages/api/core/CHANGELOG.md diff --git a/packages/api/core/package.json b/packages/api/core/package.json new file mode 100644 index 0000000000..b502c88b61 --- /dev/null +++ b/packages/api/core/package.json @@ -0,0 +1,98 @@ +{ + "name": "@electron-forge/cli", + "version": "6.0.0-beta.0", + "description": "A complete tool for building modern Electron applications", + "repository": "https://github.com/electron-userland/electron-forge", + "main": "dist/api/index.js", + "bin": { + "electron-forge": "dist/electron-forge.js", + "forge": "dist/electron-forge.js", + "electron-forge-vscode-nix": "script/vscode.sh", + "electron-forge-vscode-win": "script/vscode.cmd" + }, + "scripts": { + "precommit": "npm run lint", + "docs": "esdoc", + "install": "node tabtab-install.js", + "test": "npm run lint && npm run test-all", + "test-coverage": "npm run lint && npm run test-all-coverage", + "test-all": "mocha test/**/*_spec*.js test/**/**/*_spec*.js", + "test-fast": "mocha test/**/*_spec.js test/**/**/*_spec.js --timeout=10000", + "test-all-coverage": "cross-env NODE_ENV=test nyc npm run test-all", + "test-fast-coverage": "cross-env NODE_ENV=test nyc npm run test-fast", + "release:patch": "changelog -p && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version patch && git push origin && git push origin --tags", + "release:minor": "changelog -m && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version minor && git push origin && git push origin --tags", + "release:major": "changelog -M && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version major && git push origin && git push origin --tags", + "watch-link": "nodemon --watch src --exec \"npm link\"" + }, + "author": "Samuel Attard", + "license": "MIT", + "devDependencies": { + "asar": "^0.14.0", + "chai": "^4.0.0", + "chai-as-promised": "^7.0.0", + "coveralls": "^3.0.0", + "cross-env": "^5.0.0", + "esdoc": "^1.0.1", + "esdoc-importpath-plugin": "^1.0.0", + "esdoc-standard-plugin": "^1.0.0", + "fetch-mock": "^6.0.0", + "generate-changelog": "^1.0.2", + "mocha": "^5.0.0", + "nodemon": "^1.11.0", + "nyc": "^11.0.0", + "proxyquire": "^1.7.10", + "sinon": "^4.1.2" + }, + "dependencies": { + "@octokit/rest": "^14.0.4", + "aws-sdk": "^2.9.0", + "bluebird": "^3.4.6", + "colors": "^1.1.2", + "commander": "^2.9.0", + "cross-spawn-promise": "^0.10.1", + "debug": "^3.0.0", + "electron-forge-template-angular2": "^1.0.3", + "electron-forge-template-react": "^1.0.2", + "electron-forge-template-react-typescript": "^1.0.3", + "electron-forge-template-vue": "^1.0.2", + "electron-packager": "^11.0.0", + "electron-rebuild": "^1.6.0", + "form-data": "^2.1.4", + "fs-extra": "^5.0.0", + "glob": "^7.1.1", + "inquirer": "^5.0.0", + "lodash.merge": "^4.6.0", + "lodash.template": "^4.4.0", + "log-symbols": "^2.0.0", + "mime-types": "^2.1.17", + "node-fetch": "^2.0.0", + "node-gyp": "^3.4.0", + "nugget": "^2.0.1", + "opn": "^5.0.0", + "ora": "^1.1.0", + "parse-author": "^2.0.0", + "pify": "^3.0.0", + "resolve-package": "^1.0.1", + "s3": "^4.4.0", + "semver": "^5.3.0", + "sudo-prompt": "^8.0.0", + "tabtab": "^2.2.1", + "username": "^3.0.0", + "yarn-or-npm": "^2.0.2", + "zip-folder": "^1.0.0" + }, + "optionalDependencies": { + "electron-installer-debian": "^0.8.0", + "electron-installer-dmg": "^0.2.0", + "electron-installer-flatpak": "^0.8.0", + "electron-installer-redhat": "^0.5.0", + "electron-installer-snap": "^2.0.0", + "electron-windows-store": "^0.12.0", + "electron-winstaller": "^2.5.0", + "electron-wix-msi": "^1.3.0" + }, + "engines": { + "node": ">= 6.0" + } +} diff --git a/script/vscode.cmd b/packages/api/core/script/vscode.cmd similarity index 100% rename from script/vscode.cmd rename to packages/api/core/script/vscode.cmd diff --git a/script/vscode.sh b/packages/api/core/script/vscode.sh similarity index 100% rename from script/vscode.sh rename to packages/api/core/script/vscode.sh diff --git a/src/api/import.js b/packages/api/core/src/api/import.js similarity index 100% rename from src/api/import.js rename to packages/api/core/src/api/import.js diff --git a/src/api/index.js b/packages/api/core/src/api/index.js similarity index 100% rename from src/api/index.js rename to packages/api/core/src/api/index.js diff --git a/src/api/init.js b/packages/api/core/src/api/init.js similarity index 100% rename from src/api/init.js rename to packages/api/core/src/api/init.js diff --git a/src/api/install.js b/packages/api/core/src/api/install.js similarity index 100% rename from src/api/install.js rename to packages/api/core/src/api/install.js diff --git a/src/api/lint.js b/packages/api/core/src/api/lint.js similarity index 100% rename from src/api/lint.js rename to packages/api/core/src/api/lint.js diff --git a/src/api/make.js b/packages/api/core/src/api/make.js similarity index 100% rename from src/api/make.js rename to packages/api/core/src/api/make.js diff --git a/src/api/package.js b/packages/api/core/src/api/package.js similarity index 100% rename from src/api/package.js rename to packages/api/core/src/api/package.js diff --git a/src/api/publish.js b/packages/api/core/src/api/publish.js similarity index 100% rename from src/api/publish.js rename to packages/api/core/src/api/publish.js diff --git a/src/api/start.js b/packages/api/core/src/api/start.js similarity index 100% rename from src/api/start.js rename to packages/api/core/src/api/start.js diff --git a/src/electron-forge-import.js b/packages/api/core/src/electron-forge-import.js similarity index 100% rename from src/electron-forge-import.js rename to packages/api/core/src/electron-forge-import.js diff --git a/src/electron-forge-init.js b/packages/api/core/src/electron-forge-init.js similarity index 100% rename from src/electron-forge-init.js rename to packages/api/core/src/electron-forge-init.js diff --git a/src/electron-forge-install.js b/packages/api/core/src/electron-forge-install.js similarity index 100% rename from src/electron-forge-install.js rename to packages/api/core/src/electron-forge-install.js diff --git a/src/electron-forge-lint.js b/packages/api/core/src/electron-forge-lint.js similarity index 100% rename from src/electron-forge-lint.js rename to packages/api/core/src/electron-forge-lint.js diff --git a/src/electron-forge-make.js b/packages/api/core/src/electron-forge-make.js similarity index 100% rename from src/electron-forge-make.js rename to packages/api/core/src/electron-forge-make.js diff --git a/src/electron-forge-package.js b/packages/api/core/src/electron-forge-package.js similarity index 100% rename from src/electron-forge-package.js rename to packages/api/core/src/electron-forge-package.js diff --git a/src/electron-forge-publish.js b/packages/api/core/src/electron-forge-publish.js similarity index 100% rename from src/electron-forge-publish.js rename to packages/api/core/src/electron-forge-publish.js diff --git a/src/electron-forge-start.js b/packages/api/core/src/electron-forge-start.js similarity index 100% rename from src/electron-forge-start.js rename to packages/api/core/src/electron-forge-start.js diff --git a/src/electron-forge.js b/packages/api/core/src/electron-forge.js similarity index 100% rename from src/electron-forge.js rename to packages/api/core/src/electron-forge.js diff --git a/src/init/init-custom.js b/packages/api/core/src/init/init-custom.js similarity index 100% rename from src/init/init-custom.js rename to packages/api/core/src/init/init-custom.js diff --git a/src/init/init-directory.js b/packages/api/core/src/init/init-directory.js similarity index 100% rename from src/init/init-directory.js rename to packages/api/core/src/init/init-directory.js diff --git a/src/init/init-git.js b/packages/api/core/src/init/init-git.js similarity index 100% rename from src/init/init-git.js rename to packages/api/core/src/init/init-git.js diff --git a/src/init/init-npm.js b/packages/api/core/src/init/init-npm.js similarity index 100% rename from src/init/init-npm.js rename to packages/api/core/src/init/init-npm.js diff --git a/src/init/init-starter-files.js b/packages/api/core/src/init/init-starter-files.js similarity index 100% rename from src/init/init-starter-files.js rename to packages/api/core/src/init/init-starter-files.js diff --git a/src/installers/darwin/dmg.js b/packages/api/core/src/installers/darwin/dmg.js similarity index 100% rename from src/installers/darwin/dmg.js rename to packages/api/core/src/installers/darwin/dmg.js diff --git a/src/installers/darwin/zip.js b/packages/api/core/src/installers/darwin/zip.js similarity index 100% rename from src/installers/darwin/zip.js rename to packages/api/core/src/installers/darwin/zip.js diff --git a/src/installers/linux/deb.js b/packages/api/core/src/installers/linux/deb.js similarity index 100% rename from src/installers/linux/deb.js rename to packages/api/core/src/installers/linux/deb.js diff --git a/src/installers/linux/rpm.js b/packages/api/core/src/installers/linux/rpm.js similarity index 100% rename from src/installers/linux/rpm.js rename to packages/api/core/src/installers/linux/rpm.js diff --git a/src/installers/win32/exe.js b/packages/api/core/src/installers/win32/exe.js similarity index 100% rename from src/installers/win32/exe.js rename to packages/api/core/src/installers/win32/exe.js diff --git a/src/makers/darwin/dmg.js b/packages/api/core/src/makers/darwin/dmg.js similarity index 100% rename from src/makers/darwin/dmg.js rename to packages/api/core/src/makers/darwin/dmg.js diff --git a/src/makers/generic/zip.js b/packages/api/core/src/makers/generic/zip.js similarity index 100% rename from src/makers/generic/zip.js rename to packages/api/core/src/makers/generic/zip.js diff --git a/src/makers/linux/deb.js b/packages/api/core/src/makers/linux/deb.js similarity index 100% rename from src/makers/linux/deb.js rename to packages/api/core/src/makers/linux/deb.js diff --git a/src/makers/linux/flatpak.js b/packages/api/core/src/makers/linux/flatpak.js similarity index 100% rename from src/makers/linux/flatpak.js rename to packages/api/core/src/makers/linux/flatpak.js diff --git a/src/makers/linux/rpm.js b/packages/api/core/src/makers/linux/rpm.js similarity index 100% rename from src/makers/linux/rpm.js rename to packages/api/core/src/makers/linux/rpm.js diff --git a/src/makers/linux/snap.js b/packages/api/core/src/makers/linux/snap.js similarity index 100% rename from src/makers/linux/snap.js rename to packages/api/core/src/makers/linux/snap.js diff --git a/src/makers/win32/appx.js b/packages/api/core/src/makers/win32/appx.js similarity index 100% rename from src/makers/win32/appx.js rename to packages/api/core/src/makers/win32/appx.js diff --git a/src/makers/win32/squirrel.js b/packages/api/core/src/makers/win32/squirrel.js similarity index 100% rename from src/makers/win32/squirrel.js rename to packages/api/core/src/makers/win32/squirrel.js diff --git a/src/makers/win32/wix.js b/packages/api/core/src/makers/win32/wix.js similarity index 100% rename from src/makers/win32/wix.js rename to packages/api/core/src/makers/win32/wix.js diff --git a/src/publishers/electron-release-server.js b/packages/api/core/src/publishers/electron-release-server.js similarity index 100% rename from src/publishers/electron-release-server.js rename to packages/api/core/src/publishers/electron-release-server.js diff --git a/src/publishers/github.js b/packages/api/core/src/publishers/github.js similarity index 100% rename from src/publishers/github.js rename to packages/api/core/src/publishers/github.js diff --git a/src/publishers/s3.js b/packages/api/core/src/publishers/s3.js similarity index 100% rename from src/publishers/s3.js rename to packages/api/core/src/publishers/s3.js diff --git a/src/publishers/snapcraft.js b/packages/api/core/src/publishers/snapcraft.js similarity index 100% rename from src/publishers/snapcraft.js rename to packages/api/core/src/publishers/snapcraft.js diff --git a/src/util/author-name.js b/packages/api/core/src/util/author-name.js similarity index 100% rename from src/util/author-name.js rename to packages/api/core/src/util/author-name.js diff --git a/src/util/check-system.js b/packages/api/core/src/util/check-system.js similarity index 100% rename from src/util/check-system.js rename to packages/api/core/src/util/check-system.js diff --git a/src/util/config-fn.js b/packages/api/core/src/util/config-fn.js similarity index 100% rename from src/util/config-fn.js rename to packages/api/core/src/util/config-fn.js diff --git a/src/util/config.js b/packages/api/core/src/util/config.js similarity index 100% rename from src/util/config.js rename to packages/api/core/src/util/config.js diff --git a/src/util/confirm-if-interactive.js b/packages/api/core/src/util/confirm-if-interactive.js similarity index 100% rename from src/util/confirm-if-interactive.js rename to packages/api/core/src/util/confirm-if-interactive.js diff --git a/src/util/deprecate.js b/packages/api/core/src/util/deprecate.js similarity index 100% rename from src/util/deprecate.js rename to packages/api/core/src/util/deprecate.js diff --git a/src/util/electron-version.js b/packages/api/core/src/util/electron-version.js similarity index 100% rename from src/util/electron-version.js rename to packages/api/core/src/util/electron-version.js diff --git a/src/util/ensure-output.js b/packages/api/core/src/util/ensure-output.js similarity index 100% rename from src/util/ensure-output.js rename to packages/api/core/src/util/ensure-output.js diff --git a/src/util/forge-config.js b/packages/api/core/src/util/forge-config.js similarity index 100% rename from src/util/forge-config.js rename to packages/api/core/src/util/forge-config.js diff --git a/src/util/github.js b/packages/api/core/src/util/github.js similarity index 100% rename from src/util/github.js rename to packages/api/core/src/util/github.js diff --git a/src/util/hdiutil.js b/packages/api/core/src/util/hdiutil.js similarity index 100% rename from src/util/hdiutil.js rename to packages/api/core/src/util/hdiutil.js diff --git a/src/util/hook.js b/packages/api/core/src/util/hook.js similarity index 100% rename from src/util/hook.js rename to packages/api/core/src/util/hook.js diff --git a/src/util/install-dependencies.js b/packages/api/core/src/util/install-dependencies.js similarity index 100% rename from src/util/install-dependencies.js rename to packages/api/core/src/util/install-dependencies.js diff --git a/src/util/is-installed.js b/packages/api/core/src/util/is-installed.js similarity index 100% rename from src/util/is-installed.js rename to packages/api/core/src/util/is-installed.js diff --git a/src/util/linux-config.js b/packages/api/core/src/util/linux-config.js similarity index 100% rename from src/util/linux-config.js rename to packages/api/core/src/util/linux-config.js diff --git a/src/util/linux-installer.js b/packages/api/core/src/util/linux-installer.js similarity index 100% rename from src/util/linux-installer.js rename to packages/api/core/src/util/linux-installer.js diff --git a/src/util/messages.js b/packages/api/core/src/util/messages.js similarity index 100% rename from src/util/messages.js rename to packages/api/core/src/util/messages.js diff --git a/src/util/move-app.js b/packages/api/core/src/util/move-app.js similarity index 100% rename from src/util/move-app.js rename to packages/api/core/src/util/move-app.js diff --git a/src/util/ora-handler.js b/packages/api/core/src/util/ora-handler.js similarity index 100% rename from src/util/ora-handler.js rename to packages/api/core/src/util/ora-handler.js diff --git a/src/util/ora.js b/packages/api/core/src/util/ora.js similarity index 100% rename from src/util/ora.js rename to packages/api/core/src/util/ora.js diff --git a/src/util/out-dir.js b/packages/api/core/src/util/out-dir.js similarity index 100% rename from src/util/out-dir.js rename to packages/api/core/src/util/out-dir.js diff --git a/src/util/parse-archs.js b/packages/api/core/src/util/parse-archs.js similarity index 100% rename from src/util/parse-archs.js rename to packages/api/core/src/util/parse-archs.js diff --git a/src/util/plugin-interface.js b/packages/api/core/src/util/plugin-interface.js similarity index 100% rename from src/util/plugin-interface.js rename to packages/api/core/src/util/plugin-interface.js diff --git a/src/util/publish-state.js b/packages/api/core/src/util/publish-state.js similarity index 100% rename from src/util/publish-state.js rename to packages/api/core/src/util/publish-state.js diff --git a/src/util/read-package-json.js b/packages/api/core/src/util/read-package-json.js similarity index 100% rename from src/util/read-package-json.js rename to packages/api/core/src/util/read-package-json.js diff --git a/src/util/rebuild.js b/packages/api/core/src/util/rebuild.js similarity index 100% rename from src/util/rebuild.js rename to packages/api/core/src/util/rebuild.js diff --git a/src/util/require-search.js b/packages/api/core/src/util/require-search.js similarity index 100% rename from src/util/require-search.js rename to packages/api/core/src/util/require-search.js diff --git a/src/util/resolve-dir.js b/packages/api/core/src/util/resolve-dir.js similarity index 100% rename from src/util/resolve-dir.js rename to packages/api/core/src/util/resolve-dir.js diff --git a/src/util/terminate.js b/packages/api/core/src/util/terminate.js similarity index 100% rename from src/util/terminate.js rename to packages/api/core/src/util/terminate.js diff --git a/src/util/yarn-or-npm.js b/packages/api/core/src/util/yarn-or-npm.js similarity index 100% rename from src/util/yarn-or-npm.js rename to packages/api/core/src/util/yarn-or-npm.js diff --git a/tabtab-install.js b/packages/api/core/tabtab-install.js similarity index 100% rename from tabtab-install.js rename to packages/api/core/tabtab-install.js diff --git a/test/.eslintrc b/packages/api/core/test/.eslintrc similarity index 100% rename from test/.eslintrc rename to packages/api/core/test/.eslintrc diff --git a/test/fast/author-name_spec.js b/packages/api/core/test/fast/author-name_spec.js similarity index 100% rename from test/fast/author-name_spec.js rename to packages/api/core/test/fast/author-name_spec.js diff --git a/test/fast/config_spec.js b/packages/api/core/test/fast/config_spec.js similarity index 100% rename from test/fast/config_spec.js rename to packages/api/core/test/fast/config_spec.js diff --git a/test/fast/confirm-if-interactive_spec.js b/packages/api/core/test/fast/confirm-if-interactive_spec.js similarity index 100% rename from test/fast/confirm-if-interactive_spec.js rename to packages/api/core/test/fast/confirm-if-interactive_spec.js diff --git a/test/fast/electron_forge_start_spec.js b/packages/api/core/test/fast/electron_forge_start_spec.js similarity index 100% rename from test/fast/electron_forge_start_spec.js rename to packages/api/core/test/fast/electron_forge_start_spec.js diff --git a/test/fast/ensure-output_spec.js b/packages/api/core/test/fast/ensure-output_spec.js similarity index 100% rename from test/fast/ensure-output_spec.js rename to packages/api/core/test/fast/ensure-output_spec.js diff --git a/test/fast/forge-config_spec.js b/packages/api/core/test/fast/forge-config_spec.js similarity index 100% rename from test/fast/forge-config_spec.js rename to packages/api/core/test/fast/forge-config_spec.js diff --git a/test/fast/github_spec.js b/packages/api/core/test/fast/github_spec.js similarity index 100% rename from test/fast/github_spec.js rename to packages/api/core/test/fast/github_spec.js diff --git a/test/fast/hook_spec.js b/packages/api/core/test/fast/hook_spec.js similarity index 100% rename from test/fast/hook_spec.js rename to packages/api/core/test/fast/hook_spec.js diff --git a/test/fast/install-dependencies_spec.js b/packages/api/core/test/fast/install-dependencies_spec.js similarity index 100% rename from test/fast/install-dependencies_spec.js rename to packages/api/core/test/fast/install-dependencies_spec.js diff --git a/test/fast/makers/appx_spec.js b/packages/api/core/test/fast/makers/appx_spec.js similarity index 100% rename from test/fast/makers/appx_spec.js rename to packages/api/core/test/fast/makers/appx_spec.js diff --git a/test/fast/makers/deb_spec.js b/packages/api/core/test/fast/makers/deb_spec.js similarity index 100% rename from test/fast/makers/deb_spec.js rename to packages/api/core/test/fast/makers/deb_spec.js diff --git a/test/fast/makers/dmg_spec.js b/packages/api/core/test/fast/makers/dmg_spec.js similarity index 100% rename from test/fast/makers/dmg_spec.js rename to packages/api/core/test/fast/makers/dmg_spec.js diff --git a/test/fast/makers/flatpak_spec.js b/packages/api/core/test/fast/makers/flatpak_spec.js similarity index 100% rename from test/fast/makers/flatpak_spec.js rename to packages/api/core/test/fast/makers/flatpak_spec.js diff --git a/test/fast/makers/rpm_spec.js b/packages/api/core/test/fast/makers/rpm_spec.js similarity index 100% rename from test/fast/makers/rpm_spec.js rename to packages/api/core/test/fast/makers/rpm_spec.js diff --git a/test/fast/makers/snap_spec.js b/packages/api/core/test/fast/makers/snap_spec.js similarity index 100% rename from test/fast/makers/snap_spec.js rename to packages/api/core/test/fast/makers/snap_spec.js diff --git a/test/fast/makers_spec.js b/packages/api/core/test/fast/makers_spec.js similarity index 100% rename from test/fast/makers_spec.js rename to packages/api/core/test/fast/makers_spec.js diff --git a/test/fast/ora-handler_spec.js b/packages/api/core/test/fast/ora-handler_spec.js similarity index 100% rename from test/fast/ora-handler_spec.js rename to packages/api/core/test/fast/ora-handler_spec.js diff --git a/test/fast/out-dir_spec.js b/packages/api/core/test/fast/out-dir_spec.js similarity index 100% rename from test/fast/out-dir_spec.js rename to packages/api/core/test/fast/out-dir_spec.js diff --git a/test/fast/parse-archs_spec.js b/packages/api/core/test/fast/parse-archs_spec.js similarity index 100% rename from test/fast/parse-archs_spec.js rename to packages/api/core/test/fast/parse-archs_spec.js diff --git a/test/fast/publish_spec.js b/packages/api/core/test/fast/publish_spec.js similarity index 100% rename from test/fast/publish_spec.js rename to packages/api/core/test/fast/publish_spec.js diff --git a/test/fast/read-package-json_spec.js b/packages/api/core/test/fast/read-package-json_spec.js similarity index 100% rename from test/fast/read-package-json_spec.js rename to packages/api/core/test/fast/read-package-json_spec.js diff --git a/test/fast/require-search_spec.js b/packages/api/core/test/fast/require-search_spec.js similarity index 100% rename from test/fast/require-search_spec.js rename to packages/api/core/test/fast/require-search_spec.js diff --git a/test/fast/resolve-dir_spec.js b/packages/api/core/test/fast/resolve-dir_spec.js similarity index 100% rename from test/fast/resolve-dir_spec.js rename to packages/api/core/test/fast/resolve-dir_spec.js diff --git a/test/fast/start_spec.js b/packages/api/core/test/fast/start_spec.js similarity index 100% rename from test/fast/start_spec.js rename to packages/api/core/test/fast/start_spec.js diff --git a/test/fast/system_spec.js b/packages/api/core/test/fast/system_spec.js similarity index 100% rename from test/fast/system_spec.js rename to packages/api/core/test/fast/system_spec.js diff --git a/test/fast/yarn-or-npm_spec.js b/packages/api/core/test/fast/yarn-or-npm_spec.js similarity index 100% rename from test/fast/yarn-or-npm_spec.js rename to packages/api/core/test/fast/yarn-or-npm_spec.js diff --git a/test/fixture/bogus-private-key.pvk b/packages/api/core/test/fixture/bogus-private-key.pvk similarity index 100% rename from test/fixture/bogus-private-key.pvk rename to packages/api/core/test/fixture/bogus-private-key.pvk diff --git a/test/fixture/custom_init/index.js b/packages/api/core/test/fixture/custom_init/index.js similarity index 100% rename from test/fixture/custom_init/index.js rename to packages/api/core/test/fixture/custom_init/index.js diff --git a/test/fixture/custom_init/package.json b/packages/api/core/test/fixture/custom_init/package.json similarity index 100% rename from test/fixture/custom_init/package.json rename to packages/api/core/test/fixture/custom_init/package.json diff --git a/test/fixture/custom_init/tmpl/_bar b/packages/api/core/test/fixture/custom_init/tmpl/_bar similarity index 100% rename from test/fixture/custom_init/tmpl/_bar rename to packages/api/core/test/fixture/custom_init/tmpl/_bar diff --git a/test/fixture/custom_init/tmpl/src/foo.js b/packages/api/core/test/fixture/custom_init/tmpl/src/foo.js similarity index 100% rename from test/fixture/custom_init/tmpl/src/foo.js rename to packages/api/core/test/fixture/custom_init/tmpl/src/foo.js diff --git a/test/fixture/dummy_app/foo/null b/packages/api/core/test/fixture/dummy_app/foo/null similarity index 100% rename from test/fixture/dummy_app/foo/null rename to packages/api/core/test/fixture/dummy_app/foo/null diff --git a/test/fixture/dummy_app/package.json b/packages/api/core/test/fixture/dummy_app/package.json similarity index 100% rename from test/fixture/dummy_app/package.json rename to packages/api/core/test/fixture/dummy_app/package.json diff --git a/test/fixture/dummy_js_conf/forge.config.js b/packages/api/core/test/fixture/dummy_js_conf/forge.config.js similarity index 100% rename from test/fixture/dummy_js_conf/forge.config.js rename to packages/api/core/test/fixture/dummy_js_conf/forge.config.js diff --git a/test/fixture/dummy_js_conf/package.json b/packages/api/core/test/fixture/dummy_js_conf/package.json similarity index 100% rename from test/fixture/dummy_js_conf/package.json rename to packages/api/core/test/fixture/dummy_js_conf/package.json diff --git a/test/fixture/maker-incompatible.js b/packages/api/core/test/fixture/maker-incompatible.js similarity index 100% rename from test/fixture/maker-incompatible.js rename to packages/api/core/test/fixture/maker-incompatible.js diff --git a/test/fixture/maker-unsupported.js b/packages/api/core/test/fixture/maker-unsupported.js similarity index 100% rename from test/fixture/maker-unsupported.js rename to packages/api/core/test/fixture/maker-unsupported.js diff --git a/test/fixture/native_app/package.json b/packages/api/core/test/fixture/native_app/package.json similarity index 100% rename from test/fixture/native_app/package.json rename to packages/api/core/test/fixture/native_app/package.json diff --git a/test/mocha.opts b/packages/api/core/test/mocha.opts similarity index 100% rename from test/mocha.opts rename to packages/api/core/test/mocha.opts diff --git a/test/slow/api_spec_slow.js b/packages/api/core/test/slow/api_spec_slow.js similarity index 100% rename from test/slow/api_spec_slow.js rename to packages/api/core/test/slow/api_spec_slow.js diff --git a/test/slow/install-dependencies_spec_slow.js b/packages/api/core/test/slow/install-dependencies_spec_slow.js similarity index 100% rename from test/slow/install-dependencies_spec_slow.js rename to packages/api/core/test/slow/install-dependencies_spec_slow.js diff --git a/test/slow/install_spec_slow.js b/packages/api/core/test/slow/install_spec_slow.js similarity index 100% rename from test/slow/install_spec_slow.js rename to packages/api/core/test/slow/install_spec_slow.js diff --git a/test/slow/rebuild_spec_slow.js b/packages/api/core/test/slow/rebuild_spec_slow.js similarity index 100% rename from test/slow/rebuild_spec_slow.js rename to packages/api/core/test/slow/rebuild_spec_slow.js diff --git a/tmpl/_appveyor.yml b/packages/api/core/tmpl/_appveyor.yml similarity index 100% rename from tmpl/_appveyor.yml rename to packages/api/core/tmpl/_appveyor.yml diff --git a/tmpl/_gitignore b/packages/api/core/tmpl/_gitignore similarity index 100% rename from tmpl/_gitignore rename to packages/api/core/tmpl/_gitignore diff --git a/tmpl/_travis.yml b/packages/api/core/tmpl/_travis.yml similarity index 100% rename from tmpl/_travis.yml rename to packages/api/core/tmpl/_travis.yml diff --git a/tmpl/index.html b/packages/api/core/tmpl/index.html similarity index 100% rename from tmpl/index.html rename to packages/api/core/tmpl/index.html diff --git a/tmpl/index.js b/packages/api/core/tmpl/index.js similarity index 100% rename from tmpl/index.js rename to packages/api/core/tmpl/index.js diff --git a/tmpl/package.json b/packages/api/core/tmpl/package.json similarity index 100% rename from tmpl/package.json rename to packages/api/core/tmpl/package.json diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000000..da15577ea4 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,7563 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@octokit/rest@^14.0.4": + version "14.0.9" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-14.0.9.tgz#d5e0a00dcb78901dd7b2ef852acfc0aea7c479ef" + dependencies: + before-after-hook "^1.1.0" + debug "^3.1.0" + is-array-buffer "^1.0.0" + is-stream "^1.1.0" + lodash "^4.17.4" + url-template "^2.0.8" + +"@sinonjs/formatio@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" + dependencies: + samsam "1.3.0" + +abab@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" + +abbrev@1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + +acorn-globals@^1.0.4: + version "1.0.9" + resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" + dependencies: + acorn "^2.1.0" + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^2.1.0, acorn@^2.4.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-2.7.0.tgz#ab6e7d9d886aaca8b085bc3312b79a198433f0e7" + +acorn@^3.0.4: + version "3.3.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^5.4.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" + +ajv-keywords@^1.0.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + +ajv@^4.7.0, ajv@^4.9.1: + version "4.11.8" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + +ajv@^5.1.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +align-text@^0.1.1, align-text@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" + dependencies: + kind-of "^3.0.2" + longest "^1.0.1" + repeat-string "^1.5.2" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-align@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + dependencies: + string-width "^2.0.0" + +ansi-colors@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.0.1.tgz#e94c6c306005af8b482240241e2f3dea4b855ff3" + dependencies: + ansi-wrap "^0.1.0" + +ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + +ansi-escapes@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-styles@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" + dependencies: + color-convert "^1.9.0" + +ansi-wrap@0.1.0, ansi-wrap@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + +ansi@^0.3.0, ansi@~0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + +appdmg@^0.4.5: + version "0.4.5" + resolved "https://registry.yarnpkg.com/appdmg/-/appdmg-0.4.5.tgz#47a827865b8a0be48abb3522567e3493d2f1b838" + dependencies: + async "^1.4.2" + cp-file "^3.1.0" + ds-store "^0.1.5" + execa "^0.4.0" + fs-temp "^1.0.0" + fs-xattr "^0.1.14" + image-size "^0.5.0" + is-my-json-valid "^2.13.1" + minimist "^1.1.3" + parse-color "^1.0.0" + repeat-string "^1.5.4" + +append-transform@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + dependencies: + default-require-extensions "^1.0.0" + +aproba@^1.0.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" + +archiver@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.11.0.tgz#98177da7a6c0192b7f2798f30cd6eab8abd76690" + dependencies: + async "~0.9.0" + buffer-crc32 "~0.2.1" + glob "~3.2.6" + lazystream "~0.1.0" + lodash "~2.4.1" + readable-stream "~1.0.26" + tar-stream "~0.4.0" + zip-stream "~0.4.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + +are-we-there-yet@~1.1.2: + version "1.1.4" + resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" + dependencies: + delegates "^1.0.0" + readable-stream "^2.0.6" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-buffer-from-string@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/array-buffer-from-string/-/array-buffer-from-string-0.1.0.tgz#3b14351f86149d84efc612c5ada7ed85169d7b07" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-each@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-slice@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1, array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + +arrify@^1.0.0, arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asar@^0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/asar/-/asar-0.11.0.tgz#b926e792c315f8c048c43371e325b09c97a76464" + dependencies: + chromium-pickle-js "^0.1.0" + commander "^2.9.0" + cuint "^0.2.1" + glob "^6.0.4" + minimatch "^3.0.0" + mkdirp "^0.5.0" + mksnapshot "^0.3.0" + +asar@^0.12.0: + version "0.12.4" + resolved "https://registry.yarnpkg.com/asar/-/asar-0.12.4.tgz#2dd3f116882eab8c0f23b754792a82a7d9fce171" + dependencies: + chromium-pickle-js "^0.2.0" + commander "^2.9.0" + cuint "^0.2.1" + glob "^6.0.4" + minimatch "^3.0.3" + mkdirp "^0.5.0" + mksnapshot "^0.3.0" + tmp "0.0.28" + +asar@^0.13.0: + version "0.13.1" + resolved "https://registry.yarnpkg.com/asar/-/asar-0.13.1.tgz#dfc73f574a7db256b09ba62d1f0e95cd4a6cb8d3" + dependencies: + chromium-pickle-js "^0.2.0" + commander "^2.9.0" + cuint "^0.2.1" + glob "^6.0.4" + minimatch "^3.0.3" + mkdirp "^0.5.0" + mksnapshot "^0.3.0" + tmp "0.0.28" + +asar@^0.14.0: + version "0.14.2" + resolved "https://registry.yarnpkg.com/asar/-/asar-0.14.2.tgz#9ec5ec8dcb1904de288fd5ff94f2a8ed4014b094" + dependencies: + chromium-pickle-js "^0.2.0" + commander "^2.9.0" + cuint "^0.2.1" + glob "^6.0.4" + minimatch "^3.0.3" + mkdirp "^0.5.0" + mksnapshot "^0.3.0" + tmp "0.0.28" + +asn1@0.1.11: + version "0.1.11" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.1.11.tgz#559be18376d08a4ec4dbe80877d27818639b2df7" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.1.5.tgz#ee74009413002d84cec7219c6ac811812e723160" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +assertion-error@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + +async-each@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" + +async@^1.4.0, async@^1.4.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + +async@^2.0.0, async@^2.1.5: + version "2.6.0" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" + dependencies: + lodash "^4.14.0" + +async@~0.9.0: + version "0.9.2" + resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + +async@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +atob@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" + +attempt-x@^1.1.0, attempt-x@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/attempt-x/-/attempt-x-1.1.1.tgz#fba64e96ce03c3e0bd92c92622061c4df387cb76" + +author-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/author-regex/-/author-regex-1.0.0.tgz#d08885be6b9bbf9439fe087c76287245f0a81450" + +aws-sdk@^2.9.0: + version "2.196.0" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.196.0.tgz#0fabf9b1d22997c59d77a025c6bd4666924f147c" + dependencies: + buffer "4.9.1" + events "^1.1.1" + jmespath "0.15.0" + querystring "0.2.0" + sax "1.2.1" + url "0.10.3" + uuid "3.1.0" + xml2js "0.4.17" + xmlbuilder "4.2.1" + +aws-sdk@~2.0.31: + version "2.0.31" + resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.0.31.tgz#e72cf1fdc69015bd9fd2bdf3d3b88c16507d268e" + dependencies: + xml2js "0.2.6" + xmlbuilder "0.4.2" + +aws-sign2@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.5.0.tgz#c57103f7a17fc037f02d7c2e64b602ea223f7d63" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +babel-code-frame@^6.16.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +babel-core@^6.23.1, babel-core@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.0" + debug "^2.6.8" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.7" + slash "^1.0.0" + source-map "^0.5.6" + +babel-eslint@^7.0.0: + version "7.2.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" + dependencies: + babel-code-frame "^6.22.0" + babel-traverse "^6.23.1" + babel-types "^6.23.0" + babylon "^6.17.0" + +babel-generator@6.11.4: + version "6.11.4" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.11.4.tgz#14f6933abb20c62666d27e3b7b9f5b9dc0712a9a" + dependencies: + babel-messages "^6.8.0" + babel-runtime "^6.9.0" + babel-types "^6.10.2" + detect-indent "^3.0.1" + lodash "^4.2.0" + source-map "^0.5.0" + +babel-generator@6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.6" + trim-right "^1.0.1" + +babel-generator@^6.18.0, babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-call-delegate@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-define-map@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-function-name@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" + dependencies: + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-get-function-arity@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-hoist-variables@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-optimise-call-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helper-replace-supers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" + dependencies: + babel-helper-optimise-call-expression "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-helpers@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-messages@^6.23.0, babel-messages@^6.8.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-check-es2015-constants@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-istanbul@^4.0.0: + version "4.1.5" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e" + dependencies: + find-up "^2.1.0" + istanbul-lib-instrument "^1.7.5" + test-exclude "^4.1.1" + +babel-plugin-syntax-async-functions@^6.13.0, babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-async-to-module-method@^6.16.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-module-method/-/babel-plugin-transform-async-to-module-method-6.24.1.tgz#9109a08987794b411cb213850ce935ec2f029cdb" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-arrow-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-plugin-transform-es2015-classes@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" + dependencies: + babel-helper-define-map "^6.24.1" + babel-helper-function-name "^6.24.1" + babel-helper-optimise-call-expression "^6.24.1" + babel-helper-replace-supers "^6.24.1" + babel-messages "^6.23.0" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-computed-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" + dependencies: + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-destructuring@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" + dependencies: + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" + dependencies: + babel-helper-call-delegate "^6.24.1" + babel-helper-get-function-arity "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-shorthand-properties@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-spread@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-template-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + +babel-plugin-transform-runtime@^6.15.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-strict-mode@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-preset-env@^1.6.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^2.1.2" + invariant "^2.2.2" + semver "^5.3.0" + +babel-register@^6.16.3, babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + +babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + +babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + +babel-traverse@6.26.0, babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.10.2, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + +babylon@6.18.0, babylon@^6.17.0, babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +base32-encode@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/base32-encode/-/base32-encode-0.1.1.tgz#7510f6aa44e2c695b7efcb2673a454f8f8505ea0" + +base64-js@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.0.tgz#a39992d723584811982be5e290bb6a53d86700f1" + +base64-js@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.2.1.tgz#a91947da1f4a516ea38e5b4ec0ec3773675e0886" + +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +before-after-hook@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.1.0.tgz#83165e15a59460d13702cb8febd6a1807896db5a" + +binary-extensions@^1.0.0: + version "1.11.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" + +binary@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/binary/-/binary-0.3.0.tgz#9f60553bc5ce8c3386f3b553cff47462adecaa79" + dependencies: + buffers "~0.1.1" + chainsaw "~0.1.0" + +bl@^0.9.0, bl@~0.9.0: + version "0.9.5" + resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054" + dependencies: + readable-stream "~1.0.26" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +bluebird@^3.0.6, bluebird@^3.1.1, bluebird@^3.3.4, bluebird@^3.4.6, bluebird@^3.5.0: + version "3.5.1" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" + +boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + +boom@0.4.x: + version "0.4.2" + resolved "https://registry.yarnpkg.com/boom/-/boom-0.4.2.tgz#7a636e9ded4efcefb19cef4947a3c67dfaee911b" + dependencies: + hoek "0.9.x" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +boxen@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + +bplist-creator@~0.0.3: + version "0.0.7" + resolved "https://registry.yarnpkg.com/bplist-creator/-/bplist-creator-0.0.7.tgz#37df1536092824b87c42f957b01344117372ae45" + dependencies: + stream-buffers "~2.2.0" + +brace-expansion@^1.0.0, brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +braces@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.0.tgz#a46941cb5fb492156b3d6a656e06c35364e3e66e" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + +browser-stdout@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + +browserslist@^2.1.2: + version "2.11.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" + dependencies: + caniuse-lite "^1.0.30000792" + electron-to-chromium "^1.3.30" + +buffer-crc32@~0.2.1: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +buffer-from@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-0.1.1.tgz#57b18b1da0a19ec06f33837a5275a242351bd75e" + dependencies: + is-array-buffer-x "^1.0.13" + +buffer@4.9.1: + version "4.9.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + isarray "^1.0.0" + +buffers@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/buffers/-/buffers-0.1.1.tgz#b24579c3bed4d6d396aeee6d9a8ae7f5482ab7bb" + +builtin-modules@^1.0.0, builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + +cached-constructors-x@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cached-constructors-x/-/cached-constructors-x-1.0.0.tgz#c421e3892a4b6f7794434bdcffd1299b330c181b" + +cachedir@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cachedir/-/cachedir-1.2.0.tgz#e9a0a25bb21a2b7a0f766f07c41eb7a311919b97" + dependencies: + os-homedir "^1.0.1" + +caching-transform@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" + dependencies: + md5-hex "^1.2.0" + mkdirp "^0.5.1" + write-file-atomic "^1.1.4" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^1.0.2: + version "1.2.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + +camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + +caniuse-lite@^1.0.30000792: + version "1.0.30000808" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000808.tgz#7d759b5518529ea08b6705a19e70dbf401628ffc" + +capture-stack-trace@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +caseless@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.6.0.tgz#8167c1ab8397fb5bb95f96d28e5a81c50f247ac4" + +center-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" + dependencies: + align-text "^0.1.3" + lazy-cache "^1.0.3" + +chai-as-promised@^7.0.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.1.tgz#08645d825deb8696ee61725dbf590c012eb00ca0" + dependencies: + check-error "^1.0.2" + +chai@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" + dependencies: + assertion-error "^1.0.1" + check-error "^1.0.1" + deep-eql "^3.0.0" + get-func-name "^2.0.0" + pathval "^1.0.0" + type-detect "^4.0.0" + +chainsaw@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/chainsaw/-/chainsaw-0.1.0.tgz#5eab50b28afe58074d0d58291388828b5e5fbc98" + dependencies: + traverse ">=0.3.0 <0.4" + +chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.1.tgz#523fe2678aec7b04e8041909292fe8b17059b796" + dependencies: + ansi-styles "^3.2.0" + escape-string-regexp "^1.0.5" + supports-color "^5.2.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + +check-error@^1.0.1, check-error@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + +cheerio@0.20.0: + version "0.20.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.20.0.tgz#5c710f2bab95653272842ba01c6ea61b3545ec35" + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "~3.8.1" + lodash "^4.1.0" + optionalDependencies: + jsdom "^7.0.2" + +cheerio@0.22.0: + version "0.22.0" + resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e" + dependencies: + css-select "~1.2.0" + dom-serializer "~0.1.0" + entities "~1.1.1" + htmlparser2 "^3.9.1" + lodash.assignin "^4.0.9" + lodash.bind "^4.1.4" + lodash.defaults "^4.0.1" + lodash.filter "^4.4.0" + lodash.flatten "^4.2.0" + lodash.foreach "^4.3.0" + lodash.map "^4.4.0" + lodash.merge "^4.4.0" + lodash.pick "^4.2.1" + lodash.reduce "^4.4.0" + lodash.reject "^4.4.0" + lodash.some "^4.4.0" + +chokidar@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + upath "^1.0.0" + optionalDependencies: + fsevents "^1.0.0" + +chromium-pickle-js@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.1.0.tgz#1d48b107d82126a2f3e211c2ea25f803ba551b21" + +chromium-pickle-js@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.2.0.tgz#04a106672c18b085ab774d983dfa3ea138f22205" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + +cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + +cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + dependencies: + restore-cursor "^1.0.1" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-spinners@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.1.0.tgz#f1847b168844d917a671eb9d147e3df497c90d06" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +cliui@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" + dependencies: + center-align "^0.1.1" + right-align "^0.1.1" + wordwrap "0.0.2" + +cliui@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrap-ansi "^2.0.0" + +cliui@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + +clone-stats@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0, clone@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +code-point-at@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + +codecov.io@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/codecov.io/-/codecov.io-0.0.1.tgz#25ea2b095e1e9ea11872bdfa5842118130df78b1" + dependencies: + request "2.42.0" + urlgrey "0.4.0" + +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + +color-convert@^1.9.0: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" + dependencies: + color-name "^1.1.1" + +color-convert@~0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-0.5.3.tgz#bdb6c69ce660fadffe0b0007cc447e1b9f7282bd" + +color-logger@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/color-logger/-/color-logger-0.0.3.tgz#d9b22dd1d973e166b18bf313f9f481bba4df2018" + +color-name@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + +colors@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + +colors@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" + +colors@~0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" + +combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +combined-stream@~0.0.4: + version "0.0.7" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-0.0.7.tgz#0137e657baa5a7541c57ac37ac5fc07d73b4dc1f" + dependencies: + delayed-stream "0.0.5" + +commander@2.11.0: + version "2.11.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" + +commander@^2.11.0, commander@^2.9.0: + version "2.14.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" + +commander@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.1.0.tgz#d121bbae860d9992a3d517ba96f56588e47c6781" + +commitizen@^2.8.6: + version "2.9.6" + resolved "https://registry.yarnpkg.com/commitizen/-/commitizen-2.9.6.tgz#c0d00535ef264da7f63737edfda4228983fa2291" + dependencies: + cachedir "^1.1.0" + chalk "1.1.3" + cz-conventional-changelog "1.2.0" + dedent "0.6.0" + detect-indent "4.0.0" + find-node-modules "1.0.4" + find-root "1.0.0" + fs-extra "^1.0.0" + glob "7.1.1" + inquirer "1.2.3" + lodash "4.17.2" + minimist "1.2.0" + path-exists "2.1.0" + shelljs "0.7.6" + strip-json-comments "2.0.1" + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + +compare-version@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/compare-version/-/compare-version-0.1.2.tgz#0162ec2d9351f5ddd59a9202cba935366a725080" + +component-emitter@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" + +compress-commons@~0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-0.1.6.tgz#0c740870fde58cba516f0ac0c822e33a0b85dfa3" + dependencies: + buffer-crc32 "~0.2.1" + crc32-stream "~0.3.1" + readable-stream "~1.0.26" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@1.6.0, concat-stream@^1.4.7, concat-stream@^1.5.2: + version "1.6.0" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +configstore@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + +console-control-strings@^1.0.0, console-control-strings@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" + +contains-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + +conventional-commit-types@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.2.0.tgz#5db95739d6c212acbe7b6f656a11b940baa68946" + +convert-source-map@^1.3.0, convert-source-map@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +coveralls@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.0.0.tgz#22ef730330538080d29b8c151dc9146afde88a99" + dependencies: + js-yaml "^3.6.1" + lcov-parse "^0.0.10" + log-driver "^1.2.5" + minimist "^1.2.0" + request "^2.79.0" + +cp-file@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/cp-file/-/cp-file-3.2.0.tgz#6f83616254624f0ad58aa4aa8d076f026be7e188" + dependencies: + graceful-fs "^4.1.2" + mkdirp "^0.5.0" + nested-error-stacks "^1.0.1" + object-assign "^4.0.1" + pify "^2.3.0" + pinkie-promise "^2.0.0" + readable-stream "^2.1.4" + +crc32-stream@~0.3.1: + version "0.3.4" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-0.3.4.tgz#73bc25b45fac1db6632231a7bfce8927e9f06552" + dependencies: + buffer-crc32 "~0.2.1" + readable-stream "~1.0.24" + +create-error-class@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + dependencies: + capture-stack-trace "^1.0.0" + +cross-env@^5.0.0: + version "5.1.3" + resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.1.3.tgz#f8ae18faac87692b0a8b4d2f7000d4ec3a85dfd7" + dependencies: + cross-spawn "^5.1.0" + is-windows "^1.0.0" + +cross-spawn-async@^2.1.1: + version "2.2.5" + resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" + dependencies: + lru-cache "^4.0.0" + which "^1.2.8" + +cross-spawn-promise@^0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/cross-spawn-promise/-/cross-spawn-promise-0.10.1.tgz#db9cb4c50c60b72a15be049b78122ce382d87b10" + dependencies: + cross-spawn "^5.1.0" + +cross-spawn@^4: + version "4.0.2" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + +cross-spawn@^5.0.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cryptiles@0.2.x: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" + dependencies: + boom "0.4.x" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + +css-select@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858" + dependencies: + boolbase "~1.0.0" + css-what "2.1" + domutils "1.5.1" + nth-check "~1.0.1" + +css-what@2.1: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" + +cssom@0.3.x, "cssom@>= 0.3.0 < 0.4.0": + version "0.3.2" + resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" + +"cssstyle@>= 0.2.29 < 0.3.0": + version "0.2.37" + resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" + dependencies: + cssom "0.3.x" + +ctype@0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/ctype/-/ctype-0.5.3.tgz#82c18c2461f74114ef16c135224ad0b9144ca12f" + +cuint@^0.2.1: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +cycle@1.0.x: + version "1.0.3" + resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + +cz-conventional-changelog@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-1.2.0.tgz#2bca04964c8919b23f3fd6a89ef5e6008b31b3f8" + dependencies: + conventional-commit-types "^2.0.0" + lodash.map "^4.5.1" + longest "^1.0.1" + pad-right "^0.2.2" + right-pad "^1.0.1" + word-wrap "^1.0.3" + +cz-customizable@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/cz-customizable/-/cz-customizable-5.2.0.tgz#a172a7a24b1972e8f3d6899f3341a5d330e13fe3" + dependencies: + editor "1.0.0" + find-config "0.3.0" + inquirer "1.2.3" + temp "0.8.3" + winston "2.1.0" + word-wrap "1.1.0" + +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + +debug-log@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + +debug@2.6.9, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.3.3, debug@^2.5.1, debug@^2.6.3, debug@^2.6.8: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@3.1.0, debug@^3.0.0, debug@^3.0.1, debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +decompress-zip@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/decompress-zip/-/decompress-zip-0.3.0.tgz#ae3bcb7e34c65879adfe77e19c30f86602b4bdb0" + dependencies: + binary "^0.3.0" + graceful-fs "^4.1.3" + mkpath "^0.1.0" + nopt "^3.0.1" + q "^1.1.2" + readable-stream "^1.1.8" + touch "0.0.3" + +dedent@0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.6.0.tgz#0e6da8f0ce52838ef5cec5c8f9396b0c1b64a3cb" + +deep-eql@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + dependencies: + type-detect "^4.0.0" + +deep-equal@~0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-0.1.2.tgz#b246c2b80a570a47c11be1d9bd1070ec878b87ce" + +deep-extend@~0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + dependencies: + strip-bom "^2.0.0" + +defaults@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +defined@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/defined/-/defined-0.0.0.tgz#f35eea7d705e933baf13b2f03b3f83d921403b3e" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +delayed-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-0.0.5.tgz#d4b1f43a93e8296dfe02694f4680bc37a313c73f" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +delegates@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" + +deprecated@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" + +detect-file@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" + dependencies: + fs-exists-sync "^0.1.0" + +detect-file@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" + +detect-indent@4.0.0, detect-indent@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + dependencies: + repeating "^2.0.0" + +detect-indent@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-3.0.1.tgz#9dc5e5ddbceef8325764b9451b02bc6d54084f75" + dependencies: + get-stdin "^4.0.1" + minimist "^1.1.0" + repeating "^1.1.0" + +detect-libc@^1.0.2, detect-libc@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" + +diff@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" + +diff@^3.1.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" + +doctrine@1.3.x: + version "1.3.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-1.3.0.tgz#13e75682b55518424276f7c173783456ef913d26" + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + +doctrine@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + +dom-serializer@0, dom-serializer@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.0.tgz#073c697546ce0780ce23be4a28e293e40bc30c82" + dependencies: + domelementtype "~1.1.1" + entities "~1.1.1" + +domelementtype@1, domelementtype@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.0.tgz#b17aed82e8ab59e52dd9c19b1756e0fc187204c2" + +domelementtype@~1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" + +domhandler@2.3: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.3.0.tgz#2de59a0822d5027fabff6f032c2b25a2a8abe738" + dependencies: + domelementtype "1" + +domhandler@^2.3.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" + dependencies: + domelementtype "1" + +domutils@1.5, domutils@1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^1.5.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a" + dependencies: + dom-serializer "0" + domelementtype "1" + +dot-prop@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" + dependencies: + is-obj "^1.0.0" + +ds-store@^0.1.5: + version "0.1.6" + resolved "https://registry.yarnpkg.com/ds-store/-/ds-store-0.1.6.tgz#d1024ef746ed0c13f0f7fec85c7e858e8c4b7ca7" + dependencies: + bplist-creator "~0.0.3" + macos-alias "~0.2.5" + tn1150 "^0.1.0" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +duplexer3@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +editor@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" + +electron-download@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/electron-download/-/electron-download-4.1.0.tgz#bf932c746f2f87ffcc09d1dd472f2ff6b9187845" + dependencies: + debug "^2.2.0" + env-paths "^1.0.0" + fs-extra "^2.0.0" + minimist "^1.2.0" + nugget "^2.0.0" + path-exists "^3.0.0" + rc "^1.1.2" + semver "^5.3.0" + sumchecker "^2.0.1" + +electron-forge-template-angular2@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/electron-forge-template-angular2/-/electron-forge-template-angular2-1.0.6.tgz#c5411ff3732116885bff5fafa5d1728a5809a2b1" + +electron-forge-template-react-typescript@^1.0.3: + version "1.0.6" + resolved "https://registry.yarnpkg.com/electron-forge-template-react-typescript/-/electron-forge-template-react-typescript-1.0.6.tgz#55988260c11ae45eff688fd47749afe1d75a5b23" + +electron-forge-template-react@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/electron-forge-template-react/-/electron-forge-template-react-1.0.4.tgz#7fbc8345380f348c34387ea2130d275ce6682e20" + +electron-forge-template-vue@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/electron-forge-template-vue/-/electron-forge-template-vue-1.0.3.tgz#58a11ec972a0f0518e1306da7a573fbaf6b4ac50" + +electron-installer-debian@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/electron-installer-debian/-/electron-installer-debian-0.8.0.tgz#155a597e17ec1f0b3a7004e2fea8919bb5a9703a" + dependencies: + asar "^0.14.0" + cross-spawn-promise "^0.10.1" + debug "^3.1.0" + fs-extra "^4.0.2" + get-folder-size "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + mkdirp "^0.5.1" + nodeify "^1.0.1" + pify "^3.0.0" + semver "^5.4.1" + temp "^0.8.3" + word-wrap "^1.2.3" + yargs "^10.0.3" + +electron-installer-dmg@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/electron-installer-dmg/-/electron-installer-dmg-0.2.1.tgz#de835f02009b83f82e408036ac31462c3d6cb249" + dependencies: + debug "^2.2.0" + minimist "^1.1.1" + optionalDependencies: + appdmg "^0.4.5" + +electron-installer-flatpak@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/electron-installer-flatpak/-/electron-installer-flatpak-0.8.0.tgz#8edd178e0e04ec2da0fa40e777b67c9ccb78775f" + dependencies: + asar "^0.12.0" + async "^2.0.0" + debug "^2.2.0" + flatpak-bundler "^0.1.0" + fs-extra "^0.30.0" + lodash "^4.13.0" + temp "^0.8.3" + yargs "^6.0.0" + +electron-installer-redhat@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/electron-installer-redhat/-/electron-installer-redhat-0.5.0.tgz#09699cd37bc911cf7ff99587ba77aa205e836cd2" + dependencies: + asar "^0.13.0" + async "^2.1.5" + debug "^2.6.3" + fs-extra "^2.1.2" + glob "^7.1.1" + lodash "^4.17.4" + parse-author "^2.0.0" + temp "^0.8.3" + word-wrap "^1.2.1" + yargs "7.0.2" + +electron-installer-snap@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/electron-installer-snap/-/electron-installer-snap-2.0.0.tgz#5346317b77bdd2f8373f8b9ba9128f743f48549b" + dependencies: + asar "^0.14.0" + cross-spawn-promise "^0.10.1" + debug "^3.0.1" + fs-extra "^5.0.0" + js-yaml "^3.10.0" + lodash.filter "^4.6.0" + lodash.merge "^4.6.0" + lodash.pull "^4.1.0" + lodash.template "^4.4.0" + nodeify "^1.0.1" + pify "^3.0.0" + tmp-promise "^1.0.3" + which "^1.3.0" + yargs "^11.0.0" + +electron-osx-sign@^0.4.1: + version "0.4.8" + resolved "https://registry.yarnpkg.com/electron-osx-sign/-/electron-osx-sign-0.4.8.tgz#f0b9fadded9e1e54ec35fa89877b5c6c34c7bc40" + dependencies: + bluebird "^3.5.0" + compare-version "^0.1.2" + debug "^2.6.8" + isbinaryfile "^3.0.2" + minimist "^1.2.0" + plist "^2.1.0" + +electron-packager@^11.0.0: + version "11.0.1" + resolved "https://registry.yarnpkg.com/electron-packager/-/electron-packager-11.0.1.tgz#c2d1ff9eca8110be9ebc81826e2a921c04d1200e" + dependencies: + asar "^0.14.0" + debug "^3.0.0" + electron-download "^4.0.0" + electron-osx-sign "^0.4.1" + extract-zip "^1.0.3" + fs-extra "^5.0.0" + get-package-info "^1.0.0" + mz "^2.6.0" + nodeify "^1.0.1" + parse-author "^2.0.0" + pify "^3.0.0" + plist "^2.0.0" + pruner "^0.0.7" + rcedit "^1.0.0" + resolve "^1.1.6" + sanitize-filename "^1.6.0" + semver "^5.3.0" + yargs-parser "^9.0.2" + +electron-rebuild@^1.6.0: + version "1.7.3" + resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-1.7.3.tgz#24ae06ad9dd61cb7e4d688961f49118c40a110eb" + dependencies: + colors "^1.1.2" + debug "^2.6.3" + detect-libc "^1.0.3" + fs-extra "^3.0.1" + node-abi "^2.0.0" + node-gyp "^3.6.0" + ora "^1.2.0" + rimraf "^2.6.1" + spawn-rx "^2.0.10" + yargs "^7.0.2" + +electron-to-chromium@^1.3.30: + version "1.3.33" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.33.tgz#bf00703d62a7c65238136578c352d6c5c042a545" + +electron-windows-store@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/electron-windows-store/-/electron-windows-store-0.12.0.tgz#c2fd84504c62aeaecc4d1f8bd3420600acc30d26" + dependencies: + chalk "^2.1.0" + commander "^2.11.0" + debug "^2.6.3" + flatten-packages "^0.1.4" + fs-extra "^4.0.1" + inquirer "^3.2.3" + lodash.defaults "^4.2.0" + lodash.merge "^4.6.0" + multiline "^1.0.2" + path-exists "^3.0.0" + +electron-winstaller@^2.5.0: + version "2.6.4" + resolved "https://registry.yarnpkg.com/electron-winstaller/-/electron-winstaller-2.6.4.tgz#6b48076e873a6ea356251f157b68b9e5dc03b5a9" + dependencies: + asar "^0.11.0" + bluebird "^3.3.4" + debug "^2.2.0" + fs-extra "^0.26.7" + lodash.template "^4.2.2" + temp "^0.8.3" + +electron-wix-msi@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/electron-wix-msi/-/electron-wix-msi-1.3.0.tgz#158f70778077463eb04c15bc8df136df3e0706ec" + dependencies: + debug "^3.1.0" + fs-extra "^4.0.2" + klaw "^2.1.0" + lodash "^4.17.4" + uuid "^3.1.0" + +end-of-stream@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +end-of-stream@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" + dependencies: + once "~1.3.0" + +entities@1.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" + +entities@^1.1.1, entities@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" + +env-paths@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.38" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.38.tgz#fa7d40d65bbc9bb8a67e1d3f9cc656a00530eed3" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + +es6-iterator@^2.0.1, es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + +es6-map@^0.1.3: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + +es6-promise@^4.0.3: + version "4.2.4" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + dependencies: + es6-promise "^4.0.3" + +es6-set@^0.1.4, es6-set@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + +es6-symbol@3.1.1, es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + +escape-html@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + +escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +escodegen@^1.6.1: + version "1.9.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" + dependencies: + esprima "^3.1.3" + estraverse "^4.2.0" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.5.6" + +escope@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + +esdoc-accessor-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-accessor-plugin/-/esdoc-accessor-plugin-1.0.0.tgz#791ba4872e6c403515ce749b1348d6f0293ad9eb" + +esdoc-brand-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-brand-plugin/-/esdoc-brand-plugin-1.0.0.tgz#9e216d735e62fcec49f7a339bb4121da67cc6033" + dependencies: + cheerio "0.22.0" + +esdoc-coverage-plugin@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esdoc-coverage-plugin/-/esdoc-coverage-plugin-1.1.0.tgz#3869869cd7f87891f972625787695a299aece45c" + +esdoc-external-ecmascript-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-external-ecmascript-plugin/-/esdoc-external-ecmascript-plugin-1.0.0.tgz#78f565d4a0c5185ac63152614dce1fe1a86688db" + dependencies: + fs-extra "1.0.0" + +esdoc-importpath-plugin@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esdoc-importpath-plugin/-/esdoc-importpath-plugin-1.0.1.tgz#9918301883528e2878935c1488bbc715858e4100" + +esdoc-integrate-manual-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-integrate-manual-plugin/-/esdoc-integrate-manual-plugin-1.0.0.tgz#1854a6aa1c081035d7c8c51e3bdd4fb65aa4711c" + +esdoc-integrate-test-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-integrate-test-plugin/-/esdoc-integrate-test-plugin-1.0.0.tgz#e2d0d00090f7f0c35e5d2f2c033327a79e53e409" + +esdoc-lint-plugin@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esdoc-lint-plugin/-/esdoc-lint-plugin-1.0.1.tgz#87bee6403e676c087f61be92c452d60f2c6a70e5" + +esdoc-publish-html-plugin@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/esdoc-publish-html-plugin/-/esdoc-publish-html-plugin-1.1.0.tgz#093f8337aca169022572cb387ffcc3f470b02513" + dependencies: + babel-generator "6.11.4" + cheerio "0.22.0" + escape-html "1.0.3" + fs-extra "1.0.0" + ice-cap "0.0.4" + marked "0.3.6" + taffydb "2.7.2" + +esdoc-standard-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-standard-plugin/-/esdoc-standard-plugin-1.0.0.tgz#661201cac7ef868924902446fdac1527253c5d4d" + dependencies: + esdoc-accessor-plugin "^1.0.0" + esdoc-brand-plugin "^1.0.0" + esdoc-coverage-plugin "^1.0.0" + esdoc-external-ecmascript-plugin "^1.0.0" + esdoc-integrate-manual-plugin "^1.0.0" + esdoc-integrate-test-plugin "^1.0.0" + esdoc-lint-plugin "^1.0.0" + esdoc-publish-html-plugin "^1.0.0" + esdoc-type-inference-plugin "^1.0.0" + esdoc-undocumented-identifier-plugin "^1.0.0" + esdoc-unexported-identifier-plugin "^1.0.0" + +esdoc-type-inference-plugin@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esdoc-type-inference-plugin/-/esdoc-type-inference-plugin-1.0.1.tgz#aabca78641f99bd1ece6f302f045bbd631be72f5" + +esdoc-undocumented-identifier-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-undocumented-identifier-plugin/-/esdoc-undocumented-identifier-plugin-1.0.0.tgz#82e05d371c32d12871140f1d5c81ec99fd9cc2c8" + +esdoc-unexported-identifier-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esdoc-unexported-identifier-plugin/-/esdoc-unexported-identifier-plugin-1.0.0.tgz#1f9874c6a7c2bebf9ad397c3ceb75c9c69dabab1" + +esdoc@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/esdoc/-/esdoc-1.0.4.tgz#e2534a228aa1f185e9746e8e418ae0330b967010" + dependencies: + babel-generator "6.26.0" + babel-traverse "6.26.0" + babylon "6.18.0" + cheerio "0.22.0" + color-logger "0.0.3" + escape-html "1.0.3" + fs-extra "1.0.0" + ice-cap "0.0.4" + marked "0.3.6" + minimist "1.2.0" + taffydb "2.7.2" + +eslint-config-airbnb-base@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/eslint-config-airbnb-base/-/eslint-config-airbnb-base-8.0.0.tgz#c5e958a469ab8af76aff068b43d784e5afe74ca7" + +eslint-import-resolver-node@^0.2.0: + version "0.2.3" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" + dependencies: + debug "^2.2.0" + object-assign "^4.0.1" + resolve "^1.1.6" + +eslint-plugin-import@^1.16.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz#b2fa07ebcc53504d0f2a4477582ec8bff1871b9f" + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.2.0" + doctrine "1.3.x" + es6-map "^0.1.3" + es6-set "^0.1.4" + eslint-import-resolver-node "^0.2.0" + has "^1.0.1" + lodash.cond "^4.3.0" + lodash.endswith "^4.0.1" + lodash.find "^4.3.0" + lodash.findindex "^4.3.0" + minimatch "^3.0.3" + object-assign "^4.0.1" + pkg-dir "^1.0.0" + pkg-up "^1.0.0" + +eslint-plugin-mocha@^4.8.0: + version "4.11.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-4.11.0.tgz#91193a2f55e20a5e35974054a0089d30198ee578" + dependencies: + ramda "^0.24.1" + +eslint@^3.7.1: + version "3.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.5.2" + debug "^2.1.1" + doctrine "^2.0.0" + escope "^3.6.0" + espree "^3.4.0" + esquery "^1.0.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.14.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~2.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + +espree@^3.4.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.3.tgz#931e0af64e7fbbed26b050a29daad1fc64799fa6" + dependencies: + acorn "^5.4.0" + acorn-jsx "^3.0.0" + +esprima@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" + +esprima@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" + +esquery@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.0.tgz#fa9568d98d3823f9a41d91e902dcab9ea6e5b163" + dependencies: + estraverse "^4.1.0" + object-assign "^4.0.1" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +event-emitter@~0.3.5: + version "0.3.5" + resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + dependencies: + d "1" + es5-ext "~0.10.14" + +event-stream@~3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +events@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" + +execa@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" + dependencies: + cross-spawn-async "^2.1.1" + is-stream "^1.1.0" + npm-run-path "^1.0.0" + object-assign "^4.0.1" + path-key "^1.0.0" + strip-eof "^1.0.0" + +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +exit-hook@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +expand-tilde@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-1.2.2.tgz#0b81eba897e5a3d31d1c3d102f8f01441e559449" + dependencies: + os-homedir "^1.0.1" + +expand-tilde@^2.0.0, expand-tilde@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" + dependencies: + homedir-polyfill "^1.0.1" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + +extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +external-editor@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-1.1.1.tgz#12d7b0db850f7ff7e7081baf4005700060c4600b" + dependencies: + extend "^3.0.0" + spawn-sync "^1.0.15" + tmp "^0.0.29" + +external-editor@^2.0.4, external-editor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.1.0.tgz#3d026a21b7f95b5726387d4200ac160d372c3b48" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extglob@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +extract-zip@^1.0.3: + version "1.6.6" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.6.tgz#1290ede8d20d0872b429fd3f351ca128ec5ef85c" + dependencies: + concat-stream "1.6.0" + debug "2.6.9" + mkdirp "0.5.0" + yauzl "2.4.1" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +eyes@0.1.x: + version "0.1.8" + resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + +fancy-log@^1.1.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + time-stamp "^1.0.0" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +fd-slicer@~1.0.0, fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +fetch-mock@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/fetch-mock/-/fetch-mock-6.0.0.tgz#4edb5acefa8ea90d7eb4213130ab73137fac9df1" + dependencies: + glob-to-regexp "^0.3.0" + path-to-regexp "^2.1.0" + +figures@^1.3.5: + version "1.7.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-keys@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fill-keys/-/fill-keys-1.0.2.tgz#9a8fa36f4e8ad634e3bf6b4f3c8882551452eb20" + dependencies: + is-object "~1.0.1" + merge-descriptors "~1.0.0" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + +find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + +find-config@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/find-config/-/find-config-0.3.0.tgz#c4f6b2ae491b2cae3ca8af72401f1ad84cfdd0d9" + dependencies: + user-home "^1.1.1" + +find-index@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" + +find-node-modules@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-1.0.4.tgz#b6deb3cccb699c87037677bcede2c5f5862b2550" + dependencies: + findup-sync "0.4.2" + merge "^1.2.0" + +find-root@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.0.0.tgz#962ff211aab25c6520feeeb8d6287f8f6e95807a" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + +findit2@~2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/findit2/-/findit2-2.2.3.tgz#58a466697df8a6205cdfdbf395536b8bd777a5f6" + +findup-sync@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.2.tgz#a8117d0f73124f5a4546839579fe52d7129fb5e5" + dependencies: + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" + +findup-sync@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" + dependencies: + detect-file "^1.0.0" + is-glob "^3.1.0" + micromatch "^3.0.4" + resolve-dir "^1.0.1" + +fined@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" + dependencies: + expand-tilde "^2.0.2" + is-plain-object "^2.0.3" + object.defaults "^1.1.0" + object.pick "^1.2.0" + parse-filepath "^1.0.1" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +flagged-respawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +flatpak-bundler@^0.1.0: + version "0.1.3" + resolved "https://registry.yarnpkg.com/flatpak-bundler/-/flatpak-bundler-0.1.3.tgz#e45dfa0c4a7485c370e0915e4728929798503946" + dependencies: + debug "^2.2.0" + es6-promisify "^5.0.0" + fs-extra "^0.30.0" + lodash "^4.16.2" + tmp "0.0.29" + +flatten-packages@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/flatten-packages/-/flatten-packages-0.1.4.tgz#edc5f1ad09bdbad98a1e6332bd2917d0d9332193" + dependencies: + colors "~0.6.2" + commander "~2.1.0" + semver "~2.2.1" + wrench "~1.5.4" + +fmix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" + dependencies: + imul "^1.0.0" + +for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +for-own@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" + dependencies: + for-in "^1.0.1" + +foreground-child@^1.5.3, foreground-child@^1.5.6: + version "1.5.6" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" + dependencies: + cross-spawn "^4" + signal-exit "^3.0.0" + +forever-agent@~0.5.0: + version "0.5.2" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.5.2.tgz#6d0e09c4921f94a27f63d3b49c5feff1ea4c5130" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@^2.1.4, form-data@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +form-data@~0.1.0: + version "0.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-0.1.4.tgz#91abd788aba9702b1aabfa8bc01031a2ac9e3b12" + dependencies: + async "~0.9.0" + combined-stream "~0.0.4" + mime "~1.2.11" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs-exists-sync@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" + +fs-extra@0.26.7, fs-extra@^0.26.7: + version "0.26.7" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@1.0.0, fs-extra@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + +fs-extra@^0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + klaw "^1.0.0" + path-is-absolute "^1.0.0" + rimraf "^2.2.8" + +fs-extra@^2.0.0, fs-extra@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-2.1.2.tgz#046c70163cef9aad46b0e4a7fa467fb22d71de35" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^2.1.0" + +fs-extra@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + +fs-extra@^4.0.0, fs-extra@^4.0.1, fs-extra@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + +fs-temp@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fs-temp/-/fs-temp-1.1.2.tgz#cc52f038bbefe510f6bcd09ec592b79d0f69253f" + dependencies: + random-path "^0.1.0" + +fs-xattr@^0.1.14: + version "0.1.17" + resolved "https://registry.yarnpkg.com/fs-xattr/-/fs-xattr-0.1.17.tgz#ee943483c6fe9704a8f0e1476e8145a9886f8b0f" + dependencies: + buffer-from "^0.1.1" + nan "^2.3.2" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fsevents@^1.0.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" + dependencies: + nan "^2.3.0" + node-pre-gyp "^0.6.39" + +fstream-ignore@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" + dependencies: + fstream "^1.0.0" + inherits "2" + minimatch "^3.0.0" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: + version "1.0.11" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" + dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" + mkdirp ">=0.5 0" + rimraf "2" + +function-bind@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + +gar@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/gar/-/gar-1.0.2.tgz#5b7ecbbde1d3a1a8037cccc49971274250ff865b" + +gauge@~1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-1.2.7.tgz#e9cec5483d3d4ee0ef44b60a7d99e4935e136d93" + dependencies: + ansi "^0.3.0" + has-unicode "^2.0.0" + lodash.pad "^4.1.0" + lodash.padend "^4.1.0" + lodash.padstart "^4.1.0" + +gauge@~2.7.3: + version "2.7.4" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + +gaze@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" + dependencies: + globule "~0.1.0" + +generate-changelog@^1.0.2: + version "1.7.0" + resolved "https://registry.yarnpkg.com/generate-changelog/-/generate-changelog-1.7.0.tgz#e6321226207d5cbcfe24de39d7ffd65d51698596" + dependencies: + bluebird "^3.0.6" + commander "^2.9.0" + github-url-from-git "^1.4.0" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-caller-file@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" + +get-folder-size@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/get-folder-size/-/get-folder-size-1.0.1.tgz#802fa4208434de71205182b15ab7f1352088e580" + dependencies: + async "^1.4.2" + gar "^1.0.2" + +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" + +get-installed-path@^2.0.3: + version "2.1.1" + resolved "https://registry.yarnpkg.com/get-installed-path/-/get-installed-path-2.1.1.tgz#a1f33dc6b8af542c9331084e8edbe37fe2634152" + dependencies: + global-modules "1.0.0" + +get-package-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/get-package-info/-/get-package-info-1.0.0.tgz#6432796563e28113cd9474dbbd00052985a4999c" + dependencies: + bluebird "^3.1.1" + debug "^2.2.0" + lodash.get "^4.0.0" + read-pkg-up "^2.0.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +github-url-from-git@^1.4.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^3.1.5: + version "3.1.18" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" + dependencies: + glob "^4.3.1" + glob2base "^0.0.12" + minimatch "^2.0.1" + ordered-read-streams "^0.1.0" + through2 "^0.6.1" + unique-stream "^1.0.0" + +glob-to-regexp@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" + +glob-watcher@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" + dependencies: + gaze "^0.5.1" + +glob2base@^0.0.12: + version "0.0.12" + resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" + dependencies: + find-index "^0.1.1" + +glob@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^4.3.1: + version "4.5.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "^2.0.1" + once "^1.3.0" + +glob@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@~3.1.21: + version "3.1.21" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" + dependencies: + graceful-fs "~1.2.0" + inherits "1" + minimatch "~0.2.11" + +glob@~3.2.6: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + dependencies: + inherits "2" + minimatch "0.3" + +global-dirs@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + dependencies: + ini "^1.3.4" + +global-modules@1.0.0, global-modules@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" + dependencies: + global-prefix "^1.0.1" + is-windows "^1.0.1" + resolve-dir "^1.0.0" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-0.2.3.tgz#ea5a3bed42c6d6ce995a4f8a1269b5dae223828d" + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-0.1.5.tgz#8d3bc6b8da3ca8112a160d8d496ff0462bfef78f" + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +global-prefix@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" + dependencies: + expand-tilde "^2.0.2" + homedir-polyfill "^1.0.1" + ini "^1.3.4" + is-windows "^1.0.1" + which "^1.2.14" + +globals@^9.14.0, globals@^9.18.0: + version "9.18.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globule@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" + dependencies: + glob "~3.1.21" + lodash "~1.0.1" + minimatch "~0.2.11" + +glogg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" + dependencies: + sparkles "^1.0.0" + +got@^6.7.1: + version "6.7.1" + resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + +graceful-fs@^3.0.0, graceful-fs@~3.0.5: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@~1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" + +growl@1.10.3: + version "1.10.3" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" + +gulp-babel@^6.1.2: + version "6.1.3" + resolved "https://registry.yarnpkg.com/gulp-babel/-/gulp-babel-6.1.3.tgz#5aad8acb0db6b7f2f0be19eeee9528f2064df631" + dependencies: + babel-core "^6.23.1" + object-assign "^4.0.1" + plugin-error "^1.0.1" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl-sourcemaps-apply "^0.2.0" + +gulp-util@^3.0.0: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp@^3.9.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" + dependencies: + archy "^1.0.0" + chalk "^1.0.0" + deprecated "^0.0.1" + gulp-util "^3.0.0" + interpret "^1.0.0" + liftoff "^2.1.0" + minimist "^1.1.0" + orchestrator "^0.3.0" + pretty-hrtime "^1.0.0" + semver "^4.1.0" + tildify "^1.0.0" + v8flags "^2.0.2" + vinyl-fs "^0.3.0" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +handlebars@^4.0.3: + version "4.0.11" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" + dependencies: + async "^1.4.0" + optimist "^0.6.1" + source-map "^0.4.4" + optionalDependencies: + uglify-js "^2.6" + +har-schema@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" + dependencies: + ajv "^4.9.1" + har-schema "^1.0.5" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +has-own-property-x@^3.1.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/has-own-property-x/-/has-own-property-x-3.2.0.tgz#1c4b112a577c8cb5805469556e54b6e959e4ded9" + dependencies: + cached-constructors-x "^1.0.0" + to-object-x "^1.5.0" + to-property-key-x "^2.0.2" + +has-symbol-support-x@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-symbol-support-x/-/has-symbol-support-x-1.4.1.tgz#66ec2e377e0c7d7ccedb07a3a84d77510ff1bc4c" + +has-to-string-tag-x@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz#a045ab383d7b4b2012a00148ab0aa5f290044d4d" + dependencies: + has-symbol-support-x "^1.4.1" + +has-unicode@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" + +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + +hawk@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.1.1.tgz#87cd491f9b46e4e2aeaca335416766885d2d1ed9" + dependencies: + boom "0.4.x" + cryptiles "0.2.x" + hoek "0.9.x" + sntp "0.2.x" + +hawk@3.1.3, hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +he@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + +hoek@0.9.x: + version "0.9.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-0.9.1.tgz#3d322462badf07716ea7eb85baf88079cddce505" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoek@4.x.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + +home-or-tmp@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.1" + +homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +htmlparser2@^3.9.1: + version "3.9.2" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" + dependencies: + domelementtype "^1.3.0" + domhandler "^2.3.0" + domutils "^1.5.1" + entities "^1.1.1" + inherits "^2.0.1" + readable-stream "^2.0.2" + +htmlparser2@~3.8.1: + version "3.8.3" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.8.3.tgz#996c28b191516a8be86501a7d79757e5c70c1068" + dependencies: + domelementtype "1" + domhandler "2.3" + domutils "1.5" + entities "1.0" + readable-stream "1.1" + +http-signature@~0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz#4fbdac132559aa8323121e540779c0a012b27e66" + dependencies: + asn1 "0.1.11" + assert-plus "^0.1.5" + ctype "0.5.3" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +ice-cap@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" + dependencies: + cheerio "0.20.0" + color-logger "0.0.3" + +iconv-lite@^0.4.17: + version "0.4.19" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" + +ieee754@^1.1.4: + version "1.1.8" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + +ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + +ignore@^3.2.0: + version "3.3.7" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" + +image-size@^0.5.0: + version "0.5.5" + resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c" + +import-lazy@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + +imul@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +infinity-x@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/infinity-x/-/infinity-x-1.0.0.tgz#cea2d75181d820961b0f72d78e7c4e06fdd55a07" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" + +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +ini@^1.3.4, ini@~1.3.0: + version "1.3.5" + resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" + +inquirer@1.2.3, inquirer@^1.0.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.2.3.tgz#4dec6f32f37ef7bb0b2ed3f1d1a5c3f545074918" + dependencies: + ansi-escapes "^1.1.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + external-editor "^1.1.0" + figures "^1.3.5" + lodash "^4.3.0" + mute-stream "0.0.6" + pinkie-promise "^2.0.0" + run-async "^2.2.0" + rx "^4.1.0" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +inquirer@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + +inquirer@^3.2.3: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +inquirer@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.1.0.tgz#19da508931892328abbbdd4c477f1efc65abfd67" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.1.0" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^5.5.2" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +interpret@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + +invariant@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" + dependencies: + loose-envify "^1.0.0" + +invert-kv@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + +is-absolute@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" + dependencies: + is-relative "^1.0.0" + is-windows "^1.0.1" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + +is-array-buffer-x@^1.0.13: + version "1.7.0" + resolved "https://registry.yarnpkg.com/is-array-buffer-x/-/is-array-buffer-x-1.7.0.tgz#4b0b10427b64aa3437767adf4fc07702c59b2371" + dependencies: + attempt-x "^1.1.0" + has-to-string-tag-x "^1.4.1" + is-object-like-x "^1.5.1" + object-get-own-property-descriptor-x "^3.2.0" + to-string-tag-x "^1.4.1" + +is-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-1.0.0.tgz#f32497a0509d109423f472003f98bab6a8ea34cb" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + dependencies: + binary-extensions "^1.0.0" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-falsey-x@^1.0.0, is-falsey-x@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-falsey-x/-/is-falsey-x-1.0.1.tgz#c469951adc95b8b3fdbf90929b335a7de937d17f" + dependencies: + to-boolean-x "^1.0.1" + +is-finite-x@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-finite-x/-/is-finite-x-3.0.2.tgz#a6ec683cfb2bc1a918a1ff59d178edbcea54f7a6" + dependencies: + infinity-x "^1.0.0" + is-nan-x "^1.0.1" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + dependencies: + number-is-nan "^1.0.0" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-function-x@^3.2.0, is-function-x@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/is-function-x/-/is-function-x-3.3.0.tgz#7d16bc113853db206d5e40a8b32caf99bd4ff7c0" + dependencies: + attempt-x "^1.1.1" + has-to-string-tag-x "^1.4.1" + is-falsey-x "^1.0.1" + is-primitive "^2.0.0" + normalize-space-x "^3.0.0" + replace-comments-x "^2.0.0" + to-boolean-x "^1.0.1" + to-string-tag-x "^1.4.2" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + +is-index-x@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-index-x/-/is-index-x-1.1.0.tgz#43dac97b3a04f30191530833f45ac35001682ee2" + dependencies: + math-clamp-x "^1.2.0" + max-safe-integer "^1.0.1" + to-integer-x "^3.0.0" + to-number-x "^2.0.0" + to-string-symbols-supported-x "^1.0.0" + +is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + +is-my-ip-valid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" + +is-my-json-valid@^2.10.0, is-my-json-valid@^2.13.1: + version "2.17.2" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + is-my-ip-valid "^1.0.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-nan-x@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-nan-x/-/is-nan-x-1.0.1.tgz#de747ebcc8bddeb66f367c17caca7eba843855c0" + +is-nil-x@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/is-nil-x/-/is-nil-x-1.4.1.tgz#bd9e7b08b4cd732f9dcbde13d93291bb2ec2e248" + dependencies: + lodash.isnull "^3.0.0" + validate.io-undefined "^1.0.3" + +is-npm@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-object-like-x@^1.5.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/is-object-like-x/-/is-object-like-x-1.6.0.tgz#a8c4a95bd6b95db174e0e4730171a160ec73be82" + dependencies: + is-function-x "^3.3.0" + is-primitive "^2.0.0" + +is-object@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" + +is-odd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" + dependencies: + is-number "^3.0.0" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-promise@~1, is-promise@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-1.0.1.tgz#31573761c057e33c2e91aab9e96da08cefbe76e5" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-redirect@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + +is-relative@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" + dependencies: + is-unc-path "^1.0.0" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + +is-retry-allowed@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" + +is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-string@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" + +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-unc-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" + dependencies: + unc-path-regex "^0.1.2" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" + +is-windows@^1.0.0, is-windows@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isbinaryfile@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.2.tgz#4a3e974ec0cba9004d3fc6cde7209ea69368a621" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + +isstream@0.1.x, isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +istanbul-lib-coverage@^1.1.1, istanbul-lib-coverage@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.2.tgz#4113c8ff6b7a40a1ef7350b01016331f63afde14" + +istanbul-lib-hook@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b" + dependencies: + append-transform "^0.4.0" + +istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.9.1: + version "1.9.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.2.tgz#84905bf47f7e0b401d6b840da7bad67086b4aab6" + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.1.2" + semver "^5.3.0" + +istanbul-lib-report@^1.1.2: + version "1.1.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.3.tgz#2df12188c0fa77990c0d2176d2d0ba3394188259" + dependencies: + istanbul-lib-coverage "^1.1.2" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + +istanbul-lib-source-maps@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.1.2" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + +istanbul-reports@^1.1.3: + version "1.1.4" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.4.tgz#5ccba5e22b7b5a5d91d5e0a830f89be334bf97bd" + dependencies: + handlebars "^4.0.3" + +jmespath@0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217" + +js-tokens@^3.0.0, js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@^3.10.0, js-yaml@^3.5.1, js-yaml@^3.6.1: + version "3.10.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.10.0.tgz#2e78441646bd4682e963f22b6e92823c309c62dc" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +jsdom@^7.0.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-7.2.2.tgz#40b402770c2bda23469096bee91ab675e3b1fc6e" + dependencies: + abab "^1.0.0" + acorn "^2.4.0" + acorn-globals "^1.0.4" + cssom ">= 0.3.0 < 0.4.0" + cssstyle ">= 0.2.29 < 0.3.0" + escodegen "^1.6.1" + nwmatcher ">= 1.3.7 < 2.0.0" + parse5 "^1.5.1" + request "^2.55.0" + sax "^1.1.4" + symbol-tree ">= 3.1.0 < 4.0.0" + tough-cookie "^2.2.0" + webidl-conversions "^2.0.0" + whatwg-url-compat "~0.6.5" + xml-name-validator ">= 2.0.1 < 3.0.0" + +jsesc@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +json5@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" + +jsonfile@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.1.tgz#a5ecc6f65f53f662c4415c7675a0331d0992ec66" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonfile@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +just-extend@^1.1.27: + version "1.1.27" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" + +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.1.0, kind-of@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +kind-of@^5.0.0, kind-of@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" + +klaw@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" + optionalDependencies: + graceful-fs "^4.1.9" + +klaw@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/klaw/-/klaw-2.1.1.tgz#42b76894701169cc910fd0d19ce677b5fb378af1" + dependencies: + graceful-fs "^4.1.9" + +latest-version@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + dependencies: + package-json "^4.0.0" + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" + +lazy-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" + dependencies: + set-getter "^0.1.0" + +lazystream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-0.1.0.tgz#1b25d63c772a4c20f0a5ed0a9d77f484b6e16920" + dependencies: + readable-stream "~1.0.2" + +lcid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + dependencies: + invert-kv "^1.0.0" + +lcov-parse@^0.0.10: + version "0.0.10" + resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +liftoff@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" + dependencies: + extend "^3.0.0" + findup-sync "^2.0.0" + fined "^1.0.1" + flagged-respawn "^1.0.0" + is-plain-object "^2.0.4" + object.map "^1.0.0" + rechoir "^0.6.2" + resolve "^1.1.7" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +load-json-file@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + strip-bom "^3.0.0" + +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + +lodash.cond@^4.3.0: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" + +lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + +lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + +lodash.endswith@^4.0.1, lodash.endswith@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.filter@^4.4.0, lodash.filter@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" + +lodash.find@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + +lodash.findindex@^4.3.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.findindex/-/lodash.findindex-4.6.0.tgz#a3245dee61fb9b6e0624b535125624bb69c11106" + +lodash.flatten@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + +lodash.foreach@^4.3.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + +lodash.get@^4.0.0, lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isfunction@^3.0.8: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" + +lodash.isnull@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash.isnull/-/lodash.isnull-3.0.0.tgz#fafbe59ea1dca27eed786534039dd84c2e07c56e" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.map@^4.4.0, lodash.map@^4.5.1: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" + +lodash.merge@^4.4.0, lodash.merge@^4.6.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" + +lodash.pad@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/lodash.pad/-/lodash.pad-4.5.1.tgz#4330949a833a7c8da22cc20f6a26c4d59debba70" + +lodash.padend@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padend/-/lodash.padend-4.6.1.tgz#53ccba047d06e158d311f45da625f4e49e6f166e" + +lodash.padstart@^4.1.0: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.padstart/-/lodash.padstart-4.6.1.tgz#d2e3eebff0d9d39ad50f5cbd1b52a7bce6bb611b" + +lodash.pick@^4.2.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + +lodash.pull@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.pull/-/lodash.pull-4.1.0.tgz#60060cc6bd625b4d4567ec27dc45cd1be9eec012" + +lodash.reduce@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" + +lodash.reject@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.some@^4.4.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" + +lodash.startswith@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.startswith/-/lodash.startswith-4.2.1.tgz#c598c4adce188a27e53145731cdc6c0e7177600c" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.template@^4.2.2, lodash.template@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + dependencies: + lodash._reinterpolate "~3.0.0" + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + +lodash@4.17.2: + version "4.17.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" + +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.0, lodash@^4.14.0, lodash@^4.16.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: + version "4.17.5" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" + +lodash@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" + +lodash@~2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" + +log-driver@^1.2.5: + version "1.2.6" + resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.6.tgz#ad0e660f56bbc59aeb2784d92854cdfdac55807b" + dependencies: + codecov.io "0.0.1" + +log-symbols@^2.0.0, log-symbols@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" + dependencies: + chalk "^2.0.1" + +lolex@^2.2.0, lolex@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.2.tgz#85f9450425103bf9e7a60668ea25dc43274ca807" + +longest@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" + +loose-envify@^1.0.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" + dependencies: + js-tokens "^3.0.0" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lowercase-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +lru-cache@^4.0.0, lru-cache@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +macos-alias@~0.2.5: + version "0.2.11" + resolved "https://registry.yarnpkg.com/macos-alias/-/macos-alias-0.2.11.tgz#feeea6c13ba119814a43fc43c470b31e59ef718a" + dependencies: + nan "^2.4.0" + +make-dir@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" + dependencies: + pify "^3.0.0" + +make-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.0.tgz#57bef5dc85d23923ba23767324d8e8f8f3d9694b" + dependencies: + kind-of "^3.1.0" + +map-cache@^0.2.0, map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + +marked@0.3.6: + version "0.3.6" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.6.tgz#b2c6c618fccece4ef86c4fc6cb8a7cbf5aeda8d7" + +math-clamp-x@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/math-clamp-x/-/math-clamp-x-1.2.0.tgz#8b537be0645bbba7ee73ee16091e7d6018c5edcf" + dependencies: + to-number-x "^2.0.0" + +math-sign-x@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/math-sign-x/-/math-sign-x-3.0.0.tgz#d5286022b48e150c384729a86042e0835264c3ed" + dependencies: + is-nan-x "^1.0.1" + to-number-x "^2.0.0" + +max-safe-integer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/max-safe-integer/-/max-safe-integer-1.0.1.tgz#f38060be2c563d8c02e6d48af39122fd83b6f410" + +md5-hex@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" + dependencies: + md5-o-matic "^0.1.1" + +md5-o-matic@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + +meow@^3.1.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-descriptors@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +merge-source-map@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + dependencies: + source-map "^0.6.1" + +merge@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" + +micromatch@^2.3.11, micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + +micromatch@^3.0.4, micromatch@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.0" + define-property "^1.0.0" + extend-shallow "^2.0.1" + extglob "^2.0.2" + fragment-cache "^0.2.1" + kind-of "^6.0.0" + nanomatch "^1.2.5" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +mime-db@~1.30.0: + version "1.30.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" + +mime-types@^2.1.12, mime-types@^2.1.17, mime-types@~2.1.17, mime-types@~2.1.7: + version "2.1.17" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + dependencies: + mime-db "~1.30.0" + +mime-types@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-1.0.2.tgz#995ae1392ab8affcbfcb2641dd054e943c0d5dce" + +mime@~1.2.11: + version "1.2.11" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimatch@^2.0.1: + version "2.0.10" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" + dependencies: + brace-expansion "^1.0.0" + +minimatch@~0.2.11: + version "0.2.14" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + +mixin-deep@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + +mkdirp@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" + dependencies: + minimist "0.0.8" + +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mkpath@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/mkpath/-/mkpath-0.1.0.tgz#7554a6f8d871834cc97b5462b122c4c124d6de91" + +mksnapshot@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/mksnapshot/-/mksnapshot-0.3.1.tgz#2501c05657436d742ce958a4ff92c77e40dd37e6" + dependencies: + decompress-zip "0.3.0" + fs-extra "0.26.7" + request "^2.79.0" + +mocha@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.0.1.tgz#759b62c836b0732382a62b6b1fb245ec1bc943ac" + dependencies: + browser-stdout "1.3.0" + commander "2.11.0" + debug "3.1.0" + diff "3.3.1" + escape-string-regexp "1.0.5" + glob "7.1.2" + growl "1.10.3" + he "1.1.1" + mkdirp "0.5.1" + supports-color "4.4.0" + +module-not-found-error@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + +multiline@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/multiline/-/multiline-1.0.2.tgz#69b1f25ff074d2828904f244ddd06b7d96ef6c93" + dependencies: + strip-indent "^1.0.0" + +multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +murmur-32@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/murmur-32/-/murmur-32-0.1.0.tgz#c1a79d4fc5fabf0405749d0aff77c41402055861" + dependencies: + array-buffer-from-string "^0.1.0" + fmix "^0.1.0" + imul "^1.0.0" + +mute-stream@0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + +mute-stream@0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +mz@^2.6.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +nan-x@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/nan-x/-/nan-x-1.0.0.tgz#0ee78e8d1cd0592d5b4260a5940154545c61c121" + +nan@^2.3.0, nan@^2.3.2, nan@^2.4.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + +nanomatch@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + is-odd "^1.0.0" + kind-of "^5.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + +natives@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.1.tgz#011acce1f7cbd87f7ba6b3093d6cd9392be1c574" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +nested-error-stacks@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz#19f619591519f096769a5ba9a86e6eeec823c3cf" + dependencies: + inherits "~2.0.1" + +nise@^1.2.0: + version "1.2.5" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.2.5.tgz#a143371b65014b6807d3a6e6b4556063f3a53363" + dependencies: + "@sinonjs/formatio" "^2.0.0" + just-extend "^1.1.27" + lolex "^2.3.2" + path-to-regexp "^1.7.0" + text-encoding "^0.6.4" + +node-abi@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.2.0.tgz#e802ac7a2408e2c0593fb3176ffdf8a99a9b4dec" + dependencies: + semver "^5.4.1" + +node-fetch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.0.0.tgz#982bba43ecd4f2922a29cc186a6bbb0bb73fcba6" + +node-gyp@^3.4.0, node-gyp@^3.6.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" + dependencies: + fstream "^1.0.0" + glob "^7.0.3" + graceful-fs "^4.1.2" + minimatch "^3.0.2" + mkdirp "^0.5.0" + nopt "2 || 3" + npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "2" + rimraf "2" + semver "~5.3.0" + tar "^2.0.0" + which "1" + +node-pre-gyp@^0.6.39: + version "0.6.39" + resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" + dependencies: + detect-libc "^1.0.2" + hawk "3.1.3" + mkdirp "^0.5.1" + nopt "^4.0.1" + npmlog "^4.0.2" + rc "^1.1.7" + request "2.81.0" + rimraf "^2.6.1" + semver "^5.3.0" + tar "^2.2.1" + tar-pack "^3.4.0" + +node-uuid@~1.4.0: + version "1.4.8" + resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" + +nodeify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nodeify/-/nodeify-1.0.1.tgz#64ab69a7bdbaf03ce107b4f0335c87c0b9e91b1d" + dependencies: + is-promise "~1.0.0" + promise "~1.3.0" + +nodemon@^1.11.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.15.0.tgz#ddec01eeb9c33d53dfbf7eddb2fa32f723474c1e" + dependencies: + chokidar "^2.0.2" + debug "^3.1.0" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.0" + semver "^5.4.1" + touch "^3.1.0" + undefsafe "^2.0.1" + update-notifier "^2.3.0" + +"nopt@2 || 3", nopt@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + dependencies: + abbrev "1" + +nopt@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" + dependencies: + abbrev "1" + osenv "^0.1.4" + +nopt@~1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + dependencies: + abbrev "1" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +normalize-space-x@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-space-x/-/normalize-space-x-3.0.0.tgz#17907d6c7c724a4f9567471cbb319553bc0f8882" + dependencies: + cached-constructors-x "^1.0.0" + trim-x "^3.0.0" + white-space-x "^3.0.0" + +npm-run-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" + dependencies: + path-key "^1.0.0" + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" + +npmlog@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" + dependencies: + ansi "~0.3.1" + are-we-there-yet "~1.1.2" + gauge "~1.2.5" + +nth-check@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" + dependencies: + boolbase "~1.0.0" + +nugget@^2.0.0, nugget@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/nugget/-/nugget-2.0.1.tgz#201095a487e1ad36081b3432fa3cada4f8d071b0" + dependencies: + debug "^2.1.3" + minimist "^1.1.0" + pretty-bytes "^1.0.2" + progress-stream "^1.1.0" + request "^2.45.0" + single-line-log "^1.1.2" + throttleit "0.0.2" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +"nwmatcher@>= 1.3.7 < 2.0.0": + version "1.4.3" + resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" + +nyc@^11.0.0: + version "11.4.1" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-11.4.1.tgz#13fdf7e7ef22d027c61d174758f6978a68f4f5e5" + dependencies: + archy "^1.0.0" + arrify "^1.0.1" + caching-transform "^1.0.0" + convert-source-map "^1.3.0" + debug-log "^1.0.1" + default-require-extensions "^1.0.0" + find-cache-dir "^0.1.1" + find-up "^2.1.0" + foreground-child "^1.5.3" + glob "^7.0.6" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-hook "^1.1.0" + istanbul-lib-instrument "^1.9.1" + istanbul-lib-report "^1.1.2" + istanbul-lib-source-maps "^1.2.2" + istanbul-reports "^1.1.3" + md5-hex "^1.2.0" + merge-source-map "^1.0.2" + micromatch "^2.3.11" + mkdirp "^0.5.0" + resolve-from "^2.0.0" + rimraf "^2.5.4" + signal-exit "^3.0.1" + spawn-wrap "^1.4.2" + test-exclude "^4.1.1" + yargs "^10.0.3" + yargs-parser "^8.0.0" + +oauth-sign@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.4.0.tgz#f22956f31ea7151a821e5f2fb32c113cad8b9f69" + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-get-own-property-descriptor-x@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/object-get-own-property-descriptor-x/-/object-get-own-property-descriptor-x-3.2.0.tgz#464585ad03e66108ed166c99325b8d2c5ba93712" + dependencies: + attempt-x "^1.1.0" + has-own-property-x "^3.1.1" + has-symbol-support-x "^1.4.1" + is-falsey-x "^1.0.0" + is-index-x "^1.0.0" + is-primitive "^2.0.0" + is-string "^1.0.4" + property-is-enumerable-x "^1.1.0" + to-object-x "^1.4.1" + to-property-key-x "^2.0.1" + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + +object.defaults@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" + dependencies: + array-each "^1.0.1" + array-slice "^1.0.0" + for-own "^1.0.0" + isobject "^3.0.0" + +object.map@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" + dependencies: + for-own "^1.0.0" + make-iterator "^1.0.0" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +object.pick@^1.2.0, object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +once@^1.3.0, once@^1.3.3, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +once@~1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" + dependencies: + wrappy "1" + +onetime@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +opn@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" + dependencies: + is-wsl "^1.1.0" + +optimist@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" + dependencies: + minimist "~0.0.1" + wordwrap "~0.0.2" + +optionator@^0.8.1, optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +ora@^1.1.0, ora@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-1.4.0.tgz#884458215b3a5d4097592285f93321bb7a79e2e5" + dependencies: + chalk "^2.1.0" + cli-cursor "^2.1.0" + cli-spinners "^1.0.1" + log-symbols "^2.1.0" + +orchestrator@^0.3.0: + version "0.3.8" + resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" + dependencies: + end-of-stream "~0.1.5" + sequencify "~0.0.7" + stream-consume "~0.1.0" + +ordered-read-streams@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" + +os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + +os-shim@^0.1.2: + version "0.1.3" + resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" + +os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +osenv@0, osenv@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" + dependencies: + os-homedir "^1.0.0" + os-tmpdir "^1.0.0" + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + +package-json@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + +pad-right@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/pad-right/-/pad-right-0.2.2.tgz#6fbc924045d244f2a2a244503060d3bfc6009774" + dependencies: + repeat-string "^1.5.2" + +parse-author@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-author/-/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f" + dependencies: + author-regex "^1.0.0" + +parse-color@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-color/-/parse-color-1.0.0.tgz#7b748b95a83f03f16a94f535e52d7f3d94658619" + dependencies: + color-convert "~0.5.0" + +parse-filepath@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" + dependencies: + is-absolute "^1.0.0" + map-cache "^0.2.0" + path-root "^0.1.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-int-x@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/parse-int-x/-/parse-int-x-2.0.0.tgz#9f979d4115930df2f4706a41810b9c712405552f" + dependencies: + cached-constructors-x "^1.0.0" + nan-x "^1.0.0" + to-string-x "^1.4.2" + trim-left-x "^3.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +parse-passwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" + +parse5@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" + +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@2.1.0, path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + +path-key@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" + +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + +path-root-regex@^0.1.0: + version "0.1.2" + resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" + +path-root@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" + dependencies: + path-root-regex "^0.1.0" + +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" + +path-to-regexp@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-2.1.0.tgz#7e30f9f5b134bd6a28ffc2e3ef1e47075ac5259b" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +path-type@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" + dependencies: + pify "^2.0.0" + +pathval@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +performance-now@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0, pify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pify@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + dependencies: + find-up "^1.0.0" + +pkg-up@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" + dependencies: + find-up "^1.0.0" + +pkginfo@0.3.x: + version "0.3.1" + resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.3.1.tgz#5b29f6a81f70717142e09e765bbeab97b4f81e21" + +plist@^2.0.0, plist@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-2.1.0.tgz#57ccdb7a0821df21831217a3cad54e3e146a1025" + dependencies: + base64-js "1.2.0" + xmlbuilder "8.2.2" + xmldom "0.1.x" + +plugin-error@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" + dependencies: + ansi-colors "^1.0.1" + arr-diff "^4.0.0" + arr-union "^3.1.0" + extend-shallow "^3.0.2" + +pluralize@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +prepend-http@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +pretty-bytes@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-1.0.4.tgz#0a22e8210609ad35542f8c8d5d2159aff0751c84" + dependencies: + get-stdin "^4.0.1" + meow "^3.1.0" + +pretty-hrtime@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" + +private@^0.1.6, private@^0.1.7: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +progress-stream@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/progress-stream/-/progress-stream-1.2.0.tgz#2cd3cfea33ba3a89c9c121ec3347abe9ab125f77" + dependencies: + speedometer "~0.1.2" + through2 "~0.2.3" + +progress@^1.1.8: + version "1.1.8" + resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + +promise@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/promise/-/promise-1.3.0.tgz#e5cc9a4c8278e4664ffedc01c7da84842b040175" + dependencies: + is-promise "~1" + +property-is-enumerable-x@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/property-is-enumerable-x/-/property-is-enumerable-x-1.1.0.tgz#7ca48917476cd0914b37809bfd05776a0d942f6f" + dependencies: + to-object-x "^1.4.1" + to-property-key-x "^2.0.1" + +proxyquire@^1.7.10: + version "1.8.0" + resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-1.8.0.tgz#02d514a5bed986f04cbb2093af16741535f79edc" + dependencies: + fill-keys "^1.0.2" + module-not-found-error "^1.0.0" + resolve "~1.1.7" + +pruner@^0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/pruner/-/pruner-0.0.7.tgz#345fbcb3e80701163a1d7adf56bac229a5a1e4c1" + dependencies: + fs-extra "^4.0.0" + +ps-tree@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.1.0.tgz#b421b24140d6203f1ed3c76996b4427b08e8c014" + dependencies: + event-stream "~3.3.0" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +pstree.remy@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.0.tgz#f2af27265bd3e5b32bbfcc10e80bac55ba78688b" + dependencies: + ps-tree "^1.1.0" + +punycode@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" + +qs@~1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-1.2.2.tgz#19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88" + +qs@~6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" + +qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +querystring@0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" + +ramda@^0.24.1: + version "0.24.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.24.1.tgz#c3b7755197f35b8dc3502228262c4c91ddb6b857" + +random-path@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/random-path/-/random-path-0.1.1.tgz#f8f4d36f75a134ca15fd39c7d7505fbf163b634c" + dependencies: + base32-encode "^0.1.0" + murmur-32 "^0.1.0" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +rc@^1.0.1, rc@^1.1.2, rc@^1.1.6, rc@^1.1.7: + version "1.2.5" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + +rcedit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-1.0.0.tgz#43309ecbc8814f3582fca6b751748cfad66a16a2" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg-up@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" + dependencies: + find-up "^2.0.0" + read-pkg "^2.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +read-pkg@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" + dependencies: + load-json-file "^2.0.0" + normalize-package-data "^2.3.2" + path-type "^2.0.0" + +readable-stream@1.1: + version "1.1.13" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.2, readable-stream@~1.0.24, readable-stream@~1.0.26: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^1.0.27-1, readable-stream@^1.1.8, readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2: + version "2.3.4" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readdirp@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" + dependencies: + graceful-fs "^4.1.2" + minimatch "^3.0.2" + readable-stream "^2.0.2" + set-immediate-shim "^1.0.1" + +readline2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regenerate@^1.2.1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" + +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +regex-not@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" + dependencies: + extend-shallow "^2.0.1" + +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + +registry-auth-token@^3.0.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.2.tgz#851fd49038eecb586911115af845260eec983f20" + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + +registry-url@^3.0.3: + version "3.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + dependencies: + rc "^1.0.1" + +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + dependencies: + jsesc "~0.5.0" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^1.1.0: + version "1.1.3" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-1.1.3.tgz#3d4114218877537494f97f77f9785fab810fa4ac" + dependencies: + is-finite "^1.0.0" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +replace-comments-x@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/replace-comments-x/-/replace-comments-x-2.0.0.tgz#a5cec18efd912aad78a7c3c4b69d01768556d140" + dependencies: + require-coercible-to-string-x "^1.0.0" + to-string-x "^1.4.2" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +request@2, request@^2.45.0, request@^2.55.0, request@^2.79.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@2.42.0: + version "2.42.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.42.0.tgz#572bd0148938564040ac7ab148b96423a063304a" + dependencies: + bl "~0.9.0" + caseless "~0.6.0" + forever-agent "~0.5.0" + json-stringify-safe "~5.0.0" + mime-types "~1.0.1" + node-uuid "~1.4.0" + qs "~1.2.0" + tunnel-agent "~0.4.0" + optionalDependencies: + aws-sign2 "~0.5.0" + form-data "~0.1.0" + hawk "1.1.1" + http-signature "~0.10.0" + oauth-sign "~0.4.0" + stringstream "~0.0.4" + tough-cookie ">=0.12.0" + +request@2.81.0: + version "2.81.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~4.2.1" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + performance-now "^0.2.0" + qs "~6.4.0" + safe-buffer "^5.0.1" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "^0.6.0" + uuid "^3.0.0" + +require-coercible-to-string-x@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/require-coercible-to-string-x/-/require-coercible-to-string-x-1.0.0.tgz#367b3e9ca67e00324c411b0b498453a74cd5569e" + dependencies: + require-object-coercible-x "^1.4.1" + to-string-x "^1.4.2" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + +require-object-coercible-x@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/require-object-coercible-x/-/require-object-coercible-x-1.4.1.tgz#75b9fb5bda2d15cf705a5714f108e8b40ca3eb2e" + dependencies: + is-nil-x "^1.4.1" + +require-uncached@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve-dir@^1.0.0, resolve-dir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" + dependencies: + expand-tilde "^2.0.0" + global-modules "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +resolve-from@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + +resolve-package@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-package/-/resolve-package-1.0.1.tgz#686f70b188bd7d675f5bbc4282ccda060abb9d27" + dependencies: + get-installed-path "^2.0.3" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + +resolve@^1.1.6, resolve@^1.1.7: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + dependencies: + path-parse "^1.0.5" + +resolve@~1.1.7: + version "1.1.7" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + +restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +resumer@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" + dependencies: + through "~2.3.4" + +right-align@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" + dependencies: + align-text "^0.1.1" + +right-pad@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0" + +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +rimraf@~2.2.6, rimraf@~2.2.8: + version "2.2.8" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" + +run-async@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + dependencies: + once "^1.3.0" + +run-async@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" + dependencies: + is-promise "^2.1.0" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +rx-lite@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + +rx@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" + +rxjs@^5.1.1, rxjs@^5.5.2: + version "5.5.6" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02" + dependencies: + symbol-observable "1.0.1" + +s3@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/s3/-/s3-4.4.0.tgz#56a4f775515a7b6b9c8e5c6b1ab51f9037669f1f" + dependencies: + aws-sdk "~2.0.31" + fd-slicer "~1.0.0" + findit2 "~2.2.3" + graceful-fs "~3.0.5" + mime "~1.2.11" + mkdirp "~0.5.0" + pend "~1.2.0" + rimraf "~2.2.8" + streamsink "~1.2.0" + +safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +samsam@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" + +sanitize-filename@^1.6.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" + dependencies: + truncate-utf8-bytes "^1.0.0" + +sax@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/sax/-/sax-0.4.2.tgz#39f3b601733d6bec97105b242a2a40fd6978ac3c" + +sax@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" + +sax@>=0.6.0, sax@^1.1.4: + version "1.2.4" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" + +semver-diff@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + dependencies: + semver "^5.0.3" + +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + +semver@~2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-2.2.1.tgz#7941182b3ffcc580bff1c17942acdf7951c0d213" + +semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +sequencify@~0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" + +set-blocking@^2.0.0, set-blocking@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + +set-getter@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" + dependencies: + to-object-path "^0.3.0" + +set-immediate-shim@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" + +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + +shelljs@0.7.6: + version "0.7.6" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.6.tgz#379cccfb56b91c8601e4793356eb5382924de9ad" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +shelljs@^0.7.5: + version "0.7.8" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +single-line-log@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/single-line-log/-/single-line-log-1.1.2.tgz#c2f83f273a3e1a16edb0995661da0ed5ef033364" + dependencies: + string-width "^1.0.1" + +sinon@^4.1.2: + version "4.3.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.3.0.tgz#cec9b27d5f4e2c63c1a79c9dc1c05d34bb088234" + dependencies: + "@sinonjs/formatio" "^2.0.0" + diff "^3.1.0" + lodash.get "^4.4.2" + lolex "^2.2.0" + nise "^1.2.0" + supports-color "^5.1.0" + type-detect "^4.0.5" + +slash@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" + +slice-ansi@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + +slide@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^2.0.0" + +sntp@0.2.x: + version "0.2.4" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-0.2.4.tgz#fb885f18b0f3aad189f824862536bceeec750900" + dependencies: + hoek "0.9.x" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +source-map-resolve@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + dependencies: + atob "^2.0.0" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + +source-map@^0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" + dependencies: + amdefine ">=0.0.4" + +source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.6: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + +source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + +sparkles@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + +spawn-rx@^2.0.10: + version "2.0.12" + resolved "https://registry.yarnpkg.com/spawn-rx/-/spawn-rx-2.0.12.tgz#b6285294499426089beea0c3c1ec32d7fc57a376" + dependencies: + debug "^2.5.1" + lodash.assign "^4.2.0" + rxjs "^5.1.1" + +spawn-sync@^1.0.15: + version "1.0.15" + resolved "https://registry.yarnpkg.com/spawn-sync/-/spawn-sync-1.0.15.tgz#b00799557eb7fb0c8376c29d44e8a1ea67e57476" + dependencies: + concat-stream "^1.4.7" + os-shim "^0.1.2" + +spawn-wrap@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.4.2.tgz#cff58e73a8224617b6561abdc32586ea0c82248c" + dependencies: + foreground-child "^1.5.6" + mkdirp "^0.5.0" + os-homedir "^1.0.1" + rimraf "^2.6.2" + signal-exit "^3.0.2" + which "^1.3.0" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +speedometer@~0.1.2: + version "0.1.4" + resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +split@~0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/split/-/split-0.2.10.tgz#67097c601d697ce1368f418f06cd201cf0521a57" + dependencies: + through "2" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stack-trace@0.0.x: + version "0.0.10" + resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + +stream-buffers@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" + +stream-combiner@~0.0.2, stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-consume@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" + +streamsink@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/streamsink/-/streamsink-1.2.0.tgz#efafee9f1e22d3591ed7de3dcaa95c3f5e79f73c" + +string-width@^1.0.1, string-width@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + +string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4, stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-bom@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" + dependencies: + first-chunk-stream "^1.0.0" + is-utf8 "^0.2.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + +strip-indent@^1.0.0, strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +strip-json-comments@2.0.1, strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +sudo-prompt@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-8.1.0.tgz#62dce8013b80dd242e5b6ca15d8b8cffb7c85472" + +sumchecker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-2.0.2.tgz#0f42c10e5d05da5d42eea3e56c3399a37d6c5b3e" + dependencies: + debug "^2.2.0" + +supports-color@4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" + dependencies: + has-flag "^2.0.0" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^3.1.2: + version "3.2.3" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + dependencies: + has-flag "^1.0.0" + +supports-color@^5.1.0, supports-color@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.2.0.tgz#b0d5333b1184dd3666cbe5aa0b45c5ac7ac17a4a" + dependencies: + has-flag "^3.0.0" + +symbol-observable@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" + +"symbol-tree@>= 3.1.0 < 4.0.0": + version "3.2.2" + resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" + +table@^3.7.8: + version "3.8.3" + resolved "https://registry.yarnpkg.com/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + +tabtab@^2.2.1: + version "2.2.2" + resolved "https://registry.yarnpkg.com/tabtab/-/tabtab-2.2.2.tgz#7a047f143b010b4cbd31f857e82961512cbf4e14" + dependencies: + debug "^2.2.0" + inquirer "^1.0.2" + lodash.difference "^4.5.0" + lodash.uniq "^4.5.0" + minimist "^1.2.0" + mkdirp "^0.5.1" + npmlog "^2.0.3" + object-assign "^4.1.0" + +taffydb@2.7.2: + version "2.7.2" + resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" + +tape@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/tape/-/tape-2.3.0.tgz#0dfeec709227fbcc9170abe7f046962b271431db" + dependencies: + deep-equal "~0.1.0" + defined "~0.0.0" + inherits "~2.0.1" + jsonify "~0.0.0" + resumer "~0.0.0" + split "~0.2.10" + stream-combiner "~0.0.2" + through "~2.3.4" + +tar-pack@^3.4.0: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" + dependencies: + debug "^2.2.0" + fstream "^1.0.10" + fstream-ignore "^1.0.5" + once "^1.3.3" + readable-stream "^2.1.4" + rimraf "^2.5.1" + tar "^2.2.1" + uid-number "^0.0.6" + +tar-stream@~0.4.0: + version "0.4.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-0.4.7.tgz#1f1d2ce9ebc7b42765243ca0e8f1b7bfda0aadcd" + dependencies: + bl "^0.9.0" + end-of-stream "^1.0.0" + readable-stream "^1.0.27-1" + xtend "^4.0.0" + +tar@^2.0.0, tar@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" + dependencies: + block-stream "*" + fstream "^1.0.2" + inherits "2" + +temp@0.8.3, temp@^0.8.3: + version "0.8.3" + resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" + dependencies: + os-tmpdir "^1.0.0" + rimraf "~2.2.6" + +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + dependencies: + execa "^0.7.0" + +test-exclude@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.0.tgz#07e3613609a362c74516a717515e13322ab45b3c" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + +text-encoding@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.0" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839" + dependencies: + any-promise "^1.0.0" + +throttleit@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" + +through2@^0.6.1: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through2@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" + dependencies: + readable-stream "~1.1.9" + xtend "~2.1.1" + +through@2, through@^2.3.6, through@~2.3, through@~2.3.1, through@~2.3.4: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tildify@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" + dependencies: + os-homedir "^1.0.0" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +timed-out@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + +tmp-promise@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-1.0.4.tgz#cfe2131b78392992e756d8692a059dc4b48be7ac" + dependencies: + bluebird "^3.5.0" + tmp "0.0.33" + +tmp@0.0.28: + version "0.0.28" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.28.tgz#172735b7f614ea7af39664fa84cf0de4e515d120" + dependencies: + os-tmpdir "~1.0.1" + +tmp@0.0.29, tmp@^0.0.29: + version "0.0.29" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.29.tgz#f25125ff0dd9da3ccb0c2dd371ee1288bb9128c0" + dependencies: + os-tmpdir "~1.0.1" + +tmp@0.0.33, tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +tn1150@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/tn1150/-/tn1150-0.1.0.tgz#673503d24d56b87de8b8c77fee3fc0853d59a18d" + dependencies: + unorm "^1.4.1" + +to-boolean-x@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-boolean-x/-/to-boolean-x-1.0.1.tgz#724128dacc5bea75a93ad471be7ee9277561b2c1" + +to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + +to-integer-x@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/to-integer-x/-/to-integer-x-3.0.0.tgz#9f3b80e668c7f0ae45e6926b40d95f52c1addc74" + dependencies: + is-finite-x "^3.0.2" + is-nan-x "^1.0.1" + math-sign-x "^3.0.0" + to-number-x "^2.0.0" + +to-number-x@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-number-x/-/to-number-x-2.0.0.tgz#c9099d7ded8fd327132a2987df2dcc8baf36df4d" + dependencies: + cached-constructors-x "^1.0.0" + nan-x "^1.0.0" + parse-int-x "^2.0.0" + to-primitive-x "^1.1.0" + trim-x "^3.0.0" + +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-object-x@^1.4.1, to-object-x@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/to-object-x/-/to-object-x-1.5.0.tgz#bd69dd4e104d77acc0cc0d84f5ac48f630aebe3c" + dependencies: + cached-constructors-x "^1.0.0" + require-object-coercible-x "^1.4.1" + +to-primitive-x@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/to-primitive-x/-/to-primitive-x-1.1.0.tgz#41ce2c13e3e246e0e5d0a8829a0567c6015833f8" + dependencies: + has-symbol-support-x "^1.4.1" + is-date-object "^1.0.1" + is-function-x "^3.2.0" + is-nil-x "^1.4.1" + is-primitive "^2.0.0" + is-symbol "^1.0.1" + require-object-coercible-x "^1.4.1" + validate.io-undefined "^1.0.3" + +to-property-key-x@^2.0.1, to-property-key-x@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/to-property-key-x/-/to-property-key-x-2.0.2.tgz#b19aa8e22faa0ff7d1c102cfbc657af73413cfa1" + dependencies: + has-symbol-support-x "^1.4.1" + to-primitive-x "^1.1.0" + to-string-x "^1.4.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" + dependencies: + define-property "^0.2.5" + extend-shallow "^2.0.1" + regex-not "^1.0.0" + +to-string-symbols-supported-x@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-string-symbols-supported-x/-/to-string-symbols-supported-x-1.0.0.tgz#d435eb72312fe885b18047a96d59c75641476872" + dependencies: + cached-constructors-x "^1.0.0" + has-symbol-support-x "^1.4.1" + is-symbol "^1.0.1" + +to-string-tag-x@^1.4.1, to-string-tag-x@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/to-string-tag-x/-/to-string-tag-x-1.4.2.tgz#916a0c72d2f93dc27fccfe0ea0ce26cd78be21de" + dependencies: + lodash.isnull "^3.0.0" + validate.io-undefined "^1.0.3" + +to-string-x@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/to-string-x/-/to-string-x-1.4.2.tgz#7d9a2528e159a9214e668137c1e10a045abe6279" + dependencies: + is-symbol "^1.0.1" + +touch@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/touch/-/touch-0.0.3.tgz#51aef3d449571d4f287a5d87c9c8b49181a0db1d" + dependencies: + nopt "~1.0.10" + +touch@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + dependencies: + nopt "~1.0.10" + +tough-cookie@>=0.12.0, tough-cookie@^2.2.0, tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + dependencies: + punycode "^1.4.1" + +tr46@~0.0.1: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + +"traverse@>=0.3.0 <0.4": + version "0.3.9" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" + +trim-left-x@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-left-x/-/trim-left-x-3.0.0.tgz#356cf055896726b9754425e841398842e90b4cdf" + dependencies: + cached-constructors-x "^1.0.0" + require-coercible-to-string-x "^1.0.0" + white-space-x "^3.0.0" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +trim-right-x@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-right-x/-/trim-right-x-3.0.0.tgz#28c4cd37d5981f50ace9b52e3ce9106f4d2d22c0" + dependencies: + cached-constructors-x "^1.0.0" + require-coercible-to-string-x "^1.0.0" + white-space-x "^3.0.0" + +trim-right@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + +trim-x@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-x/-/trim-x-3.0.0.tgz#24efdcd027b748bbfc246a0139ad1749befef024" + dependencies: + trim-left-x "^3.0.0" + trim-right-x "^3.0.0" + +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + dependencies: + utf8-byte-length "^1.0.1" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tunnel-agent@~0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.8" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +uglify-js@^2.6: + version "2.8.29" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" + dependencies: + source-map "~0.5.1" + yargs "~3.10.0" + optionalDependencies: + uglify-to-browserify "~1.0.0" + +uglify-to-browserify@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" + +uid-number@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" + +unc-path-regex@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" + +undefsafe@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" + dependencies: + debug "^2.2.0" + +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + +unique-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" + +unique-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + dependencies: + crypto-random-string "^1.0.0" + +universalify@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" + +unorm@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.4.1.tgz#364200d5f13646ca8bcd44490271335614792300" + +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +unzip-response@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + +upath@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/upath/-/upath-1.0.2.tgz#80aaae5395abc5fd402933ae2f58694f0860204c" + dependencies: + lodash.endswith "^4.2.1" + lodash.isfunction "^3.0.8" + lodash.isstring "^4.0.1" + lodash.startswith "^4.2.1" + +update-notifier@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.3.0.tgz#4e8827a6bb915140ab093559d7014e3ebb837451" + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + dependencies: + prepend-http "^1.0.1" + +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + +url@0.10.3: + version "0.10.3" + resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64" + dependencies: + punycode "1.3.2" + querystring "0.2.0" + +urlgrey@0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/urlgrey/-/urlgrey-0.4.0.tgz#f065357040fb35c3b311d4e5dc36484d96dbea06" + dependencies: + tape "2.3.0" + +use@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" + dependencies: + define-property "^0.2.5" + isobject "^3.0.0" + lazy-cache "^2.0.2" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + +user-home@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + dependencies: + os-homedir "^1.0.0" + +username@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/username/-/username-3.0.0.tgz#b3dba982a72b4ce59d52f159fa1aeba266af5fc8" + dependencies: + execa "^0.7.0" + mem "^1.1.0" + +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + +uuid@^3.0.0, uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +v8flags@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +validate.io-undefined@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/validate.io-undefined/-/validate.io-undefined-1.0.3.tgz#7e27fcbb315b841e78243431897671929e20b7f4" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-fs@^0.3.0: + version "0.3.14" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" + dependencies: + defaults "^1.0.0" + glob-stream "^3.1.5" + glob-watcher "^0.0.6" + graceful-fs "^3.0.0" + mkdirp "^0.5.0" + strip-bom "^1.0.0" + through2 "^0.6.1" + vinyl "^0.4.0" + +vinyl-sourcemaps-apply@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" + dependencies: + source-map "^0.5.1" + +vinyl@^0.4.0: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +webidl-conversions@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" + +whatwg-url-compat@~0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz#00898111af689bb097541cd5a45ca6c8798445bf" + dependencies: + tr46 "~0.0.1" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + +which@1, which@^1.2.12, which@^1.2.14, which@^1.2.8, which@^1.2.9, which@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" + dependencies: + isexe "^2.0.0" + +white-space-x@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/white-space-x/-/white-space-x-3.0.0.tgz#c8e31ed4fecf4f3feebe6532e6046008a666a3e1" + +wide-align@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" + dependencies: + string-width "^1.0.2" + +widest-line@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" + dependencies: + string-width "^2.1.1" + +window-size@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" + +winston@2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/winston/-/winston-2.1.0.tgz#34688215cc8dbb784838b9aa626e73aee44fe4b6" + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + pkginfo "0.3.x" + stack-trace "0.0.x" + +word-wrap@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.1.0.tgz#356153d61d10610d600785c5d701288e0ae764a6" + +word-wrap@^1.0.3, word-wrap@^1.2.1, word-wrap@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + +wordwrap@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" + +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +wrench@~1.5.4: + version "1.5.9" + resolved "https://registry.yarnpkg.com/wrench/-/wrench-1.5.9.tgz#411691c63a9b2531b1700267279bdeca23b2142a" + +write-file-atomic@^1.1.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-file-atomic@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + +"xml-name-validator@>= 2.0.1 < 3.0.0": + version "2.0.1" + resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" + +xml2js@0.2.6: + version "0.2.6" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.2.6.tgz#d209c4e4dda1fc9c452141ef41c077f5adfdf6c4" + dependencies: + sax "0.4.2" + +xml2js@0.4.17: + version "0.4.17" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.17.tgz#17be93eaae3f3b779359c795b419705a8817e868" + dependencies: + sax ">=0.6.0" + xmlbuilder "^4.1.0" + +xmlbuilder@0.4.2: + version "0.4.2" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-0.4.2.tgz#1776d65f3fdbad470a08d8604cdeb1c4e540ff83" + +xmlbuilder@4.2.1, xmlbuilder@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-4.2.1.tgz#aa58a3041a066f90eaa16c2f5389ff19f3f461a5" + dependencies: + lodash "^4.0.0" + +xmlbuilder@8.2.2: + version "8.2.2" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-8.2.2.tgz#69248673410b4ba42e1a6136551d2922335aa773" + +xmldom@0.1.x: + version "0.1.27" + resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + dependencies: + object-keys "~0.4.0" + +y18n@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" + dependencies: + camelcase "^3.0.0" + +yargs-parser@^8.0.0, yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + dependencies: + camelcase "^4.1.0" + +yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + dependencies: + camelcase "^4.1.0" + +yargs@7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.0.2.tgz#115b97df1321823e8b8648e8968c782521221f67" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.1.0" + +yargs@^11.0.0: + version "11.0.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.0.0.tgz#c052931006c5eee74610e5fc0354bedfd08a201b" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" + +yargs@^6.0.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + +yargs@^7.0.2: + version "7.1.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^5.0.0" + +yargs@~3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" + dependencies: + camelcase "^1.0.2" + cliui "^2.1.0" + decamelize "^1.0.0" + window-size "0.1.0" + +yarn-or-npm@^2.0.2: + version "2.0.4" + resolved "https://registry.yarnpkg.com/yarn-or-npm/-/yarn-or-npm-2.0.4.tgz#46e38aafce74c350e6c0cca72712fca7410fad98" + dependencies: + cross-spawn "^5.0.0" + +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1" + +zip-folder@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/zip-folder/-/zip-folder-1.0.0.tgz#70a7744fd1789a2feb41ad3419b32e9fd87957b2" + dependencies: + archiver "^0.11.0" + +zip-stream@~0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-0.4.1.tgz#4ea795a8ce19e9fab49a31d1d0877214159f03a3" + dependencies: + compress-commons "~0.1.0" + lodash "~2.4.1" + readable-stream "~1.0.26" From e032201e3fcbbe46656904a0bac5dd8b29f99922 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Sun, 18 Feb 2018 12:16:39 +1100 Subject: [PATCH 02/40] Start working in new package structure --- .babelrc | 17 +- .../api/core/.editorconfig => .editorconfig | 0 .eslintrc | 6 +- .gitignore | 4 +- .nvmrc | 1 + gulpfile.babel.js | 42 - mocha.opts | 2 + package.json | 25 +- packages/_old/.editorconfig | 14 + packages/_old/.esdoc.json | 28 + packages/_old/.eslintignore | 1 + packages/_old/.gitignore | 6 + packages/_old/.npmignore | 4 + packages/_old/CHANGELOG.md | 1059 ++++++++++ packages/_old/package.json | 97 + packages/{api/core => _old}/script/vscode.cmd | 0 packages/{api/core => _old}/script/vscode.sh | 0 packages/_old/src/api/import.js | 166 ++ packages/_old/src/api/index.js | 28 + packages/_old/src/api/init.js | 46 + packages/_old/src/api/install.js | 163 ++ packages/_old/src/api/lint.js | 58 + packages/_old/src/api/make.js | 182 ++ packages/_old/src/api/package.js | 174 ++ packages/_old/src/api/publish.js | 155 ++ packages/_old/src/api/start.js | 98 + .../src/electron-forge-import.js | 0 .../core => _old}/src/electron-forge-init.js | 0 .../src/electron-forge-install.js | 0 .../core => _old}/src/electron-forge-lint.js | 0 .../core => _old}/src/electron-forge-make.js | 0 .../src/electron-forge-package.js | 0 .../src/electron-forge-publish.js | 0 .../core => _old}/src/electron-forge-start.js | 0 .../{api/core => _old}/src/electron-forge.js | 0 .../core => _old}/src/init/init-custom.js | 0 .../core => _old}/src/init/init-directory.js | 0 .../{api/core => _old}/src/init/init-git.js | 0 .../{api/core => _old}/src/init/init-npm.js | 0 .../src/init/init-starter-files.js | 0 .../src/installers/darwin/dmg.js | 0 .../src/installers/darwin/zip.js | 0 .../core => _old}/src/installers/linux/deb.js | 0 .../core => _old}/src/installers/linux/rpm.js | 0 .../core => _old}/src/installers/win32/exe.js | 0 .../core => _old}/src/makers/darwin/dmg.js | 0 .../core => _old}/src/makers/generic/zip.js | 0 .../core => _old}/src/makers/linux/deb.js | 0 .../core => _old}/src/makers/linux/flatpak.js | 0 .../core => _old}/src/makers/linux/rpm.js | 0 .../core => _old}/src/makers/linux/snap.js | 0 .../core => _old}/src/makers/win32/appx.js | 0 .../src/makers/win32/squirrel.js | 0 .../core => _old}/src/makers/win32/wix.js | 0 .../src/publishers/electron-release-server.js | 0 .../core => _old}/src/publishers/github.js | 0 .../{api/core => _old}/src/publishers/s3.js | 0 .../core => _old}/src/publishers/snapcraft.js | 0 packages/_old/src/util/author-name.js | 19 + .../core => _old}/src/util/check-system.js | 0 packages/_old/src/util/config-fn.js | 6 + .../{api/core => _old}/src/util/config.js | 0 .../src/util/confirm-if-interactive.js | 0 packages/_old/src/util/deprecate.js | 8 + packages/_old/src/util/electron-version.js | 6 + packages/_old/src/util/ensure-output.js | 22 + packages/_old/src/util/forge-config.js | 114 ++ packages/_old/src/util/github.js | 30 + .../{api/core => _old}/src/util/hdiutil.js | 0 packages/_old/src/util/hook.js | 13 + .../_old/src/util/install-dependencies.js | 33 + packages/_old/src/util/is-installed.js | 9 + packages/_old/src/util/linux-config.js | 19 + packages/_old/src/util/messages.js | 13 + .../{api/core => _old}/src/util/move-app.js | 0 packages/_old/src/util/ora-handler.js | 44 + packages/_old/src/util/ora.js | 39 + packages/_old/src/util/out-dir.js | 14 + packages/_old/src/util/parse-archs.js | 9 + packages/_old/src/util/plugin-interface.js | 50 + packages/_old/src/util/publish-state.js | 72 + packages/_old/src/util/read-package-json.js | 5 + packages/_old/src/util/rebuild.js | 26 + packages/_old/src/util/require-search.js | 25 + packages/_old/src/util/resolve-dir.js | 36 + .../{api/core => _old}/src/util/terminate.js | 0 packages/_old/src/util/yarn-or-npm.js | 23 + packages/_old/tabtab-install.js | 21 + packages/_old/test/.eslintrc | 9 + packages/_old/test/fast/author-name_spec.js | 30 + .../core => _old}/test/fast/config_spec.js | 0 .../test/fast/confirm-if-interactive_spec.js | 0 .../test/fast/electron_forge_start_spec.js | 0 packages/_old/test/fast/ensure-output_spec.js | 50 + packages/_old/test/fast/forge-config_spec.js | 98 + packages/_old/test/fast/github_spec.js | 94 + packages/_old/test/fast/hook_spec.js | 27 + .../test/fast/install-dependencies_spec.js | 99 + .../test/fast/makers/appx_spec.js | 0 .../test/fast/makers/deb_spec.js | 0 .../test/fast/makers/dmg_spec.js | 0 .../test/fast/makers/flatpak_spec.js | 0 .../test/fast/makers/rpm_spec.js | 0 .../test/fast/makers/snap_spec.js | 0 .../core => _old}/test/fast/makers_spec.js | 0 packages/_old/test/fast/ora-handler_spec.js | 115 ++ packages/_old/test/fast/out-dir_spec.js | 26 + packages/_old/test/fast/parse-archs_spec.js | 21 + packages/_old/test/fast/publish_spec.js | 234 +++ .../_old/test/fast/read-package-json_spec.js | 10 + .../_old/test/fast/require-search_spec.js | 16 + packages/_old/test/fast/resolve-dir_spec.js | 15 + packages/_old/test/fast/start_spec.js | 208 ++ .../core => _old}/test/fast/system_spec.js | 0 packages/_old/test/fast/yarn-or-npm_spec.js | 39 + .../_old/test/fixture/bogus-private-key.pvk | Bin 0 -> 1196 bytes .../_old/test/fixture/custom_init/index.js | 8 + .../test/fixture/custom_init/package.json | 12 + .../_old/test/fixture/custom_init/tmpl/_bar | 0 .../test/fixture/custom_init/tmpl/src/foo.js | 0 packages/_old/test/fixture/dummy_app/foo/null | 0 .../_old/test/fixture/dummy_app/package.json | 34 + .../fixture/dummy_js_conf/forge.config.js | 13 + .../test/fixture/dummy_js_conf/package.json | 19 + .../_old/test/fixture/maker-incompatible.js | 1 + .../_old/test/fixture/maker-unsupported.js | 3 + .../_old/test/fixture/native_app/package.json | 27 + packages/_old/test/mocha.opts | 2 + packages/_old/test/slow/api_spec_slow.js | 371 ++++ .../slow/install-dependencies_spec_slow.js | 23 + packages/_old/test/slow/install_spec_slow.js | 191 ++ packages/_old/test/slow/rebuild_spec_slow.js | 79 + packages/_old/tmpl/_appveyor.yml | 26 + packages/_old/tmpl/_gitignore | 2 + packages/_old/tmpl/_travis.yml | 33 + packages/_old/tmpl/index.html | 10 + packages/_old/tmpl/index.js | 57 + packages/_old/tmpl/package.json | 38 + packages/api/cli/package.json | 34 + packages/api/cli/script/vscode.cmd | 9 + packages/api/cli/script/vscode.sh | 7 + packages/api/cli/src/electron-forge-import.js | 27 + packages/api/cli/src/electron-forge-init.js | 33 + .../api/cli/src/electron-forge-install.js | 24 + packages/api/cli/src/electron-forge-lint.js | 28 + packages/api/cli/src/electron-forge-make.js | 48 + .../api/cli/src/electron-forge-package.js | 35 + .../api/cli/src/electron-forge-publish.js | 44 + packages/api/cli/src/electron-forge-start.js | 74 + packages/api/cli/src/electron-forge.js | 72 + packages/api/cli/src/util/check-system.js | 71 + packages/api/cli/src/util/terminate.js | 25 + packages/api/cli/test/check-system_spec.js | 24 + packages/api/core/.gitignore | 5 - packages/api/core/README.md | 1 + packages/api/core/package.json | 61 +- packages/api/core/src/api/import.js | 44 +- .../core/src/api/init-scripts/init-custom.js | 62 + .../src/api/init-scripts/init-directory.js | 21 + .../api/core/src/api/init-scripts/init-git.js | 26 + .../api/core/src/api/init-scripts/init-npm.js | 42 + .../api/init-scripts/init-starter-files.js | 31 + packages/api/core/src/api/init.js | 12 +- packages/api/core/src/api/install.js | 36 +- .../api/core/src/util/install-dependencies.js | 4 +- packages/api/core/test/fast/start_spec.js | 30 - .../fixture/custom_init/package-lock.json | 5 + packages/api/core/test/mocha.opts | 2 - packages/api/core/test/slow/api_spec_slow.js | 159 +- packages/installer/base/package.json | 20 + packages/installer/base/src/Installer.js | 21 + .../installer/base/test/Installer_spec.js | 15 + packages/installer/darwin/package.json | 25 + .../installer/darwin/src/InstallerDarwin.js | 32 + packages/installer/deb/package.json | 22 + packages/installer/deb/src/InstallerDeb.js | 13 + packages/installer/dmg/package.json | 25 + packages/installer/dmg/src/InstallerDMG.js | 41 + packages/installer/dmg/src/util/hdiutil.js | 42 + packages/installer/exe/package.json | 23 + packages/installer/exe/src/InstallerExe.js | 15 + packages/installer/linux/package.json | 24 + .../installer/linux/src/InstallerLinux.js | 22 + packages/installer/rpm/package.json | 22 + packages/installer/rpm/src/InstallerRpm.js | 13 + packages/installer/zip/package.json | 24 + packages/installer/zip/src/InstallerZip.js | 30 + yarn.lock | 1705 +++++++---------- 188 files changed, 6963 insertions(+), 1339 deletions(-) rename packages/api/core/.editorconfig => .editorconfig (100%) create mode 100644 .nvmrc delete mode 100644 gulpfile.babel.js create mode 100644 mocha.opts create mode 100644 packages/_old/.editorconfig create mode 100644 packages/_old/.esdoc.json create mode 100644 packages/_old/.eslintignore create mode 100644 packages/_old/.gitignore create mode 100644 packages/_old/.npmignore create mode 100644 packages/_old/CHANGELOG.md create mode 100644 packages/_old/package.json rename packages/{api/core => _old}/script/vscode.cmd (100%) rename packages/{api/core => _old}/script/vscode.sh (100%) create mode 100644 packages/_old/src/api/import.js create mode 100644 packages/_old/src/api/index.js create mode 100644 packages/_old/src/api/init.js create mode 100644 packages/_old/src/api/install.js create mode 100644 packages/_old/src/api/lint.js create mode 100644 packages/_old/src/api/make.js create mode 100644 packages/_old/src/api/package.js create mode 100644 packages/_old/src/api/publish.js create mode 100644 packages/_old/src/api/start.js rename packages/{api/core => _old}/src/electron-forge-import.js (100%) rename packages/{api/core => _old}/src/electron-forge-init.js (100%) rename packages/{api/core => _old}/src/electron-forge-install.js (100%) rename packages/{api/core => _old}/src/electron-forge-lint.js (100%) rename packages/{api/core => _old}/src/electron-forge-make.js (100%) rename packages/{api/core => _old}/src/electron-forge-package.js (100%) rename packages/{api/core => _old}/src/electron-forge-publish.js (100%) rename packages/{api/core => _old}/src/electron-forge-start.js (100%) rename packages/{api/core => _old}/src/electron-forge.js (100%) rename packages/{api/core => _old}/src/init/init-custom.js (100%) rename packages/{api/core => _old}/src/init/init-directory.js (100%) rename packages/{api/core => _old}/src/init/init-git.js (100%) rename packages/{api/core => _old}/src/init/init-npm.js (100%) rename packages/{api/core => _old}/src/init/init-starter-files.js (100%) rename packages/{api/core => _old}/src/installers/darwin/dmg.js (100%) rename packages/{api/core => _old}/src/installers/darwin/zip.js (100%) rename packages/{api/core => _old}/src/installers/linux/deb.js (100%) rename packages/{api/core => _old}/src/installers/linux/rpm.js (100%) rename packages/{api/core => _old}/src/installers/win32/exe.js (100%) rename packages/{api/core => _old}/src/makers/darwin/dmg.js (100%) rename packages/{api/core => _old}/src/makers/generic/zip.js (100%) rename packages/{api/core => _old}/src/makers/linux/deb.js (100%) rename packages/{api/core => _old}/src/makers/linux/flatpak.js (100%) rename packages/{api/core => _old}/src/makers/linux/rpm.js (100%) rename packages/{api/core => _old}/src/makers/linux/snap.js (100%) rename packages/{api/core => _old}/src/makers/win32/appx.js (100%) rename packages/{api/core => _old}/src/makers/win32/squirrel.js (100%) rename packages/{api/core => _old}/src/makers/win32/wix.js (100%) rename packages/{api/core => _old}/src/publishers/electron-release-server.js (100%) rename packages/{api/core => _old}/src/publishers/github.js (100%) rename packages/{api/core => _old}/src/publishers/s3.js (100%) rename packages/{api/core => _old}/src/publishers/snapcraft.js (100%) create mode 100644 packages/_old/src/util/author-name.js rename packages/{api/core => _old}/src/util/check-system.js (100%) create mode 100644 packages/_old/src/util/config-fn.js rename packages/{api/core => _old}/src/util/config.js (100%) rename packages/{api/core => _old}/src/util/confirm-if-interactive.js (100%) create mode 100644 packages/_old/src/util/deprecate.js create mode 100644 packages/_old/src/util/electron-version.js create mode 100644 packages/_old/src/util/ensure-output.js create mode 100644 packages/_old/src/util/forge-config.js create mode 100644 packages/_old/src/util/github.js rename packages/{api/core => _old}/src/util/hdiutil.js (100%) create mode 100644 packages/_old/src/util/hook.js create mode 100644 packages/_old/src/util/install-dependencies.js create mode 100644 packages/_old/src/util/is-installed.js create mode 100644 packages/_old/src/util/linux-config.js create mode 100644 packages/_old/src/util/messages.js rename packages/{api/core => _old}/src/util/move-app.js (100%) create mode 100644 packages/_old/src/util/ora-handler.js create mode 100644 packages/_old/src/util/ora.js create mode 100644 packages/_old/src/util/out-dir.js create mode 100644 packages/_old/src/util/parse-archs.js create mode 100644 packages/_old/src/util/plugin-interface.js create mode 100644 packages/_old/src/util/publish-state.js create mode 100644 packages/_old/src/util/read-package-json.js create mode 100644 packages/_old/src/util/rebuild.js create mode 100644 packages/_old/src/util/require-search.js create mode 100644 packages/_old/src/util/resolve-dir.js rename packages/{api/core => _old}/src/util/terminate.js (100%) create mode 100644 packages/_old/src/util/yarn-or-npm.js create mode 100644 packages/_old/tabtab-install.js create mode 100644 packages/_old/test/.eslintrc create mode 100644 packages/_old/test/fast/author-name_spec.js rename packages/{api/core => _old}/test/fast/config_spec.js (100%) rename packages/{api/core => _old}/test/fast/confirm-if-interactive_spec.js (100%) rename packages/{api/core => _old}/test/fast/electron_forge_start_spec.js (100%) create mode 100644 packages/_old/test/fast/ensure-output_spec.js create mode 100644 packages/_old/test/fast/forge-config_spec.js create mode 100644 packages/_old/test/fast/github_spec.js create mode 100644 packages/_old/test/fast/hook_spec.js create mode 100644 packages/_old/test/fast/install-dependencies_spec.js rename packages/{api/core => _old}/test/fast/makers/appx_spec.js (100%) rename packages/{api/core => _old}/test/fast/makers/deb_spec.js (100%) rename packages/{api/core => _old}/test/fast/makers/dmg_spec.js (100%) rename packages/{api/core => _old}/test/fast/makers/flatpak_spec.js (100%) rename packages/{api/core => _old}/test/fast/makers/rpm_spec.js (100%) rename packages/{api/core => _old}/test/fast/makers/snap_spec.js (100%) rename packages/{api/core => _old}/test/fast/makers_spec.js (100%) create mode 100644 packages/_old/test/fast/ora-handler_spec.js create mode 100644 packages/_old/test/fast/out-dir_spec.js create mode 100644 packages/_old/test/fast/parse-archs_spec.js create mode 100644 packages/_old/test/fast/publish_spec.js create mode 100644 packages/_old/test/fast/read-package-json_spec.js create mode 100644 packages/_old/test/fast/require-search_spec.js create mode 100644 packages/_old/test/fast/resolve-dir_spec.js create mode 100644 packages/_old/test/fast/start_spec.js rename packages/{api/core => _old}/test/fast/system_spec.js (100%) create mode 100644 packages/_old/test/fast/yarn-or-npm_spec.js create mode 100755 packages/_old/test/fixture/bogus-private-key.pvk create mode 100644 packages/_old/test/fixture/custom_init/index.js create mode 100644 packages/_old/test/fixture/custom_init/package.json create mode 100644 packages/_old/test/fixture/custom_init/tmpl/_bar create mode 100644 packages/_old/test/fixture/custom_init/tmpl/src/foo.js create mode 100644 packages/_old/test/fixture/dummy_app/foo/null create mode 100644 packages/_old/test/fixture/dummy_app/package.json create mode 100644 packages/_old/test/fixture/dummy_js_conf/forge.config.js create mode 100644 packages/_old/test/fixture/dummy_js_conf/package.json create mode 100644 packages/_old/test/fixture/maker-incompatible.js create mode 100644 packages/_old/test/fixture/maker-unsupported.js create mode 100644 packages/_old/test/fixture/native_app/package.json create mode 100644 packages/_old/test/mocha.opts create mode 100644 packages/_old/test/slow/api_spec_slow.js create mode 100644 packages/_old/test/slow/install-dependencies_spec_slow.js create mode 100644 packages/_old/test/slow/install_spec_slow.js create mode 100644 packages/_old/test/slow/rebuild_spec_slow.js create mode 100644 packages/_old/tmpl/_appveyor.yml create mode 100644 packages/_old/tmpl/_gitignore create mode 100644 packages/_old/tmpl/_travis.yml create mode 100644 packages/_old/tmpl/index.html create mode 100644 packages/_old/tmpl/index.js create mode 100644 packages/_old/tmpl/package.json create mode 100644 packages/api/cli/package.json create mode 100755 packages/api/cli/script/vscode.cmd create mode 100755 packages/api/cli/script/vscode.sh create mode 100644 packages/api/cli/src/electron-forge-import.js create mode 100644 packages/api/cli/src/electron-forge-init.js create mode 100644 packages/api/cli/src/electron-forge-install.js create mode 100644 packages/api/cli/src/electron-forge-lint.js create mode 100644 packages/api/cli/src/electron-forge-make.js create mode 100644 packages/api/cli/src/electron-forge-package.js create mode 100644 packages/api/cli/src/electron-forge-publish.js create mode 100644 packages/api/cli/src/electron-forge-start.js create mode 100644 packages/api/cli/src/electron-forge.js create mode 100644 packages/api/cli/src/util/check-system.js create mode 100644 packages/api/cli/src/util/terminate.js create mode 100644 packages/api/cli/test/check-system_spec.js create mode 100644 packages/api/core/README.md create mode 100644 packages/api/core/src/api/init-scripts/init-custom.js create mode 100644 packages/api/core/src/api/init-scripts/init-directory.js create mode 100644 packages/api/core/src/api/init-scripts/init-git.js create mode 100644 packages/api/core/src/api/init-scripts/init-npm.js create mode 100644 packages/api/core/src/api/init-scripts/init-starter-files.js create mode 100644 packages/api/core/test/fixture/custom_init/package-lock.json delete mode 100644 packages/api/core/test/mocha.opts create mode 100644 packages/installer/base/package.json create mode 100644 packages/installer/base/src/Installer.js create mode 100644 packages/installer/base/test/Installer_spec.js create mode 100644 packages/installer/darwin/package.json create mode 100644 packages/installer/darwin/src/InstallerDarwin.js create mode 100644 packages/installer/deb/package.json create mode 100644 packages/installer/deb/src/InstallerDeb.js create mode 100644 packages/installer/dmg/package.json create mode 100644 packages/installer/dmg/src/InstallerDMG.js create mode 100644 packages/installer/dmg/src/util/hdiutil.js create mode 100644 packages/installer/exe/package.json create mode 100644 packages/installer/exe/src/InstallerExe.js create mode 100644 packages/installer/linux/package.json create mode 100644 packages/installer/linux/src/InstallerLinux.js create mode 100644 packages/installer/rpm/package.json create mode 100644 packages/installer/rpm/src/InstallerRpm.js create mode 100644 packages/installer/zip/package.json create mode 100644 packages/installer/zip/src/InstallerZip.js diff --git a/.babelrc b/.babelrc index 6c8cf0c63a..9e0140afd4 100644 --- a/.babelrc +++ b/.babelrc @@ -1,24 +1,17 @@ { "sourceMaps": "inline", + "plugins": [ + "@babel/plugin-proposal-class-properties", + "@babel/plugin-proposal-object-rest-spread" + ], "presets": [ [ - "env", + "@babel/preset-env", { "targets": { "node": "6" } } ] - ], - "plugins": [ - "transform-runtime", - "syntax-async-functions", - [ - "transform-async-to-module-method", - { - "module": "bluebird", - "method": "coroutine" - } - ] ] } \ No newline at end of file diff --git a/packages/api/core/.editorconfig b/.editorconfig similarity index 100% rename from packages/api/core/.editorconfig rename to .editorconfig diff --git a/.eslintrc b/.eslintrc index 2e133541a7..df99363498 100644 --- a/.eslintrc +++ b/.eslintrc @@ -4,6 +4,9 @@ "plugins": [ "mocha" ], + "env": { + "mocha": true + }, "rules": { "consistent-return": 0, "global-require": 0, @@ -16,6 +19,7 @@ "mocha/no-exclusive-tests": "error", "no-console": 0, "no-throw-literal": 0, - "no-underscore-dangle": 0 + "no-underscore-dangle": 0, + "class-methods-use-this": 0 } } diff --git a/.gitignore b/.gitignore index b512c09d47..65e3fd0d8e 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -node_modules \ No newline at end of file +node_modules +dist +yarn-error.log \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000000..910f631fa3 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +8.9.1 \ No newline at end of file diff --git a/gulpfile.babel.js b/gulpfile.babel.js deleted file mode 100644 index ac5eef6b5f..0000000000 --- a/gulpfile.babel.js +++ /dev/null @@ -1,42 +0,0 @@ -/* eslint-disable import/no-extraneous-dependencies */ - -import gulp from 'gulp'; - -import babel from 'gulp-babel'; -import fs from 'fs'; -import path from 'path'; - -console.log(process.cwd(), process.argv); - -gulp.task('transpile', () => - gulp.src('./src/**/*.js') - .pipe(babel()) - .pipe(gulp.dest('./dist')) -); - -gulp.task('watch', ['build'], () => { - gulp.watch('./src/**/*.js', ['transpile']); -}); - -gulp.task('link', () => { - const files = fs.readdirSync(path.resolve(__dirname, './src')) - .filter(f => f.endsWith('.js')); - const packageJSON = require('./package.json'); - - if (!fs.existsSync(path.resolve(__dirname, './dist'))) fs.mkdirSync(path.resolve(__dirname, './dist')); - - Object.keys(packageJSON.bin).forEach((binName) => { - if (binName === 'electron-forge') return; - - if (packageJSON.bin[binName] === packageJSON.bin['electron-forge']) { - files.forEach((fileName) => { - fs.writeFileSync( - path.resolve(__dirname, `./dist/${fileName.replace('electron-forge', binName)}`), - `/* Auto-generated bin alias file */\nglobal.__LINKED_FORGE__ = true;\nrequire('./${fileName}');\n` - ); - }); - } - }); -}); - -gulp.task('build', ['transpile', 'link']); diff --git a/mocha.opts b/mocha.opts new file mode 100644 index 0000000000..74f680e91e --- /dev/null +++ b/mocha.opts @@ -0,0 +1,2 @@ +--require @babel/register +--timeout 300000 diff --git a/package.json b/package.json index 556debb881..fdedb61ff7 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,9 @@ "bolt": { "workspaces": [ "packages/api/*", - "packages/makers/*", - "packages/publishers/*" + "packages/maker/*", + "packages/publisher/*", + "packages/installer/*" ] }, "config": { @@ -17,14 +18,15 @@ } }, "scripts": { + "build": "bolt ws exec -- node_modules/.bin/babel src -d dist --quiet", "commit": "git-cz", - "lint": "eslint packages/**/src packages/**/test gulpfile.babel.js" + "lint": "eslint packages/**/src packages/**/test", + "test": "bolt ws run test", + "test-fast": "bolt ws run test-fast" }, "dependencies": { "@octokit/rest": "^14.0.4", "aws-sdk": "^2.9.0", - "babel-register": "^6.16.3", - "bluebird": "^3.4.6", "colors": "^1.1.2", "commander": "^2.9.0", "cross-spawn-promise": "^0.10.1", @@ -60,13 +62,14 @@ "zip-folder": "^1.0.0" }, "devDependencies": { + "@babel/cli": "^7.0.0-beta.40", + "@babel/core": "^7.0.0-beta.40", + "@babel/plugin-proposal-class-properties": "^7.0.0-beta.40", + "@babel/plugin-proposal-object-rest-spread": "^7.0.0-beta.40", + "@babel/preset-env": "^7.0.0-beta.40", + "@babel/register": "^7.0.0-beta.40", "asar": "^0.14.0", "babel-eslint": "^7.0.0", - "babel-plugin-istanbul": "^4.0.0", - "babel-plugin-syntax-async-functions": "^6.13.0", - "babel-plugin-transform-async-to-module-method": "^6.16.0", - "babel-plugin-transform-runtime": "^6.15.0", - "babel-preset-env": "^1.6.0", "chai": "^4.0.0", "chai-as-promised": "^7.0.0", "commitizen": "^2.8.6", @@ -82,8 +85,6 @@ "eslint-plugin-mocha": "^4.8.0", "fetch-mock": "^6.0.0", "generate-changelog": "^1.0.2", - "gulp": "^3.9.1", - "gulp-babel": "^6.1.2", "mocha": "^5.0.0", "nodemon": "^1.11.0", "nyc": "^11.0.0", diff --git a/packages/_old/.editorconfig b/packages/_old/.editorconfig new file mode 100644 index 0000000000..1fc2eea28c --- /dev/null +++ b/packages/_old/.editorconfig @@ -0,0 +1,14 @@ +root = true + +[{*.html,*.js,*.json,*.md,*.yml,*eslintrc}] +indent_style = space +indent_size = 2 +insert_final_newline = true +max_line_length = 160 +trim_trailing_whitespace = true + +[*.sh] +indent_style = space +indent_size = 4 +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/packages/_old/.esdoc.json b/packages/_old/.esdoc.json new file mode 100644 index 0000000000..d980babe1f --- /dev/null +++ b/packages/_old/.esdoc.json @@ -0,0 +1,28 @@ +{ + "source": "./src/api", + "destination": "./docs", + "plugins": [ + { + "name": "esdoc-standard-plugin", + "option": { + "coverage": {"enable": true}, + "lint": {"enable": true} + } + }, + { + "name": "esdoc-importpath-plugin", + "option": { + "replaces": [ + { + "from": ".js", + "to": "" + }, + { + "from": "api/", + "to": "dist/api/" + } + ] + } + } + ] +} diff --git a/packages/_old/.eslintignore b/packages/_old/.eslintignore new file mode 100644 index 0000000000..14e485a5bc --- /dev/null +++ b/packages/_old/.eslintignore @@ -0,0 +1 @@ +tmpl diff --git a/packages/_old/.gitignore b/packages/_old/.gitignore new file mode 100644 index 0000000000..1c988ca8c8 --- /dev/null +++ b/packages/_old/.gitignore @@ -0,0 +1,6 @@ +dist +node_modules +docs +.nyc_output +coverage +npm-debug.log diff --git a/packages/_old/.npmignore b/packages/_old/.npmignore new file mode 100644 index 0000000000..971d74d520 --- /dev/null +++ b/packages/_old/.npmignore @@ -0,0 +1,4 @@ +src +test +.travis.yml +ci diff --git a/packages/_old/CHANGELOG.md b/packages/_old/CHANGELOG.md new file mode 100644 index 0000000000..a655e2784e --- /dev/null +++ b/packages/_old/CHANGELOG.md @@ -0,0 +1,1059 @@ +#### [5.1.1](https://github.com/electron-userland/electron-forge/releases/tag/v5.1.1) (2018-02-15) + +##### Chores + +* **packager:** upgrade electron-packager to 11.0.0 ([dee72fd1](https://github.com/electron-userland/electron-forge/commit/dee72fd1)) +* **generic:** upgrade node-fetch to 2.0.0 and fetch-mock to 6.0.0 ([42abee35](https://github.com/electron-userland/electron-forge/commit/42abee35)) + +### [5.1.0](https://github.com/electron-userland/electron-forge/releases/tag/v5.1.0) (2018-02-05) + +##### New Features + +* **publisher:** add GitHub Enterprise/HTTP proxy support to the GitHub publisher ([14151022](https://github.com/electron-userland/electron-forge/commit/14151022)) + +## [5.0.0](https://github.com/electron-userland/electron-forge/releases/tag/v5.0.0) (2018-02-01) + +##### New Features + +* **publisher:** + * add snapcraft publisher ([c5b7d0d7](https://github.com/electron-userland/electron-forge/commit/c5b7d0d7)) + * add dir to publisher args & convert args from positional to keyword ([45ace6cf](https://github.com/electron-userland/electron-forge/commit/45ace6cf)) +* **maker:** add builtin snap support ([86f987d7](https://github.com/electron-userland/electron-forge/commit/86f987d7)) + +### [4.3.0](https://github.com/electron-userland/electron-forge/releases/tag/v4.3.0) (2018-01-31) + +##### New Features + +* **maker:** add Wix support ([76166af3](https://github.com/electron-userland/electron-forge/commit/76166af3)) + +##### Bug Fixes + +* **maker:** wix only works on win32 currently ([707a1e33](https://github.com/electron-userland/electron-forge/commit/707a1e33)) + +##### Other Changes + +* add Wix to PATH ([52a64080](https://github.com/electron-userland/electron-forge/commit/52a64080)) + +##### Refactors + +* **maker:** extract author name parsing into its own function ([fa80cd3d](https://github.com/electron-userland/electron-forge/commit/fa80cd3d)) + +#### [4.2.1](https://github.com/electron-userland/electron-forge/releases/tag/v4.2.1) (2018-01-29) + +##### Chores + +* **generic:** + * upgrade mocha to 5.x ([01857a8e](https://github.com/electron-userland/electron-forge/commit/01857a8e)) + * upgrade electron-installer-debian to 0.8.x ([0bcedfe8](https://github.com/electron-userland/electron-forge/commit/0bcedfe8)) + * replace node-github with @octokit/rest ([e1f26075](https://github.com/electron-userland/electron-forge/commit/e1f26075)) + * upgrade github to v13 ([a80ff504](https://github.com/electron-userland/electron-forge/commit/a80ff504)) + * upgrade fs-extra to v5 and inquirer to v5 ([0ecc57dd](https://github.com/electron-userland/electron-forge/commit/0ecc57dd)) + +##### Documentation Changes + +* **generic:** add support document & move debugging section there ([d3f610c4](https://github.com/electron-userland/electron-forge/commit/d3f610c4)) + +##### Bug Fixes + +* **installer:** hdiutil output should be a string ([e511206b](https://github.com/electron-userland/electron-forge/commit/e511206b)) + +### [4.2.0](https://github.com/electron-userland/electron-forge/releases/tag/v4.2.0) (2018-01-08) + +##### New Features + +* **generic:** allow specifying a build identifier that segregates build artifacts ([0e483659](https://github.com/electron-userland/electron-forge/commit/0e483659)) +* **rebuilder:** allow configuration of electron-rebuild ([b986f264](https://github.com/electron-userland/electron-forge/commit/b986f264)) + +#### [4.1.9](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.9) (2018-01-08) + +##### Bug Fixes + +* **packager:** packager hooks should be executed sequentially ([e844b1d1](https://github.com/electron-userland/electron-forge/commit/e844b1d1)) + +#### [4.1.8](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.8) (2018-01-08) + +##### Chores + +* **maker:** upgrade electron-installer-flatpak to 0.8.0 & re-enable its tests ([9c199e0d](https://github.com/electron-userland/electron-forge/commit/9c199e0d)) + +##### Documentation Changes + +* **starter:** add note to readme about debugging on the command line ([26f347a6](https://github.com/electron-userland/electron-forge/commit/26f347a6)) +* **generic:** add link to electronforge.io repository in contributing docs ([c3332688](https://github.com/electron-userland/electron-forge/commit/c3332688)) + +##### Bug Fixes + +* **generic:** tabtab install breaks in bash for windows ([a5f8b40f](https://github.com/electron-userland/electron-forge/commit/a5f8b40f)) +* **maker:** fix detection of flatpak artifact ([4d5378c2](https://github.com/electron-userland/electron-forge/commit/4d5378c2)) + +#### [4.1.7](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.7) (2017-12-24) + +##### Chores + +* **generic:** + * don't nonzero-exit when trying to install tabtab completions ([0e18fe34](https://github.com/electron-userland/electron-forge/commit/0e18fe34)) + * don't use deprecated mocha CLI flag ([e13e6380](https://github.com/electron-userland/electron-forge/commit/e13e6380)) +* **tests:** + * move default test config to mocha.opts file ([f681176c](https://github.com/electron-userland/electron-forge/commit/f681176c)) + * remove intermediate layer when running via Docker ([6282a115](https://github.com/electron-userland/electron-forge/commit/6282a115)) + * cache node_modules in CI ([fcef3826](https://github.com/electron-userland/electron-forge/commit/fcef3826)) + +##### Documentation Changes + +* **packager:** + * clarify why dir/platform can't be set in Packager config ([f2b5c4a3](https://github.com/electron-userland/electron-forge/commit/f2b5c4a3)) + * clarify why arch can't be set in Packager config ([df5a018e](https://github.com/electron-userland/electron-forge/commit/df5a018e)) + +##### Bug Fixes + +* **packager:** package spinner isn't defined when asar.unpack is checked ([435e83d0](https://github.com/electron-userland/electron-forge/commit/435e83d0)) +* **initializer:** electron versions for babel-preset-env should be strings ([35120b1c](https://github.com/electron-userland/electron-forge/commit/35120b1c)) + +##### Other Changes + +* use yarn instead ([907a377e](https://github.com/electron-userland/electron-forge/commit/907a377e)) + +##### Refactors + +* **generic:** Use readJson and writeJson ([1a1884d1](https://github.com/electron-userland/electron-forge/commit/1a1884d1)) + +#### [4.1.6](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.6) (2017-12-06) + +##### Bug Fixes + +* **importer:** + * Fix typo in dependency check ([24267fe4](https://github.com/electron-userland/electron-forge/commit/24267fe4)) + * handle the case where productName doesn't exist ([23f191a8](https://github.com/electron-userland/electron-forge/commit/23f191a8)) +* **generic:** assume invalid semver package manager versions are incompatible ([076c78e1](https://github.com/electron-userland/electron-forge/commit/076c78e1)) + +##### Refactors + +* **maker:** DRY up linux config transformations ([a39011b8](https://github.com/electron-userland/electron-forge/commit/a39011b8)) + +#### [4.1.5](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.5) (2017-11-24) + +##### Bug Fixes + +* **packager:** fix custom afterCopy, afterPrune not being included ([c9e23e38](https://github.com/electron-userland/electron-forge/commit/c9e23e38)) + +#### [4.1.4](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.4) (2017-11-21) + +##### New Features + +* **packager:** add support for hook files for electronPackagerConfig.afterPrune ([e847a78e](https://github.com/electron-userland/electron-forge/commit/e847a78e)) + +##### Bug Fixes + +* **publisher:** fix publishing a saved dry run on a different device from the initial dry run ([a2c33eb8](https://github.com/electron-userland/electron-forge/commit/a2c33eb8)) +* **packager:** move the rebuild hook to after pruning finishes ([cce9db42](https://github.com/electron-userland/electron-forge/commit/cce9db42)) +* **importer:** adjust Forge config defaults just like in init ([38f9a3d4](https://github.com/electron-userland/electron-forge/commit/38f9a3d4)) + +##### Refactors + +* **packager:** resolve hook files in a common function ([08d55772](https://github.com/electron-userland/electron-forge/commit/08d55772)) + +#### [4.1.3](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.3) (2017-11-10) + +##### Chores + +* **generic:** replace the deprecated babel-preset-es2015 with babel-preset-env ([b3499edf](https://github.com/electron-userland/electron-forge/commit/b3499edf)) + +##### Bug Fixes + +* **make:** allow building for MAS inside make logic ([5e6411ec](https://github.com/electron-userland/electron-forge/commit/5e6411ec)) +* **packager:** warn if the app version is not set ([29070ca6](https://github.com/electron-userland/electron-forge/commit/29070ca6)) +* **importer:** warn if the package.json being imported does not have a version ([e55ea98d](https://github.com/electron-userland/electron-forge/commit/e55ea98d)) +* **starter:** throw an error if the app version is not set in package.json ([69b29958](https://github.com/electron-userland/electron-forge/commit/69b29958)) + +##### Tests + +* **make:** add mas test ([359b2799](https://github.com/electron-userland/electron-forge/commit/359b2799)) + +#### [4.1.2](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.2) (2017-09-27) + +##### Bug Fixes + +* **generic:** correct the getOwnPropertyDescriptor proxy hook to respect current properties writabil ([8e9872bc](https://github.com/electron-userland/electron-forge/commit/8e9872bc)) + +#### [4.1.1](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.1) (2017-09-27) + +##### Bug Fixes + +* **generic:** ensure config proxy doesn't prevent access to built-ins ([07047889](https://github.com/electron-userland/electron-forge/commit/07047889)) + +### [4.1.0](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.0) (2017-09-26) + +##### Chores + +* **generic:** + * upgrade electron-windows-store to 0.12 ([fcdc0a02](https://github.com/electron-userland/electron-forge/commit/fcdc0a02)) + * upgrade cz-customizable, and github ([9156296b](https://github.com/electron-userland/electron-forge/commit/9156296b)) + +##### Documentation Changes + +* **maker:** mention that make can support non-host platforms ([6c302198](https://github.com/electron-userland/electron-forge/commit/6c302198)) + +##### New Features + +* **initializer:** add electron-squirrel-startup to the default template ([e0e42aa2](https://github.com/electron-userland/electron-forge/commit/e0e42aa2)) + +##### Bug Fixes + +* **generic:** + * automatically warn w/a nightly package manager version ([d997ba0c](https://github.com/electron-userland/electron-forge/commit/d997ba0c)) + * blacklist NPM 5.4.[01] on Windows ([063caca4](https://github.com/electron-userland/electron-forge/commit/063caca4)) +* **init:** run package manager commands via cross-spawn ([cbee55e2](https://github.com/electron-userland/electron-forge/commit/cbee55e2)) +* **publisher:** allow config for Electron Release Server to be read from envars ([50d35374](https://github.com/electron-userland/electron-forge/commit/50d35374)) +* **tests:** use a newer version of native-metrics ([1e7c175e](https://github.com/electron-userland/electron-forge/commit/1e7c175e)) + +##### Refactors + +* **generic:** + * use cross-spawn-promise instead of spawn-rx ([5a9848c7](https://github.com/electron-userland/electron-forge/commit/5a9848c7)) + * replace electron-host-arch with hostArch in Electron Packager ([45afdfb5](https://github.com/electron-userland/electron-forge/commit/45afdfb5)) +* **maker:** + * use makeCert from electron-windows-store ([c31ceef6](https://github.com/electron-userland/electron-forge/commit/c31ceef6)) + * use the target platform/arch API from Packager to determine "all" archs ([f9c4c20c](https://github.com/electron-userland/electron-forge/commit/f9c4c20c)) + +#### [4.0.2](https://github.com/electron-userland/electron-forge/releases/tag/v4.0.2) (2017-09-10) + +##### Bug Fixes + +* **generic:** whitelist yarn >= 1.0.0 ([36bc34ad](https://github.com/electron-userland/electron-forge/commit/36bc34ad)) +* **linter:** don't pass --color to linters that don't support it ([66354fb6](https://github.com/electron-userland/electron-forge/commit/66354fb6)) +* **tests:** + * use fakeOra properly in system spec ([bb4c7875](https://github.com/electron-userland/electron-forge/commit/bb4c7875)) + * stub ora.warn ([969a0359](https://github.com/electron-userland/electron-forge/commit/969a0359)) + +#### [4.0.1](https://github.com/electron-userland/electron-forge/releases/tag/v4.0.1) (2017-9-5) + +##### Bug Fixes + +* **generic:** tabtab install script fails on non-*nix systems ([fc3c0301](https://github.com/electron-userland/electron-forge/commit/fc3c0301)) + +## [4.0.0](https://github.com/electron-userland/electron-forge/releases/tag/v4.0.0) (2017-08-30) + +##### Chores + +* **publisher:** use SHA256 instead of md5 ([c69db80f](https://github.com/electron-userland/electron-forge/commit/c69db80f)) +* **generic:** upgrade Electron Packager to 9.x ([6275d2bf](https://github.com/electron-userland/electron-forge/commit/6275d2bf)) + +##### Documentation Changes + +* **publisher:** + * improve docs for publish function ([7766a27c](https://github.com/electron-userland/electron-forge/commit/7766a27c)) + * mention that multiple targets are allowed ([3ec0cfa6](https://github.com/electron-userland/electron-forge/commit/3ec0cfa6)) + * fix S3 config key typo ([4225683b](https://github.com/electron-userland/electron-forge/commit/4225683b)) +* **maker:** document the return result of make ([5399f500](https://github.com/electron-userland/electron-forge/commit/5399f500)) + +##### New Features + +* **publisher:** adds dryRun and resumeDryRun to the API to allow post-make publishes ([288edbc1](https://github.com/electron-userland/electron-forge/commit/288edbc1)) +* **initializer:** + * only copy CI files if specified ([fd6f2f9b](https://github.com/electron-userland/electron-forge/commit/fd6f2f9b)) + * add Travis/AppVeyor CI files to default template ([296bdde8](https://github.com/electron-userland/electron-forge/commit/296bdde8)) + +##### Bug Fixes + +* **generic:** + * clean up package manager warning output ([894ed0a9](https://github.com/electron-userland/electron-forge/commit/894ed0a9)) + * add yarn 0.27.5 to the whitelist, but only for darwin/linux ([88b92fce](https://github.com/electron-userland/electron-forge/commit/88b92fce)) + * fix installing tab completion when installing Forge locally ([7ea49812](https://github.com/electron-userland/electron-forge/commit/7ea49812)) + +##### Refactors + +* **publisher:** + * make dryRun object storage make more sense ([f8d807ed](https://github.com/electron-userland/electron-forge/commit/f8d807ed)) + * rename target option to publishTargets in API ([4b68880d](https://github.com/electron-userland/electron-forge/commit/4b68880d)) +* **initializer:** make init options camelcase ([f4459822](https://github.com/electron-userland/electron-forge/commit/f4459822)) + +##### Tests + +* **maker:** Fix make test for new return type ([d6393567](https://github.com/electron-userland/electron-forge/commit/d6393567)) +* **publisher:** fix dry run specs ([d2085812](https://github.com/electron-userland/electron-forge/commit/d2085812)) + +### [3.2.0](https://github.com/electron-userland/electron-forge/releases/tag/v3.2.0) (2017-08-17) + +##### Chores + +* **generic:** + * use the xcode8.3 image for Travis OSX ([c24ae48c](https://github.com/electron-userland/electron-forge/commit/c24ae48c)) + * upgrade dependencies ([9d17ca9e](https://github.com/electron-userland/electron-forge/commit/9d17ca9e)) +* **tests:** fixup comma arch test ([565fce42](https://github.com/electron-userland/electron-forge/commit/565fce42)) + +##### Documentation Changes + +* **generic:** mention alternate ways of creating new Electron apps with Forge ([419962a8](https://github.com/electron-userland/electron-forge/commit/419962a8)) +* **packager:** list the Packager options that are not configurable ([bb33d9b6](https://github.com/electron-userland/electron-forge/commit/bb33d9b6)) + +##### New Features + +* **initializer:** add Forge as a devDependency to new Electron projects ([6d2cf4b0](https://github.com/electron-userland/electron-forge/commit/6d2cf4b0)) +* **generic:** print a warning if the package manager used is not a known good version ([a4c36fa4](https://github.com/electron-userland/electron-forge/commit/a4c36fa4)) + +##### Bug Fixes + +* **maker:** allow comma seperated arches in make as well as package ([9c69b08b](https://github.com/electron-userland/electron-forge/commit/9c69b08b)) + +#### [3.0.5](https://github.com/electron-userland/electron-forge/releases/tag/v3.0.5) (2017-6-17) + +##### Bug Fixes + +* **maker:** fix debian and redhat maker path calculation ([c2dca211](https://github.com/electron-userland/electron-forge/commit/c2dca211)) + +#### [3.0.4](https://github.com/electron-userland/electron-forge/releases/tag/v3.0.4) (2017-6-15) + +##### Chores + +* **tests:** remove unnecessary chai-fetch-mock dependency ([196a64db](https://github.com/electron-userland/electron-forge/commit/196a64db)) + +##### Bug Fixes + +* **maker:** handle name option for the deb, rpm makers as well as dmg ([d335741a](https://github.com/electron-userland/electron-forge/commit/d335741a)) +* **generic:** add executable permissions to vscode.cmd ([33532f79](https://github.com/electron-userland/electron-forge/commit/33532f79)) + +##### Refactors + +* **installer:** replace electron-sudo with sudo-prompt ([0ea55fab](https://github.com/electron-userland/electron-forge/commit/0ea55fab)) + +#### [3.0.3](https://github.com/electron-userland/electron-forge/releases/tag/v3.0.3) (2017-5-26) + +##### Bug Fixes + +* **initializer:** fix bad logic RE argument parsing from the top level forge command ([774b8769](https://github.com/electron-userland/electron-forge/commit/774b8769)) + +#### [3.0.2](https://github.com/electron-userland/electron-forge/releases/tag/v3.0.2) (2017-5-25) + +##### Bug Fixes + +* **starter:** fix double dash arg pass through ([0379e5fc](https://github.com/electron-userland/electron-forge/commit/0379e5fc)) +* **maker:** fix renaming of DMG output when a custom name is provided ([14cc927a](https://github.com/electron-userland/electron-forge/commit/14cc927a)) +* **tests:** fix appx tests (maker did not return output path) ([8d895cfc](https://github.com/electron-userland/electron-forge/commit/8d895cfc)) +* **initializer:** fix linting install for airbnb style ([b3446184](https://github.com/electron-userland/electron-forge/commit/b3446184)) + +##### Refactors + +* **generic:** replace fs-promise with fs-extra ([012b152f](https://github.com/electron-userland/electron-forge/commit/012b152f)) + +##### Tests + +* **maker:** add tests for the DMG maker to ensure the renaming logic is correct ([8f5f9691](https://github.com/electron-userland/electron-forge/commit/8f5f9691)) + +#### [3.0.1](https://github.com/electron-userland/electron-forge/releases/tag/v3.0.1) (2017-5-3) + +##### Bug Fixes + +* **publisher:** fix ers publisher not publishing when version already exists ([1c643ef9](https://github.com/electron-userland/electron-forge/commit/1c643ef9)) +* **maker:** fix dmg output path and add test to enforce in future ([a41d6db3](https://github.com/electron-userland/electron-forge/commit/a41d6db3)) + +## [3.0.0](https://github.com/electron-userland/electron-forge/releases/tag/v3.0.0) (2017-5-1) + +##### Chores + +* **undefined:** fix devDependency peer dep versions ([c5c8e9a9](https://github.com/electron-userland/electron-forge/commit/c5c8e9a9)) +* **generic:** add breaking changes prompt to `npm run commit` ([566fd6fb](https://github.com/electron-userland/electron-forge/commit/566fd6fb)) + +##### Documentation Changes + +* **publisher:** add docs for the new ers publisher ([e70405a8](https://github.com/electron-userland/electron-forge/commit/e70405a8)) + +##### New Features + +* **publisher:** add new publisher for electron-release-server ([0c68ebab](https://github.com/electron-userland/electron-forge/commit/0c68ebab)) +* **makers:** Ensure all assets outputted by make are versioned ([6dda5179](https://github.com/electron-userland/electron-forge/commit/6dda5179)) +* **maker:** + * create and consume a common util to check makers' supported platforms ([fa53340b](https://github.com/electron-userland/electron-forge/commit/fa53340b)) + * declare deb maker support for darwin & linux platforms ([f10fbd18](https://github.com/electron-userland/electron-forge/commit/f10fbd18)) + +##### Bug Fixes + +* **start:** exit forge with same status code as Electron if nonzero ([a509f55a](https://github.com/electron-userland/electron-forge/commit/a509f55a)) +* **tests:** make optionFetcher-related tests compile again ([1097f8bd](https://github.com/electron-userland/electron-forge/commit/1097f8bd)) +* **docs:** rm note that package api's platform opt is ignored ([eefa93f0](https://github.com/electron-userland/electron-forge/commit/eefa93f0)) + +##### Refactors + +* **starter:** use double dash instead of triple dash to pass args through ([e3a1be64](https://github.com/electron-userland/electron-forge/commit/e3a1be64)) +* **utils:** filter packages' os declarations to exclude blacklist entries ([fbaec97f](https://github.com/electron-userland/electron-forge/commit/fbaec97f)) +* **maker:** support make for targets on non-host platforms ([f79f6f78](https://github.com/electron-userland/electron-forge/commit/f79f6f78)) +* **util:** extend requireSearch to export a raw search fn ([84f0134b](https://github.com/electron-userland/electron-forge/commit/84f0134b)) + +##### Tests + +* **publisher:** fix publisher tests for new syntax ([c19d1c2a](https://github.com/electron-userland/electron-forge/commit/c19d1c2a)) +* **maker:** add test to confirm dummy maker does not get called ([556deaac](https://github.com/electron-userland/electron-forge/commit/556deaac)) + +### [2.12.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.12.0) (2017-4-25) + +##### New Features + +* **maker:** basic hooks for preMake, postMake, generateAssets, prePackage and postPackage ([1a17189b](https://github.com/electron-userland/electron-forge/commit/1a17189b)) + +##### Bug Fixes + +* **maker:** do not enforce the name property on the DMG maker ([1b10fd57](https://github.com/electron-userland/electron-forge/commit/1b10fd57)) + +#### [2.11.1](https://github.com/electron-userland/electron-forge/releases/tag/v2.11.1) (2017-4-19) + +### [2.11.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.11.0) (2017-4-19) + +##### New Features + +* **maker:** allow maker configs to be functions that return values based on arch ([d9cbec5a](https://github.com/electron-userland/electron-forge/commit/d9cbec5a)) + +### [2.10.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.10.0) (2017-4-16) + +##### Chores + +* **generic:** + * fix/rename coverage sending script ([547c044f](https://github.com/electron-userland/electron-forge/commit/547c044f)) + * update various dependencies ([0f97292c](https://github.com/electron-userland/electron-forge/commit/0f97292c)) + +##### New Features + +* **starter:** + * windows implementation of the vscode debug command ([9cb7f42c](https://github.com/electron-userland/electron-forge/commit/9cb7f42c)) + * provide an executable to start forge in a vscode debugger compatible way ([1238dee5](https://github.com/electron-userland/electron-forge/commit/1238dee5)) + +### [2.9.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.9.0) (2017-4-2) + +##### Chores + +* **generic:** add .editorconfig ([5aaf871e](https://github.com/electron-userland/electron-forge/commit/5aaf871e)) + +##### New Features + +* **importer:** add configurable outDir support for gitignore ([9369284f](https://github.com/electron-userland/electron-forge/commit/9369284f)) + +##### Bug Fixes + +* **initializer:** + * update Electron version type in .compilerc template, for completeness ([a4fa4bfc](https://github.com/electron-userland/electron-forge/commit/a4fa4bfc)) + * set electron version to be float in init step ([710129b7](https://github.com/electron-userland/electron-forge/commit/710129b7)) +* **maker:** + * upgrade rpm maker for better package.json handling ([926032e8](https://github.com/electron-userland/electron-forge/commit/926032e8)) + * test outDir on zip target only, after other targets run ([a2c92499](https://github.com/electron-userland/electron-forge/commit/a2c92499)) + * pass computed outDir to packager ([686200f6](https://github.com/electron-userland/electron-forge/commit/686200f6)) + * search local node_modules folder for maker when installed globally ([9b8f2970](https://github.com/electron-userland/electron-forge/commit/9b8f2970)) +* **tests:** + * stop awaiting mocha and ensure we clean up out dirs ([2e6dc384](https://github.com/electron-userland/electron-forge/commit/2e6dc384)) + * use expect(await ...) syntax per @marshallofsound ([59ddf9af](https://github.com/electron-userland/electron-forge/commit/59ddf9af)) +* **generic:** use path.resolve (vs /-delimited) to compute default outDir ([ff167447](https://github.com/electron-userland/electron-forge/commit/ff167447)) +* **packager:** correct main file reference in thrown error from packageJson.name to .main ([a68284b1](https://github.com/electron-userland/electron-forge/commit/a68284b1)) +* **publisher:** check local node_modules when searching for publisher ([42fad7f3](https://github.com/electron-userland/electron-forge/commit/42fad7f3)) + +##### Refactors + +* **maker:** compute outDir from providedOptions w/default ([d69e7626](https://github.com/electron-userland/electron-forge/commit/d69e7626)) +* **packager:** compute outDir from providedOptions w/default ([1e26d258](https://github.com/electron-userland/electron-forge/commit/1e26d258)) + +##### Code Style Changes + +* **initializer:** fix typo ([dd6aec48](https://github.com/electron-userland/electron-forge/commit/dd6aec48)) + +##### Tests + +* **tests:** add tests for packager & maker outDir support ([32cecffd](https://github.com/electron-userland/electron-forge/commit/32cecffd)) + +#### [2.8.3](https://github.com/electron-userland/electron-forge/releases/tag/v2.8.3) (2017-3-10) + +##### Chores + +* **generic:** + * update react-typescript template ([30516e78](https://github.com/electron-userland/electron-forge/commit/30516e78)) + * make release script work on windows ([0ff6a7ab](https://github.com/electron-userland/electron-forge/commit/0ff6a7ab)) + +##### New Features + +* **starter:** automatically wipe the ELECTRON_RUN_AS_NODE variable unless specified ([c702fe4a](https://github.com/electron-userland/electron-forge/commit/c702fe4a)) +* **generic:** + * Support setting the Electron app path in start() ([47c5572e](https://github.com/electron-userland/electron-forge/commit/47c5572e)) + * allow third party modules to be named whatever they want ([fddb40e6](https://github.com/electron-userland/electron-forge/commit/fddb40e6)) + +##### Bug Fixes + +* **publisher:** use updated node-github response API ([0f8e6c4f](https://github.com/electron-userland/electron-forge/commit/0f8e6c4f)) +* **maker:** + * fix the squirrel maker app name logic ([84031ecb](https://github.com/electron-userland/electron-forge/commit/84031ecb)) + * allow most appx default config to be overridden by the user ([b1e90538](https://github.com/electron-userland/electron-forge/commit/b1e90538)) +* **tests:** ensure test project has proper metadata filled ([0bc81858](https://github.com/electron-userland/electron-forge/commit/0bc81858)) + +#### [2.8.2](https://github.com/electron-userland/electron-forge/releases/tag/v2.8.2) (2017-2-28) + +##### Chores + +* **templates:** bump all template versions ([32297344](https://github.com/electron-userland/electron-forge/commit/32297344)) + +##### Bug Fixes + +* **ci:** Use the preinstalled yarn on AppVeyor (#146) ([7a1deee7](https://github.com/electron-userland/electron-forge/commit/7a1deee7)) +* **publisher:** Fix secret access key ([0a9710b5](https://github.com/electron-userland/electron-forge/commit/0a9710b5)) + +#### [2.8.1](https://github.com/electron-userland/electron-forge/releases/tag/v2.8.1) (2017-2-23) + +##### Chores + +* **generic:** + * add checkboxes and intros to the issue/PR templates ([a1ab1c3a](https://github.com/electron-userland/electron-forge/commit/a1ab1c3a)) + * fix formatting in GitHub issue template ([da95b42b](https://github.com/electron-userland/electron-forge/commit/da95b42b)) +* **tests:** remove now obsolete flatpak call in Linux tests ([b93b6cfe](https://github.com/electron-userland/electron-forge/commit/b93b6cfe)) + +##### Documentation Changes + +* **publisher:** + * mention the standard AWS environment variables in the README ([efc7ea14](https://github.com/electron-userland/electron-forge/commit/efc7ea14)) + * add example for GitHub publish target ([3fc0a9c2](https://github.com/electron-userland/electron-forge/commit/3fc0a9c2)) + +##### New Features + +* **packager:** remove the users forge config after packaging for safety reasons ([7432e034](https://github.com/electron-userland/electron-forge/commit/7432e034)) +* **publisher:** + * allow usage of standard AWS environment variables for S3 publishing ([d31ce248](https://github.com/electron-userland/electron-forge/commit/d31ce248)) + * add S3 publish target ([fa31902a](https://github.com/electron-userland/electron-forge/commit/fa31902a)) + * allow platform level config for publish targets ([8572cad6](https://github.com/electron-userland/electron-forge/commit/8572cad6)) +* **generic:** allow config options to be automagically pulled in from process.env ([250c197f](https://github.com/electron-userland/electron-forge/commit/250c197f)) + +##### Bug Fixes + +* **tests:** + * fix forge config deletion tests on all platforms ([7b99e847](https://github.com/electron-userland/electron-forge/commit/7b99e847)) + * fix test failures caused by config structure changes ([3a3cdfdb](https://github.com/electron-userland/electron-forge/commit/3a3cdfdb)) +* **importer:** + * install electron-prebuilt-compile as devDep ([e80be32a](https://github.com/electron-userland/electron-forge/commit/e80be32a)) + * check updateScripts value at script install vs deps removal ([4942cb60](https://github.com/electron-userland/electron-forge/commit/4942cb60)) + * ensure electronName exists before resolving its path ([9dcf2ec5](https://github.com/electron-userland/electron-forge/commit/9dcf2ec5)) +* **publisher:** throw an exception if a GitHub token isn't specified ([bc299b7a](https://github.com/electron-userland/electron-forge/commit/bc299b7a)) +* **initializer:** add github_repository.name to package.json in default template ([d1ceadf3](https://github.com/electron-userland/electron-forge/commit/d1ceadf3)) + +##### Refactors + +* **publisher:** add deprecate method call to inform the user ([24571197](https://github.com/electron-userland/electron-forge/commit/24571197)) + +##### Code Style Changes + +* **util:** fix typo re: imagePath ([9e064cf3](https://github.com/electron-userland/electron-forge/commit/9e064cf3)) + +### [2.8.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.8.0) (2017-2-2) + +##### Chores + +* **gitignore:** ignore npm-debug.log files ([06b824ee](https://github.com/electron-userland/electron-forge/commit/06b824ee)) + +##### New Features + +* **importer:** allow the implementer to decide whether to override scripts or not ([f85e194f](https://github.com/electron-userland/electron-forge/commit/f85e194f)) +* **starter:** resolve start api usage with a handle to the spawned process ([b5ba30e3](https://github.com/electron-userland/electron-forge/commit/b5ba30e3)) + +##### Bug Fixes + +* **importer:** if no electron was found install the latest version by default ([c8b12fbf](https://github.com/electron-userland/electron-forge/commit/c8b12fbf)) +* **generic:** make all process.exit and console calls respect the interactive setting ([a3e43315](https://github.com/electron-userland/electron-forge/commit/a3e43315)) + +##### Refactors + +* **generic:** add wrappers for console.info and console.warn ([f223df85](https://github.com/electron-userland/electron-forge/commit/f223df85)) + +##### Tests + +* **starter:** add test for returned childProcess.spawn ([f2c128e4](https://github.com/electron-userland/electron-forge/commit/f2c128e4)) + +#### [2.7.5](https://github.com/electron-userland/electron-forge/releases/tag/v2.7.5) (2017-1-29) + +##### Chores + +* **tests:** add eslint-plugin-mocha ([74397232](https://github.com/electron-userland/electron-forge/commit/74397232)) +* **generic:** update electron-installer-dmg to version 0.2.0 ([aa8034b1](https://github.com/electron-userland/electron-forge/commit/aa8034b1)) + +##### Bug Fixes + +* **tests:** update tests due to changes in #101 ([912b4f69](https://github.com/electron-userland/electron-forge/commit/912b4f69)) +* **maker:** detect out path of package step correctly ([6d15c62d](https://github.com/electron-userland/electron-forge/commit/6d15c62d)) +* **tabtab:** dont install tabtab in a development environment and ignore tabtab install errors ([f0cb0417](https://github.com/electron-userland/electron-forge/commit/f0cb0417)) + +##### Code Style Changes + +* **generic:** fixed typos ([2f869d81](https://github.com/electron-userland/electron-forge/commit/2f869d81)) +* **tests:** ignore intentionally wrong code in test ([f01f9907](https://github.com/electron-userland/electron-forge/commit/f01f9907)) + +##### Tests + +* **initializer:** add nonexistent template test ([6f26c64f](https://github.com/electron-userland/electron-forge/commit/6f26c64f)) +* **generic:** increase test coverage of the init API ([2c9caddf](https://github.com/electron-userland/electron-forge/commit/2c9caddf)) +* **starter:** add test coverage for starter ([0d2f5712](https://github.com/electron-userland/electron-forge/commit/0d2f5712)) +* **installer:** add test coverage for the installer ([4049e31c](https://github.com/electron-userland/electron-forge/commit/4049e31c)) +* **tests:** increase test coverage on util modules ([6c63aafa](https://github.com/electron-userland/electron-forge/commit/6c63aafa)) + +#### [2.7.4](https://github.com/electron-userland/electron-forge/releases/tag/v2.7.4) (2017-1-27) + +##### Documentation Changes + +* **generic:** clarify what the major package dependencies are ([559956b3](https://github.com/electron-userland/electron-forge/commit/559956b3)) + +##### Refactors + +* **generic:** move ora.ora to an ora helper for ease of submodule use ([ee33638a](https://github.com/electron-userland/electron-forge/commit/ee33638a)) + +#### [2.7.3](https://github.com/electron-userland/electron-forge/releases/tag/v2.7.3) (2017-1-25) + +##### New Features + +* **installer:** manually mount and scan a DMG file when installing for the .app ([7ea5af8a](https://github.com/electron-userland/electron-forge/commit/7ea5af8a)) + +##### Bug Fixes + +* **packager:** fix resolving of afterCopy and afterExtract hook paths ([bd4df685](https://github.com/electron-userland/electron-forge/commit/bd4df685)) +* **installer:** fix install prompt when multiple compatable targets found ([9a2f36c9](https://github.com/electron-userland/electron-forge/commit/9a2f36c9)) + +##### Code Style Changes + +* **generic:** remove unnecessary eslint pragmas ([23d1aa9f](https://github.com/electron-userland/electron-forge/commit/23d1aa9f)) + +#### [2.7.2](https://github.com/electron-userland/electron-forge/releases/tag/v2.7.2) (2017-1-18) + +##### Bug Fixes + +* **packager:** force upgrade to electron-rebuild 1.5.7 ([f2912db5](https://github.com/electron-userland/electron-forge/commit/f2912db5)) + +#### [2.7.1](https://github.com/electron-userland/electron-forge/releases/tag/v2.7.1) (2017-1-15) + +##### Chores + +* **generic:** + * alphabetize custom eslint rules ([e7f6eeb6](https://github.com/electron-userland/electron-forge/commit/e7f6eeb6)) + * disable the no-throw-literal eslint rule ([05f893e8](https://github.com/electron-userland/electron-forge/commit/05f893e8)) + +##### Bug Fixes + +* **initializer:** handle local templates correctly ([42bf745a](https://github.com/electron-userland/electron-forge/commit/42bf745a)) +* **alias:** fix the forge alias so that it can run the make command ([725e6b06](https://github.com/electron-userland/electron-forge/commit/725e6b06)) + +### [2.7.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.7.0) (2017-1-14) + +##### Documentation Changes + +* **initializer:** document the built in templates ([b0eec7c3](https://github.com/electron-userland/electron-forge/commit/b0eec7c3)) + +##### New Features + +* **initializer:** add userland templates to forge ([bcba06a2](https://github.com/electron-userland/electron-forge/commit/bcba06a2)) + +### [2.6.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.6.0) (2017-1-10) + +##### Chores + +* **deps:** Update electron-windows-store ([761464f0](https://github.com/electron-userland/electron-forge/commit/761464f0)) + +##### New Features + +* **importer:** + * ensure the user is aware of any script changes we make ([cbb73e7e](https://github.com/electron-userland/electron-forge/commit/cbb73e7e)) + * import now sets the scripts section in package.json to be forge scripts ([cb01d406](https://github.com/electron-userland/electron-forge/commit/cb01d406)) +* **initializer:** template package.json now includes package and make scripts ([272d9b1e](https://github.com/electron-userland/electron-forge/commit/272d9b1e)) +* **rebuilder:** show rebuild progress from the electron-rebuild lifecycle ([26f23b48](https://github.com/electron-userland/electron-forge/commit/26f23b48)) +* **generic:** + * use electron-rebuild instead of generic rebuild logic ([3d26da5b](https://github.com/electron-userland/electron-forge/commit/3d26da5b)) + * add basic tab completion for top level commands ([30082bbf](https://github.com/electron-userland/electron-forge/commit/30082bbf)) + +##### Bug Fixes + +* **packager:** + * check asar.unpack correctly ([150ea5dd](https://github.com/electron-userland/electron-forge/commit/150ea5dd)) + * clarify entry point error messages ([969ab1ea](https://github.com/electron-userland/electron-forge/commit/969ab1ea)) + * throw errors on an uncompilable entrypoint ([b7f7b81c](https://github.com/electron-userland/electron-forge/commit/b7f7b81c)) +* **initializer:** + * unpin electron-compilers ([9e2aefaa](https://github.com/electron-userland/electron-forge/commit/9e2aefaa)) + * unpin eslint-plugin-jsx-a11y ([02b6e367](https://github.com/electron-userland/electron-forge/commit/02b6e367)) + * pin electron-compilers dependency due to typescript bug ([4ebafa8d](https://github.com/electron-userland/electron-forge/commit/4ebafa8d)) + +##### Refactors + +* **packager:** upgrade to Electron Packager 8.5.0 ([b8489b47](https://github.com/electron-userland/electron-forge/commit/b8489b47)) + +#### [2.5.2](https://github.com/electron-userland/electron-forge/releases/tag/v2.5.2) (2017-1-7) + +##### Bug Fixes + +* **publisher:** dont call make twice while publishing ([55bfe1ac](https://github.com/electron-userland/electron-forge/commit/55bfe1ac)) + +#### [2.5.1](https://github.com/electron-userland/electron-forge/releases/tag/v2.5.1) (2017-1-5) + +##### Chores + +* **undefined:** + * istanbul-lib-instrument is no longer required ([f60dd586](https://github.com/electron-userland/electron-forge/commit/f60dd586)) + * upgrade to version of babel-plugin-istanbul that should address regression ([0913506b](https://github.com/electron-userland/electron-forge/commit/0913506b)) + +##### Bug Fixes + +* **importer:** fix relative path to tmpl directory ([b39c1008](https://github.com/electron-userland/electron-forge/commit/b39c1008)) +* **undefined:** regression in istanbul-lib-instrument and babel-plugin-istanbul should now be addressed ([58b9791e](https://github.com/electron-userland/electron-forge/commit/58b9791e)) + +### [2.5.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.5.0) (2017-1-3) + +##### Chores + +* **generic:** + * only publish CI coverage on success ([7fbbef72](https://github.com/electron-userland/electron-forge/commit/7fbbef72)) + * enable coveralls ([2f821155](https://github.com/electron-userland/electron-forge/commit/2f821155)) +* **tests:** + * fix appx tests on rebased branch ([75f217a5](https://github.com/electron-userland/electron-forge/commit/75f217a5)) + * move tests to be unit tests on the API and enable coverage ([54603c1e](https://github.com/electron-userland/electron-forge/commit/54603c1e)) + +##### Documentation Changes + +* **generic:** + * fix option variable names ([0923ac1e](https://github.com/electron-userland/electron-forge/commit/0923ac1e)) + * cleanup API docs ([9c118a4f](https://github.com/electron-userland/electron-forge/commit/9c118a4f)) + * add doc formatting guidelines based off of pycodestyle ([6efa5259](https://github.com/electron-userland/electron-forge/commit/6efa5259)) +* **importer:** + * tweak description ([e885cd5e](https://github.com/electron-userland/electron-forge/commit/e885cd5e)) + * mention import in the README ([d5eab37a](https://github.com/electron-userland/electron-forge/commit/d5eab37a)) + +##### New Features + +* **generic:** + * expose some util methods through JS API ([a506dd33](https://github.com/electron-userland/electron-forge/commit/a506dd33)) + * expose top level methods as JS APIs ([93fb48f5](https://github.com/electron-userland/electron-forge/commit/93fb48f5)) +* **publisher:** add draft and prerelease options for publishing to github ([898de235](https://github.com/electron-userland/electron-forge/commit/898de235)) + +##### Bug Fixes + +* **generic:** lock istanbul dependency versions to prevent bug ([205104c4](https://github.com/electron-userland/electron-forge/commit/205104c4)) + +##### Refactors + +* **generic:** refactor confirm prompts into a helper for interactive mode ([b495012e](https://github.com/electron-userland/electron-forge/commit/b495012e)) + +##### Tests + +* **generic:** add tests for lots of the utils ([d0962b93](https://github.com/electron-userland/electron-forge/commit/d0962b93)) + +### [2.4.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.4.0) (2017-1-3) + +##### New Features + +* **maker:** add support for Windows Store (AppX) packages ([74a12163](https://github.com/electron-userland/electron-forge/commit/74a12163)) +* **starter:** switch the default Babel preset to use babel-preset-env ([4e3bb17b](https://github.com/electron-userland/electron-forge/commit/4e3bb17b)) + +##### Bug Fixes + +* **starter:** ensure linebreak-style is disabled ([ac7a20bc](https://github.com/electron-userland/electron-forge/commit/ac7a20bc)) + +### [2.3.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.3.0) (2017-1-1) + +##### Chores + +* **installer:** use the ora helper in the install command ([9358eb42](https://github.com/electron-userland/electron-forge/commit/9358eb42)) +* **generic:** + * add installer to cz config ([3b253b11](https://github.com/electron-userland/electron-forge/commit/3b253b11)) + * only send slack notifications on build change ([838d70e7](https://github.com/electron-userland/electron-forge/commit/838d70e7)) +* **tests:** make sure ora knows that the Docker container is for CI ([41d25ea7](https://github.com/electron-userland/electron-forge/commit/41d25ea7)) + +##### New Features + +* **installer:** + * add rpm installer ([f8f9baa5](https://github.com/electron-userland/electron-forge/commit/f8f9baa5)) + * don't suffix temp install files with .forge-install ([1c2bfd81](https://github.com/electron-userland/electron-forge/commit/1c2bfd81)) + * add deb installer ([fb217c74](https://github.com/electron-userland/electron-forge/commit/fb217c74)) + * add DMG support for macOS installer ([3465d261](https://github.com/electron-userland/electron-forge/commit/3465d261)) + * add inital app installer for macOS platform ([da3150d9](https://github.com/electron-userland/electron-forge/commit/da3150d9)) +* **generic:** + * use an ora/promise helper instead of a global uncaughtRejection handler (#50) ([1b6b7276](https://github.com/electron-userland/electron-forge/commit/1b6b7276)) + * travis build notifications ([d25f1461](https://github.com/electron-userland/electron-forge/commit/d25f1461)) + +##### Bug Fixes + +* **installer:** + * fix installer debug key ([24454950](https://github.com/electron-userland/electron-forge/commit/24454950)) + * dont fetch prerelease versions unless instructed ([1b88b153](https://github.com/electron-userland/electron-forge/commit/1b88b153)) + * await promises through the linux install chain ([a0b5ac70](https://github.com/electron-userland/electron-forge/commit/a0b5ac70)) + * remove flatpak check ([0b044134](https://github.com/electron-userland/electron-forge/commit/0b044134)) + * wildcard the extension matchers ([1489e641](https://github.com/electron-userland/electron-forge/commit/1489e641)) + +##### Refactors + +* **installer:** + * use single regexp to make repo path safe ([1255803b](https://github.com/electron-userland/electron-forge/commit/1255803b)) + * finish replacing sudo-prompt with electron-sudo ([d8587930](https://github.com/electron-userland/electron-forge/commit/d8587930)) + * replace sudo-prompt with git branch of electron-sudo for Linux installers ([9834cb1b](https://github.com/electron-userland/electron-forge/commit/9834cb1b)) + * check that the linux installer program exists first ([fb56c542](https://github.com/electron-userland/electron-forge/commit/fb56c542)) + * update the ora text wh have resolved a repo but not found a release ([5cbf8cb8](https://github.com/electron-userland/electron-forge/commit/5cbf8cb8)) + +### [2.2.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.2.0) (2016-12-30) + +##### New Features + +* **initializer:** allow custom initialzers ([9e6ddfa0](https://github.com/electron-userland/electron-forge/commit/9e6ddfa0)) + +##### Tests + +* **initializer:** add test for custom initializer ([0dc62307](https://github.com/electron-userland/electron-forge/commit/0dc62307)) + +### [2.1.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.1.0) (2016-12-30) + +##### Chores + +* **generic:** add importer to the git-cz list ([fbf691cb](https://github.com/electron-userland/electron-forge/commit/fbf691cb)) +* **tests:** remove .only from util_spec ([3b01f08c](https://github.com/electron-userland/electron-forge/commit/3b01f08c)) + +##### New Features + +* **importer:** + * confirm build tool package removal from user ([3b548557](https://github.com/electron-userland/electron-forge/commit/3b548557)) + * delete existing Electron build tools from package.json ([4152bd2d](https://github.com/electron-userland/electron-forge/commit/4152bd2d)) + * move babel config in existing project to .compilerc ([b09fc3d6](https://github.com/electron-userland/electron-forge/commit/b09fc3d6)) + * fix the projects gitignore on import ([75366bfe](https://github.com/electron-userland/electron-forge/commit/75366bfe)) + * create inital import logic ([bddb9038](https://github.com/electron-userland/electron-forge/commit/bddb9038)) +* **maker:** allow user to override make targets ([bac86800](https://github.com/electron-userland/electron-forge/commit/bac86800)) +* **generic:** allow config options to use string templating ([5a568cb8](https://github.com/electron-userland/electron-forge/commit/5a568cb8)) + +##### Bug Fixes + +* **importer:** + * pretty print the compilerc file ([07f06b40](https://github.com/electron-userland/electron-forge/commit/07f06b40)) + * update the logging as per PR feedback ([dac33f0d](https://github.com/electron-userland/electron-forge/commit/dac33f0d)) +* **rebuild:** skip dependencies without a package.json file ([3348223d](https://github.com/electron-userland/electron-forge/commit/3348223d)) +* **packager:** remove stray .bin files leftover by yarn installs during packaging ([50ad8e6d](https://github.com/electron-userland/electron-forge/commit/50ad8e6d)) + +##### Refactors + +* **importer:** + * use readPackageJSON ([e000eaf1](https://github.com/electron-userland/electron-forge/commit/e000eaf1)) + * de-rimrafify ([df4193a4](https://github.com/electron-userland/electron-forge/commit/df4193a4)) + +## [2.0.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.0.0) (2016-12-30) + +##### Chores + +* **generic:** add publisher to cz config ([8653b62b](https://github.com/electron-userland/electron-forge/commit/8653b62b)) + +##### Documentation Changes + +* **publisher:** document the API for custom makers and publishers ([81ed28d7](https://github.com/electron-userland/electron-forge/commit/81ed28d7)) + +##### New Features + +* **publisher:** initial work on a publish command to sent make artifacts to github ([189cb0cc](https://github.com/electron-userland/electron-forge/commit/189cb0cc)) +* **generic:** map the alias bin commands to the correct commander files ([f1cac740](https://github.com/electron-userland/electron-forge/commit/f1cac740)) + +##### Bug Fixes + +* **publisher:** + * publish to the correct version ([02fe5699](https://github.com/electron-userland/electron-forge/commit/02fe5699)) + * throw custom 404 if we cant find the release ([6f4e1ed4](https://github.com/electron-userland/electron-forge/commit/6f4e1ed4)) +* **maker:** fix RPM maker outPath variable ([4b32fe42](https://github.com/electron-userland/electron-forge/commit/4b32fe42)) + +##### Refactors + +* **publisher:** move github publish logic to own file ([bdaff3ce](https://github.com/electron-userland/electron-forge/commit/bdaff3ce)) + +##### Tests + +* **generic:** add tests for the require-search util ([b7930eaa](https://github.com/electron-userland/electron-forge/commit/b7930eaa)) + +### [1.1.0](https://github.com/electron-userland/electron-forge/releases/tag/v1.1.0) (2016-12-27) + +##### Chores + +* **tests:** run flatpak runtime install in local Dockerfile ([d046965f](https://github.com/electron-userland/electron-forge/commit/d046965f)) +* **generic:** add pretest step to improve development ([558fae31](https://github.com/electron-userland/electron-forge/commit/558fae31)) +* **packages:** upgrade fs-promise and inquirer (#18) ([d51d482f](https://github.com/electron-userland/electron-forge/commit/d51d482f)) + +##### Documentation Changes + +* **generic:** document the new JS file option for config ([2d44c41f](https://github.com/electron-userland/electron-forge/commit/2d44c41f)) + +##### New Features + +* **rebuilder:** only rebuild prod and optional deps (ignore dev deps) ([d751a85f](https://github.com/electron-userland/electron-forge/commit/d751a85f)) +* **generic:** allow JS files to provide the config object ([e57f3c78](https://github.com/electron-userland/electron-forge/commit/e57f3c78)) + +##### Bug Fixes + +* **packager:** allow hooks to be strings or functions depending on config setup ([ec0caecc](https://github.com/electron-userland/electron-forge/commit/ec0caecc)) +* **rebuilder:** rebuild modules inside @ scoped folders as well (#19) ([bc21528d](https://github.com/electron-userland/electron-forge/commit/bc21528d)) +* **generic:** document that the minimum Node version is 6 ([1f5ac7f2](https://github.com/electron-userland/electron-forge/commit/1f5ac7f2)) + +##### Refactors + +* **generic:** + * standardize reading package.json files (#33) ([0855eacf](https://github.com/electron-userland/electron-forge/commit/0855eacf)) + * replace mkdirp/rimraf calls with equivalent fs-promise calls ([bb2c6cf3](https://github.com/electron-userland/electron-forge/commit/bb2c6cf3)) +* **tests:** use different native modules so the tests run on CI ([d20387b7](https://github.com/electron-userland/electron-forge/commit/d20387b7)) + +##### Tests + +* **generic:** only skip help spec on Windows (#34) ([202987e1](https://github.com/electron-userland/electron-forge/commit/202987e1)) +* **builder:** add tests to ensure correct behvior of the native module builder ([b79c7af5](https://github.com/electron-userland/electron-forge/commit/b79c7af5)) + +#### [1.0.1](https://github.com/electron-userland/electron-forge/releases/tag/v1.0.1) (2016-12-12) + +##### Chores + +* **tests:** add AppVeyor support (#15) ([fe63ac0b](https://github.com/electron-userland/electron-forge/commit/fe63ac0b)) + +##### Bug Fixes + +* **starter:** fix launching on newest yarn ([8c5bc656](https://github.com/electron-userland/electron-forge/commit/8c5bc656)) + +## [1.0.0](https://github.com/electron-userland/electron-forge/releases/tag/v1.0.0) (2016-12-11) + +##### Chores + +* **generic:** + * rename all instances of marshallofsound to electron-userland ([9981fcbb](https://github.com/electron-userland/electron-forge/commit/9981fcbb)) + * fix changelog link parsing ([07defb76](https://github.com/electron-userland/electron-forge/commit/07defb76)) +* **packager:** remove commented code ([35745594](https://github.com/electron-userland/electron-forge/commit/35745594)) +* **maker:** add mas default targets ([775459cd](https://github.com/electron-userland/electron-forge/commit/775459cd)) + +##### New Features + +* **maker:** + * enable MAS makes on darwin platform ([d8ac9ad8](https://github.com/electron-userland/electron-forge/commit/d8ac9ad8)) + * allow make to target different or multiple arches ([3d4ee593](https://github.com/electron-userland/electron-forge/commit/3d4ee593)) + +##### Bug Fixes + +* **maker:** build armv7l distributables when arch=all ([f6d28c32](https://github.com/electron-userland/electron-forge/commit/f6d28c32)) +* **packager:** + * change arch name when armv7l is packaged during arch=all ([132b3670](https://github.com/electron-userland/electron-forge/commit/132b3670)) + * fix the third arch ora on linux ([894fd4e7](https://github.com/electron-userland/electron-forge/commit/894fd4e7)) + * fix ora sequencing when running with --arch=all ([e4dfdede](https://github.com/electron-userland/electron-forge/commit/e4dfdede)) + +##### Refactors + +* **generic:** replace process.arch with a function that handles arm arches better ([81fa0943](https://github.com/electron-userland/electron-forge/commit/81fa0943)) + +### [0.1.0](https://github.com/electron-userland/electron-forge/releases/tag/v0.1.0) (2016-12-11) + +##### Chores + +* **tests:** + * install g++ since Docker Hub won't create a new image ([f219e994](https://github.com/electron-userland/electron-forge/commit/f219e994)) + * disable building branches on Travis CI ([12e5d99e](https://github.com/electron-userland/electron-forge/commit/12e5d99e)) +* **initializer:** output logs of the install step on failure ([20c0b12a](https://github.com/electron-userland/electron-forge/commit/20c0b12a)) +* **generic:** + * make the changelog link to the relevent commits ([ee6a7d86](https://github.com/electron-userland/electron-forge/commit/ee6a7d86)) + * set up changelog generation ([9a3854f1](https://github.com/electron-userland/electron-forge/commit/9a3854f1)) + +##### Documentation Changes + +* **generic:** + * add contributing/issue/pull request docs + news ([d25d701d](https://github.com/electron-userland/electron-forge/commit/d25d701d)) + * clean up README ([eddd61d8](https://github.com/electron-userland/electron-forge/commit/eddd61d8)) +* **packager:** fix syntax of hook docs ([84a1a063](https://github.com/electron-userland/electron-forge/commit/84a1a063)) + +##### New Features + +* **packager:** rebuild native modules automatically in all the right places ([1d1ff74d](https://github.com/electron-userland/electron-forge/commit/1d1ff74d)) + +##### Bug Fixes + +* **packager:** + * output rebuild errors if there are any ([f8ffca13](https://github.com/electron-userland/electron-forge/commit/f8ffca13)) + * rebuild pre-gyp modules with their binary variables ([ed9137dd](https://github.com/electron-userland/electron-forge/commit/ed9137dd)) + +##### Refactors + +* **packager:** make the rebuild a promise and use an ora ([bc1ec28d](https://github.com/electron-userland/electron-forge/commit/bc1ec28d)) + +#### [0.0.9](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.9) (2016-12-11) + +##### Documentation Changes + +* **packager:** document the require mapping of the hooks ([87fb6aa6](https://github.com/electron-userland/electron-forge/commit/87fb6aa6)) + +##### New Features + +* **packager:** map afterExtract hooks to require calls ([623a0001](https://github.com/electron-userland/electron-forge/commit/623a0001)) + +#### [0.0.8](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.8) (2016-12-11) + +##### New Features + +* **maker:** add the flatpak maker for the linux target ([218518ef](https://github.com/electron-userland/electron-forge/commit/218518ef)) + +##### Refactors + +* **packager:** + * move packager compile logic to a electron-packager afterCopy hook ([c10bcd29](https://github.com/electron-userland/electron-forge/commit/c10bcd29)) + * upgrade to Electron Packager 8.4.0 (with quiet option) ([9ab19b5f](https://github.com/electron-userland/electron-forge/commit/9ab19b5f)) + +#### [0.0.7](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.7) (2016-12-11) + +##### Documentation Changes + +* **generic:** + * tweak the readme ([c6ededf6](https://github.com/electron-userland/electron-forge/commit/c6ededf6)) + * update readme ([f03ffeb5](https://github.com/electron-userland/electron-forge/commit/f03ffeb5)) + +##### Bug Fixes + +* **starter:** pass through env to started application ([834729fb](https://github.com/electron-userland/electron-forge/commit/834729fb)) +* **maker:** spawn the zip command in the containing directory ([e909a0c4](https://github.com/electron-userland/electron-forge/commit/e909a0c4)) +* **initializer:** add electron-compile to the prod dependencies of the initialized app ([5a56efb9](https://github.com/electron-userland/electron-forge/commit/5a56efb9)) + +#### [0.0.6](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.6) (2016-12-11) + +##### Chores + +* **tests:** + * run different package installers in different Travis workers ([028bcfbf](https://github.com/electron-userland/electron-forge/commit/028bcfbf)) + * run Travis with OSX and Linux workers ([9d1b0291](https://github.com/electron-userland/electron-forge/commit/9d1b0291)) + +##### Documentation Changes + +* **README:** + * fix license badge url ([026141c0](https://github.com/electron-userland/electron-forge/commit/026141c0)) + * add badges to the readme ([f912c24f](https://github.com/electron-userland/electron-forge/commit/f912c24f)) +* **LICENSE:** add a license file ([89ada6e9](https://github.com/electron-userland/electron-forge/commit/89ada6e9)) + +##### New Features + +* **maker:** + * add the rpm maker for the linux target ([85821f27](https://github.com/electron-userland/electron-forge/commit/85821f27)) + * add the deb maker for the linux target ([5c5ce67a](https://github.com/electron-userland/electron-forge/commit/5c5ce67a)) + * add the dmg maker for the darwin target ([aaceb3f2](https://github.com/electron-userland/electron-forge/commit/aaceb3f2)) +* **build:** add git-cz for semantic versioned commits ([cdbc78b6](https://github.com/electron-userland/electron-forge/commit/cdbc78b6)) + +##### Bug Fixes + +* **maker:** + * add a santizied app id to the electronWinstaller config on init ([20ae889e](https://github.com/electron-userland/electron-forge/commit/20ae889e)) + * move electron-installer-debian to optional deps so that installs work on windows ([661b1eb6](https://github.com/electron-userland/electron-forge/commit/661b1eb6)) + * correct path/arch of generated deb file ([63ff52b2](https://github.com/electron-userland/electron-forge/commit/63ff52b2)) +* **generic:** fix package.json warning about repository ([f21a87aa](https://github.com/electron-userland/electron-forge/commit/f21a87aa)) +* **packager:** throw error when electron-prebuilt-compile is not found ([23449956](https://github.com/electron-userland/electron-forge/commit/23449956)) + +##### Refactors + +* **maker:** + * DRY up app name ([f5ae494f](https://github.com/electron-userland/electron-forge/commit/f5ae494f)) + * add packageJSON to the function arguments ([e8e1054a](https://github.com/electron-userland/electron-forge/commit/e8e1054a)) + * create ensure{Directory,File} to rimraf+mkdirp the given output ([b3b616a0](https://github.com/electron-userland/electron-forge/commit/b3b616a0)) +* **generic:** + * add debug calls to the linter ([3e116109](https://github.com/electron-userland/electron-forge/commit/3e116109)) + * add the 'debug' module for standard debug logging ([9f4c0b49](https://github.com/electron-userland/electron-forge/commit/9f4c0b49)) +* **packager:** + * remove stray log ([f4f36b59](https://github.com/electron-userland/electron-forge/commit/f4f36b59)) + * move the electron-packager dependency to forge instead of the users module ([2e695c21](https://github.com/electron-userland/electron-forge/commit/2e695c21)) + +##### Code Style Changes + +* **generic:** + * disable some eslint rules that don't make sense in a CLI tool ([f1f06acf](https://github.com/electron-userland/electron-forge/commit/f1f06acf)) + * change eslint rules to allow strange linebreaks ([4b7a22e3](https://github.com/electron-userland/electron-forge/commit/4b7a22e3)) + +##### Tests + +* **resolve-dir:** add a fixture that is actually an electron-forge package.json file ([e0e712dd](https://github.com/electron-userland/electron-forge/commit/e0e712dd)) + +#### [0.0.5](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.5) (2016-12-11) + +#### [0.0.4](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.4) (2016-12-11) + +#### [0.0.3](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.3) (2016-12-11) + +#### [0.0.2](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.2) (2016-12-11) + +#### [0.0.1](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.1) (2016-12-11) diff --git a/packages/_old/package.json b/packages/_old/package.json new file mode 100644 index 0000000000..0efda3f6a0 --- /dev/null +++ b/packages/_old/package.json @@ -0,0 +1,97 @@ +{ + "name": "@electron-forge/cli", + "version": "6.0.0-beta.0", + "description": "A complete tool for building modern Electron applications", + "repository": "https://github.com/electron-userland/electron-forge", + "main": "dist/api/index.js", + "bin": { + "electron-forge": "dist/electron-forge.js", + "forge": "dist/electron-forge.js", + "electron-forge-vscode-nix": "script/vscode.sh", + "electron-forge-vscode-win": "script/vscode.cmd" + }, + "scripts": { + "precommit": "npm run lint", + "docs": "esdoc", + "install": "node tabtab-install.js", + "test": "yarn test-all", + "test-coverage": "npm run lint && npm run test-all-coverage", + "test-all": "mocha test/**/*_spec*.js test/**/**/*_spec*.js", + "test-fast": "mocha test/**/*_spec.js test/**/**/*_spec.js --timeout=10000", + "test-all-coverage": "cross-env NODE_ENV=test nyc npm run test-all", + "test-fast-coverage": "cross-env NODE_ENV=test nyc npm run test-fast", + "release:patch": "changelog -p && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version patch && git push origin && git push origin --tags", + "release:minor": "changelog -m && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version minor && git push origin && git push origin --tags", + "release:major": "changelog -M && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version major && git push origin && git push origin --tags", + "watch-link": "nodemon --watch src --exec \"npm link\"" + }, + "author": "Samuel Attard", + "license": "MIT", + "devDependencies": { + "asar": "^0.14.0", + "chai": "^4.0.0", + "chai-as-promised": "^7.0.0", + "coveralls": "^3.0.0", + "cross-env": "^5.0.0", + "esdoc": "^1.0.1", + "esdoc-importpath-plugin": "^1.0.0", + "esdoc-standard-plugin": "^1.0.0", + "fetch-mock": "^6.0.0", + "generate-changelog": "^1.0.2", + "mocha": "^5.0.0", + "nodemon": "^1.11.0", + "nyc": "^11.0.0", + "proxyquire": "^1.7.10", + "sinon": "^4.1.2" + }, + "dependencies": { + "@octokit/rest": "^14.0.4", + "aws-sdk": "^2.9.0", + "colors": "^1.1.2", + "commander": "^2.9.0", + "cross-spawn-promise": "^0.10.1", + "debug": "^3.0.0", + "electron-forge-template-angular2": "^1.0.3", + "electron-forge-template-react": "^1.0.2", + "electron-forge-template-react-typescript": "^1.0.3", + "electron-forge-template-vue": "^1.0.2", + "electron-packager": "^11.0.0", + "electron-rebuild": "^1.6.0", + "form-data": "^2.1.4", + "fs-extra": "^5.0.0", + "glob": "^7.1.1", + "inquirer": "^5.0.0", + "lodash.merge": "^4.6.0", + "lodash.template": "^4.4.0", + "log-symbols": "^2.0.0", + "mime-types": "^2.1.17", + "node-fetch": "^2.0.0", + "node-gyp": "^3.4.0", + "nugget": "^2.0.1", + "opn": "^5.0.0", + "ora": "^1.1.0", + "parse-author": "^2.0.0", + "pify": "^3.0.0", + "resolve-package": "^1.0.1", + "s3": "^4.4.0", + "semver": "^5.3.0", + "sudo-prompt": "^8.0.0", + "tabtab": "^2.2.1", + "username": "^3.0.0", + "yarn-or-npm": "^2.0.2", + "zip-folder": "^1.0.0" + }, + "optionalDependencies": { + "electron-installer-debian": "^0.8.0", + "electron-installer-dmg": "^0.2.0", + "electron-installer-flatpak": "^0.8.0", + "electron-installer-redhat": "^0.5.0", + "electron-installer-snap": "^2.0.0", + "electron-windows-store": "^0.12.0", + "electron-winstaller": "^2.5.0", + "electron-wix-msi": "^1.3.0" + }, + "engines": { + "node": ">= 6.0" + } +} diff --git a/packages/api/core/script/vscode.cmd b/packages/_old/script/vscode.cmd similarity index 100% rename from packages/api/core/script/vscode.cmd rename to packages/_old/script/vscode.cmd diff --git a/packages/api/core/script/vscode.sh b/packages/_old/script/vscode.sh similarity index 100% rename from packages/api/core/script/vscode.sh rename to packages/_old/script/vscode.sh diff --git a/packages/_old/src/api/import.js b/packages/_old/src/api/import.js new file mode 100644 index 0000000000..f2b7840fd0 --- /dev/null +++ b/packages/_old/src/api/import.js @@ -0,0 +1,166 @@ +import debug from 'debug'; +import fs from 'fs-extra'; +import path from 'path'; + +import initGit from '../init/init-git'; +import { deps, devDeps, exactDevDeps } from '../init/init-npm'; + +import { setInitialForgeConfig } from '../util/forge-config'; +import asyncOra from '../util/ora-handler'; +import { info, warn } from '../util/messages'; +import installDepList from '../util/install-dependencies'; +import readPackageJSON from '../util/read-package-json'; +import confirmIfInteractive from '../util/confirm-if-interactive'; + +const d = debug('electron-forge:import'); + +/** + * @typedef {Object} ImportOptions + * @property {string} [dir=process.cwd()] The path to the app to be imported + * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually + * @property {boolean} [updateScripts=true] Whether to update the modules package.json scripts to be electron-forge commands + * @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables + */ + +/** + * Attempt to import a given module directory to the Electron Forge standard. + * + * - Sets up `git` and the correct NPM dependencies + * - Adds a template forge config to `package.json` + * + * @param {ImportOptions} providedOptions - Options for the import method + * @return {Promise} Will resolve when the import process is complete + */ +export default async (providedOptions = {}) => { + const { dir, interactive, updateScripts } = Object.assign({ + dir: process.cwd(), + interactive: false, + updateScripts: true, + }, providedOptions); + + const outDir = providedOptions.outDir || 'out'; + asyncOra.interactive = interactive; + + d(`Attempting to import project in: ${dir}`); + if (!await fs.pathExists(dir) || !await fs.pathExists(path.resolve(dir, 'package.json'))) { + throw `We couldn't find a project in: ${dir}`; + } + + // eslint-disable-next-line max-len + const confirm = await confirmIfInteractive(interactive, `WARNING: We will now attempt to import: "${dir}". This will involve modifying some files, are you sure you want to continue?`); + + if (!confirm) { + process.exit(0); + } + + await initGit(dir); + + let packageJSON = await readPackageJSON(dir); + if (packageJSON.config && packageJSON.config.forge) { + warn(interactive, 'It looks like this project is already configured for "electron-forge"'.green); + const shouldContinue = await confirmIfInteractive(interactive, 'Are you sure you want to continue?'); + + if (!shouldContinue) { + process.exit(0); + } + } + + packageJSON.dependencies = packageJSON.dependencies || {}; + packageJSON.devDependencies = packageJSON.devDependencies || {}; + + const keys = Object.keys(packageJSON.dependencies).concat(Object.keys(packageJSON.devDependencies)); + const buildToolPackages = { + 'electron-builder': 'provides mostly equivalent functionality', + 'electron-download': 'already uses this module as a transitive dependency', + 'electron-installer-debian': 'already uses this module as a transitive dependency', + 'electron-installer-dmg': 'already uses this module as a transitive dependency', + 'electron-installer-flatpak': 'already uses this module as a transitive dependency', + 'electron-installer-redhat': 'already uses this module as a transitive dependency', + 'electron-osx-sign': 'already uses this module as a transitive dependency', + 'electron-packager': 'already uses this module as a transitive dependency', + 'electron-winstaller': 'already uses this module as a transitive dependency', + }; + + for (const key of keys) { + if (buildToolPackages[key]) { + const explanation = buildToolPackages[key]; + // eslint-disable-next-line max-len + const shouldRemoveDependency = await confirmIfInteractive(interactive, `Do you want us to remove the "${key}" dependency in package.json? Electron Forge ${explanation}.`); + + if (shouldRemoveDependency) { + delete packageJSON.dependencies[key]; + delete packageJSON.devDependencies[key]; + } + } + } + + packageJSON.scripts = packageJSON.scripts || {}; + d('reading current scripts object:', packageJSON.scripts); + + const updatePackageScript = async (scriptName, newValue) => { + if (packageJSON.scripts[scriptName] !== newValue) { + // eslint-disable-next-line max-len + const shouldUpdate = await confirmIfInteractive(interactive, `Do you want us to update the "${scriptName}" script to instead call the electron-forge task "${newValue}"`, updateScripts); + if (shouldUpdate) { + packageJSON.scripts[scriptName] = newValue; + } + } + }; + + await updatePackageScript('start', 'electron-forge start'); + await updatePackageScript('package', 'electron-forge package'); + await updatePackageScript('make', 'electron-forge make'); + + d('forgified scripts object:', packageJSON.scripts); + + const writeChanges = async () => { + await asyncOra('Writing modified package.json file', async () => { + await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON, { spaces: 2 }); + }); + }; + + await writeChanges(); + + await asyncOra('Installing dependencies', async () => { + d('deleting old dependencies forcefully'); + await fs.remove(path.resolve(dir, 'node_modules/.bin/electron')); + await fs.remove(path.resolve(dir, 'node_modules/.bin/electron.cmd')); + + d('installing dependencies'); + await installDepList(dir, deps); + + d('installing devDependencies'); + await installDepList(dir, devDeps, true); + + d('installing exactDevDependencies'); + await installDepList(dir, exactDevDeps, true, true); + }); + + packageJSON = await readPackageJSON(dir); + + if (!packageJSON.version) { + warn(interactive, "Please set the 'version' in your application's package.json".yellow); + } + + packageJSON.config = packageJSON.config || {}; + const templatePackageJSON = await readPackageJSON(path.resolve(__dirname, '../../tmpl')); + packageJSON.config.forge = templatePackageJSON.config.forge; + setInitialForgeConfig(packageJSON); + + await writeChanges(); + + await asyncOra('Fixing .gitignore', async () => { + if (await fs.pathExists(path.resolve(dir, '.gitignore'))) { + const gitignore = await fs.readFile(path.resolve(dir, '.gitignore')); + if (!gitignore.includes(outDir)) { + await fs.writeFile(path.resolve(dir, '.gitignore'), `${gitignore}\n${outDir}/`); + } + } + }); + + info(interactive, ` + +We have ATTEMPTED to convert your app to be in a format that electron-forge understands. + +Thanks for using ${'"electron-forge"'.green}!!!`); +}; diff --git a/packages/_old/src/api/index.js b/packages/_old/src/api/index.js new file mode 100644 index 0000000000..a3e63e4a92 --- /dev/null +++ b/packages/_old/src/api/index.js @@ -0,0 +1,28 @@ +import 'colors'; + +import _import from './import'; +import init from './init'; +import install from './install'; +import lint from './lint'; +import make from './make'; +import _package from './package'; +import publish from './publish'; +import start from './start'; + +import getForgeConfig from '../util/forge-config'; +import readPackageJSON from '../util/read-package-json'; + +module.exports = { + 'import': _import, // eslint-disable-line + init, + install, + lint, + make, + 'package': _package, // eslint-disable-line + publish, + start, + utils: { + getForgeConfig, + readPackageJSON, + }, +}; diff --git a/packages/_old/src/api/init.js b/packages/_old/src/api/init.js new file mode 100644 index 0000000000..2f295432a1 --- /dev/null +++ b/packages/_old/src/api/init.js @@ -0,0 +1,46 @@ +import debug from 'debug'; + +import initCustom from '../init/init-custom'; +import initDirectory from '../init/init-directory'; +import initGit from '../init/init-git'; +import initNPM from '../init/init-npm'; +import initStarter from '../init/init-starter-files'; + +import asyncOra from '../util/ora-handler'; + +const d = debug('electron-forge:init'); + +/** + * @typedef {Object} InitOptions + * @property {string} [dir=process.cwd()] The path to the app to be initialized + * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually + * @property {boolean} [copyCIFiles=false] Whether to copy Travis and AppVeyor CI files + * @property {string} [template] The custom template to use. If left empty, the default template is used + */ + +/** + * Initialize a new Electron Forge template project in the given directory. + * + * @param {InitOptions} providedOptions - Options for the init method + * @return {Promise} Will resolve when the initialization process is complete + */ +export default async (providedOptions = {}) => { + // eslint-disable-next-line prefer-const, no-unused-vars + let { dir, interactive, copyCIFiles, template } = Object.assign({ + dir: process.cwd(), + interactive: false, + copyCIFiles: false, + template: null, + }, providedOptions); + asyncOra.interactive = interactive; + + d(`Initializing in: ${dir}`); + + await initDirectory(dir, interactive); + await initGit(dir); + await initStarter(dir, { copyCIFiles }); + await initNPM(dir); + if (template) { + await initCustom(dir, template); + } +}; diff --git a/packages/_old/src/api/install.js b/packages/_old/src/api/install.js new file mode 100644 index 0000000000..f573327611 --- /dev/null +++ b/packages/_old/src/api/install.js @@ -0,0 +1,163 @@ +import 'colors'; +import debug from 'debug'; +import fetch from 'node-fetch'; +import fs from 'fs-extra'; +import inquirer from 'inquirer'; +import nugget from 'nugget'; +import os from 'os'; +import path from 'path'; +import pify from 'pify'; +import semver from 'semver'; + +import asyncOra from '../util/ora-handler'; +import { info } from '../util/messages'; + +import darwinDMGInstaller from '../installers/darwin/dmg'; +import darwinZipInstaller from '../installers/darwin/zip'; +import linuxDebInstaller from '../installers/linux/deb'; +import linuxRPMInstaller from '../installers/linux/rpm'; +import win32ExeInstaller from '../installers/win32/exe'; + +const d = debug('electron-forge:install'); + +const GITHUB_API = 'https://api.github.com'; + +/** + * @typedef {Object} InstallOptions + * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually + * @property {boolean} [prerelease=false] Whether to install prerelease versions + * @property {string} repo The GitHub repository to install from, in the format owner/name + * @property {function} chooseAsset A function that must return the asset to use/install from a provided array of compatible GitHub assets + */ + +/** + * Install an Electron application from GitHub. If you leave interactive as `false`, you MUST provide a `chooseAsset` function. + * + * @param {InstallOptions} providedOptions - Options for the install method + * @return {Promise} Will resolve when the install process is complete + */ +export default async (providedOptions = {}) => { + // eslint-disable-next-line prefer-const, no-unused-vars + let { interactive, prerelease, repo, chooseAsset } = Object.assign({ + interactive: false, + prerelease: false, + }, providedOptions); + asyncOra.interactive = interactive; + + let latestRelease; + let possibleAssets = []; + + await asyncOra('Searching for Application', async (searchSpinner) => { + if (!repo || repo.indexOf('/') === -1) { + throw 'Invalid repository name, must be in the format owner/name'; + } + + d('searching for repo:', repo); + let releases; + try { + releases = await (await fetch(`${GITHUB_API}/repos/${repo}/releases`)).json(); + } catch (err) { + // Ignore error + } + + if (!releases || releases.message === 'Not Found' || !Array.isArray(releases)) { + throw `Failed to find releases for repository "${repo}". Please check the name and try again.`; + } + + releases = releases.filter(release => !release.prerelease || prerelease); + + const sortedReleases = releases.sort((releaseA, releaseB) => { + let tagA = releaseA.tag_name; + if (tagA.substr(0, 1) === 'v') tagA = tagA.substr(1); + let tagB = releaseB.tag_name; + if (tagB.substr(0, 1) === 'v') tagB = tagB.substr(1); + return (semver.gt(tagB, tagA) ? 1 : -1); + }); + latestRelease = sortedReleases[0]; + + searchSpinner.text = 'Searching for Releases'; // eslint-disable-line + + const assets = latestRelease.assets; + if (!assets || !Array.isArray(assets)) { + throw 'Could not find any assets for the latest release'; + } + + const installTargets = { + win32: [/\.exe$/], + darwin: [/OSX.*\.zip$/, /darwin.*\.zip$/, /macOS.*\.zip$/, /mac.*\.zip$/, /\.dmg$/], + linux: [/\.rpm$/, /\.deb$/], + }; + + possibleAssets = assets.filter((asset) => { + const targetSuffixes = installTargets[process.platform]; + for (const suffix of targetSuffixes) { + if (suffix.test(asset.name)) return true; + } + return false; + }); + + if (possibleAssets.length === 0) { + throw `Failed to find any installable assets for target platform: ${`${process.platform}`.cyan}`; + } + }); + + info(interactive, `Found latest release${prerelease ? ' (including prereleases)' : ''}: ${latestRelease.tag_name.cyan}`); + + let targetAsset = possibleAssets[0]; + if (possibleAssets.length > 1) { + if (chooseAsset) { + targetAsset = await Promise.resolve(chooseAsset(possibleAssets)); + } else if (interactive) { + const choices = []; + possibleAssets.forEach((asset) => { + choices.push({ name: asset.name, value: asset.id }); + }); + const { assetID } = await inquirer.createPromptModule()({ + type: 'list', + name: 'assetID', + message: 'Multiple potential assets found, please choose one from the list below:'.cyan, + choices, + }); + + targetAsset = possibleAssets.find(asset => asset.id === assetID); + } else { + throw 'expected a chooseAsset function to be provided but it was not'; + } + } + + const tmpdir = path.resolve(os.tmpdir(), 'forge-install'); + const pathSafeRepo = repo.replace(/[/\\]/g, '-'); + const filename = `${pathSafeRepo}-${latestRelease.tag_name}-${targetAsset.name}`; + + const fullFilePath = path.resolve(tmpdir, filename); + if (!await fs.pathExists(fullFilePath) || (await fs.stat(fullFilePath)).size !== targetAsset.size) { + await fs.mkdirs(tmpdir); + + const nuggetOpts = { + target: filename, + dir: tmpdir, + resume: true, + strictSSL: true, + }; + await pify(nugget)(targetAsset.browser_download_url, nuggetOpts); + } + + await asyncOra('Installing Application', async (installSpinner) => { + const installActions = { + win32: { + '.exe': win32ExeInstaller, + }, + darwin: { + '.zip': darwinZipInstaller, + '.dmg': darwinDMGInstaller, + }, + linux: { + '.deb': linuxDebInstaller, + '.rpm': linuxRPMInstaller, + }, + }; + + const suffixFnIdent = Object.keys(installActions[process.platform]).find(suffix => targetAsset.name.endsWith(suffix)); + await installActions[process.platform][suffixFnIdent](fullFilePath, installSpinner); + }); +}; diff --git a/packages/_old/src/api/lint.js b/packages/_old/src/api/lint.js new file mode 100644 index 0000000000..8a5486f8e8 --- /dev/null +++ b/packages/_old/src/api/lint.js @@ -0,0 +1,58 @@ +import 'colors'; +import debug from 'debug'; +import { yarnOrNpmSpawn } from '../util/yarn-or-npm'; + +import asyncOra from '../util/ora-handler'; +import resolveDir from '../util/resolve-dir'; + +const d = debug('electron-forge:lint'); + +/** + * @typedef {Object} LintOptions + * @property {string} [dir=process.cwd()] The path to the module to import + * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually + */ + +/** + * Lint a local Electron application. + * + * The promise will be rejected with the stdout+stderr of the linting process if linting fails or + * will be resolved if it succeeds. + * + * @param {LintOptions} providedOptions - Options for the Lint method + * @return {Promise} Will resolve when the lint process is complete + */ +export default async (providedOptions = {}) => { + // eslint-disable-next-line prefer-const, no-unused-vars + let { dir, interactive } = Object.assign({ + dir: process.cwd(), + interactive: false, + }, providedOptions); + asyncOra.interactive = interactive; + + let success = true; + let result = null; + + await asyncOra('Linting Application', async (lintSpinner) => { + dir = await resolveDir(dir); + if (!dir) { + throw 'Failed to locate lintable Electron application'; + } + + d('executing "run lint" in dir:', dir); + try { + await yarnOrNpmSpawn(['run', 'lint'], { + stdio: process.platform === 'win32' ? 'inherit' : 'pipe', + cwd: dir, + }); + } catch (err) { + lintSpinner.fail(); + success = false; + result = err; + } + }); + + if (!success) { + throw result; + } +}; diff --git a/packages/_old/src/api/make.js b/packages/_old/src/api/make.js new file mode 100644 index 0000000000..296d1c5a70 --- /dev/null +++ b/packages/_old/src/api/make.js @@ -0,0 +1,182 @@ +import 'colors'; +import fs from 'fs-extra'; +import path from 'path'; +import { hostArch } from 'electron-packager/targets'; + +import asyncOra from '../util/ora-handler'; +import getForgeConfig from '../util/forge-config'; +import runHook from '../util/hook'; +import { info, warn } from '../util/messages'; +import parseArchs from '../util/parse-archs'; +import readPackageJSON from '../util/read-package-json'; +import { requireSearchRaw } from '../util/require-search'; +import resolveDir from '../util/resolve-dir'; +import getCurrentOutDir from '../util/out-dir'; +import getElectronVersion from '../util/electron-version'; + +import packager from './package'; + +/** + * @typedef {Object} MakeOptions + * @property {string} [dir=process.cwd()] The path to the app from which distributables are generated + * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually + * @property {boolean} [skipPackage=false] Whether to skip the pre-make packaging step + * @property {Array} [overrideTargets] An array of make targets to override your forge config + * @property {string} [arch=host architecture] The target architecture + * @property {string} [platform=process.platform] The target platform. + * @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables + */ + +/** + * @typedef {Object} MakeResult + * @property {Array} artifacts An array of paths to artifacts generated for this make run + * @property {Object} packageJSON The state of the package.json file when the make happened + * @property {string} platform The platform this make run was for + * @property {string} arch The arch this make run was for + */ + +/** + * Make distributables for an Electron application. + * + * @param {MakeOptions} providedOptions - Options for the make method + * @return {Promise>} Will resolve when the make process is complete + */ +export default async (providedOptions = {}) => { + // eslint-disable-next-line prefer-const, no-unused-vars + let { dir, interactive, skipPackage, overrideTargets, arch, platform } = Object.assign({ + dir: process.cwd(), + interactive: false, + skipPackage: false, + arch: hostArch(), + platform: process.platform, + }, providedOptions); + + asyncOra.interactive = interactive; + + let forgeConfig; + await asyncOra('Resolving Forge Config', async () => { + dir = await resolveDir(dir); + if (!dir) { + throw 'Failed to locate makeable Electron application'; + } + + forgeConfig = await getForgeConfig(dir); + }); + + const outDir = providedOptions.outDir || getCurrentOutDir(dir, forgeConfig); + + const actualTargetPlatform = platform; + platform = platform === 'mas' ? 'darwin' : platform; + if (!['darwin', 'win32', 'linux', 'mas'].includes(actualTargetPlatform)) { + throw new Error(`'${actualTargetPlatform}' is an invalid platform. Choices are 'darwin', 'mas', 'win32' or 'linux'`); + } + + const makers = {}; + const targets = overrideTargets || forgeConfig.make_targets[platform]; + + for (const target of targets) { + const maker = requireSearchRaw(__dirname, [ + `../makers/${platform}/${target}.js`, + `../makers/generic/${target}.js`, + `electron-forge-maker-${target}`, + target, + path.resolve(dir, target), + path.resolve(dir, 'node_modules', target), + ]); + + if (!maker) { + throw new Error([ + 'Could not find a build target with the name: ', + `${target} for the platform: ${actualTargetPlatform}`, + ].join('')); + } + + if (!maker.isSupportedOnCurrentPlatform) { + throw new Error([ + `Maker for target ${target} is incompatible with this version of `, + 'electron-forge, please upgrade or contact the maintainer ', + '(needs to implement \'isSupportedOnCurrentPlatform)\')', + ].join('')); + } + + if (!await maker.isSupportedOnCurrentPlatform()) { + throw new Error([ + `Cannot build for ${platform} target ${target}: the maker declared `, + `that it cannot run on ${process.platform}`, + ].join('')); + } + + makers[target] = maker.default || maker; + } + + if (!skipPackage) { + info(interactive, 'We need to package your application before we can make it'.green); + await packager({ + dir, + interactive, + arch, + outDir, + platform: actualTargetPlatform, + }); + } else { + warn(interactive, 'WARNING: Skipping the packaging step, this could result in an out of date build'.red); + } + + info(interactive, 'Making for the following targets:', `${targets.join(', ')}`.cyan); + + const packageJSON = await readPackageJSON(dir); + const appName = forgeConfig.electronPackagerConfig.name || packageJSON.productName || packageJSON.name; + let outputs = []; + + await runHook(forgeConfig, 'preMake'); + + for (const targetArch of parseArchs(platform, arch, getElectronVersion(packageJSON))) { + const packageDir = path.resolve(outDir, `${appName}-${actualTargetPlatform}-${targetArch}`); + if (!(await fs.pathExists(packageDir))) { + throw new Error(`Couldn't find packaged app at: ${packageDir}`); + } + + for (const target of targets) { + const maker = makers[target]; + + // eslint-disable-next-line no-loop-func + await asyncOra(`Making for target: ${target.cyan} - On platform: ${actualTargetPlatform.cyan} - For arch: ${targetArch.cyan}`, async () => { + try { + const artifacts = await maker({ + dir: packageDir, + appName, + targetPlatform: actualTargetPlatform, + targetArch, + forgeConfig, + packageJSON, + }); + + outputs.push({ + artifacts, + packageJSON, + platform: actualTargetPlatform, + arch: targetArch, + }); + } catch (err) { + if (err) { + throw { + message: `An error occured while making for target: ${target}`, + stack: `${err.message}\n${err.stack}`, + }; + } else { + throw new Error(`An unknown error occured while making for target: ${target}`); + } + } + }); + } + } + + const result = await runHook(forgeConfig, 'postMake', outputs); + // If the postMake hooks modifies the locations / names of the outputs it must return + // the new locations so that the publish step knows where to look + if (Array.isArray(result)) { + outputs = result; + } + + return outputs; +}; diff --git a/packages/_old/src/api/package.js b/packages/_old/src/api/package.js new file mode 100644 index 0000000000..178543a20f --- /dev/null +++ b/packages/_old/src/api/package.js @@ -0,0 +1,174 @@ +import 'colors'; +import debug from 'debug'; +import fs from 'fs-extra'; +import glob from 'glob'; +import path from 'path'; +import pify from 'pify'; +import packager from 'electron-packager'; +import { hostArch } from 'electron-packager/targets'; + +import getForgeConfig from '../util/forge-config'; +import runHook from '../util/hook'; +import { warn } from '../util/messages'; +import realOra, { fakeOra } from '../util/ora'; +import readPackageJSON from '../util/read-package-json'; +import rebuildHook from '../util/rebuild'; +import requireSearch from '../util/require-search'; +import resolveDir from '../util/resolve-dir'; +import getCurrentOutDir from '../util/out-dir'; +import getElectronVersion from '../util/electron-version'; + +const d = debug('electron-forge:packager'); + +/** + * @typedef {Object} PackageOptions + * @property {string} [dir=process.cwd()] The path to the app to package + * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually + * @property {string} [arch=process.arch] The target arch + * @property {string} [platform=process.platform] The target platform. + * @property {string} [outDir=`${dir}/out`] The path to the output directory for packaged apps + */ + +/** + * Resolves hooks if they are a path to a file (instead of a `Function`). + */ +function resolveHooks(hooks, dir) { + if (hooks) { + return hooks.map(hook => (typeof hook === 'string' ? requireSearch(dir, [hook]) : hook)); + } + + return []; +} + +function sequentialHooks(hooks) { + return [async (...args) => { + const done = args[args.length - 1]; + const passedArgs = args.splice(0, args.length - 1); + for (const hook of hooks) { + await pify(hook)(...passedArgs); + } + done(); + }]; +} + +/** + * Package an Electron application into an platform dependent format. + * + * @param {PackageOptions} providedOptions - Options for the Package method + * @return {Promise} Will resolve when the package process is complete + */ +export default async (providedOptions = {}) => { + // eslint-disable-next-line prefer-const, no-unused-vars + let { dir, interactive, arch, platform } = Object.assign({ + dir: process.cwd(), + interactive: false, + arch: hostArch(), + platform: process.platform, + }, providedOptions); + + const ora = interactive ? realOra : fakeOra; + + let prepareSpinner = ora(`Preparing to Package Application for arch: ${(arch === 'all' ? 'ia32' : arch).cyan}`).start(); + let prepareCounter = 0; + + dir = await resolveDir(dir); + if (!dir) { + throw 'Failed to locate compilable Electron application'; + } + + const packageJSON = await readPackageJSON(dir); + + if (path.dirname(require.resolve(path.resolve(dir, packageJSON.main))) === dir) { + console.error(`Entry point: ${packageJSON.main}`.red); + throw 'The entry point to your application ("packageJSON.main") must be in a subfolder not in the top level directory'; + } + + const forgeConfig = await getForgeConfig(dir); + const outDir = providedOptions.outDir || getCurrentOutDir(dir, forgeConfig); + let packagerSpinner; + + const pruneEnabled = !('prune' in forgeConfig.electronPackagerConfig) || forgeConfig.electronPackagerConfig.prune; + + const rebuildHookFn = async (buildPath, electronVersion, pPlatform, pArch, done) => { + await rebuildHook(buildPath, electronVersion, pPlatform, pArch, forgeConfig.electronRebuildConfig); + packagerSpinner = ora('Packaging Application').start(); + done(); + }; + + const afterCopyHooks = [ + async (buildPath, electronVersion, pPlatform, pArch, done) => { + if (packagerSpinner) { + packagerSpinner.succeed(); + prepareCounter += 1; + prepareSpinner = ora(`Preparing to Package Application for arch: ${(prepareCounter === 2 ? 'armv7l' : 'x64').cyan}`).start(); + } + const bins = await pify(glob)(path.join(buildPath, '**/.bin/**/*')); + for (const bin of bins) { + await fs.remove(bin); + } + done(); + }, async (buildPath, electronVersion, pPlatform, pArch, done) => { + prepareSpinner.succeed(); + await runHook(forgeConfig, 'packageAfterCopy', buildPath, electronVersion, pPlatform, pArch); + done(); + }, + ]; + + if (!pruneEnabled) { + afterCopyHooks.push(rebuildHookFn); + } + + afterCopyHooks.push(async (buildPath, electronVersion, pPlatform, pArch, done) => { + const copiedPackageJSON = await readPackageJSON(buildPath); + if (copiedPackageJSON.config && copiedPackageJSON.config.forge) { + delete copiedPackageJSON.config.forge; + } + await fs.writeJson(path.resolve(buildPath, 'package.json'), copiedPackageJSON, { spaces: 2 }); + done(); + }); + + afterCopyHooks.push(...resolveHooks(forgeConfig.electronPackagerConfig.afterCopy, dir)); + + const afterPruneHooks = []; + + if (pruneEnabled) { + afterPruneHooks.push(rebuildHookFn); + afterPruneHooks.push(...resolveHooks(forgeConfig.electronPackagerConfig.afterPrune, dir)); + } + + afterPruneHooks.push(async (buildPath, electronVersion, pPlatform, pArch, done) => { + await runHook(forgeConfig, 'packageAfterPrune', buildPath, electronVersion, pPlatform, pArch); + done(); + }); + + const packageOpts = Object.assign({ + asar: false, + overwrite: true, + }, forgeConfig.electronPackagerConfig, { + afterCopy: sequentialHooks(afterCopyHooks), + afterExtract: sequentialHooks(resolveHooks(forgeConfig.electronPackagerConfig.afterExtract, dir)), + afterPrune: sequentialHooks(afterPruneHooks), + dir, + arch, + platform, + out: outDir, + electronVersion: getElectronVersion(packageJSON), + }); + packageOpts.quiet = true; + + if (!packageJSON.version && !packageOpts.appVersion) { + // eslint-disable-next-line max-len + warn(interactive, "Please set 'version' or 'config.forge.electronPackagerConfig.appVersion' in your application's package.json so auto-updates work properly".yellow); + } + + await runHook(forgeConfig, 'generateAssets'); + await runHook(forgeConfig, 'prePackage'); + + d('packaging with options', packageOpts); + + await packager(packageOpts); + + await runHook(forgeConfig, 'postPackage'); + + packagerSpinner.succeed(); +}; diff --git a/packages/_old/src/api/publish.js b/packages/_old/src/api/publish.js new file mode 100644 index 0000000000..04d8f09587 --- /dev/null +++ b/packages/_old/src/api/publish.js @@ -0,0 +1,155 @@ +import 'colors'; +import debug from 'debug'; +import fs from 'fs-extra'; +import path from 'path'; + +import asyncOra from '../util/ora-handler'; +import getForgeConfig from '../util/forge-config'; +import readPackageJSON from '../util/read-package-json'; +import requireSearch from '../util/require-search'; +import resolveDir from '../util/resolve-dir'; +import PublishState from '../util/publish-state'; +import getCurrentOutDir from '../util/out-dir'; + +import make from './make'; + +const d = debug('electron-forge:publish'); + +/** + * @typedef {Object} PublishOptions + * @property {string} [dir=process.cwd()] The path to the app to be published + * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually + * @property {string} [authToken] An authentication token to use when publishing + * @property {string} [tag=packageJSON.version] The string to tag this release with + * @property {Array} [publishTargets=[github]] The publish targets + * @property {MakeOptions} [makeOptions] Options object to passed through to make() + * @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables + * @property {boolean} [dryRun=false] Whether to generate dry run meta data but not actually publish + * @property {boolean} [dryRunResume=false] Whether or not to attempt to resume a previously saved `dryRun` and publish + * @property {MakeResult} [makeResults=null] Provide results from make so that the publish step doesn't run make itself + */ + +/** + * Publish an Electron application into the given target service. + * + * @param {PublishOptions} providedOptions - Options for the Publish method + * @return {Promise} Will resolve when the publish process is complete + */ +const publish = async (providedOptions = {}) => { + // eslint-disable-next-line prefer-const, no-unused-vars + let { dir, interactive, authToken, tag, publishTargets, makeOptions, dryRun, dryRunResume, makeResults } = Object.assign({ + dir: process.cwd(), + interactive: false, + tag: null, + makeOptions: {}, + publishTargets: null, + dryRun: false, + dryRunResume: false, + makeResults: null, + }, providedOptions); + asyncOra.interactive = interactive; + + if (dryRun && dryRunResume) { + throw 'Can\'t dry run and resume a dry run at the same time'; + } + if (dryRunResume && makeResults) { + throw 'Can\'t resume a dry run and use the provided makeResults at the same time'; + } + + let packageJSON = await readPackageJSON(dir); + + const forgeConfig = await getForgeConfig(dir); + const outDir = providedOptions.outDir || getCurrentOutDir(dir, forgeConfig); + const dryRunDir = path.resolve(outDir, 'publish-dry-run'); + + if (dryRunResume) { + d('attempting to resume from dry run'); + const publishes = await PublishState.loadFromDirectory(dryRunDir, dir); + for (const publishStates of publishes) { + d('publishing for given state set'); + await publish({ + dir, + interactive, + authToken, + tag, + publishTargets, + makeOptions, + dryRun: false, + dryRunResume: false, + makeResults: publishStates.map(({ state }) => state), + }); + } + return; + } else if (!makeResults) { + d('triggering make'); + makeResults = await make(Object.assign({ + dir, + interactive, + }, makeOptions)); + } else { + // Restore values from dry run + d('restoring publish settings from dry run'); + + for (const makeResult of makeResults) { + packageJSON = makeResult.packageJSON; + makeOptions.platform = makeResult.platform; + makeOptions.arch = makeResult.arch; + + for (const makePath of makeResult.artifacts) { + if (!await fs.exists(makePath)) { + throw `Attempted to resume a dry run but an artifact (${makePath}) could not be found`; + } + } + } + } + + if (dryRun) { + d('saving results of make in dry run state', makeResults); + await fs.remove(dryRunDir); + await PublishState.saveToDirectory(dryRunDir, makeResults, dir); + return; + } + + dir = await resolveDir(dir); + if (!dir) { + throw 'Failed to locate publishable Electron application'; + } + + const artifacts = makeResults.reduce((accum, makeResult) => { + accum.push(...makeResult.artifacts); + return accum; + }, []); + + if (publishTargets === null) { + publishTargets = forgeConfig.publish_targets[makeOptions.platform || process.platform]; + } + + for (const publishTarget of publishTargets) { + let publisher; + await asyncOra(`Resolving publish target: ${`${publishTarget}`.cyan}`, async () => { // eslint-disable-line no-loop-func + publisher = requireSearch(__dirname, [ + `../publishers/${publishTarget}.js`, + `electron-forge-publisher-${publishTarget}`, + publishTarget, + path.resolve(dir, publishTarget), + path.resolve(dir, 'node_modules', publishTarget), + ]); + if (!publisher) { + throw `Could not find a publish target with the name: ${publishTarget}`; + } + }); + + await publisher({ + dir, + artifacts, + packageJSON, + forgeConfig, + authToken, + tag, + platform: makeOptions.platform || process.platform, + arch: makeOptions.arch || process.arch, + }); + } +}; + +export default publish; diff --git a/packages/_old/src/api/start.js b/packages/_old/src/api/start.js new file mode 100644 index 0000000000..e30c6c6696 --- /dev/null +++ b/packages/_old/src/api/start.js @@ -0,0 +1,98 @@ +import 'colors'; +import { spawn } from 'child_process'; +import path from 'path'; + +import asyncOra from '../util/ora-handler'; +import readPackageJSON from '../util/read-package-json'; +import rebuild from '../util/rebuild'; +import resolveDir from '../util/resolve-dir'; +import getForgeConfig from '../util/forge-config'; +import runHook from '../util/hook'; +import getElectronVersion from '../util/electron-version'; + +/** + * @typedef {Object} StartOptions + * @property {string} [dir=process.cwd()] The path to the electron forge project to run + * @property {string} [appPath='.'] The path (relative to dir) to the electron app to run relative to the project directory + * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually + * @property {boolean} [enableLogging=false] Enables advanced internal Electron debug calls + * @property {Array} [args] Arguments to pass through to the launched Electron application + */ + +/** + * Start an Electron application. + * + * @param {StartOptions} providedOptions - Options for the Publish method + * @return {Promise} Will resolve when the application is launched + */ +export default async (providedOptions = {}) => { + // eslint-disable-next-line prefer-const, no-unused-vars + let { dir, interactive, enableLogging, appPath, args, runAsNode, inspect } = Object.assign({ + dir: process.cwd(), + appPath: '.', + interactive: false, + enableLogging: false, + args: [], + runAsNode: false, + inspect: false, + }, providedOptions); + asyncOra.interactive = interactive; + + await asyncOra('Locating Application', async () => { + dir = await resolveDir(dir); + if (!dir) { + throw 'Failed to locate startable Electron application'; + } + }); + + const packageJSON = await readPackageJSON(dir); + + if (!packageJSON.version) { + throw `Please set your application's 'version' in '${dir}/package.json'.`; + } + + const forgeConfig = await getForgeConfig(dir); + + await rebuild(dir, getElectronVersion(packageJSON), process.platform, process.arch, forgeConfig.electronRebuildConfig); + + await runHook(forgeConfig, 'generateAssets'); + + // If a plugin has taken over the start command let's stop here + const spawnedPluginChild = await forgeConfig.pluginInterface.overrideStartLogic({ + dir, + appPath, + interactive, + enableLogging, + args, + runAsNode, + inspect, + }); + if (spawnedPluginChild) return spawnedPluginChild; + + const spawnOpts = { + cwd: dir, + stdio: 'inherit', + env: Object.assign({}, process.env, enableLogging ? { + ELECTRON_ENABLE_LOGGING: true, + ELECTRON_ENABLE_STACK_DUMPING: true, + } : {}), + }; + + if (runAsNode) { + spawnOpts.env.ELECTRON_RUN_AS_NODE = true; + } else { + delete spawnOpts.env.ELECTRON_RUN_AS_NODE; + } + + if (inspect) { + args = ['--inspect'].concat(args); + } + + let spawned; + + await asyncOra('Launching Application', async () => { + spawned = spawn(process.execPath, [path.resolve(dir, 'node_modules/electron/cli'), appPath].concat(args), spawnOpts); + }); + + return spawned; +}; diff --git a/packages/api/core/src/electron-forge-import.js b/packages/_old/src/electron-forge-import.js similarity index 100% rename from packages/api/core/src/electron-forge-import.js rename to packages/_old/src/electron-forge-import.js diff --git a/packages/api/core/src/electron-forge-init.js b/packages/_old/src/electron-forge-init.js similarity index 100% rename from packages/api/core/src/electron-forge-init.js rename to packages/_old/src/electron-forge-init.js diff --git a/packages/api/core/src/electron-forge-install.js b/packages/_old/src/electron-forge-install.js similarity index 100% rename from packages/api/core/src/electron-forge-install.js rename to packages/_old/src/electron-forge-install.js diff --git a/packages/api/core/src/electron-forge-lint.js b/packages/_old/src/electron-forge-lint.js similarity index 100% rename from packages/api/core/src/electron-forge-lint.js rename to packages/_old/src/electron-forge-lint.js diff --git a/packages/api/core/src/electron-forge-make.js b/packages/_old/src/electron-forge-make.js similarity index 100% rename from packages/api/core/src/electron-forge-make.js rename to packages/_old/src/electron-forge-make.js diff --git a/packages/api/core/src/electron-forge-package.js b/packages/_old/src/electron-forge-package.js similarity index 100% rename from packages/api/core/src/electron-forge-package.js rename to packages/_old/src/electron-forge-package.js diff --git a/packages/api/core/src/electron-forge-publish.js b/packages/_old/src/electron-forge-publish.js similarity index 100% rename from packages/api/core/src/electron-forge-publish.js rename to packages/_old/src/electron-forge-publish.js diff --git a/packages/api/core/src/electron-forge-start.js b/packages/_old/src/electron-forge-start.js similarity index 100% rename from packages/api/core/src/electron-forge-start.js rename to packages/_old/src/electron-forge-start.js diff --git a/packages/api/core/src/electron-forge.js b/packages/_old/src/electron-forge.js similarity index 100% rename from packages/api/core/src/electron-forge.js rename to packages/_old/src/electron-forge.js diff --git a/packages/api/core/src/init/init-custom.js b/packages/_old/src/init/init-custom.js similarity index 100% rename from packages/api/core/src/init/init-custom.js rename to packages/_old/src/init/init-custom.js diff --git a/packages/api/core/src/init/init-directory.js b/packages/_old/src/init/init-directory.js similarity index 100% rename from packages/api/core/src/init/init-directory.js rename to packages/_old/src/init/init-directory.js diff --git a/packages/api/core/src/init/init-git.js b/packages/_old/src/init/init-git.js similarity index 100% rename from packages/api/core/src/init/init-git.js rename to packages/_old/src/init/init-git.js diff --git a/packages/api/core/src/init/init-npm.js b/packages/_old/src/init/init-npm.js similarity index 100% rename from packages/api/core/src/init/init-npm.js rename to packages/_old/src/init/init-npm.js diff --git a/packages/api/core/src/init/init-starter-files.js b/packages/_old/src/init/init-starter-files.js similarity index 100% rename from packages/api/core/src/init/init-starter-files.js rename to packages/_old/src/init/init-starter-files.js diff --git a/packages/api/core/src/installers/darwin/dmg.js b/packages/_old/src/installers/darwin/dmg.js similarity index 100% rename from packages/api/core/src/installers/darwin/dmg.js rename to packages/_old/src/installers/darwin/dmg.js diff --git a/packages/api/core/src/installers/darwin/zip.js b/packages/_old/src/installers/darwin/zip.js similarity index 100% rename from packages/api/core/src/installers/darwin/zip.js rename to packages/_old/src/installers/darwin/zip.js diff --git a/packages/api/core/src/installers/linux/deb.js b/packages/_old/src/installers/linux/deb.js similarity index 100% rename from packages/api/core/src/installers/linux/deb.js rename to packages/_old/src/installers/linux/deb.js diff --git a/packages/api/core/src/installers/linux/rpm.js b/packages/_old/src/installers/linux/rpm.js similarity index 100% rename from packages/api/core/src/installers/linux/rpm.js rename to packages/_old/src/installers/linux/rpm.js diff --git a/packages/api/core/src/installers/win32/exe.js b/packages/_old/src/installers/win32/exe.js similarity index 100% rename from packages/api/core/src/installers/win32/exe.js rename to packages/_old/src/installers/win32/exe.js diff --git a/packages/api/core/src/makers/darwin/dmg.js b/packages/_old/src/makers/darwin/dmg.js similarity index 100% rename from packages/api/core/src/makers/darwin/dmg.js rename to packages/_old/src/makers/darwin/dmg.js diff --git a/packages/api/core/src/makers/generic/zip.js b/packages/_old/src/makers/generic/zip.js similarity index 100% rename from packages/api/core/src/makers/generic/zip.js rename to packages/_old/src/makers/generic/zip.js diff --git a/packages/api/core/src/makers/linux/deb.js b/packages/_old/src/makers/linux/deb.js similarity index 100% rename from packages/api/core/src/makers/linux/deb.js rename to packages/_old/src/makers/linux/deb.js diff --git a/packages/api/core/src/makers/linux/flatpak.js b/packages/_old/src/makers/linux/flatpak.js similarity index 100% rename from packages/api/core/src/makers/linux/flatpak.js rename to packages/_old/src/makers/linux/flatpak.js diff --git a/packages/api/core/src/makers/linux/rpm.js b/packages/_old/src/makers/linux/rpm.js similarity index 100% rename from packages/api/core/src/makers/linux/rpm.js rename to packages/_old/src/makers/linux/rpm.js diff --git a/packages/api/core/src/makers/linux/snap.js b/packages/_old/src/makers/linux/snap.js similarity index 100% rename from packages/api/core/src/makers/linux/snap.js rename to packages/_old/src/makers/linux/snap.js diff --git a/packages/api/core/src/makers/win32/appx.js b/packages/_old/src/makers/win32/appx.js similarity index 100% rename from packages/api/core/src/makers/win32/appx.js rename to packages/_old/src/makers/win32/appx.js diff --git a/packages/api/core/src/makers/win32/squirrel.js b/packages/_old/src/makers/win32/squirrel.js similarity index 100% rename from packages/api/core/src/makers/win32/squirrel.js rename to packages/_old/src/makers/win32/squirrel.js diff --git a/packages/api/core/src/makers/win32/wix.js b/packages/_old/src/makers/win32/wix.js similarity index 100% rename from packages/api/core/src/makers/win32/wix.js rename to packages/_old/src/makers/win32/wix.js diff --git a/packages/api/core/src/publishers/electron-release-server.js b/packages/_old/src/publishers/electron-release-server.js similarity index 100% rename from packages/api/core/src/publishers/electron-release-server.js rename to packages/_old/src/publishers/electron-release-server.js diff --git a/packages/api/core/src/publishers/github.js b/packages/_old/src/publishers/github.js similarity index 100% rename from packages/api/core/src/publishers/github.js rename to packages/_old/src/publishers/github.js diff --git a/packages/api/core/src/publishers/s3.js b/packages/_old/src/publishers/s3.js similarity index 100% rename from packages/api/core/src/publishers/s3.js rename to packages/_old/src/publishers/s3.js diff --git a/packages/api/core/src/publishers/snapcraft.js b/packages/_old/src/publishers/snapcraft.js similarity index 100% rename from packages/api/core/src/publishers/snapcraft.js rename to packages/_old/src/publishers/snapcraft.js diff --git a/packages/_old/src/util/author-name.js b/packages/_old/src/util/author-name.js new file mode 100644 index 0000000000..944c6febb9 --- /dev/null +++ b/packages/_old/src/util/author-name.js @@ -0,0 +1,19 @@ +import parseAuthor from 'parse-author'; + +export default function getNameFromAuthor(author) { + let publisher = author || ''; + + if (typeof publisher === 'string') { + publisher = parseAuthor(publisher); + } + + if (typeof publisher.name === 'string') { + publisher = publisher.name; + } + + if (typeof publisher !== 'string') { + publisher = ''; + } + + return publisher; +} diff --git a/packages/api/core/src/util/check-system.js b/packages/_old/src/util/check-system.js similarity index 100% rename from packages/api/core/src/util/check-system.js rename to packages/_old/src/util/check-system.js diff --git a/packages/_old/src/util/config-fn.js b/packages/_old/src/util/config-fn.js new file mode 100644 index 0000000000..39f6341275 --- /dev/null +++ b/packages/_old/src/util/config-fn.js @@ -0,0 +1,6 @@ +export default (configObject, ...args) => { + if (typeof configObject === 'function') { + return configObject(...args); + } + return configObject; +}; diff --git a/packages/api/core/src/util/config.js b/packages/_old/src/util/config.js similarity index 100% rename from packages/api/core/src/util/config.js rename to packages/_old/src/util/config.js diff --git a/packages/api/core/src/util/confirm-if-interactive.js b/packages/_old/src/util/confirm-if-interactive.js similarity index 100% rename from packages/api/core/src/util/confirm-if-interactive.js rename to packages/_old/src/util/confirm-if-interactive.js diff --git a/packages/_old/src/util/deprecate.js b/packages/_old/src/util/deprecate.js new file mode 100644 index 0000000000..75a5a6ce33 --- /dev/null +++ b/packages/_old/src/util/deprecate.js @@ -0,0 +1,8 @@ +import 'colors'; +import logSymbols from 'log-symbols'; + +export default what => ({ + replaceWith: (replacement) => { + console.warn(logSymbols.warning, `WARNING: ${what} is deprecated, please use ${replacement} instead`.yellow); + }, +}); diff --git a/packages/_old/src/util/electron-version.js b/packages/_old/src/util/electron-version.js new file mode 100644 index 0000000000..7e20cc6cd7 --- /dev/null +++ b/packages/_old/src/util/electron-version.js @@ -0,0 +1,6 @@ +export default (packageJSON) => { + if (!packageJSON.devDependencies) return null; + return (packageJSON.devDependencies['electron-prebuilt-compile'] + || packageJSON.devDependencies['electron-prebuilt'] + || packageJSON.devDependencies.electron); +}; diff --git a/packages/_old/src/util/ensure-output.js b/packages/_old/src/util/ensure-output.js new file mode 100644 index 0000000000..8cf776aee1 --- /dev/null +++ b/packages/_old/src/util/ensure-output.js @@ -0,0 +1,22 @@ +import fs from 'fs-extra'; +import path from 'path'; + +// This is different from fs-extra's ensureDir because it wipes out the existing directory, +// if it's found. +async function ensureDirectory(dir) { + if (await fs.pathExists(dir)) { + await fs.remove(dir); + } + return fs.mkdirs(dir); +} + +// This is different from fs-extra's ensureFile because it wipes out the existing file, +// if it's found. +async function ensureFile(file) { + if (await fs.pathExists(file)) { + await fs.remove(file); + } + await fs.mkdirs(path.dirname(file)); +} + +export { ensureDirectory, ensureFile }; diff --git a/packages/_old/src/util/forge-config.js b/packages/_old/src/util/forge-config.js new file mode 100644 index 0000000000..120ccc212f --- /dev/null +++ b/packages/_old/src/util/forge-config.js @@ -0,0 +1,114 @@ +import fs from 'fs-extra'; +import path from 'path'; +import _template from 'lodash.template'; +import readPackageJSON from './read-package-json'; +import yarnOrNpm from './yarn-or-npm'; +import PluginInterface from './plugin-interface'; + +const underscoreCase = str => str.replace(/(.)([A-Z][a-z]+)/g, '$1_$2').replace(/([a-z0-9])([A-Z])/g, '$1_$2').toUpperCase(); + +const proxify = (object, envPrefix) => { + const newObject = {}; + + Object.keys(object).forEach((key) => { + if (typeof object[key] === 'object' && !Array.isArray(object[key]) && key !== 'pluginInterface') { + newObject[key] = proxify(object[key], `${envPrefix}_${underscoreCase(key)}`); + } else { + newObject[key] = object[key]; + } + }); + + return new Proxy(newObject, { + get(target, name) { + // eslint-disable-next-line no-prototype-builtins + if (!target.hasOwnProperty(name) && typeof name === 'string') { + const envValue = process.env[`${envPrefix}_${underscoreCase(name)}`]; + if (envValue) return envValue; + } + return target[name]; + }, + getOwnPropertyDescriptor(target, name) { + const envValue = process.env[`${envPrefix}_${underscoreCase(name)}`]; + // eslint-disable-next-line no-prototype-builtins + if (target.hasOwnProperty(name)) { + return Object.getOwnPropertyDescriptor(target, name); + } else if (envValue) { + return { writable: true, enumerable: true, configurable: true, value: envValue }; + } + }, + }); +}; + +/** + * Sets sensible defaults for the `config.forge` object. + */ +export function setInitialForgeConfig(packageJSON) { + const { name = '', productName = name } = packageJSON; + + /* eslint-disable no-param-reassign */ + packageJSON.config.forge.electronWinstallerConfig.name = name.replace(/-/g, '_'); + packageJSON.config.forge.windowsStoreConfig.name = productName.replace(/-/g, ''); + packageJSON.config.forge.electronPackagerConfig.packageManager = yarnOrNpm(); + /* eslint-enable no-param-reassign */ +} + +export default async (dir) => { + const packageJSON = await readPackageJSON(dir); + let forgeConfig = packageJSON.config.forge; + if (typeof forgeConfig === 'string' && (await fs.pathExists(path.resolve(dir, forgeConfig)) || await fs.pathExists(path.resolve(dir, `${forgeConfig}.js`)))) { + try { + forgeConfig = require(path.resolve(dir, forgeConfig)); + } catch (err) { + console.error(`Failed to load: ${path.resolve(dir, forgeConfig)}`); + throw err; + } + } else if (typeof forgeConfig !== 'object') { + throw new Error('Expected packageJSON.config.forge to be an object or point to a requirable JS file'); + } + forgeConfig = Object.assign({ + make_targets: {}, + publish_targets: {}, + electronPackagerConfig: {}, + electronRebuildConfig: {}, + electronWinstallerConfig: {}, + electronInstallerDebian: {}, + electronInstallerDMG: {}, + electronInstallerRedhat: {}, + s3: {}, + github_repository: {}, + electronReleaseServer: {}, + plugins: [], + }, forgeConfig); + forgeConfig.make_targets = Object.assign({ + win32: ['squirrel'], + darwin: ['zip'], + mas: ['zip'], + linux: ['deb', 'rpm'], + }, forgeConfig.make_targets); + forgeConfig.publish_targets = Object.assign({ + win32: ['github'], + darwin: ['github'], + mas: ['github'], + linux: ['github'], + }, forgeConfig.publish_targets); + + const templateObj = Object.assign({}, packageJSON, { year: (new Date()).getFullYear() }); + const template = (obj) => { + Object.keys(obj).forEach((objKey) => { + if (typeof obj[objKey] === 'object' && obj !== null) { + template(obj[objKey]); + } else if (typeof obj[objKey] === 'string') { + obj[objKey] = _template(obj[objKey])(templateObj); // eslint-disable-line + if (obj[objKey].startsWith('require:')) { + obj[objKey] = require(path.resolve(dir, obj[objKey].substr(8))); // eslint-disable-line + } + } + }); + }; + + template(forgeConfig); + + forgeConfig.pluginInterface = new PluginInterface(dir, forgeConfig); + + return proxify(forgeConfig, 'ELECTRON_FORGE'); +}; diff --git a/packages/_old/src/util/github.js b/packages/_old/src/util/github.js new file mode 100644 index 0000000000..c50813affb --- /dev/null +++ b/packages/_old/src/util/github.js @@ -0,0 +1,30 @@ +import GitHubAPI from '@octokit/rest'; +import merge from 'lodash.merge'; + +export default class GitHub { + constructor(authToken, requireAuth, options = {}) { + this.options = merge( + { protocol: 'https' }, + options, + { headers: { 'user-agent': 'Electron Forge' } } + ); + if (authToken) { + this.token = authToken; + } else if (process.env.GITHUB_TOKEN) { + this.token = process.env.GITHUB_TOKEN; + } else if (requireAuth) { + throw 'Please set GITHUB_TOKEN in your environment to access these features'; + } + } + + getGitHub() { + const github = new GitHubAPI(this.options); + if (this.token) { + github.authenticate({ + type: 'token', + token: this.token, + }); + } + return github; + } +} diff --git a/packages/api/core/src/util/hdiutil.js b/packages/_old/src/util/hdiutil.js similarity index 100% rename from packages/api/core/src/util/hdiutil.js rename to packages/_old/src/util/hdiutil.js diff --git a/packages/_old/src/util/hook.js b/packages/_old/src/util/hook.js new file mode 100644 index 0000000000..255b5f56bc --- /dev/null +++ b/packages/_old/src/util/hook.js @@ -0,0 +1,13 @@ +import debug from 'debug'; + +const d = debug('electron-forge:hook'); + +export default async (forgeConfig, hookName, ...hookArgs) => { + const hooks = forgeConfig.hooks || {}; + d(`hook triggered: ${hookName}`); + if (typeof hooks[hookName] === 'function') { + d('calling hook:', hookName, 'with args:', hookArgs); + await hooks[hookName](forgeConfig, ...hookArgs); + } + await forgeConfig.pluginInterface.triggerHook(hookName, hookArgs); +}; diff --git a/packages/_old/src/util/install-dependencies.js b/packages/_old/src/util/install-dependencies.js new file mode 100644 index 0000000000..698ef98888 --- /dev/null +++ b/packages/_old/src/util/install-dependencies.js @@ -0,0 +1,33 @@ +import debug from 'debug'; +import { yarnOrNpmSpawn, hasYarn } from './yarn-or-npm'; + +import config from './config'; + +const d = debug('electron-forge:dependency-installer'); + +export default async (dir, deps, areDev = false, exact = false) => { + d('installing', JSON.stringify(deps), 'in:', dir, `dev=${areDev},exact=${exact},withYarn=${hasYarn()}`); + if (deps.length === 0) { + d('nothing to install, stopping immediately'); + return Promise.resolve(); + } + let cmd = ['install'].concat(deps); + if (hasYarn()) { + cmd = ['add'].concat(deps); + if (areDev) cmd.push('--dev'); + if (exact) cmd.push('--exact'); + } else { + if (exact) cmd.push('--save-exact'); + if (areDev) cmd.push('--save-dev'); + if (!areDev) cmd.push('--save'); + } + d('executing', JSON.stringify(cmd), 'in:', dir); + try { + await yarnOrNpmSpawn(cmd, { + cwd: dir, + stdio: config.get('verbose') ? 'inherit' : 'pipe', + }); + } catch (err) { + throw new Error(`Failed to install modules: ${JSON.stringify(deps)}\n\nWith output: ${err.message}`); + } +}; diff --git a/packages/_old/src/util/is-installed.js b/packages/_old/src/util/is-installed.js new file mode 100644 index 0000000000..ad2c8f67c4 --- /dev/null +++ b/packages/_old/src/util/is-installed.js @@ -0,0 +1,9 @@ +export default function isInstalled(pkg) { + try { + require(pkg); + return true; + } catch (e) { + // Package doesn't exist -- must not be installable on this platform + return false; + } +} diff --git a/packages/_old/src/util/linux-config.js b/packages/_old/src/util/linux-config.js new file mode 100644 index 0000000000..eed0c812e1 --- /dev/null +++ b/packages/_old/src/util/linux-config.js @@ -0,0 +1,19 @@ +import merge from 'lodash.merge'; +import path from 'path'; + +import configFn from './config-fn'; + +export function populateConfig({ forgeConfig, configKey, targetArch }) { + const config = configFn(forgeConfig[configKey] || {}, targetArch); + config.options = config.options || {}; + + return config; +} + +export function linuxConfig({ config, pkgArch, dir, outPath }) { + return merge({}, config, { + arch: pkgArch, + dest: path.dirname(outPath), + src: dir, + }); +} diff --git a/packages/_old/src/util/messages.js b/packages/_old/src/util/messages.js new file mode 100644 index 0000000000..90309cdad2 --- /dev/null +++ b/packages/_old/src/util/messages.js @@ -0,0 +1,13 @@ +function info(interactive, message) { + if (interactive) { + console.info(message); + } +} + +function warn(interactive, message) { + if (interactive) { + console.warn(message); + } +} + +export { info, warn }; diff --git a/packages/api/core/src/util/move-app.js b/packages/_old/src/util/move-app.js similarity index 100% rename from packages/api/core/src/util/move-app.js rename to packages/_old/src/util/move-app.js diff --git a/packages/_old/src/util/ora-handler.js b/packages/_old/src/util/ora-handler.js new file mode 100644 index 0000000000..a99870591f --- /dev/null +++ b/packages/_old/src/util/ora-handler.js @@ -0,0 +1,44 @@ +import colors from 'colors'; +import ora from './ora'; + +class MockOra { + succeed() { return this; } + fail() { return this; } + start() { return this; } + stop() { return this; } +} + +const asyncOra = (initialOraValue, asyncFn, processExitFn = process.exit) => { + let fnOra = new MockOra(); + if (asyncOra.interactive) { + fnOra = ora(initialOraValue).start(); + } + return new Promise((resolve, reject) => { + asyncFn(fnOra).then(() => { + fnOra.succeed(); + resolve(); + }).catch((err) => { + fnOra.fail(); + if (asyncOra.interactive) { + if (err && err.message && err.stack) { + console.error('\nAn unhandled error has occurred inside Forge:'.red); + console.error(colors.red(err.message)); + console.error(colors.red(err.stack)); + } else { + console.error('\nElectron forge was terminated:'.red); + console.error(colors.red(typeof err === 'string' ? err : JSON.stringify(err))); + } + processExitFn(1); + // If the process is still alive we should continue because either something went really wrong + // or we are testing this function + setTimeout(() => resolve(), 500); + } else { + reject(err); + } + }); + }); +}; + +asyncOra.interactive = true; + +export default asyncOra; diff --git a/packages/_old/src/util/ora.js b/packages/_old/src/util/ora.js new file mode 100644 index 0000000000..9c464424b4 --- /dev/null +++ b/packages/_old/src/util/ora.js @@ -0,0 +1,39 @@ +import 'colors'; +import debug from 'debug'; +import logSymbols from 'log-symbols'; +import realOra from 'ora'; + +const d = debug('electron-forge:lifecycle'); + +const useFakeOra = (process.env.DEBUG && process.env.DEBUG.includes('electron-forge')); + +if (useFakeOra) { + console.warn('WARNING: DEBUG environment variable detected. Progress indicators will be sent over electron-forge:lifecycle'.red); +} + +export const fakeOra = (name) => { + const fake = { + start: () => { + d('Process Started:', name); + return fake; + }, + warn: (msg) => { + console.warn(logSymbols.warning, msg.yellow); + }, + fail: () => { + d(`Process Failed: ${name}`.red); + return fake; + }, + succeed: () => { + d('Process Succeeded:', name); + return fake; + }, + stop: () => { + d('Process Stopped:', name); + return fake; + }, + }; + return fake; +}; + +export default useFakeOra ? fakeOra : realOra; diff --git a/packages/_old/src/util/out-dir.js b/packages/_old/src/util/out-dir.js new file mode 100644 index 0000000000..372395d8a8 --- /dev/null +++ b/packages/_old/src/util/out-dir.js @@ -0,0 +1,14 @@ +const path = require('path'); + +const BASE_OUT_DIR = 'out'; + +export default (baseDir, forgeConfig) => { + if (forgeConfig.buildIdentifier) { + let identifier = forgeConfig.buildIdentifier; + if (typeof identifier === 'function') { + identifier = identifier(); + } + if (identifier) return path.resolve(baseDir, BASE_OUT_DIR, identifier); + } + return path.resolve(baseDir, BASE_OUT_DIR); +}; diff --git a/packages/_old/src/util/parse-archs.js b/packages/_old/src/util/parse-archs.js new file mode 100644 index 0000000000..6f6c2073a5 --- /dev/null +++ b/packages/_old/src/util/parse-archs.js @@ -0,0 +1,9 @@ +import { allOfficialArchsForPlatformAndVersion } from 'electron-packager/targets'; + +export default function parseArchs(platform, declaredArch, electronVersion) { + if (declaredArch === 'all') { + return allOfficialArchsForPlatformAndVersion(platform, electronVersion) || ['x64']; + } + + return declaredArch.split(','); +} diff --git a/packages/_old/src/util/plugin-interface.js b/packages/_old/src/util/plugin-interface.js new file mode 100644 index 0000000000..42f19db614 --- /dev/null +++ b/packages/_old/src/util/plugin-interface.js @@ -0,0 +1,50 @@ +import debug from 'debug'; + +import asyncOra from './ora-handler'; + +const d = debug('electron-forge:plugins'); + +export default class PluginInterface { + constructor(dir, forgeConfig) { + this.plugins = forgeConfig.plugins; + Object.defineProperty(this, 'config', { + value: forgeConfig, + enumerable: false, + configurable: false, + writable: false, + }); + + for (const plugin of this.plugins) { + plugin.init(dir, forgeConfig, asyncOra); + } + + this.triggerHook = this.triggerHook.bind(this); + this.overrideStartLogic = this.overrideStartLogic.bind(this); + } + + async triggerHook(hookName, hookArgs) { + for (const plugin of this.plugins) { + if (typeof plugin.getHook === 'function') { + const hook = plugin.getHook(hookName); + if (hook) await hook(...hookArgs); + } + } + } + + async overrideStartLogic(opts) { + let newStartFn; + const claimed = []; + for (const plugin of this.plugins) { + if (typeof plugin.startLogic === 'function') { + claimed.push(plugin.name); + newStartFn = plugin.startLogic; + } + } + if (claimed.length > 1) throw `Multiple plugins tried to take control of the start command, please remove one of them\n --> ${claimed.join(', ')}`; + if (claimed.length === 1) { + d(`plugin: "${claimed[0]}" has taken control of the start command`); + return await newStartFn(opts); + } + return false; + } +} diff --git a/packages/_old/src/util/publish-state.js b/packages/_old/src/util/publish-state.js new file mode 100644 index 0000000000..ddf198f0c7 --- /dev/null +++ b/packages/_old/src/util/publish-state.js @@ -0,0 +1,72 @@ +import crypto from 'crypto'; +import fs from 'fs-extra'; +import path from 'path'; + +const EXTENSION = '.forge.publish'; + +export default class PublishState { + static async loadFromDirectory(directory, rootDir) { + if (!await fs.exists(directory)) { + throw new Error(`Attempted to load publish state from a missing directory: ${directory}`); + } + + const publishes = []; + for (const dirName of await fs.readdir(directory)) { + const subDir = path.resolve(directory, dirName); + const states = []; + if ((await fs.stat(subDir)).isDirectory()) { + const filePaths = (await fs.readdir(subDir)) + .filter(fileName => fileName.endsWith(EXTENSION)) + .map(fileName => path.resolve(subDir, fileName)); + + for (const filePath of filePaths) { + const state = new PublishState(filePath); + await state.load(); + state.state.artifacts = state.state.artifacts.map(artifactPath => path.resolve(rootDir, artifactPath)); + states.push(state); + } + } + publishes.push(states); + } + return publishes; + } + + static async saveToDirectory(directory, artifacts, rootDir) { + const id = crypto.createHash('SHA256').update(JSON.stringify(artifacts)).digest('hex'); + for (const artifact of artifacts) { + artifact.artifacts = artifact.artifacts.map(artifactPath => path.relative(rootDir, artifactPath)); + const state = new PublishState(path.resolve(directory, id, 'null'), '', false); + state.setState(artifact); + await state.saveToDisk(); + } + } + + constructor(filePath, hasHash = true) { + this.dir = path.dirname(filePath); + this.path = filePath; + this.hasHash = hasHash; + } + + generateHash() { + const content = JSON.stringify(this.state || {}); + return crypto.createHash('SHA256').update(content).digest('hex'); + } + + setState(state) { + this.state = state; + } + + async load() { + this.state = await fs.readJson(this.path); + } + + async saveToDisk() { + if (!this.hasHash) { + this.path = path.resolve(this.dir, `${this.generateHash()}${EXTENSION}`); + this.hasHash = true; + } + + await fs.mkdirs(path.dirname(this.path)); + await fs.writeJson(this.path, this.state); + } +} diff --git a/packages/_old/src/util/read-package-json.js b/packages/_old/src/util/read-package-json.js new file mode 100644 index 0000000000..cee775dc1e --- /dev/null +++ b/packages/_old/src/util/read-package-json.js @@ -0,0 +1,5 @@ +import fs from 'fs-extra'; +import path from 'path'; + +export default async dir => + await fs.readJson(path.resolve(dir, 'package.json')); diff --git a/packages/_old/src/util/rebuild.js b/packages/_old/src/util/rebuild.js new file mode 100644 index 0000000000..4d8c29f276 --- /dev/null +++ b/packages/_old/src/util/rebuild.js @@ -0,0 +1,26 @@ +import rebuild from 'electron-rebuild'; + +import asyncOra from '../util/ora-handler'; + +export default async (buildPath, electronVersion, platform, arch, config = {}) => { + await asyncOra('Preparing native dependencies', async (rebuildSpinner) => { + const rebuilder = rebuild(Object.assign({}, config, { + buildPath, + electronVersion, + arch, + })); + const { lifecycle } = rebuilder; + + let found = 0; + let done = 0; + + const redraw = () => { + rebuildSpinner.text = `Preparing native dependencies: ${done} / ${found}`; // eslint-disable-line + }; + + lifecycle.on('module-found', () => { found += 1; redraw(); }); + lifecycle.on('module-done', () => { done += 1; redraw(); }); + + await rebuilder; + }); +}; diff --git a/packages/_old/src/util/require-search.js b/packages/_old/src/util/require-search.js new file mode 100644 index 0000000000..23c265b351 --- /dev/null +++ b/packages/_old/src/util/require-search.js @@ -0,0 +1,25 @@ +import debug from 'debug'; +import path from 'path'; + +const d = debug('electron-forge:require-search'); + +export function requireSearchRaw(relativeTo, paths) { + const testPaths = paths + .concat(paths.map(mapPath => path.resolve(relativeTo, mapPath))) + .concat(paths.map(mapPath => path.resolve(relativeTo, 'node_modules', mapPath))); + d('searching', testPaths, 'relative to', relativeTo); + for (const testPath of testPaths) { + try { + d('testing', testPath); + return require(testPath); + } catch (err) { + // Ignore the error + } + } + d('failed to find a module in', testPaths); +} + +export default (relativeTo, paths) => { + const result = requireSearchRaw(relativeTo, paths); + return typeof result === 'object' && result && result.default ? result.default : result; +}; diff --git a/packages/_old/src/util/resolve-dir.js b/packages/_old/src/util/resolve-dir.js new file mode 100644 index 0000000000..66a70ba157 --- /dev/null +++ b/packages/_old/src/util/resolve-dir.js @@ -0,0 +1,36 @@ +import debug from 'debug'; +import fs from 'fs-extra'; +import path from 'path'; +import readPackageJSON from './read-package-json'; +import getElectronVersion from './electron-version'; + +const d = debug('electron-forge:project-resolver'); + +export default async (dir) => { + let mDir = dir; + let prevDir; + while (prevDir !== mDir) { + prevDir = mDir; + const testPath = path.resolve(mDir, 'package.json'); + d('searching for project in:', mDir); + if (await fs.pathExists(testPath)) { + const packageJSON = await readPackageJSON(mDir); + + const electronVersion = getElectronVersion(packageJSON); + if (electronVersion) { + if (!/[0-9]/.test(electronVersion[0])) { + throw `You must depend on an EXACT version of electron not a range (${electronVersion})`; + } + } else { + throw 'You must depend on "electron" in your devDependencies'; + } + + if (packageJSON.config && packageJSON.config.forge) { + d('electron-forge compatible package.json found in', testPath); + return mDir; + } + } + mDir = path.dirname(mDir); + } + return null; +}; diff --git a/packages/api/core/src/util/terminate.js b/packages/_old/src/util/terminate.js similarity index 100% rename from packages/api/core/src/util/terminate.js rename to packages/_old/src/util/terminate.js diff --git a/packages/_old/src/util/yarn-or-npm.js b/packages/_old/src/util/yarn-or-npm.js new file mode 100644 index 0000000000..e233201879 --- /dev/null +++ b/packages/_old/src/util/yarn-or-npm.js @@ -0,0 +1,23 @@ +import spawnPromise from 'cross-spawn-promise'; +import logSymbols from 'log-symbols'; +import yarnOrNpm from 'yarn-or-npm'; + +const safeYarnOrNpm = () => { + const system = yarnOrNpm(); + switch (process.env.NODE_INSTALLER) { + case 'yarn': + case 'npm': + return process.env.NODE_INSTALLER; + default: + if (process.env.NODE_INSTALLER) { + console.warn(`${logSymbols.warning} Unknown NODE_INSTALLER, using detected installer ${system}`.yellow); + } + return system; + } +}; + +export default safeYarnOrNpm; + +export const yarnOrNpmSpawn = (...args) => spawnPromise(safeYarnOrNpm(), ...args); + +export const hasYarn = () => safeYarnOrNpm() === 'yarn'; diff --git a/packages/_old/tabtab-install.js b/packages/_old/tabtab-install.js new file mode 100644 index 0000000000..4802f2ed25 --- /dev/null +++ b/packages/_old/tabtab-install.js @@ -0,0 +1,21 @@ +try { + const Complete = require('tabtab/src/complete'); + const Installer = require('tabtab/src/installer'); + + const options = { auto: true, name: 'electron-forge' }; + const complete = new Complete(options); + const installer = new Installer(options, complete); + + let shell = process.env.SHELL; + if (shell) shell = shell.split((process.platform !== 'win32') ? '/' : '\\').slice(-1)[0]; + + if (installer[shell]) { + installer.handle(options.name, options) + .catch(e => console.warn(`Failed to install tab completion: ${e}`)); + } else { + console.warn(`User shell ${shell} not supported, skipping completion install`); + } +} catch (err) { + console.log('tabtab install went wrong', err); + process.exit(0); +} diff --git a/packages/_old/test/.eslintrc b/packages/_old/test/.eslintrc new file mode 100644 index 0000000000..fcf427ed5d --- /dev/null +++ b/packages/_old/test/.eslintrc @@ -0,0 +1,9 @@ +{ + "env": { + "mocha": true + }, + "rules": { + "class-methods-use-this": 0, + "import/no-extraneous-dependencies": 0 + } +} diff --git a/packages/_old/test/fast/author-name_spec.js b/packages/_old/test/fast/author-name_spec.js new file mode 100644 index 0000000000..177c86e77e --- /dev/null +++ b/packages/_old/test/fast/author-name_spec.js @@ -0,0 +1,30 @@ +import { expect } from 'chai'; + +import getNameFromAuthor from '../../src/util/author-name'; + +describe('author-name', () => { + describe('getNameFromAuthor', () => { + [{ + author: 'First Last', + expectedReturnValue: 'First Last', + }, { + author: 'First Last ', + expectedReturnValue: 'First Last', + }, { + author: { + name: 'First Last', + }, + expectedReturnValue: 'First Last', + }, { + author: undefined, + expectedReturnValue: '', + }, { + author: '', + expectedReturnValue: '', + }].forEach((scenario) => { + it(`${JSON.stringify(scenario.author)} -> "${scenario.expectedReturnValue}"`, () => { + expect(getNameFromAuthor(scenario.author)).to.equal(scenario.expectedReturnValue); + }); + }); + }); +}); diff --git a/packages/api/core/test/fast/config_spec.js b/packages/_old/test/fast/config_spec.js similarity index 100% rename from packages/api/core/test/fast/config_spec.js rename to packages/_old/test/fast/config_spec.js diff --git a/packages/api/core/test/fast/confirm-if-interactive_spec.js b/packages/_old/test/fast/confirm-if-interactive_spec.js similarity index 100% rename from packages/api/core/test/fast/confirm-if-interactive_spec.js rename to packages/_old/test/fast/confirm-if-interactive_spec.js diff --git a/packages/api/core/test/fast/electron_forge_start_spec.js b/packages/_old/test/fast/electron_forge_start_spec.js similarity index 100% rename from packages/api/core/test/fast/electron_forge_start_spec.js rename to packages/_old/test/fast/electron_forge_start_spec.js diff --git a/packages/_old/test/fast/ensure-output_spec.js b/packages/_old/test/fast/ensure-output_spec.js new file mode 100644 index 0000000000..4e366d65ed --- /dev/null +++ b/packages/_old/test/fast/ensure-output_spec.js @@ -0,0 +1,50 @@ +import { expect } from 'chai'; +import fs from 'fs-extra'; +import os from 'os'; +import path from 'path'; + +import { ensureDirectory, ensureFile } from '../../src/util/ensure-output'; + +describe('ensure-output', () => { + const tmpPath = path.resolve(os.tmpdir(), 'forge-ensure'); + + before(async () => { + await fs.mkdirs(tmpPath); + }); + + describe('ensureDirectory', () => { + it('should delete the directory contents if it exists', async () => { + await fs.mkdirs(path.resolve(tmpPath, 'foo')); + fs.writeFileSync(path.resolve(tmpPath, 'foo', 'touchedFile')); + expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(true); + await ensureDirectory(path.resolve(tmpPath, 'foo')); + expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(false); + }); + + it('should create the directory if it does not exist', async () => { + expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(false); + await ensureDirectory(path.resolve(tmpPath, 'bar')); + expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(true); + }); + }); + + describe('ensureFile', () => { + it('should delete the file if it exists', async () => { + await fs.mkdirs(path.resolve(tmpPath, 'foo')); + fs.writeFileSync(path.resolve(tmpPath, 'foo', 'touchedFile')); + expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(true); + await ensureFile(path.resolve(tmpPath, 'foo')); + expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(false); + }); + + it('should create the containing directory if it does not exist', async () => { + expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(false); + await ensureFile(path.resolve(tmpPath, 'bar', 'file')); + expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(true); + }); + }); + + afterEach(async () => { + await fs.remove(tmpPath); + }); +}); diff --git a/packages/_old/test/fast/forge-config_spec.js b/packages/_old/test/fast/forge-config_spec.js new file mode 100644 index 0000000000..317650fa79 --- /dev/null +++ b/packages/_old/test/fast/forge-config_spec.js @@ -0,0 +1,98 @@ +import { expect } from 'chai'; +import path from 'path'; + +import findConfig from '../../src/util/forge-config'; + +const defaults = { + make_targets: { + win32: ['squirrel', 'appx'], + darwin: ['zip'], + linux: ['deb', 'rpm'], + mas: ['zip'], + }, + electronInstallerDMG: {}, + electronPackagerConfig: {}, + electronRebuildConfig: {}, + electronWinstallerConfig: {}, + electronInstallerDebian: {}, + electronInstallerRedhat: {}, + publish_targets: { + win32: ['github'], + darwin: ['github'], + linux: ['github'], + mas: ['github'], + }, + github_repository: {}, + s3: {}, + electronReleaseServer: {}, + plugins: [], +}; + +describe('forge-config', () => { + it('should resolve the object in package.json with defaults if one exists', async () => { + const config = await findConfig(path.resolve(__dirname, '../fixture/dummy_app')); + delete config.pluginInterface; + expect(config).to.be.deep.equal(Object.assign({}, defaults, { + electronWinstallerConfig: { windows: 'magic' }, + windowsStoreConfig: { packageName: 'test' }, + github_repository: { + name: 'project', + owner: 'dummy', + }, + })); + }); + + it('should set a pluginInterface', async () => { + const config = await findConfig(path.resolve(__dirname, '../fixture/dummy_app')); + expect(config).to.have.property('pluginInterface'); + }); + + it('should allow access to built-ins of proxied objects', async () => { + const conf = await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')); + expect(conf.electronPackagerConfig.baz.hasOwnProperty).to.be.a('function'); + process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY = 'SecretyThing'; + // eslint-disable-next-line no-prototype-builtins + expect(conf.s3.hasOwnProperty('secretAccessKey')).to.equal(true); + delete process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY; + }); + + it('should allow overwrite of properties in proxied objects', async () => { + const conf = await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')); + expect(conf.electronPackagerConfig.baz.hasOwnProperty).to.be.a('function'); + expect(() => { conf.electronPackagerConfig.baz = 'bar'; }).to.not.throw(); + process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY = 'SecretyThing'; + + const descriptor = { writable: true, enumerable: true, configurable: true, value: 'SecretyThing' }; + expect(Object.getOwnPropertyDescriptor(conf.s3, 'secretAccessKey')).to.be.deep.equal(descriptor); + expect(() => { conf.s3.secretAccessKey = 'bar'; }).to.not.throw(); + expect(conf.s3.secretAccessKey).to.equal('bar'); + delete process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY; + }); + + + it('should resolve the JS file exports in config.forge points to a JS file', async () => { + const config = JSON.parse(JSON.stringify(await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')))); + delete config.pluginInterface; + expect(config).to.be.deep.equal(Object.assign({}, defaults, { + electronPackagerConfig: { foo: 'bar', baz: {} }, + })); + }); + + it('should resolve the JS file exports in config.forge points to a JS file and maintain functions', async () => { + const conf = await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')); + expect(conf.magicFn).to.be.a('function'); + expect(conf.magicFn()).to.be.equal('magic result'); + }); + + it('should magically map properties to environment variables', async () => { + const conf = await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')); + expect(conf.s3.secretAccessKey).to.equal(undefined); + + process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY = 'SecretyThing'; + process.env.ELECTRON_FORGE_ELECTRON_RELEASE_SERVER_BASE_URL = 'http://example.com'; + expect(conf.s3.secretAccessKey).to.equal('SecretyThing'); + expect(conf.electronReleaseServer.baseUrl).to.equal('http://example.com'); + delete process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY; + delete process.env.ELECTRON_FORGE_ELECTRON_RELEASE_SERVER_BASE_URL; + }); +}); diff --git a/packages/_old/test/fast/github_spec.js b/packages/_old/test/fast/github_spec.js new file mode 100644 index 0000000000..71fc80ab32 --- /dev/null +++ b/packages/_old/test/fast/github_spec.js @@ -0,0 +1,94 @@ +import { expect } from 'chai'; +import proxyquire from 'proxyquire'; +import sinon from 'sinon'; + +describe('GitHub', () => { + let GitHub; + let gitHubSpy; + let gitHubAuthSpy; + let MockGitHub; + + beforeEach(() => { + gitHubSpy = sinon.spy(); + gitHubAuthSpy = sinon.spy(); + MockGitHub = class { + constructor(options) { + gitHubSpy(); + this.options = options; + } + + authenticate() { + gitHubAuthSpy(); + } + }; + GitHub = proxyquire.noCallThru().load('../../src/util/github', { + '@octokit/rest': MockGitHub, + }).default; + }); + + it('should read token from constructor', () => { + expect(new GitHub('token1').token).to.equal('token1'); + }); + + it('should fall back to token from environment', () => { + process.env.GITHUB_TOKEN = 'abc123'; + expect(new GitHub().token).to.equal('abc123'); + delete process.env.GITHUB_TOKEN; + }); + + describe('getGitHub', () => { + it('should create a new GitHubAPI', () => { + const gh = new GitHub(); + expect(gitHubSpy.callCount).to.equal(0); + gh.getGitHub(); + expect(gitHubSpy.callCount).to.equal(1); + }); + + it('should be able to set the Enterprise URL settings', () => { + const gh = new GitHub('1234', true, { + host: 'github.example.com', + port: 8443, + pathPrefix: '/enterprise', + }); + const api = gh.getGitHub(); + + expect(api.options).to.deep.equal({ + protocol: 'https', + host: 'github.example.com', + port: 8443, + pathPrefix: '/enterprise', + headers: { + 'user-agent': 'Electron Forge', + }, + }); + }); + + it('should not override the user agent', () => { + const gh = new GitHub('1234', true, { headers: { 'user-agent': 'Something' } }); + const api = gh.getGitHub(); + + expect(api.options.headers['user-agent']).to.equal('Electron Forge'); + }); + + it('should authenticate if a token is present', () => { + const gh = new GitHub('token'); + expect(gitHubAuthSpy.callCount).to.equal(0); + gh.getGitHub(); + expect(gitHubAuthSpy.callCount).to.equal(1); + }); + + it('should not authenticate if a token is not present', () => { + const gh = new GitHub(); + expect(gitHubAuthSpy.callCount).to.equal(0); + gh.getGitHub(); + expect(gitHubAuthSpy.callCount).to.equal(0); + }); + + it('should throw an exception if a token is required', () => { + expect(() => { + const gh = new GitHub(null, true); + gh.getGitHub(); + }).to.throw('Please set GITHUB_TOKEN in your environment to access these features'); + }); + }); +}); diff --git a/packages/_old/test/fast/hook_spec.js b/packages/_old/test/fast/hook_spec.js new file mode 100644 index 0000000000..9484fb18c7 --- /dev/null +++ b/packages/_old/test/fast/hook_spec.js @@ -0,0 +1,27 @@ +import { expect } from 'chai'; +import { stub } from 'sinon'; + +import runHook from '../../src/util/hook'; + +const fakeConfig = { + pluginInterface: { + triggerHook: async () => false, + }, +}; + +describe('runHook', () => { + it('should not error when running non existent hooks', async () => { + await runHook(Object.assign({}, fakeConfig), 'magic'); + }); + + it('should not error when running a hook that is not a function', async () => { + await runHook(Object.assign({ hooks: { myHook: 'abc' } }, fakeConfig), 'abc'); + }); + + it('should run the hook if it is provided as a function', async () => { + const myStub = stub(); + myStub.returns(Promise.resolve()); + await runHook(Object.assign({ hooks: { myHook: myStub } }, fakeConfig), 'myHook'); + expect(myStub.callCount).to.equal(1); + }); +}); diff --git a/packages/_old/test/fast/install-dependencies_spec.js b/packages/_old/test/fast/install-dependencies_spec.js new file mode 100644 index 0000000000..cc714f43d9 --- /dev/null +++ b/packages/_old/test/fast/install-dependencies_spec.js @@ -0,0 +1,99 @@ +import { expect } from 'chai'; +import proxyquire from 'proxyquire'; +import sinon from 'sinon'; + +describe('Install dependencies', () => { + let install; + let spawnSpy; + let hasYarnSpy; + let spawnPromise; + let spawnPromiseResolve; + let spawnPromiseReject; + + beforeEach(() => { + spawnSpy = sinon.stub(); + spawnPromise = new Promise((resolve, reject) => { + spawnPromiseResolve = resolve; + spawnPromiseReject = reject; + }); + spawnSpy.returns(spawnPromise); + hasYarnSpy = sinon.stub(); + install = proxyquire.noCallThru().load('../../src/util/install-dependencies', { + './yarn-or-npm': { + yarnOrNpmSpawn: spawnSpy, + hasYarn: hasYarnSpy, + }, + }).default; + }); + + it('should immediately resolve if no deps are provided', async () => { + await install('mydir', []); + expect(spawnSpy.callCount).to.equal(0); + }); + + it('should reject if reject the promise if exit code is not 0', (done) => { + const p = install('void', ['electron']); + p.then(() => done(new Error('expected install to be rejected'))) + .catch(() => done()); + spawnPromiseReject(); + }); + + it('should resolve if reject the promise if exit code is 0', (done) => { + const p = install('void', ['electron']); + p.then(() => done()) + .catch(() => done(new Error('expected install to be resolved'))); + spawnPromiseResolve(); + }); + + describe('with yarn', () => { + beforeEach(() => { + hasYarnSpy.returns(true); + }); + + it('should install prod deps', () => { + install('mydir', ['react']); + expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['add', 'react']); + }); + + it('should install dev deps', () => { + install('mydir', ['eslint'], true); + expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['add', 'eslint', '--dev']); + }); + + it('should install exact deps', () => { + install('mydir', ['react-dom'], false, true); + expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['add', 'react-dom', '--exact']); + }); + + it('should install exact dev deps', () => { + install('mydir', ['mocha'], true, true); + expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['add', 'mocha', '--dev', '--exact']); + }); + }); + + describe('with npm', () => { + beforeEach(() => { + hasYarnSpy.returns(false); + }); + + it('should install prod deps', () => { + install('mydir', ['react']); + expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['install', 'react', '--save']); + }); + + it('should install dev deps', () => { + install('mydir', ['eslint'], true); + expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['install', 'eslint', '--save-dev']); + }); + + it('should install exact deps', () => { + install('mydir', ['react-dom'], false, true); + expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['install', 'react-dom', '--save-exact', '--save']); + }); + + it('should install exact dev deps', () => { + install('mydir', ['mocha'], true, true); + expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['install', 'mocha', '--save-exact', '--save-dev']); + }); + }); +}); diff --git a/packages/api/core/test/fast/makers/appx_spec.js b/packages/_old/test/fast/makers/appx_spec.js similarity index 100% rename from packages/api/core/test/fast/makers/appx_spec.js rename to packages/_old/test/fast/makers/appx_spec.js diff --git a/packages/api/core/test/fast/makers/deb_spec.js b/packages/_old/test/fast/makers/deb_spec.js similarity index 100% rename from packages/api/core/test/fast/makers/deb_spec.js rename to packages/_old/test/fast/makers/deb_spec.js diff --git a/packages/api/core/test/fast/makers/dmg_spec.js b/packages/_old/test/fast/makers/dmg_spec.js similarity index 100% rename from packages/api/core/test/fast/makers/dmg_spec.js rename to packages/_old/test/fast/makers/dmg_spec.js diff --git a/packages/api/core/test/fast/makers/flatpak_spec.js b/packages/_old/test/fast/makers/flatpak_spec.js similarity index 100% rename from packages/api/core/test/fast/makers/flatpak_spec.js rename to packages/_old/test/fast/makers/flatpak_spec.js diff --git a/packages/api/core/test/fast/makers/rpm_spec.js b/packages/_old/test/fast/makers/rpm_spec.js similarity index 100% rename from packages/api/core/test/fast/makers/rpm_spec.js rename to packages/_old/test/fast/makers/rpm_spec.js diff --git a/packages/api/core/test/fast/makers/snap_spec.js b/packages/_old/test/fast/makers/snap_spec.js similarity index 100% rename from packages/api/core/test/fast/makers/snap_spec.js rename to packages/_old/test/fast/makers/snap_spec.js diff --git a/packages/api/core/test/fast/makers_spec.js b/packages/_old/test/fast/makers_spec.js similarity index 100% rename from packages/api/core/test/fast/makers_spec.js rename to packages/_old/test/fast/makers_spec.js diff --git a/packages/_old/test/fast/ora-handler_spec.js b/packages/_old/test/fast/ora-handler_spec.js new file mode 100644 index 0000000000..5825a0a264 --- /dev/null +++ b/packages/_old/test/fast/ora-handler_spec.js @@ -0,0 +1,115 @@ +import { expect } from 'chai'; +import proxyquire from 'proxyquire'; +import sinon from 'sinon'; + +describe('asyncOra', () => { + let asyncOra; + let MockOra; + let currentOra; + + beforeEach(() => { + currentOra = undefined; + MockOra = (text) => { + currentOra = { + start() { + this.started = true; + return currentOra; + }, + succeed() { + this.succeeded = true; + return currentOra; + }, + fail() { + this.failed = true; + return currentOra; + }, + get text() { + return currentOra._text; + }, + set text(newText) { + currentOra._text = newText; + }, + }; + currentOra.succeeded = false; + currentOra.failed = false; + currentOra._text = text; + return currentOra; + }; + asyncOra = proxyquire.noCallThru().load('../../src/util/ora-handler', { + './ora': MockOra, + }).default; + }); + + it('should create an ora with an initial value', () => { + asyncOra('say this first', async () => {}); + expect(currentOra).to.not.equal(undefined); + expect(currentOra.text).to.equal('say this first'); + }); + + it('should not create an ora when in non-interactive mode', () => { + asyncOra.interactive = false; + asyncOra('say this again', async () => {}); + expect(currentOra).to.equal(undefined); + }); + + it('should call the provided async function', async () => { + const spy = sinon.spy(); + await asyncOra('random text', async () => { + spy(); + }); + expect(spy.callCount).to.equal(1); + }); + + it('should succeed the ora if the async fn passes', async () => { + await asyncOra('random text', async () => { + if (2 + 2 === 5) console.error('Big brother is at it again'); // eslint-disable-line + }); + expect(currentOra.succeeded).to.equal(true); + expect(currentOra.failed).to.equal(false); + }); + + it('should fail the ora if the async fn throws', async () => { + await asyncOra('this is gonna end badly', async () => { + throw { message: 'Not an error', stack: 'No Stack - Not an error' }; // eslint-disable-line + }, () => {}); + expect(currentOra.succeeded).to.equal(false); + expect(currentOra.failed).to.equal(true); + }); + + it('should exit the process with status 1 if the async fn throws', async () => { + const processExitSpy = sinon.spy(); + await asyncOra('this is dodge', async () => { + throw 'woops'; // eslint-disable-line + }, processExitSpy); + expect(processExitSpy.callCount).to.equal(1); + expect(processExitSpy.firstCall.args).to.deep.equal([1]); + }); + + it('should exit the process with status 1 if the async fn throws a number', async () => { + const processExitSpy = sinon.spy(); + await asyncOra('this is dodge', async () => { + throw 42; // eslint-disable-line + }, processExitSpy); + expect(processExitSpy.callCount).to.equal(1); + expect(processExitSpy.firstCall.args).to.deep.equal([1]); + }); + + it('should just reject the promise in non-interactive mode if the fn throws', (done) => { + asyncOra.interactive = false; + asyncOra('doo-wop', async () => { + throw new Error('uh oh'); + }).then(() => done(new Error('expected asyncOra to be rejected'))) + .catch(() => done()); + }); + + it('should provide a fully functioning mock ora in non-interactive mode', async () => { + asyncOra.interactive = false; + await asyncOra('ora-magic', async (spinner) => { + expect(spinner).to.have.property('start'); + expect(spinner).to.have.property('stop'); + expect(spinner).to.have.property('succeed'); + expect(spinner).to.have.property('fail'); + expect(spinner.start().stop().fail().succeed()).to.equal(spinner); + }); + }); +}); diff --git a/packages/_old/test/fast/out-dir_spec.js b/packages/_old/test/fast/out-dir_spec.js new file mode 100644 index 0000000000..eaf61256ee --- /dev/null +++ b/packages/_old/test/fast/out-dir_spec.js @@ -0,0 +1,26 @@ +import { expect } from 'chai'; +import path from 'path'; + +import getCurrentOutDir from '../../src/util/out-dir'; + +describe('out-dir', () => { + const DIR = __dirname; + + describe('getCurrentOutDir', () => { + it('resolves to the default out directory when nothing extra is declared', () => { + expect(getCurrentOutDir(DIR, {})).to.equal(`${DIR}${path.sep}out`); + }); + + it('resolves to the provided identifier', () => { + expect(getCurrentOutDir(DIR, { + buildIdentifier: 'bar', + })).to.equal(`${DIR}${path.sep}out${path.sep}bar`); + }); + + it('resolves to the return value of provided identifier getter', () => { + expect(getCurrentOutDir(DIR, { + buildIdentifier: () => 'thing', + })).to.equal(`${DIR}${path.sep}out${path.sep}thing`); + }); + }); +}); diff --git a/packages/_old/test/fast/parse-archs_spec.js b/packages/_old/test/fast/parse-archs_spec.js new file mode 100644 index 0000000000..931b7d3fe0 --- /dev/null +++ b/packages/_old/test/fast/parse-archs_spec.js @@ -0,0 +1,21 @@ +import { expect } from 'chai'; + +import parseArchs from '../../src/util/parse-archs'; + +describe('parse-archs', () => { + it('should make an Array out of one arch', () => { + expect(parseArchs('linux', 'x64', '1.7.0')).to.deep.equal(['x64']); + }); + + it('should transform comma-separated values into an Array', () => { + expect(parseArchs('linux', 'ia32,x64', '1.7.0')).to.deep.equal(['ia32', 'x64']); + }); + + it('should use the official Electron arch list when arch is "all"', () => { + expect(parseArchs('win32', 'all', '1.7.0')).to.deep.equal(['ia32', 'x64']); + }); + + it('should default to [x64] when the platform is unknown', () => { + expect(parseArchs('nonexistent', 'all', '1.7.0')).to.deep.equal(['x64']); + }); +}); diff --git a/packages/_old/test/fast/publish_spec.js b/packages/_old/test/fast/publish_spec.js new file mode 100644 index 0000000000..67a4f6f3bc --- /dev/null +++ b/packages/_old/test/fast/publish_spec.js @@ -0,0 +1,234 @@ +import chai, { expect } from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import fs from 'fs-extra'; +import os from 'os'; +import path from 'path'; +import proxyquire from 'proxyquire'; +import sinon from 'sinon'; + +chai.use(chaiAsPromised); + +describe('publish', () => { + let publish; + let makeStub; + let requireSearchStub; + let resolveStub; + let publisherSpy; + + beforeEach(() => { + requireSearchStub = sinon.stub(); + resolveStub = sinon.stub(); + makeStub = sinon.stub(); + publisherSpy = sinon.stub(); + + publish = proxyquire.noCallThru().load('../../src/api/publish', { + './make': async (...args) => makeStub(...args), + '../util/resolve-dir': async dir => resolveStub(dir), + '../util/read-package-json': () => Promise.resolve(require('../fixture/dummy_app/package.json')), + '../util/forge-config': () => require('../../src/util/forge-config').default(path.resolve(__dirname, '../fixture/dummy_app')), + '../util/require-search': requireSearchStub, + }).default; + + publisherSpy.returns(Promise.resolve()); + requireSearchStub.returns(publisherSpy); + resolveStub.returns(path.resolve(__dirname, '../fixture/dummy_app')); + makeStub.returns([]); + }); + + it('should should call make with makeOptions', async () => { + await publish({ + dir: __dirname, + interactive: false, + }); + expect(makeStub.callCount).to.equal(1); + }); + + it('should call the resolved publisher with the appropriate args', async () => { + makeStub.returns([{ artifacts: ['artifact1', 'artifact2'] }]); + await publish({ + dir: __dirname, + interactive: false, + authToken: 'my_token', + tag: 'my_special_tag', + }); + expect(publisherSpy.callCount).to.equal(1); + // pluginInterface will be a new instance so we ignore it + delete publisherSpy.firstCall.args[0].forgeConfig.pluginInterface; + const testConfig = await require('../../src/util/forge-config').default(path.resolve(__dirname, '../fixture/dummy_app')); + + delete testConfig.pluginInterface; + expect(publisherSpy.firstCall.args).to.deep.equal([{ + dir: resolveStub(), + artifacts: ['artifact1', 'artifact2'], + packageJSON: require('../fixture/dummy_app/package.json'), + forgeConfig: testConfig, + authToken: 'my_token', + tag: 'my_special_tag', + platform: process.platform, + arch: process.arch, + }]); + }); + + it('should default to publishing to github', async () => { + await publish({ + dir: __dirname, + interactive: false, + }); + expect(requireSearchStub.firstCall.args[1][0]).to.equal('../publishers/github.js'); + }); + + it('should resolve publishers when given a string name', async () => { + await publish({ + dir: __dirname, + interactive: false, + publishTargets: ['void'], + }); + expect(requireSearchStub.firstCall.args[1][0]).to.equal('../publishers/void.js'); + }); + + it('should resolve consecutive publishers when given an array of names', async () => { + await publish({ + dir: __dirname, + interactive: false, + publishTargets: ['void', 'nowhere', 'black_hole', 'everywhere'], + }); + expect(requireSearchStub.getCall(0).args[1][0]).to.equal('../publishers/void.js'); + expect(requireSearchStub.getCall(1).args[1][0]).to.equal('../publishers/nowhere.js'); + expect(requireSearchStub.getCall(2).args[1][0]).to.equal('../publishers/black_hole.js'); + expect(requireSearchStub.getCall(3).args[1][0]).to.equal('../publishers/everywhere.js'); + }); + + describe('dry run', () => { + let dir; + + const fakeMake = (platform) => { + const ret = [ + { artifacts: [ + path.resolve(dir, `out/make/artifact1-${platform}`), + path.resolve(dir, `out/make/artifact2-${platform}`), + ] }, { artifacts: [ + path.resolve(dir, `out/make/artifact3-${platform}`), + ] }, + { artifacts: [ + path.resolve(dir, `out/make/artifact4-${platform}`), + ] }, + ]; + const state = { + platform, + arch: 'x64', + packageJSON: { state: platform === 'darwin' ? 1 : 0 }, + }; + Object.assign(ret[0], state); + Object.assign(ret[1], state); + Object.assign(ret[2], state); + return ret; + }; + + before(async () => { + dir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'electron-forge-test-')); + }); + + describe('when creating a dry run', () => { + beforeEach(async () => { + makeStub.returns(fakeMake('darwin')); + const dryPath = path.resolve(dir, 'out', 'publish-dry-run'); + await fs.mkdirs(dryPath); + await fs.writeFile(path.resolve(dryPath, 'hash.json'), 'test'); + await publish({ + dir, + interactive: false, + target: [], + dryRun: true, + }); + expect(await fs.exists(path.resolve(dryPath, 'hash.json'))).to.equal(false, 'previous hashes should be erased'); + const backupDir = path.resolve(dir, 'out', 'backup'); + await fs.move(dryPath, backupDir); + makeStub.returns(fakeMake('win32')); + await publish({ + dir, + interactive: false, + target: [], + dryRun: true, + }); + for (const backedUp of await fs.readdir(backupDir)) { + await fs.copy(path.resolve(backupDir, backedUp), path.resolve(dryPath, backedUp)); + } + }); + + it('should create dry run hash JSON files', async () => { + expect(makeStub.callCount).to.equal(2); + const dryRunFolder = path.resolve(dir, 'out', 'publish-dry-run'); + expect(await fs.exists(dryRunFolder)).to.equal(true); + + const hashFolders = await fs.readdir(dryRunFolder); + expect(hashFolders).to.have.length(2, 'Should contain two hashes (two publishes)'); + for (const hashFolderName of hashFolders) { + const hashFolder = path.resolve(dryRunFolder, hashFolderName); + const makes = await fs.readdir(hashFolder); + expect(makes).to.have.length(3, 'Should contain the results of three makes'); + for (const makeJson of makes) { + const jsonPath = path.resolve(hashFolder, makeJson); + const contents = await fs.readFile(jsonPath, 'utf8'); + expect(() => JSON.parse(contents), 'Should be valid JSON').to.not.throw(); + const data = JSON.parse(contents); + expect(data).to.have.property('artifacts'); + expect(data).to.have.property('platform'); + expect(data).to.have.property('arch'); + expect(data).to.have.property('packageJSON'); + + // Make the artifacts for later + for (const artifactPath of data.artifacts) { + await fs.mkdirp(path.dirname(path.resolve(dir, artifactPath))); + await fs.writeFile(path.resolve(dir, artifactPath), artifactPath); + } + } + } + }); + }); + + describe('when resuming a dry run', () => { + let publisher; + + beforeEach(async () => { + publisher = sinon.stub(); + publisher.returns(Promise.resolve()); + requireSearchStub.returns(publisher); + await publish({ + dir, + interactive: false, + target: [__filename], + dryRunResume: true, + }); + }); + + it('should successfully restore values and pass them to publisher', () => { + expect(makeStub.callCount).to.equal(0); + expect(publisher.callCount).to.equal(2, 'should call once for each platform (make run)'); + const darwinIndex = publisher.firstCall.args[0].platform === 'darwin' ? 0 : 1; + const win32Index = darwinIndex === 0 ? 1 : 0; + const darwinArgs = publisher.getCall(darwinIndex).args[0]; + expect(darwinArgs.artifacts.sort()).to.deep.equal( + fakeMake('darwin').reduce((accum, val) => accum.concat(val.artifacts), []).sort() + ); + expect(darwinArgs.packageJSON).to.deep.equal({ state: 1 }); + expect(darwinArgs.authToken).to.equal(undefined); + expect(darwinArgs.tag).to.equal(null); + expect(darwinArgs.platform).to.equal('darwin'); + expect(darwinArgs.arch).to.equal('x64'); + const win32Args = publisher.getCall(win32Index).args[0]; + expect(win32Args.artifacts.sort()).to.deep.equal( + fakeMake('win32').reduce((accum, val) => accum.concat(val.artifacts), []).sort() + ); + expect(win32Args.packageJSON).to.deep.equal({ state: 0 }); + expect(win32Args.authToken).to.equal(undefined); + expect(win32Args.tag).to.equal(null); + expect(win32Args.platform).to.equal('win32'); + expect(win32Args.arch).to.equal('x64'); + }); + }); + + after(async () => { + await fs.remove(dir); + }); + }); +}); diff --git a/packages/_old/test/fast/read-package-json_spec.js b/packages/_old/test/fast/read-package-json_spec.js new file mode 100644 index 0000000000..3f1d4ca5d3 --- /dev/null +++ b/packages/_old/test/fast/read-package-json_spec.js @@ -0,0 +1,10 @@ +import path from 'path'; +import { expect } from 'chai'; + +import readPackageJSON from '../../src/util/read-package-json'; + +describe('read-package-json', () => { + it('should find a package.json file from the given directory', async () => { + expect(await readPackageJSON(path.resolve(__dirname, '../..'))).to.deep.equal(require('../..//package.json')); + }); +}); diff --git a/packages/_old/test/fast/require-search_spec.js b/packages/_old/test/fast/require-search_spec.js new file mode 100644 index 0000000000..497361d240 --- /dev/null +++ b/packages/_old/test/fast/require-search_spec.js @@ -0,0 +1,16 @@ +import { expect } from 'chai'; + +import requireSearch from '../../src/util/require-search'; +import findConfig from '../../src/util/forge-config'; + +describe('require-search', () => { + it('should resolve undefined if no file exists', () => { + const resolved = requireSearch(__dirname, ['../../src/util/wizard-secrets']); + expect(resolved).to.equal(undefined); + }); + + it('should resolve a file if it exists', () => { + const resolved = requireSearch(__dirname, ['../../src/util/forge-config']); + expect(resolved).to.equal(findConfig); + }); +}); diff --git a/packages/_old/test/fast/resolve-dir_spec.js b/packages/_old/test/fast/resolve-dir_spec.js new file mode 100644 index 0000000000..5aee25e799 --- /dev/null +++ b/packages/_old/test/fast/resolve-dir_spec.js @@ -0,0 +1,15 @@ +import { expect } from 'chai'; +import path from 'path'; + +import resolveDir from '../../src/util/resolve-dir'; + +describe('resolve-dir', () => { + it('should return null if a valid dir can not be found', async () => { + expect(await resolveDir('/foo/var/fake')).to.be.equal(null); + }); + + it('should return a directory if it finds a node module', async () => { + expect(await resolveDir(path.resolve(__dirname, '../fixture/dummy_app/foo'))).to.not.be.equal(null); + expect(await resolveDir(path.resolve(__dirname, '../fixture/dummy_app/foo'))).to.be.equal(path.resolve(__dirname, '../fixture/dummy_app')); + }); +}); diff --git a/packages/_old/test/fast/start_spec.js b/packages/_old/test/fast/start_spec.js new file mode 100644 index 0000000000..c6094bb4e0 --- /dev/null +++ b/packages/_old/test/fast/start_spec.js @@ -0,0 +1,208 @@ +import chai, { expect } from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import path from 'path'; +import proxyquire from 'proxyquire'; +import sinon from 'sinon'; + +chai.use(chaiAsPromised); + +describe('start', () => { + let start; + let packageJSON; + let resolveStub; + let spawnStub; + let shouldOverride; + + beforeEach(() => { + resolveStub = sinon.stub(); + spawnStub = sinon.stub(); + shouldOverride = false; + packageJSON = require('../fixture/dummy_app/package.json'); + + start = proxyquire.noCallThru().load('../../src/api/start', { + '../util/forge-config': async () => ({ + pluginInterface: { + overrideStartLogic: async () => shouldOverride, + triggerHook: async () => false, + }, + }), + '../util/resolve-dir': async dir => resolveStub(dir), + '../util/read-package-json': () => Promise.resolve(packageJSON), + '../util/rebuild': () => Promise.resolve(), + child_process: { + spawn: spawnStub, + }, + }).default; + }); + + it('should spawn electron in the correct dir', async () => { + resolveStub.returnsArg(0); + await start({ + dir: __dirname, + interactive: false, + }); + expect(spawnStub.callCount).to.equal(1); + expect(spawnStub.firstCall.args[0]).to.equal(process.execPath); + expect(spawnStub.firstCall.args[1][0]).to.contain(`electron${path.sep}cli`); + expect(spawnStub.firstCall.args[2]).to.have.property('cwd', __dirname); + expect(spawnStub.firstCall.args[2].env).to.not.have.property('ELECTRON_ENABLE_LOGGING'); + }); + + it('should not spawn if a plugin overrides the start command', async () => { + resolveStub.returnsArg(0); + shouldOverride = true; + await start({ + dir: __dirname, + interactive: false, + }); + expect(spawnStub.callCount).to.equal(0); + }); + + it("should pass electron '.' as the app path if not specified", async () => { + resolveStub.returnsArg(0); + await start({ + dir: __dirname, + }); + expect(spawnStub.callCount).to.equal(1); + expect(spawnStub.firstCall.args[0]).to.equal(process.execPath); + expect(spawnStub.firstCall.args[1][0]).to.contain(`electron${path.sep}cli`); + expect(spawnStub.firstCall.args[1][1]).to.equal('.'); + }); + + it('should pass electron the app path if specified', async () => { + resolveStub.returnsArg(0); + await start({ + dir: __dirname, + appPath: '/path/to/app.js', + }); + expect(spawnStub.callCount).to.equal(1); + expect(spawnStub.firstCall.args[0]).to.equal(process.execPath); + expect(spawnStub.firstCall.args[1][0]).to.contain(`electron${path.sep}cli`); + expect(spawnStub.firstCall.args[1][1]).to.equal('/path/to/app.js'); + }); + + it('should enable electron logging if enableLogging=true', async () => { + resolveStub.returnsArg(0); + await start({ + dir: __dirname, + interactive: false, + enableLogging: true, + }); + expect(spawnStub.callCount).to.equal(1); + expect(spawnStub.firstCall.args[0]).to.equal(process.execPath); + expect(spawnStub.firstCall.args[1][0]).to.contain(`electron${path.sep}cli`); + expect(spawnStub.firstCall.args[2].env).to.have.property('ELECTRON_ENABLE_LOGGING', true); + }); + + it('should enable RUN_AS_NODE if runAsNode=true', async () => { + resolveStub.returnsArg(0); + await start({ + dir: __dirname, + interactive: false, + runAsNode: true, + }); + expect(spawnStub.callCount).to.equal(1); + expect(spawnStub.firstCall.args[2].env).to.have.property('ELECTRON_RUN_AS_NODE', true); + }); + + it('should disable RUN_AS_NODE if runAsNode=false', async () => { + resolveStub.returnsArg(0); + await start({ + dir: __dirname, + interactive: false, + runAsNode: false, + }); + expect(spawnStub.callCount).to.equal(1); + expect(spawnStub.firstCall.args[2].env).to.not.have.property('ELECTRON_RUN_AS_NODE'); + }); + + it('should throw if no dir could be found', async () => { + resolveStub.returns(null); + + await expect(start()).to.eventually.be.rejectedWith( + 'Failed to locate startable Electron application' + ); + }); + + it('should throw if no version is in package.json', async () => { + resolveStub.returnsArg(0); + packageJSON = Object.assign({}, packageJSON); + delete packageJSON.version; + await expect(start({ + dir: __dirname, + interactive: false, + })).to.eventually.be.rejectedWith( + `Please set your application's 'version' in '${__dirname}/package.json'.` + ); + }); + + it('should pass all args through to the spawned Electron instance', async () => { + const args = ['magic_arg', 123, 'thingy']; + resolveStub.returnsArg(0); + spawnStub.returns(0); + await start({ + dir: __dirname, + interactive: false, + args, + }); + expect(spawnStub.callCount).to.equal(1); + expect(spawnStub.firstCall.args[0]).to.equal(process.execPath); + expect(spawnStub.firstCall.args[1].slice(2)).to.deep.equal(args); + }); + + it('should pass --inspect at the start of the args if inspect is set', async () => { + const args = ['magic']; + resolveStub.returnsArg(0); + spawnStub.returns(0); + await start({ + dir: __dirname, + interactive: false, + args, + inspect: true, + }); + expect(spawnStub.callCount).to.equal(1); + expect(spawnStub.firstCall.args[0]).to.equal(process.execPath); + expect(spawnStub.firstCall.args[1].slice(2)).to.deep.equal(['--inspect'].concat(args)); + }); + + it('should resolve with a handle to the spawned instance', async () => { + resolveStub.returnsArg(0); + spawnStub.returns('child'); + + await expect(start({ + dir: __dirname, + interactive: false, + enableLogging: true, + })).to.eventually.equal('child'); + }); + + describe('cli', () => { + let argv; + let childExitCode; + let childStub; + beforeEach(() => { + argv = process.argv; + childExitCode = 0; + childStub = { + on: (event, cb) => cb(childExitCode), + }; + }); + + it('should remove all "~" from args when in VSCode debug mode', (done) => { + process.argv = [argv[0], '--vscode', '--', '--foo', 'bar', 'this arg exists']; + proxyquire.noCallThru().load('../../src/electron-forge-start', { + './api': { + start: (startOptions) => { + expect(startOptions.args).to.deep.equal(['--foo', 'bar', 'this arg exists']); + done(); + return Promise.resolve(childStub); + }, + }, + }); + }); + + afterEach(() => { + process.argv = argv; + }); + }); +}); diff --git a/packages/api/core/test/fast/system_spec.js b/packages/_old/test/fast/system_spec.js similarity index 100% rename from packages/api/core/test/fast/system_spec.js rename to packages/_old/test/fast/system_spec.js diff --git a/packages/_old/test/fast/yarn-or-npm_spec.js b/packages/_old/test/fast/yarn-or-npm_spec.js new file mode 100644 index 0000000000..cb05ce0edc --- /dev/null +++ b/packages/_old/test/fast/yarn-or-npm_spec.js @@ -0,0 +1,39 @@ +import { expect } from 'chai'; + +import systemYarnOrNpm from 'yarn-or-npm'; +import yarnOrNpm from '../../src/util/yarn-or-npm'; + +describe('yarn-or-npm', () => { + let nodeInstaller; + + beforeEach(() => { + nodeInstaller = process.env.NODE_INSTALLER; + }); + + afterEach(() => { + if (!nodeInstaller) { + delete process.env.NODE_INSTALLER; + } else { + process.env.NODE_INSTALLER = nodeInstaller; + } + }); + + it('should by default equal the system yarn-or-npm value', () => { + expect(yarnOrNpm()).to.be.equal(systemYarnOrNpm()); + }); + + it('should return yarn if NODE_INSTALLER=yarn', () => { + process.env.NODE_INSTALLER = 'yarn'; + expect(yarnOrNpm()).to.be.equal('yarn'); + }); + + it('should return npm if NODE_INSTALLER=npm', () => { + process.env.NODE_INSTALLER = 'npm'; + expect(yarnOrNpm()).to.be.equal('npm'); + }); + + it('should return system value if NODE_INSTALLER is an unrecognized installer', () => { + process.env.NODE_INSTALLER = 'magical_unicorn'; + expect(yarnOrNpm()).to.be.equal(systemYarnOrNpm()); + }); +}); diff --git a/packages/_old/test/fixture/bogus-private-key.pvk b/packages/_old/test/fixture/bogus-private-key.pvk new file mode 100755 index 0000000000000000000000000000000000000000..0563d8d94ab28566fc57f88198e582c4e7abf506 GIT binary patch literal 1196 zcmV;d1XKGS@wKo30000200000000000001#1ONaB0ssI2Bme+XQ$aES2mk;90097f zwK~)y7g0gw!X1_#s-lgcvdUCGPLyP1qC}W!*f^1Qlxw=jlm>Ok&AICR^<^6iiC+vM zx+92@CRCEta0R*BW}o56l^Sz^85eXeVv4A=E^h|?r zCVOZg#;Qf_rUy;Rhaij7jRVf+6edkufn(^4P*jn^op33t;T3-^5r%@)MKB&>gcX&^ zs(Wg?9(Yuz8x1uhK1sIcyeK5Dbbp6LQv9W**1^KTRPKSr)MUbsD6W~M_BG8Rv2_tN z_O5FM48@D6F7@O%FnBL&L?PTsX=FR*!mi~CgZ{-jT4tEi%~Yf34!Ut8)*rH6so^5$ z4u278Y2j$cp(8J;aE6PO8I_F;M_I7;QIv$!oatmSR(yyD8U;rF+Zs8{C`hFQ)4xExw95wh5-vDJA^&4cC^MN7?Jk;CpDps z-hrfB`K(=ZCAttLt*8=CB0v!z3JVRnhuJuQjv?ko>L3HrdBsfnmRgvT>H3kO!JFVS z66ktJm~rORTS$LI93)RnRLa?aWw0nO&(1}Gs3uDc!KTqzbNC3kZuh@0nIQTg`V8W4 z%p;#FS0QQuHea|}AV(A-j~a3sf$Eg|t3b4X@GsWubil|j6Oi(CB-I6T9+3}_R-vv6 zhUQP6w1B&?iji1x?l$;nDwvtKaunbqUu$a6Uv;I+&+uS?%r4A2vy)wu%sY2tTr|^l zno*Z_Aj<;zKndPJST-?b4}jjrn8>h;o#qF#it?J;Eq4p;6XPH1;I7}h0U2e$^m`?f=G->oNSzUS=`w z#=GZsN9X&qVIm9k+OUt-!V=;DQhOHZ%Uy9ft|Ok5bX!Ow(l5<#Z9WskwPMZD*%iI{b8g; zePjqmpd`BH9w>~h)hktQ(tQC3WwAdguGPi#?ASM#N;}Uhg{)t7 zOcxyA84`zQqC;JoyZ|gMqom7VxzIVnc~sqic|KX~37j`si83X2AS*ku-XnDh6|qla z!?~x+n?ir1d-tSoXpjdK&dWU%7jsnDSTF)t9y_s|0LAZTDcX1FalS_1KVbeUXwP~} KDkb}Rv&aXl$ue93 literal 0 HcmV?d00001 diff --git a/packages/_old/test/fixture/custom_init/index.js b/packages/_old/test/fixture/custom_init/index.js new file mode 100644 index 0000000000..19ef99c50a --- /dev/null +++ b/packages/_old/test/fixture/custom_init/index.js @@ -0,0 +1,8 @@ +const path = require('path'); + +module.exports = { + dependencies: ['react'], + devDependencies: ['react-dom'], + templateDirectory: path.resolve(__dirname, './tmpl'), + postCopy: (initDir, ora, lintStyle) => {}, // eslint-disable-line +}; diff --git a/packages/_old/test/fixture/custom_init/package.json b/packages/_old/test/fixture/custom_init/package.json new file mode 100644 index 0000000000..6c00e3a5ac --- /dev/null +++ b/packages/_old/test/fixture/custom_init/package.json @@ -0,0 +1,12 @@ +{ + "name": "electron-forge-template-dummy", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "start": "electron-forge start" + }, + "keywords": [], + "author": "", + "license": "MIT" +} diff --git a/packages/_old/test/fixture/custom_init/tmpl/_bar b/packages/_old/test/fixture/custom_init/tmpl/_bar new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/_old/test/fixture/custom_init/tmpl/src/foo.js b/packages/_old/test/fixture/custom_init/tmpl/src/foo.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/_old/test/fixture/dummy_app/foo/null b/packages/_old/test/fixture/dummy_app/foo/null new file mode 100644 index 0000000000..e69de29bb2 diff --git a/packages/_old/test/fixture/dummy_app/package.json b/packages/_old/test/fixture/dummy_app/package.json new file mode 100644 index 0000000000..7d60780d49 --- /dev/null +++ b/packages/_old/test/fixture/dummy_app/package.json @@ -0,0 +1,34 @@ +{ + "name": "", + "productName": "", + "version": "1.0.0", + "description": "", + "main": "src/index.js", + "scripts": { + "start": "electron-forge start" + }, + "keywords": [], + "author": "", + "license": "MIT", + "config": { + "forge": { + "make_targets": { + "win32": ["squirrel", "appx"], + "darwin": ["zip"], + "linux": ["deb", "rpm"] + }, + "electronPackagerConfig": {}, + "electronInstallerRedhat": {}, + "electronInstallerDebian": {}, + "electronWinstallerConfig": { "windows": "magic" }, + "windowsStoreConfig": { "packageName": "test" }, + "github_repository": { + "owner": "dummy", + "name": "project" + } + } + }, + "devDependencies": { + "electron": "9.9.9" + } +} diff --git a/packages/_old/test/fixture/dummy_js_conf/forge.config.js b/packages/_old/test/fixture/dummy_js_conf/forge.config.js new file mode 100644 index 0000000000..e24e909eff --- /dev/null +++ b/packages/_old/test/fixture/dummy_js_conf/forge.config.js @@ -0,0 +1,13 @@ +module.exports = { + make_targets: { + win32: ['squirrel', 'appx'], + darwin: ['zip'], + linux: ['deb', 'rpm'], + mas: ['zip'], + }, + electronPackagerConfig: { foo: 'bar', baz: {} }, + electronWinstallerConfig: {}, + electronInstallerDebian: {}, + electronInstallerRedhat: {}, + magicFn: () => 'magic result', +}; diff --git a/packages/_old/test/fixture/dummy_js_conf/package.json b/packages/_old/test/fixture/dummy_js_conf/package.json new file mode 100644 index 0000000000..ebd70b7b87 --- /dev/null +++ b/packages/_old/test/fixture/dummy_js_conf/package.json @@ -0,0 +1,19 @@ +{ + "name": "", + "productName": "", + "version": "1.0.0", + "description": "", + "main": "src/index.js", + "scripts": { + "start": "electron-forge start" + }, + "keywords": [], + "author": "", + "license": "MIT", + "config": { + "forge": "./forge.config.js" + }, + "devDependencies": { + "electron-prebuilt": "9.9.9" + } +} diff --git a/packages/_old/test/fixture/maker-incompatible.js b/packages/_old/test/fixture/maker-incompatible.js new file mode 100644 index 0000000000..4a26cae2c7 --- /dev/null +++ b/packages/_old/test/fixture/maker-incompatible.js @@ -0,0 +1 @@ +export default async () => 'i don\'t implement isSupportedOnCurrentPlatform()'; diff --git a/packages/_old/test/fixture/maker-unsupported.js b/packages/_old/test/fixture/maker-unsupported.js new file mode 100644 index 0000000000..bdef2a4c6b --- /dev/null +++ b/packages/_old/test/fixture/maker-unsupported.js @@ -0,0 +1,3 @@ +export const isSupportedOnCurrentPlatform = async () => false; + +export default async () => 'i don\'t support any platforms'; diff --git a/packages/_old/test/fixture/native_app/package.json b/packages/_old/test/fixture/native_app/package.json new file mode 100644 index 0000000000..ac70908278 --- /dev/null +++ b/packages/_old/test/fixture/native_app/package.json @@ -0,0 +1,27 @@ +{ + "name": "native-app", + "productName": "Native App", + "version": "1.0.0", + "description": "", + "main": "src/index.js", + "scripts": { + "start": "electron-forge start" + }, + "keywords": [], + "author": "", + "license": "MIT", + "config": { + "forge": "./forge.config.js" + }, + "devDependencies": { + "ffi": "2.2.0" + }, + "dependencies": { + "ref": "1.3.3", + "benchr": "3.2.0", + "@newrelic/native-metrics": "2.1.1" + }, + "optionalDependencies": { + "zipfile": "0.5.11" + } +} diff --git a/packages/_old/test/mocha.opts b/packages/_old/test/mocha.opts new file mode 100644 index 0000000000..74f680e91e --- /dev/null +++ b/packages/_old/test/mocha.opts @@ -0,0 +1,2 @@ +--require @babel/register +--timeout 300000 diff --git a/packages/_old/test/slow/api_spec_slow.js b/packages/_old/test/slow/api_spec_slow.js new file mode 100644 index 0000000000..4e742b62a1 --- /dev/null +++ b/packages/_old/test/slow/api_spec_slow.js @@ -0,0 +1,371 @@ +import { execSync } from 'child_process'; +import asar from 'asar'; +import fs from 'fs-extra'; +import os from 'os'; +import path from 'path'; + +import { expect } from 'chai'; +import proxyquire from 'proxyquire'; + +import { createDefaultCertificate } from '../../src/makers/win32/appx'; +import installDeps from '../../src/util/install-dependencies'; +import readPackageJSON from '../../src/util/read-package-json'; +import yarnOrNpm from '../../src/util/yarn-or-npm'; + +const nodeInstallerArg = process.argv.find(arg => arg.startsWith('--installer=')) || `--installer=${yarnOrNpm()}`; +const nodeInstaller = nodeInstallerArg.substr(12); +const forge = proxyquire.noCallThru().load('../../src/api', { + './install': async () => {}, +}); + +describe(`electron-forge API (with installer=${nodeInstaller})`, () => { + let dir; + let dirID = Date.now(); + + const ensureTestDirIsNonexistent = async () => { + dir = path.resolve(os.tmpdir(), `electron-forge-test-${dirID}`); + dirID += 1; + await fs.remove(dir); + }; + + const beforeInitTest = (params, beforeInit) => { + before(async () => { + await ensureTestDirIsNonexistent(); + if (beforeInit) { + beforeInit(); + } + await forge.init(Object.assign({}, params, { dir })); + }); + }; + + const expectProjectPathExists = async (subPath, pathType) => { + expect(await fs.pathExists(path.resolve(dir, subPath)), `the ${subPath} ${pathType} should exist`).to.equal(true); + }; + + describe('init', () => { + beforeInitTest(); + + it('should create a new folder with a npm module inside', async () => { + expect(await fs.pathExists(dir), 'the target dir should have been created').to.equal(true); + expectProjectPathExists('package.json', 'file'); + }); + + it('should have initialized a git repository', async () => { + expectProjectPathExists('.git', 'folder'); + }); + + it('should have installed the initial node_modules', async () => { + expectProjectPathExists('node_modules', 'folder'); + expect(await fs.pathExists(path.resolve(dir, 'node_modules/electron')), 'electron should exist').to.equal(true); + expect(await fs.pathExists(path.resolve(dir, 'node_modules/babel-core')), 'babel-core should exist').to.equal(true); + expect(await fs.pathExists(path.resolve(dir, 'node_modules/electron-forge')), 'electron-forge should exist').to.equal(true); + }); + + describe('lint', () => { + it('should initially pass the linting process', () => forge.lint({ dir })); + }); + + after(() => fs.remove(dir)); + }); + + describe('init with CI files enabled', () => { + beforeInitTest({ copyCIFiles: true }); + + it('should copy over the CI config files correctly', async () => { + expect(await fs.pathExists(dir), 'the target dir should have been created').to.equal(true); + expectProjectPathExists('.appveyor.yml', 'file'); + expectProjectPathExists('.travis.yml', 'file'); + }); + }); + + describe('init (with custom templater)', () => { + beforeInitTest({ template: 'dummy' }, () => { + execSync('npm link', { + cwd: path.resolve(__dirname, '../fixture/custom_init'), + }); + }); + + it('should create dot files correctly', async () => { + expect(await fs.pathExists(dir), 'the target dir should have been created').to.equal(true); + expectProjectPathExists('.bar', 'file'); + }); + + it('should create deep files correctly', async () => { + expectProjectPathExists('src/foo.js', 'file'); + }); + + describe('lint', () => { + it('should initially pass the linting process', () => forge.lint({ dir })); + }); + + after(async () => { + await fs.remove(dir); + execSync('npm unlink', { + cwd: path.resolve(__dirname, '../fixture/custom_init'), + }); + }); + }); + + describe('init (with built-in templater)', () => { + before(ensureTestDirIsNonexistent); + + it('should succeed in initializing', async () => { + await forge.init({ + dir, + template: 'react-typescript', + }); + }); + + it('should succeed in initializing an already initialized directory', async () => { + await forge.init({ + dir, + template: 'react-typescript', + }); + }); + + it('should add a dependency on react', async () => { + expect(Object.keys(require(path.resolve(dir, 'package.json')).dependencies)).to.contain('react'); + }); + + after(async () => { + await fs.remove(dir); + }); + }); + + describe('init (with a nonexistent templater)', () => { + before(ensureTestDirIsNonexistent); + + it('should fail in initializing', async () => { + await expect(forge.init({ + dir, + template: 'does-not-exist', + })).to.eventually.be.rejectedWith('Failed to locate custom template'); + }); + + after(async () => { + await fs.remove(dir); + }); + }); + + describe('import', () => { + before(async () => { + await ensureTestDirIsNonexistent(); + await fs.mkdir(dir); + execSync(`${nodeInstaller} init -y`, { + cwd: dir, + }); + }); + + it('creates a forge config', async () => { + const packageJSON = await readPackageJSON(dir); + packageJSON.name = 'Name'; + packageJSON.productName = 'Product Name'; + packageJSON.customProp = 'propVal'; + await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); + + await forge.import({ dir }); + + const { + config: { + forge: { + electronWinstallerConfig: { name: winstallerName }, + windowsStoreConfig: { name: windowsStoreName }, + }, + }, + customProp, + } = await readPackageJSON(dir); + + expect(winstallerName).to.equal('Name'); + expect(windowsStoreName).to.equal('Product Name'); + expect(customProp).to.equal('propVal'); + }); + + it('defaults windowsStoreConfig.name to packageJSON.name', async () => { + const packageJSON = await readPackageJSON(dir); + packageJSON.name = 'Name'; + delete packageJSON.productName; + await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); + + await forge.import({ dir }); + + const { + config: { + forge: { + electronWinstallerConfig: { name: winstallerName }, + windowsStoreConfig: { name: windowsStoreName }, + }, + }, + } = await readPackageJSON(dir); + + expect(winstallerName).to.equal('Name'); + expect(windowsStoreName).to.equal('Name'); + }); + + after(async () => { + await fs.remove(dir); + }); + }); + + describe('after init', () => { + before(async () => { + dir = path.resolve(os.tmpdir(), `electron-forge-test-${dirID}/electron-forge-test`); + dirID += 1; + await forge.init({ dir }); + + const packageJSON = await readPackageJSON(dir); + packageJSON.name = 'testapp'; + packageJSON.productName = 'Test App'; + packageJSON.config.forge.electronPackagerConfig.asar = false; + packageJSON.config.forge.windowsStoreConfig.packageName = 'TestApp'; + if (process.platform === 'win32') { + await fs.copy( + path.join(__dirname, '..', 'fixture', 'bogus-private-key.pvk'), + path.join(dir, 'default.pvk') + ); + packageJSON.config.forge.windowsStoreConfig.devCert = await createDefaultCertificate( + 'CN=Test Author', + { certFilePath: dir } + ); + } + packageJSON.homepage = 'http://www.example.com/'; + packageJSON.author = 'Test Author'; + await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); + }); + + it('can package to outDir without errors', async () => { + const outDir = `${dir}/foo`; + + expect(await fs.pathExists(outDir)).to.equal(false); + + await forge.package({ dir, outDir }); + + expect(await fs.pathExists(outDir)).to.equal(true); + }); + + it('can make from custom outDir without errors', async () => { + const packageJSON = await readPackageJSON(dir); + packageJSON.config.forge.make_targets[process.platform] = ['zip']; + await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); + + await forge.make({ dir, skipPackage: true, outDir: `${dir}/foo` }); + + // Cleanup here to ensure things dont break in the make tests + await fs.remove(path.resolve(dir, 'foo')); + await fs.remove(path.resolve(dir, 'out')); + }); + + it('can package without errors with native pre-gyp deps installed', async () => { + await installDeps(dir, ['ref']); + await forge.package({ dir }); + await fs.remove(path.resolve(dir, 'node_modules/ref')); + }); + + it('can package without errors', async () => { + const packageJSON = await readPackageJSON(dir); + packageJSON.config.forge.electronPackagerConfig.asar = true; + await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); + + await forge.package({ dir }); + }); + + describe('after package', () => { + let resourcesPath = 'Test App.app/Contents/Resources'; + if (process.platform !== 'darwin') { + resourcesPath = 'resources'; + } + + it('should have deleted the forge config from the packaged app', async () => { + const cleanPackageJSON = JSON.parse(asar.extractFile( + path.resolve(dir, 'out', `Test App-${process.platform}-${process.arch}`, resourcesPath, 'app.asar'), + 'package.json' + )); + expect(cleanPackageJSON).to.not.have.nested.property('config.forge'); + }); + + it('should not affect the actual forge config', async () => { + const normalPackageJSON = await readPackageJSON(dir); + expect(normalPackageJSON).to.have.nested.property('config.forge'); + }); + + function getMakers(platform) { + return fs.readdirSync(path.resolve(__dirname, `../../src/makers/${platform}`)).map(file => path.parse(file).name); + } + + const goodMakers = [...getMakers(process.platform), ...getMakers('generic')]; + const badPlatforms = ['darwin', 'linux', 'win32'].filter(p => p !== process.platform); + const badMakers = []; + badPlatforms.forEach(platform => badMakers.push(...getMakers(platform))); + + const testMakeTarget = function testMakeTarget(target, shouldPass, ...options) { + describe(`make (with target=${target})`, async () => { + before(async () => { + const packageJSON = await readPackageJSON(dir); + packageJSON.config.forge.make_targets[process.platform] = [target]; + await fs.writeFile(path.resolve(dir, 'package.json'), JSON.stringify(packageJSON)); + }); + + for (const optionsFetcher of options) { + if (shouldPass) { + it(`successfully makes for config: ${JSON.stringify(optionsFetcher(), 2)}`, async () => { + const outputs = await forge.make(optionsFetcher()); + for (const outputResult of outputs) { + for (const output of outputResult.artifacts) { + expect(await fs.exists(output)).to.equal(true); + } + } + }); + } else { + it(`fails for config: ${JSON.stringify(optionsFetcher(), 2)}`, async () => { + await expect(forge.make(optionsFetcher())).to.eventually.be.rejected; + }); + } + } + }); + }; + + const targetOptionFetcher = () => ({ dir, skipPackage: true }); + for (const maker of goodMakers) { + testMakeTarget(maker, true, targetOptionFetcher); + } + + for (const maker of badMakers) { + testMakeTarget(maker, false, targetOptionFetcher); + } + + describe('make', () => { + it('throws an error when given an unrecognized platform', async () => { + await expect(forge.make({ dir, platform: 'dos' })).to.eventually.be.rejectedWith(/invalid platform/); + }); + + it('throws an error when the specified maker doesn\'t support the current platform', async () => { + const makerPath = `${process.cwd()}/test/fixture/maker-unsupported`; + await expect(forge.make({ + dir, + overrideTargets: [makerPath], + skipPackage: true, + })).to.eventually.be.rejectedWith(/the maker declared that it cannot run/); + }); + + it('throws an error when the specified maker doesn\'t implement isSupportedOnCurrentPlatform()', async () => { + const makerPath = `${process.cwd()}/test/fixture/maker-incompatible`; + await expect(forge.make({ + dir, + overrideTargets: [makerPath], + skipPackage: true, + })).to.eventually.be.rejectedWith(/incompatible with this version/); + }); + + it('can make for the MAS platform successfully', async () => { + if (process.platform !== 'darwin') return; + await expect(forge.make({ + dir, + overrideTargets: ['zip', 'dmg'], + platform: 'mas', + })).to.eventually.have.length(2); + }); + }); + }); + + after(() => fs.remove(dir)); + }); +}); diff --git a/packages/_old/test/slow/install-dependencies_spec_slow.js b/packages/_old/test/slow/install-dependencies_spec_slow.js new file mode 100644 index 0000000000..7d1d547709 --- /dev/null +++ b/packages/_old/test/slow/install-dependencies_spec_slow.js @@ -0,0 +1,23 @@ +import { expect } from 'chai'; +import fs from 'fs-extra'; +import os from 'os'; +import path from 'path'; + +import installDeps from '../../src/util/install-dependencies'; + +if (!(process.platform === 'linux' && process.env.CI)) { + describe('install-dependencies', () => { + const installDir = path.resolve(os.tmpdir(), 'electron-forge-test-install-dependencies'); + + before(async () => { fs.ensureDir(installDir); }); + + it('should install the latest minor version when the dependency has a caret', async () => { + await installDeps(installDir, ['debug@^2.0.0']); + + const packageJSON = require(path.resolve(installDir, 'node_modules', 'debug', 'package.json')); + expect(packageJSON.version).to.not.equal('2.0.0'); + }); + + after(async () => await fs.remove(installDir)); + }); +} diff --git a/packages/_old/test/slow/install_spec_slow.js b/packages/_old/test/slow/install_spec_slow.js new file mode 100644 index 0000000000..18cdee2552 --- /dev/null +++ b/packages/_old/test/slow/install_spec_slow.js @@ -0,0 +1,191 @@ +import chai, { expect } from 'chai'; +import fetchMock from 'fetch-mock/es5/server'; +import chaiAsPromised from 'chai-as-promised'; +import proxyquire from 'proxyquire'; +import sinon from 'sinon'; + +chai.use(chaiAsPromised); + +describe('install', () => { + let install; + let nuggetSpy; + let mockInquirer; + let fetch; + const mockInstaller = () => Promise.resolve(); + + beforeEach(() => { + fetch = fetchMock.sandbox(); + nuggetSpy = sinon.stub(); + mockInquirer = { + createPromptModule: sinon.spy(() => sinon.spy(() => Promise.resolve({ assetID: 1 }))), + }; + + install = proxyquire.noCallThru().load('../../src/api/install', { + 'node-fetch': fetch, + nugget: (...args) => { + nuggetSpy(...args); + args[args.length - 1](); + }, + '../installers/darwin/dmg': mockInstaller, + '../installers/darwin/zip': mockInstaller, + '../installers/linux/deb': mockInstaller, + '../installers/linux/rpm': mockInstaller, + '../installers/win32/exe': mockInstaller, + inquirer: mockInquirer, + }).default; + }); + + afterEach(() => { + fetch.restore(); + }); + + it('should throw an error when a repo name is not given', async () => { + await expect(install()).to.eventually.be.rejected; + }); + + it('should throw an error when given an invalid repository name', async () => { + await expect(install({ repo: 'foobar', interactive: false })).to.eventually.be.rejected; + }); + + it('should throw an error if the fetch fails', async () => { + fetch.get('*', { + throws: new Error('it broke'), + }); + await expect(install({ repo: 'a/b', interactive: false })).to.eventually.be.rejectedWith( + 'Failed to find releases for repository "a/b". Please check the name and try again.' + ); + }); + + it('should throw an error if we can\'t find the repo', async () => { + fetch.get('*', { + message: 'Not Found', + }); + await expect(install({ repo: 'b/c', interactive: false })).to.eventually.be.rejectedWith( + 'Failed to find releases for repository "b/c". Please check the name and try again.' + ); + }); + + it('should throw an error if the API does not return a release array', async () => { + fetch.get('*', { + lolz: 'this aint no array', + }); + await expect(install({ repo: 'c/d', interactive: false })).to.eventually.be.rejectedWith( + 'Failed to find releases for repository "c/d". Please check the name and try again.' + ); + }); + + it('should throw an error if the latest release has no assets', async () => { + fetch.get('*', [ + { tag_name: 'v1.0.0' }, + { tag_name: '0.3.0' }, + { tag_name: 'v1.2.0' }, + { tag_name: '0.1.0' }, + ]); + await expect(install({ repo: 'e/f', interactive: false })).to.eventually.be.rejectedWith( + 'Could not find any assets for the latest release' + ); + }); + + it('should throw an error if there are no release compatable with the current platform', async () => { + fetch.get('*', [ + { + tag_name: '1.0.0', + assets: [ + { + name: 'installer.unicorn', + }, + ], + }, + ]); + await expect(install({ repo: 'f/g', interactive: false })).to.eventually.be.rejectedWith( + `Failed to find any installable assets for target platform: ${`${process.platform}`.cyan}` + ); + }); + + // eslint-disable-next-line no-nested-ternary + const compatSuffix = process.platform === 'darwin' ? 'dmg' : (process.platform === 'win32' ? 'exe' : 'deb'); + + it('should download a release if there is a single compatible asset', async () => { + fetch.get('*', [ + { + tag_name: '1.0.0', + assets: [ + { + name: `installer.${compatSuffix}`, + browser_download_url: 'fetch.it', + }, + ], + }, + ]); + expect(nuggetSpy.callCount).to.equal(0); + await install({ repo: 'g/h', interactive: false }); + expect(nuggetSpy.callCount).to.equal(1); + expect(nuggetSpy.firstCall.args[0]).to.equal('fetch.it'); + }); + + it('should throw an error if there is more than compatable asset with no chooseAsset method', async () => { + fetch.get('*', [ + { + tag_name: '1.0.0', + assets: [ + { + name: `installer.${compatSuffix}`, + browser_download_url: 'fetch.it', + }, + { + name: `installer2.${compatSuffix}`, + browser_download_url: 'fetch.it.2', + }, + ], + }, + ]); + await expect(install({ repo: 'h/i', interactive: false })).to.eventually.be.rejectedWith( + 'expected a chooseAsset function to be provided but it was not' + ); + }); + + it('should provide compatable assets to chooseAsset if more than one exists', async () => { + const chooseAsset = sinon.spy(async assets => assets[0]); + fetch.get('*', [ + { + tag_name: '1.0.0', + assets: [ + { + name: `installer.${compatSuffix}`, + browser_download_url: 'fetch.it', + }, + { + name: `installer2.${compatSuffix}`, + browser_download_url: 'fetch.it.2', + }, + ], + }, + ]); + expect(chooseAsset.callCount).to.equal(0); + await install({ repo: 'i/j', interactive: false, chooseAsset }); + expect(chooseAsset.callCount).to.equal(1); + expect(chooseAsset.firstCall.args[0].length).to.equal(2); + }); + + it('should prompt the user to choose an asset if in interactive mode and more than one exists', async () => { + fetch.get('*', [ + { + tag_name: '1.0.0', + assets: [ + { + id: 1, + name: `installer.${compatSuffix}`, + browser_download_url: 'fetch.it', + }, + { + name: `installer2.${compatSuffix}`, + browser_download_url: 'fetch.it.2', + }, + ], + }, + ]); + expect(mockInquirer.createPromptModule.callCount).to.equal(0); + await install({ repo: 'j/k', interactive: true }); + expect(mockInquirer.createPromptModule.callCount).to.equal(1); + }); +}); diff --git a/packages/_old/test/slow/rebuild_spec_slow.js b/packages/_old/test/slow/rebuild_spec_slow.js new file mode 100644 index 0000000000..b679af1538 --- /dev/null +++ b/packages/_old/test/slow/rebuild_spec_slow.js @@ -0,0 +1,79 @@ +import fs from 'fs-extra'; +import path from 'path'; +import os from 'os'; + +import { expect } from 'chai'; + +import rebuild from '../../src/util/rebuild'; +import { yarnOrNpmSpawn, hasYarn } from '../../src/util/yarn-or-npm'; + +describe('rebuilder', () => { + const testModulePath = path.resolve(os.tmpdir(), 'electron-forge-rebuild-test'); + + async function setupProject() { + await fs.remove(testModulePath); + await fs.mkdirs(testModulePath); + await fs.writeFile(path.resolve(testModulePath, 'package.json'), await fs.readFile(path.resolve(__dirname, '../fixture/native_app/package.json'), 'utf8')); + await yarnOrNpmSpawn(hasYarn() ? [] : ['install'], { + cwd: testModulePath, + stdio: process.platform === 'win32' ? 'inherit' : 'pipe', + }); + } + + async function doRebuild(config) { + await rebuild(testModulePath, '1.4.12', process.platform, process.arch, config); + } + + describe('no config', () => { + before(async () => { + await setupProject(); + await doRebuild(); + }); + + it('should have rebuilt top level prod dependencies', async () => { + const forgeMeta = path.resolve(testModulePath, 'node_modules', 'ref', 'build', 'Release', '.forge-meta'); + expect(await fs.pathExists(forgeMeta), 'ref build meta should exist').to.equal(true); + }); + + it('should have rebuilt children of top level prod dependencies', async () => { + const forgeMeta = path.resolve(testModulePath, 'node_modules', 'microtime', 'build', 'Release', '.forge-meta'); + expect(await fs.pathExists(forgeMeta), 'microtime build meta should exist').to.equal(true); + }); + + it('should have rebuilt children of scoped top level prod dependencies', async () => { + const forgeMeta = path.resolve(testModulePath, 'node_modules', '@newrelic/native-metrics', 'build', 'Release', '.forge-meta'); + expect(await fs.pathExists(forgeMeta), '@newrelic/native-metrics build meta should exist').to.equal(true); + }); + + it('should have rebuilt top level optional dependencies', async () => { + const forgeMeta = path.resolve(testModulePath, 'node_modules', 'zipfile', 'build', 'Release', '.forge-meta'); + expect(await fs.pathExists(forgeMeta), 'zipfile build meta should exist').to.equal(true); + }); + + it('should not have rebuilt top level devDependencies', async () => { + const forgeMeta = path.resolve(testModulePath, 'node_modules', 'ffi', 'build', 'Release', '.forge-meta'); + expect(await fs.pathExists(forgeMeta), 'ffi build meta should not exist').to.equal(false); + }); + }); + + describe('with config', () => { + before(async () => { + await setupProject(); + await doRebuild({ onlyModules: ['ref'] }); + }); + + it('should have rebuilt module in onlyModules', async () => { + const forgeMeta = path.resolve(testModulePath, 'node_modules', 'ref', 'build', 'Release', '.forge-meta'); + expect(await fs.pathExists(forgeMeta), 'ref build meta should exist').to.equal(true); + }); + + it('should not have rebuilt module not in onlyModules', async () => { + const forgeMeta = path.resolve(testModulePath, 'node_modules', 'zipfile', 'build', 'Release', '.forge-meta'); + expect(await fs.pathExists(forgeMeta), 'zipfile build meta should not exist').to.equal(false); + }); + }); + + after(async () => { + await fs.remove(testModulePath); + }); +}); diff --git a/packages/_old/tmpl/_appveyor.yml b/packages/_old/tmpl/_appveyor.yml new file mode 100644 index 0000000000..728114826c --- /dev/null +++ b/packages/_old/tmpl/_appveyor.yml @@ -0,0 +1,26 @@ +platform: +- x64 +environment: + nodejs_version: "6" +cache: +- '%APPDATA%\npm-cache' +- '%USERPROFILE%\.electron' +- node_modules +branches: + only: + - master + - /^v\d+\.\d+\.\d+/ +install: +- ps: Install-Product node $env:nodejs_version $env:platform +- set PATH=%APPDATA%\npm;%PATH% +- npm install +- npm update + +test_script: +- node --version +- npm --version +- npm run lint +- if %APPVEYOR_REPO_TAG% EQU false npm run make + +build_script: +- IF %APPVEYOR_REPO_TAG% EQU true npm run publish diff --git a/packages/_old/tmpl/_gitignore b/packages/_old/tmpl/_gitignore new file mode 100644 index 0000000000..9209ef5bfd --- /dev/null +++ b/packages/_old/tmpl/_gitignore @@ -0,0 +1,2 @@ +node_modules +out diff --git a/packages/_old/tmpl/_travis.yml b/packages/_old/tmpl/_travis.yml new file mode 100644 index 0000000000..02fa627e34 --- /dev/null +++ b/packages/_old/tmpl/_travis.yml @@ -0,0 +1,33 @@ +language: node_js +node_js: "6" +os: +- linux +- osx +dist: trusty +osx_image: xcode8.3 +sudo: false + +cache: + directories: + - node_modules + - $HOME/.cache/electron + +addons: + apt: + packages: + - fakeroot + - rpm + +branches: + only: + - master + - /^v\d+\.\d+\.\d+/ + +install: +- npm install +- npm update + +script: +- npm run lint +- if test -z "$TRAVIS_TAG"; then npm run make; fi +after_success: if test -n "$TRAVIS_TAG"; then npm run publish; fi diff --git a/packages/_old/tmpl/index.html b/packages/_old/tmpl/index.html new file mode 100644 index 0000000000..e11c582a95 --- /dev/null +++ b/packages/_old/tmpl/index.html @@ -0,0 +1,10 @@ + + + + + + + + Well hey there!!! + + diff --git a/packages/_old/tmpl/index.js b/packages/_old/tmpl/index.js new file mode 100644 index 0000000000..94a7e01e31 --- /dev/null +++ b/packages/_old/tmpl/index.js @@ -0,0 +1,57 @@ +const { app, BrowserWindow } = require('electron'); + +// Handle creating/removing shortcuts on Windows when installing/uninstalling. +if (require('electron-squirrel-startup')) { // eslint-disable-line global-require + app.quit(); +} + +// Keep a global reference of the window object, if you don't, the window will +// be closed automatically when the JavaScript object is garbage collected. +let mainWindow; + +const createWindow = () => { + // Create the browser window. + mainWindow = new BrowserWindow({ + width: 800, + height: 600, + }); + + // and load the index.html of the app. + mainWindow.loadURL(`file://${__dirname}/index.html`); + + // Open the DevTools. + mainWindow.webContents.openDevTools(); + + // Emitted when the window is closed. + mainWindow.on('closed', () => { + // Dereference the window object, usually you would store windows + // in an array if your app supports multi windows, this is the time + // when you should delete the corresponding element. + mainWindow = null; + }); +}; + +// This method will be called when Electron has finished +// initialization and is ready to create browser windows. +// Some APIs can only be used after this event occurs. +app.on('ready', createWindow); + +// Quit when all windows are closed. +app.on('window-all-closed', () => { + // On OS X it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== 'darwin') { + app.quit(); + } +}); + +app.on('activate', () => { + // On OS X it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (mainWindow === null) { + createWindow(); + } +}); + +// In this file you can include the rest of your app's specific main process +// code. You can also put them in separate files and import them here. diff --git a/packages/_old/tmpl/package.json b/packages/_old/tmpl/package.json new file mode 100644 index 0000000000..9ac204578a --- /dev/null +++ b/packages/_old/tmpl/package.json @@ -0,0 +1,38 @@ +{ + "name": "", + "productName": "", + "version": "1.0.0", + "description": "My Electron application description", + "main": "src/index.js", + "scripts": { + "start": "electron-forge start", + "package": "electron-forge package", + "make": "electron-forge make", + "publish": "electron-forge publish" + }, + "keywords": [], + "author": "", + "license": "MIT", + "config": { + "forge": { + "make_targets": { + "win32": ["squirrel"], + "darwin": ["zip"], + "linux": ["deb", "rpm"] + }, + "electronPackagerConfig": {}, + "electronWinstallerConfig": { + "name": "" + }, + "electronInstallerDebian": {}, + "electronInstallerRedhat": {}, + "github_repository": { + "owner": "", + "name": "" + }, + "windowsStoreConfig": { + "packageName": "" + } + } + } +} diff --git a/packages/api/cli/package.json b/packages/api/cli/package.json new file mode 100644 index 0000000000..f7febcb0d4 --- /dev/null +++ b/packages/api/cli/package.json @@ -0,0 +1,34 @@ +{ + "name": "@electron-forge/cli", + "version": "6.0.0-beta.0", + "description": "A complete tool for building modern Electron applications", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "bin": { + "electron-forge": "dist/electron-forge.js", + "forge": "dist/electron-forge.js", + "electron-forge-vscode-nix": "script/vscode.sh", + "electron-forge-vscode-win": "script/vscode.cmd" + }, + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", + "test-fast": "yarn test" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "dependencies": { + "@electron-forge/core": "^6.0.0-beta.0", + "colors": "^1.1.2", + "commander": "^2.9.0", + "debug": "^3.0.0", + "fs-extra": "^5.0.0", + "semver": "^5.3.0", + "tabtab": "^2.2.1" + }, + "engines": { + "node": ">= 6.0" + } +} \ No newline at end of file diff --git a/packages/api/cli/script/vscode.cmd b/packages/api/cli/script/vscode.cmd new file mode 100755 index 0000000000..b447f966f2 --- /dev/null +++ b/packages/api/cli/script/vscode.cmd @@ -0,0 +1,9 @@ +@echo off + +SETLOCAL +SET FORGE_ARGS=%* + +SET FORGE_ARGS=%FORGE_ARGS: =~ ~% +node "%~dp0/../../electron-forge/dist/electron-forge-start.js" --vscode -- ~%FORGE_ARGS%~ + +ENDLOCAL \ No newline at end of file diff --git a/packages/api/cli/script/vscode.sh b/packages/api/cli/script/vscode.sh new file mode 100755 index 0000000000..8f0e891508 --- /dev/null +++ b/packages/api/cli/script/vscode.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +ARGS=$@ +ARGS=${ARGS// /\~ \~} + +node $DIR/../electron-forge/dist/electron-forge-start --vscode -- \~$ARGS\~ \ No newline at end of file diff --git a/packages/api/cli/src/electron-forge-import.js b/packages/api/cli/src/electron-forge-import.js new file mode 100644 index 0000000000..dfbb9c3bf8 --- /dev/null +++ b/packages/api/cli/src/electron-forge-import.js @@ -0,0 +1,27 @@ +import { import as importAPI } from '@electron-forge/core'; + +import path from 'path'; +import program from 'commander'; + +import './util/terminate'; + +(async () => { + let dir = process.cwd(); + program + .version(require('../package.json').version) + .arguments('[name]') + .action((name) => { + if (!name) return; + if (path.isAbsolute(name)) { + dir = name; + } else { + dir = path.resolve(dir, name); + } + }) + .parse(process.argv); + + await importAPI({ + dir, + interactive: true, + }); +})(); diff --git a/packages/api/cli/src/electron-forge-init.js b/packages/api/cli/src/electron-forge-init.js new file mode 100644 index 0000000000..ba81fe6bf7 --- /dev/null +++ b/packages/api/cli/src/electron-forge-init.js @@ -0,0 +1,33 @@ +import { init } from '@electron-forge/core'; + +import path from 'path'; +import program from 'commander'; + +import './util/terminate'; + +(async () => { + let dir = process.cwd(); + program + .version(require('../package.json').version) + .arguments('[name]') + .option('-t, --template [name]', 'Name of the forge template to use') + .option('-c, --copy-ci-files', 'Whether to copy the templated CI files (defaults to false)', false) + .action((name) => { + if (!name) return; + if (path.isAbsolute(name)) { + dir = name; + } else { + dir = path.resolve(dir, name); + } + }) + .parse(process.argv); + + const initOpts = { + dir, + interactive: true, + copyCIFiles: !!program.copyCiFiles, + }; + if (program.template) initOpts.template = program.template; + + await init(initOpts); +})(); diff --git a/packages/api/cli/src/electron-forge-install.js b/packages/api/cli/src/electron-forge-install.js new file mode 100644 index 0000000000..d0678a49d8 --- /dev/null +++ b/packages/api/cli/src/electron-forge-install.js @@ -0,0 +1,24 @@ +import { install } from '@electron-forge/core'; + +import program from 'commander'; + +import './util/terminate'; + +(async () => { + let repo; + + program + .version(require('../package.json').version) + .arguments('[repository]') + .option('--prerelease', 'Fetch prerelease versions') + .action((repository) => { + repo = repository; + }) + .parse(process.argv); + + await install({ + repo, + interactive: true, + prerelease: program.prerelease, + }); +})(); diff --git a/packages/api/cli/src/electron-forge-lint.js b/packages/api/cli/src/electron-forge-lint.js new file mode 100644 index 0000000000..b42f99f0b2 --- /dev/null +++ b/packages/api/cli/src/electron-forge-lint.js @@ -0,0 +1,28 @@ +import { lint } from '@electron-forge/core'; + +import fs from 'fs'; +import path from 'path'; +import program from 'commander'; + +import './util/terminate'; + +(async () => { + let dir = process.cwd(); + program + .version(require('../package.json').version) + .arguments('[cwd]') + .action((cwd) => { + if (!cwd) return; + if (path.isAbsolute(cwd) && fs.existsSync(cwd)) { + dir = cwd; + } else if (fs.existsSync(path.resolve(dir, cwd))) { + dir = path.resolve(dir, cwd); + } + }) + .parse(process.argv); + + await lint({ + dir, + interactive: true, + }); +})(); diff --git a/packages/api/cli/src/electron-forge-make.js b/packages/api/cli/src/electron-forge-make.js new file mode 100644 index 0000000000..86c7d7429f --- /dev/null +++ b/packages/api/cli/src/electron-forge-make.js @@ -0,0 +1,48 @@ +import { make } from '@electron-forge/core'; + +import fs from 'fs-extra'; +import path from 'path'; +import program from 'commander'; + +import './util/terminate'; + +// eslint-disable-next-line import/prefer-default-export +export const getMakeOptions = () => { + let dir = process.cwd(); + program + .version(require('../package.json').version) + .arguments('[cwd]') + .option('--skip-package', 'Assume the app is already packaged') + .option('-a, --arch [arch]', 'Target architecture') + .option('-p, --platform [platform]', 'Target build platform') + .option('--targets [targets]', 'Override your make targets for this run') + .allowUnknownOption(true) + .action((cwd) => { + if (!cwd) return; + if (path.isAbsolute(cwd) && fs.existsSync(cwd)) { + dir = cwd; + } else if (fs.existsSync(path.resolve(dir, cwd))) { + dir = path.resolve(dir, cwd); + } + }) + .parse(process.argv); + + const makeOpts = { + dir, + interactive: true, + skipPackage: program.skipPackage, + }; + if (program.targets) makeOpts.overrideTargets = program.targets.split(','); + if (program.arch) makeOpts.arch = program.arch; + if (program.platform) makeOpts.platform = program.platform; + + return makeOpts; +}; + +if (process.mainModule === module || global.__LINKED_FORGE__) { + (async () => { + const makeOpts = getMakeOptions(); + + await make(makeOpts); + })(); +} diff --git a/packages/api/cli/src/electron-forge-package.js b/packages/api/cli/src/electron-forge-package.js new file mode 100644 index 0000000000..3f5a11d607 --- /dev/null +++ b/packages/api/cli/src/electron-forge-package.js @@ -0,0 +1,35 @@ +import { package as packageAPI } from '@electron-forge/core'; + +import fs from 'fs-extra'; +import path from 'path'; +import program from 'commander'; + +import './util/terminate'; + +(async () => { + let dir = process.cwd(); + + program + .version(require('../package.json').version) + .arguments('[cwd]') + .option('-a, --arch [arch]', 'Target architecture') + .option('-p, --platform [platform]', 'Target build platform') + .action((cwd) => { + if (!cwd) return; + if (path.isAbsolute(cwd) && fs.existsSync(cwd)) { + dir = cwd; + } else if (fs.existsSync(path.resolve(dir, cwd))) { + dir = path.resolve(dir, cwd); + } + }) + .parse(process.argv); + + const packageOpts = { + dir, + interactive: true, + }; + if (program.arch) packageOpts.arch = program.arch; + if (program.platform) packageOpts.platform = program.platform; + + await packageAPI(packageOpts); +})(); diff --git a/packages/api/cli/src/electron-forge-publish.js b/packages/api/cli/src/electron-forge-publish.js new file mode 100644 index 0000000000..6bc14d07c9 --- /dev/null +++ b/packages/api/cli/src/electron-forge-publish.js @@ -0,0 +1,44 @@ +import { publish } from '@electron-forge/core'; + +import fs from 'fs-extra'; +import path from 'path'; +import program from 'commander'; + +import './util/terminate'; +import { getMakeOptions } from './electron-forge-make'; + +(async () => { + let dir = process.cwd(); + program + .version(require('../package.json').version) + .arguments('[cwd]') + .option('--auth-token', 'Authorization token for your publisher target (if required)') + .option('--tag', 'The tag to publish to on GitHub') + .option('--target [target[,target...]]', 'The comma-separated deployment targets, defaults to "github"') + .option('--dry-run', 'Triggers a publish dry run which saves state and doesn\'t upload anything') + .option('--from-dry-run', 'Attempts to publish artifacts from the last saved dry run') + .allowUnknownOption(true) + .action((cwd) => { + if (!cwd) return; + if (path.isAbsolute(cwd) && fs.existsSync(cwd)) { + dir = cwd; + } else if (fs.existsSync(path.resolve(dir, cwd))) { + dir = path.resolve(dir, cwd); + } + }) + .parse(process.argv); + + const publishOpts = { + dir, + interactive: true, + authToken: program.authToken, + tag: program.tag, + dryRun: program.dryRun, + dryRunResume: program.fromDryRun, + }; + if (program.target) publishOpts.publishTargets = program.target.split(','); + + publishOpts.makeOptions = getMakeOptions(); + + await publish(publishOpts); +})(); diff --git a/packages/api/cli/src/electron-forge-start.js b/packages/api/cli/src/electron-forge-start.js new file mode 100644 index 0000000000..94a940014d --- /dev/null +++ b/packages/api/cli/src/electron-forge-start.js @@ -0,0 +1,74 @@ +import { start } from '@electron-forge/core'; + +import fs from 'fs-extra'; +import path from 'path'; +import program from 'commander'; + +import './util/terminate'; + +(async () => { + let commandArgs = process.argv; + let appArgs; + + const doubleDashIndex = process.argv.indexOf('--'); + if (doubleDashIndex !== -1) { + commandArgs = process.argv.slice(0, doubleDashIndex); + appArgs = process.argv.slice(doubleDashIndex + 1); + } + + let dir = process.cwd(); + program + .version(require('../package.json').version) + .arguments('[cwd]') + .option('-p, --app-path ', "Override the path to the Electron app to launch (defaults to '.')") + .option('-l, --enable-logging', 'Enable advanced logging. This will log internal Electron things') + .option('-n, --run-as-node', 'Run the Electron app as a Node.JS script') + .option('--vscode', 'Used to enable arg transformation for debugging Electron through VSCode. Do not use yourself.') + .option('-i, --inspect-electron', 'Triggers inspect mode on Electron to allow debugging the main process. Electron >1.7 only') + .action((cwd) => { + if (!cwd) return; + if (path.isAbsolute(cwd) && fs.existsSync(cwd)) { + dir = cwd; + } else if (fs.existsSync(path.resolve(dir, cwd))) { + dir = path.resolve(dir, cwd); + } + }) + .parse(commandArgs); + + program.on('--help', () => { + console.log(" Any arguments found after '--' will be passed to the Electron app, e.g."); + console.log(''); + console.log(' $ electron-forge /path/to/project -l -- -d -f foo.txt'); + console.log(''); + console.log(" will pass the arguments '-d -f foo.txt' to the Electron app"); + }); + + const opts = { + dir, + interactive: true, + enableLogging: !!program.enableLogging, + runAsNode: !!program.runAsNode, + inspect: !!program.inspectElectron, + }; + + if (program.vscode && appArgs) { + // Args are in the format ~arg~ so we need to strip the "~" + appArgs = appArgs + .map(arg => arg.substr(1, arg.length - 2)) + .filter(arg => arg.length > 0); + } + + if (program.appPath) opts.appPath = program.appPath; + if (appArgs) opts.args = appArgs; + + const spawned = await start(opts); + + await new Promise((resolve) => { + spawned.on('exit', (code) => { + if (code !== 0) { + process.exit(code); + } + resolve(); + }); + }); +})(); diff --git a/packages/api/cli/src/electron-forge.js b/packages/api/cli/src/electron-forge.js new file mode 100644 index 0000000000..5d7fbfec0e --- /dev/null +++ b/packages/api/cli/src/electron-forge.js @@ -0,0 +1,72 @@ +#!/usr/bin/env node +import 'colors'; +import program from 'commander'; +import tabtab from 'tabtab'; + +import './util/terminate'; + +import asyncOra from '@electron-forge/core/dist/util/ora-handler'; +import checkSystem from './util/check-system'; + +const originalSC = program.executeSubCommand.bind(program); +program.executeSubCommand = (argv, args, unknown) => { + let indexOfDoubleDash = process.argv.indexOf('--'); + indexOfDoubleDash = indexOfDoubleDash < 0 ? process.argv.length + 1 : indexOfDoubleDash; + + const passThroughArgs = args.filter(arg => process.argv.indexOf(arg) > indexOfDoubleDash); + const normalArgs = args.filter(arg => process.argv.indexOf(arg) <= indexOfDoubleDash); + + let newArgs = args; + let newUnknown = unknown; + if (passThroughArgs.length > 0) { + newArgs = normalArgs.concat(unknown).concat('--').concat(passThroughArgs); + newUnknown = []; + } + return originalSC(argv, newArgs, newUnknown); +}; + +program + .version(require('../package.json').version) + .option('--verbose', 'Enables verbose mode') + .command('init', 'Initialize a new Electron application') + .command('import', 'Attempts to navigate you through the process of importing an existing project to "electron-forge"') + .command('lint', 'Lints the current Electron application') + .command('package', 'Package the current Electron application') + .command('make', 'Generate distributables for the current Electron application') + .command('start', 'Start the current Electron application') + .command('publish', 'Publish the current Electron application to GitHub') + .command('install', 'Install an Electron application from GitHub'); + +const tab = tabtab({ + name: 'electron-forge', +}); +tab.on('electron-forge', (data, done) => { + if (data.line.split(' ').length <= 2) { + done( + null, + program.commands + .filter(cmd => cmd._name.startsWith(data.lastPartial)) + .map(cmd => `${cmd._name}:${cmd._description}`).sort() + ); + } else { + done(null, []); + } +}); +tab.start(); + +if (process.argv[2] !== 'completion') { + (async () => { + let goodSystem; + await asyncOra('Checking your system', async (ora) => { + goodSystem = await checkSystem(ora); + }); + + if (!goodSystem) { + console.error(('It looks like you are missing some dependencies you need to get Electron running.\n' + + 'Make sure you have git installed and Node.js version 6.0.0+').red); + process.exit(1); + } + + program.parse(process.argv); + })(); +} diff --git a/packages/api/cli/src/util/check-system.js b/packages/api/cli/src/util/check-system.js new file mode 100644 index 0000000000..546b6c53c4 --- /dev/null +++ b/packages/api/cli/src/util/check-system.js @@ -0,0 +1,71 @@ +import { exec } from 'child_process'; +import debug from 'debug'; +import semver from 'semver'; + +import { hasYarn, yarnOrNpmSpawn } from '@electron-forge/core/dist/util/yarn-or-npm'; + +const d = debug('electron-forge:check-system'); + +async function checkGitExists() { + return new Promise((resolve) => { + exec('git --version', (err) => { + if (err) return resolve(false); + resolve(true); + }); + }); +} + +async function checkNodeVersion() { + return Promise.resolve(semver.gt(process.versions.node, '6.0.0')); +} + +const NPM_WHITELISTED_VERSIONS = { + all: '^3.0.0 || ^4.0.0 || ~5.1.0 || ~5.2.0 || >= 5.4.2', + darwin: '>= 5.4.0', + linux: '>= 5.4.0', +}; +const YARN_WHITELISTED_VERSIONS = { + all: '0.23.3 || 0.24.6 || >= 1.0.0', + darwin: '0.27.5', + linux: '0.27.5', +}; + +export function validPackageManagerVersion(packageManager, version, whitelistedVersions, ora) { + try { + return semver.satisfies(version, whitelistedVersions); + } catch (e) { + ora.warn(`Could not check ${packageManager} version "${version}", assuming incompatible`); + d(`Exception while checking version: ${e}`); + return false; + } +} + +function warnIfPackageManagerIsntAKnownGoodVersion(packageManager, version, whitelistedVersions, ora) { + const osVersions = whitelistedVersions[process.platform]; + const versions = osVersions ? `${whitelistedVersions.all} || ${osVersions}` : whitelistedVersions.all; + const versionString = version.toString(); + if (!validPackageManagerVersion(packageManager, versionString, versions, ora)) { + ora.warn( + `You are using ${packageManager}, but not a known good version.\n` + + `The known versions that work with Electron Forge are: ${versions}` + ); + } +} + +async function checkPackageManagerVersion(ora) { + return yarnOrNpmSpawn(['--version']) + .then((version) => { + if (hasYarn()) { + warnIfPackageManagerIsntAKnownGoodVersion('Yarn', version, YARN_WHITELISTED_VERSIONS, ora); + } else { + warnIfPackageManagerIsntAKnownGoodVersion('NPM', version, NPM_WHITELISTED_VERSIONS, ora); + } + + return true; + }); +} + +export default async function (ora) { + return (await Promise.all([checkGitExists(ora), checkNodeVersion(ora), checkPackageManagerVersion(ora)])) + .every(check => check); +} diff --git a/packages/api/cli/src/util/terminate.js b/packages/api/cli/src/util/terminate.js new file mode 100644 index 0000000000..aac9aef978 --- /dev/null +++ b/packages/api/cli/src/util/terminate.js @@ -0,0 +1,25 @@ +import colors from 'colors'; + +process.on('unhandledRejection', (err) => { + if (err && err.message && err.stack) { + console.error('\nAn unhandled rejection has occurred inside Forge:'.red); + console.error(colors.red(err.message)); + console.error(colors.red(err.stack)); + } else { + console.error('\nElectron forge was terminated:'.red); + console.error(colors.red(typeof err === 'string' ? err : JSON.stringify(err))); + } + process.exit(1); +}); + +process.on('uncaughtException', (err) => { + if (err && err.message && err.stack) { + console.error('\nAn unhandled exception has occurred inside Forge:'.red); + console.error(colors.red(err.message)); + console.error(colors.red(err.stack)); + } else { + console.error('\nElectron forge was terminated:'.red); + console.error(colors.red(typeof err === 'string' ? err : JSON.stringify(err))); + } + process.exit(1); +}); diff --git a/packages/api/cli/test/check-system_spec.js b/packages/api/cli/test/check-system_spec.js new file mode 100644 index 0000000000..fc18b075c0 --- /dev/null +++ b/packages/api/cli/test/check-system_spec.js @@ -0,0 +1,24 @@ +import { expect } from 'chai'; + +import checkSystem, { validPackageManagerVersion } from '../src/util/check-system'; +import { fakeOra } from '@electron-forge/core/dist/util/ora'; + +describe('check-system', () => { + it('should succeed on valid agents', async () => { + expect(await checkSystem(fakeOra())).to.be.equal(true); + }); + + describe('validPackageManagerVersion', () => { + it('should consider whitelisted versions to be valid', () => { + expect(validPackageManagerVersion('NPM', '3.10.1', '^3.0.0', fakeOra())).to.be.equal(true); + }); + + it('should consider Yarn nightly versions to be invalid', () => { + expect(validPackageManagerVersion('Yarn', '0.23.0-20170311.0515', '0.23.0', fakeOra())).to.be.equal(false); + }); + + it('should consider invalid semver versions to be invalid', () => { + expect(validPackageManagerVersion('Yarn', '0.22', '0.22.0', fakeOra())).to.be.equal(false); + }); + }); +}); diff --git a/packages/api/core/.gitignore b/packages/api/core/.gitignore index 1c988ca8c8..d8f8d46921 100644 --- a/packages/api/core/.gitignore +++ b/packages/api/core/.gitignore @@ -1,6 +1 @@ -dist -node_modules docs -.nyc_output -coverage -npm-debug.log diff --git a/packages/api/core/README.md b/packages/api/core/README.md new file mode 100644 index 0000000000..bc38706a59 --- /dev/null +++ b/packages/api/core/README.md @@ -0,0 +1 @@ +# Electron Forge Core \ No newline at end of file diff --git a/packages/api/core/package.json b/packages/api/core/package.json index b502c88b61..13a32f7055 100644 --- a/packages/api/core/package.json +++ b/packages/api/core/package.json @@ -1,29 +1,13 @@ { - "name": "@electron-forge/cli", + "name": "@electron-forge/core", "version": "6.0.0-beta.0", "description": "A complete tool for building modern Electron applications", "repository": "https://github.com/electron-userland/electron-forge", "main": "dist/api/index.js", - "bin": { - "electron-forge": "dist/electron-forge.js", - "forge": "dist/electron-forge.js", - "electron-forge-vscode-nix": "script/vscode.sh", - "electron-forge-vscode-win": "script/vscode.cmd" - }, "scripts": { - "precommit": "npm run lint", "docs": "esdoc", - "install": "node tabtab-install.js", - "test": "npm run lint && npm run test-all", - "test-coverage": "npm run lint && npm run test-all-coverage", - "test-all": "mocha test/**/*_spec*.js test/**/**/*_spec*.js", - "test-fast": "mocha test/**/*_spec.js test/**/**/*_spec.js --timeout=10000", - "test-all-coverage": "cross-env NODE_ENV=test nyc npm run test-all", - "test-fast-coverage": "cross-env NODE_ENV=test nyc npm run test-fast", - "release:patch": "changelog -p && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version patch && git push origin && git push origin --tags", - "release:minor": "changelog -m && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version minor && git push origin && git push origin --tags", - "release:major": "changelog -M && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version major && git push origin && git push origin --tags", - "watch-link": "nodemon --watch src --exec \"npm link\"" + "test": "mocha test/**/*_spec*.js test/**/**/*_spec*.js --opts ../../../mocha.opts", + "test-fast": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts --timeout 10000" }, "author": "Samuel Attard", "license": "MIT", @@ -31,68 +15,43 @@ "asar": "^0.14.0", "chai": "^4.0.0", "chai-as-promised": "^7.0.0", - "coveralls": "^3.0.0", - "cross-env": "^5.0.0", "esdoc": "^1.0.1", "esdoc-importpath-plugin": "^1.0.0", "esdoc-standard-plugin": "^1.0.0", "fetch-mock": "^6.0.0", - "generate-changelog": "^1.0.2", "mocha": "^5.0.0", - "nodemon": "^1.11.0", - "nyc": "^11.0.0", "proxyquire": "^1.7.10", "sinon": "^4.1.2" }, "dependencies": { + "@electron-forge/installer-deb": "^6.0.0-beta.0", + "@electron-forge/installer-dmg": "^6.0.0-beta.0", + "@electron-forge/installer-exe": "^6.0.0-beta.0", + "@electron-forge/installer-rpm": "^6.0.0-beta.0", + "@electron-forge/installer-zip": "^6.0.0-beta.0", "@octokit/rest": "^14.0.4", - "aws-sdk": "^2.9.0", - "bluebird": "^3.4.6", "colors": "^1.1.2", - "commander": "^2.9.0", "cross-spawn-promise": "^0.10.1", "debug": "^3.0.0", - "electron-forge-template-angular2": "^1.0.3", - "electron-forge-template-react": "^1.0.2", - "electron-forge-template-react-typescript": "^1.0.3", - "electron-forge-template-vue": "^1.0.2", "electron-packager": "^11.0.0", "electron-rebuild": "^1.6.0", - "form-data": "^2.1.4", "fs-extra": "^5.0.0", "glob": "^7.1.1", - "inquirer": "^5.0.0", "lodash.merge": "^4.6.0", "lodash.template": "^4.4.0", "log-symbols": "^2.0.0", - "mime-types": "^2.1.17", "node-fetch": "^2.0.0", - "node-gyp": "^3.4.0", "nugget": "^2.0.1", - "opn": "^5.0.0", "ora": "^1.1.0", "parse-author": "^2.0.0", "pify": "^3.0.0", "resolve-package": "^1.0.1", - "s3": "^4.4.0", "semver": "^5.3.0", "sudo-prompt": "^8.0.0", - "tabtab": "^2.2.1", "username": "^3.0.0", - "yarn-or-npm": "^2.0.2", - "zip-folder": "^1.0.0" - }, - "optionalDependencies": { - "electron-installer-debian": "^0.8.0", - "electron-installer-dmg": "^0.2.0", - "electron-installer-flatpak": "^0.8.0", - "electron-installer-redhat": "^0.5.0", - "electron-installer-snap": "^2.0.0", - "electron-windows-store": "^0.12.0", - "electron-winstaller": "^2.5.0", - "electron-wix-msi": "^1.3.0" + "yarn-or-npm": "^2.0.2" }, "engines": { "node": ">= 6.0" } -} +} \ No newline at end of file diff --git a/packages/api/core/src/api/import.js b/packages/api/core/src/api/import.js index f2b7840fd0..ec576a3c66 100644 --- a/packages/api/core/src/api/import.js +++ b/packages/api/core/src/api/import.js @@ -2,15 +2,14 @@ import debug from 'debug'; import fs from 'fs-extra'; import path from 'path'; -import initGit from '../init/init-git'; -import { deps, devDeps, exactDevDeps } from '../init/init-npm'; +import initGit from './init-scripts/init-git'; +import { deps, devDeps, exactDevDeps } from './init-scripts/init-npm'; import { setInitialForgeConfig } from '../util/forge-config'; import asyncOra from '../util/ora-handler'; import { info, warn } from '../util/messages'; import installDepList from '../util/install-dependencies'; import readPackageJSON from '../util/read-package-json'; -import confirmIfInteractive from '../util/confirm-if-interactive'; const d = debug('electron-forge:import'); @@ -18,7 +17,10 @@ const d = debug('electron-forge:import'); * @typedef {Object} ImportOptions * @property {string} [dir=process.cwd()] The path to the app to be imported * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually - * @property {boolean} [updateScripts=true] Whether to update the modules package.json scripts to be electron-forge commands + * @property {function} [confirmImport] An async function that returns true or false in order to confirm the start of importing + * @property {function} [shouldContinueOnExisting] An async function that returns whether the import should continue if it looks like a forge project already + * @property {function} [shouldRemoveDependency] An async function that returns whether the given dependency should be removed + * @property {function} [shouldUpdateScript] An async function that returns whether the given script should be overridden with a forge one * @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables */ @@ -32,10 +34,10 @@ const d = debug('electron-forge:import'); * @return {Promise} Will resolve when the import process is complete */ export default async (providedOptions = {}) => { - const { dir, interactive, updateScripts } = Object.assign({ + const { dir, interactive, confirmImport, + shouldContinueOnExisting, shouldRemoveDependency, shouldUpdateScript } = Object.assign({ dir: process.cwd(), interactive: false, - updateScripts: true, }, providedOptions); const outDir = providedOptions.outDir || 'out'; @@ -47,10 +49,10 @@ export default async (providedOptions = {}) => { } // eslint-disable-next-line max-len - const confirm = await confirmIfInteractive(interactive, `WARNING: We will now attempt to import: "${dir}". This will involve modifying some files, are you sure you want to continue?`); - - if (!confirm) { - process.exit(0); + if (typeof confirmImport === 'function') { + if (!await confirmImport()) { + process.exit(0); + } } await initGit(dir); @@ -58,10 +60,10 @@ export default async (providedOptions = {}) => { let packageJSON = await readPackageJSON(dir); if (packageJSON.config && packageJSON.config.forge) { warn(interactive, 'It looks like this project is already configured for "electron-forge"'.green); - const shouldContinue = await confirmIfInteractive(interactive, 'Are you sure you want to continue?'); - - if (!shouldContinue) { - process.exit(0); + if (typeof shouldContinueOnExisting === 'function') { + if (!await shouldContinueOnExisting()) { + process.exit(0); + } } } @@ -85,9 +87,12 @@ export default async (providedOptions = {}) => { if (buildToolPackages[key]) { const explanation = buildToolPackages[key]; // eslint-disable-next-line max-len - const shouldRemoveDependency = await confirmIfInteractive(interactive, `Do you want us to remove the "${key}" dependency in package.json? Electron Forge ${explanation}.`); + let remove = true; + if (typeof shouldRemoveDependency === 'function') { + remove = await shouldRemoveDependency(key, explanation); + } - if (shouldRemoveDependency) { + if (remove) { delete packageJSON.dependencies[key]; delete packageJSON.devDependencies[key]; } @@ -100,8 +105,11 @@ export default async (providedOptions = {}) => { const updatePackageScript = async (scriptName, newValue) => { if (packageJSON.scripts[scriptName] !== newValue) { // eslint-disable-next-line max-len - const shouldUpdate = await confirmIfInteractive(interactive, `Do you want us to update the "${scriptName}" script to instead call the electron-forge task "${newValue}"`, updateScripts); - if (shouldUpdate) { + let update = true; + if (typeof shouldUpdateScript === 'function') { + update = await shouldUpdateScript(scriptName, newValue); + } + if (update) { packageJSON.scripts[scriptName] = newValue; } } diff --git a/packages/api/core/src/api/init-scripts/init-custom.js b/packages/api/core/src/api/init-scripts/init-custom.js new file mode 100644 index 0000000000..6521ea6f0d --- /dev/null +++ b/packages/api/core/src/api/init-scripts/init-custom.js @@ -0,0 +1,62 @@ +import debug from 'debug'; +import fs from 'fs-extra'; +import glob from 'glob'; +import resolvePackage from 'resolve-package'; +import path from 'path'; + +import { copy } from './init-starter-files'; +import asyncOra from '../../util/ora-handler'; +import installDepList from '../../util/install-dependencies'; +import ora from '../../util/ora'; + +const d = debug('electron-forge:init:custom'); + +export default async (dir, template) => { + let templateModulePath; + await asyncOra(`Locating custom template: "${template}"`, async () => { + try { + templateModulePath = await resolvePackage(`electron-forge-template-${template}`); + d('using global template'); + } catch (err) { + try { + templateModulePath = require.resolve(`electron-forge-template-${template}`); + d('using local template'); + } catch (err2) { + throw `Failed to locate custom template: "${template}"\n\nTry \`npm install -g electron-forge-template-${template}\``; + } + } + }); + + let templateModule = require(templateModulePath); + + templateModule = templateModule.default || templateModule; + + await asyncOra('Installing Template Dependencies', async () => { + d('installing dependencies'); + await installDepList(dir, templateModule.dependencies || []); + d('installing devDependencies'); + await installDepList(dir, templateModule.devDependencies || [], true); + }); + + await asyncOra('Copying Template Files', async () => { + const templateDirectory = templateModule.templateDirectory; + if (templateDirectory) { + const tmplPath = templateDirectory; + if (!path.isAbsolute(templateDirectory)) { + throw `Custom template path needs to be absolute, this is an issue with "electron-forge-template-${template}"`; + } + + const files = glob.sync(path.resolve(tmplPath, '**/*')); + + for (const file of files) { + if ((await fs.stat(file)).isFile()) { + await copy(file, path.resolve(dir, path.relative(tmplPath, file).replace(/^_/, '.'))); + } + } + } + }); + + if (typeof templateModule.postCopy === 'function') { + await Promise.resolve(templateModule.postCopy(dir, ora)); + } +}; diff --git a/packages/api/core/src/api/init-scripts/init-directory.js b/packages/api/core/src/api/init-scripts/init-directory.js new file mode 100644 index 0000000000..6e4a2e67da --- /dev/null +++ b/packages/api/core/src/api/init-scripts/init-directory.js @@ -0,0 +1,21 @@ +import debug from 'debug'; +import fs from 'fs-extra'; +import logSymbols from 'log-symbols'; + +import asyncOra from '../../util/ora-handler'; + +const d = debug('electron-forge:init:directory'); + +export default async (dir) => { + await asyncOra('Initializing Project Directory', async (initSpinner) => { + d('creating directory:', dir); + await fs.mkdirs(dir); + + const files = await fs.readdir(dir); + if (files.length !== 0) { + d('found', files.length, 'files in the directory. warning the user'); + initSpinner.stop(logSymbols.warning); + throw `The specified path: "${dir}" is not empty, do you wish to continue?`; + } + }); +}; diff --git a/packages/api/core/src/api/init-scripts/init-git.js b/packages/api/core/src/api/init-scripts/init-git.js new file mode 100644 index 0000000000..472cfa796b --- /dev/null +++ b/packages/api/core/src/api/init-scripts/init-git.js @@ -0,0 +1,26 @@ +import { exec } from 'child_process'; +import debug from 'debug'; +import fs from 'fs-extra'; +import path from 'path'; + +import asyncOra from '../../util/ora-handler'; + +const d = debug('electron-forge:init:git'); + +export default async (dir) => { + await asyncOra('Initializing Git Repository', async () => { + await new Promise(async (resolve, reject) => { + if (await fs.pathExists(path.resolve(dir, '.git'))) { + d('.git directory already exists, skipping git initialization'); + return resolve(); + } + d('executing "git init" in directory:', dir); + exec('git init', { + cwd: dir, + }, (err) => { + if (err) return reject(err); + resolve(); + }); + }); + }); +}; diff --git a/packages/api/core/src/api/init-scripts/init-npm.js b/packages/api/core/src/api/init-scripts/init-npm.js new file mode 100644 index 0000000000..53fa55b938 --- /dev/null +++ b/packages/api/core/src/api/init-scripts/init-npm.js @@ -0,0 +1,42 @@ +import debug from 'debug'; +import fs from 'fs-extra'; +import path from 'path'; +import username from 'username'; + +import { setInitialForgeConfig } from '../../util/forge-config'; +import installDepList from '../../util/install-dependencies'; +import readPackageJSON from '../../util/read-package-json'; +import asyncOra from '../../util/ora-handler'; + +const d = debug('electron-forge:init:npm'); + +export const deps = ['electron-squirrel-startup']; +export const devDeps = ['electron-forge']; +export const exactDevDeps = ['electron']; + +export default async (dir) => { + await asyncOra('Initializing NPM Module', async () => { + const packageJSON = await readPackageJSON(path.resolve(__dirname, '../../../tmpl')); + packageJSON.productName = packageJSON.name = path.basename(dir).toLowerCase(); + packageJSON.author = await username(); + setInitialForgeConfig(packageJSON); + + packageJSON.scripts.lint = 'echo "No linting configured"'; + + d('writing package.json to:', dir); + await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON, { spaces: 2 }); + }); + + await asyncOra('Installing NPM Dependencies', async () => { + d('installing dependencies'); + await installDepList(dir, deps); + + d('installing devDependencies'); + await installDepList(dir, devDeps, true); + + d('installing exact dependencies'); + for (const packageName of exactDevDeps) { + await installDepList(dir, [packageName], true, true); + } + }); +}; diff --git a/packages/api/core/src/api/init-scripts/init-starter-files.js b/packages/api/core/src/api/init-scripts/init-starter-files.js new file mode 100644 index 0000000000..d19420d86f --- /dev/null +++ b/packages/api/core/src/api/init-scripts/init-starter-files.js @@ -0,0 +1,31 @@ +import debug from 'debug'; +import fs from 'fs-extra'; +import path from 'path'; + +import asyncOra from '../../util/ora-handler'; + +const d = debug('electron-forge:init:starter-files'); + +export const copy = async (source, target) => { + d(`copying "${source}" --> "${target}"`); + await fs.copy(source, target); +}; + +export default async (dir, { copyCIFiles }) => { + await asyncOra('Copying Starter Files', async () => { + const tmplPath = path.resolve(__dirname, '../../../tmpl'); + + d('creating directory:', path.resolve(dir, 'src')); + await fs.mkdirs(path.resolve(dir, 'src')); + const rootFiles = ['_gitignore']; + if (copyCIFiles) rootFiles.push(...['_travis.yml', '_appveyor.yml']); + const srcFiles = ['index.js', 'index.html']; + + for (const file of rootFiles) { + await copy(path.resolve(tmplPath, file), path.resolve(dir, file.replace(/^_/, '.'))); + } + for (const file of srcFiles) { + await copy(path.resolve(tmplPath, file), path.resolve(dir, 'src', file)); + } + }); +}; diff --git a/packages/api/core/src/api/init.js b/packages/api/core/src/api/init.js index 2f295432a1..e1b5871d21 100644 --- a/packages/api/core/src/api/init.js +++ b/packages/api/core/src/api/init.js @@ -1,10 +1,10 @@ import debug from 'debug'; -import initCustom from '../init/init-custom'; -import initDirectory from '../init/init-directory'; -import initGit from '../init/init-git'; -import initNPM from '../init/init-npm'; -import initStarter from '../init/init-starter-files'; +import initCustom from './init-scripts/init-custom'; +import initDirectory from './init-scripts/init-directory'; +import initGit from './init-scripts/init-git'; +import initNPM from './init-scripts/init-npm'; +import initStarter from './init-scripts/init-starter-files'; import asyncOra from '../util/ora-handler'; @@ -36,7 +36,7 @@ export default async (providedOptions = {}) => { d(`Initializing in: ${dir}`); - await initDirectory(dir, interactive); + await initDirectory(dir); await initGit(dir); await initStarter(dir, { copyCIFiles }); await initNPM(dir); diff --git a/packages/api/core/src/api/install.js b/packages/api/core/src/api/install.js index f573327611..dff8b416c1 100644 --- a/packages/api/core/src/api/install.js +++ b/packages/api/core/src/api/install.js @@ -2,22 +2,21 @@ import 'colors'; import debug from 'debug'; import fetch from 'node-fetch'; import fs from 'fs-extra'; -import inquirer from 'inquirer'; import nugget from 'nugget'; import os from 'os'; import path from 'path'; import pify from 'pify'; import semver from 'semver'; +import darwinDMGInstaller from '@electron-forge/installer-dmg'; +import darwinZipInstaller from '@electron-forge/installer-zip'; +import linuxDebInstaller from '@electron-forge/installer-deb'; +import linuxRPMInstaller from '@electron-forge/installer-rpm'; +import win32ExeInstaller from '@electron-forge/installer-exe'; + import asyncOra from '../util/ora-handler'; import { info } from '../util/messages'; -import darwinDMGInstaller from '../installers/darwin/dmg'; -import darwinZipInstaller from '../installers/darwin/zip'; -import linuxDebInstaller from '../installers/linux/deb'; -import linuxRPMInstaller from '../installers/linux/rpm'; -import win32ExeInstaller from '../installers/win32/exe'; - const d = debug('electron-forge:install'); const GITHUB_API = 'https://api.github.com'; @@ -44,6 +43,10 @@ export default async (providedOptions = {}) => { }, providedOptions); asyncOra.interactive = interactive; + if (typeof chooseAsset !== 'function') { + throw 'Expected chooseAsset to be a function in install call'; + } + let latestRelease; let possibleAssets = []; @@ -105,24 +108,7 @@ export default async (providedOptions = {}) => { let targetAsset = possibleAssets[0]; if (possibleAssets.length > 1) { - if (chooseAsset) { - targetAsset = await Promise.resolve(chooseAsset(possibleAssets)); - } else if (interactive) { - const choices = []; - possibleAssets.forEach((asset) => { - choices.push({ name: asset.name, value: asset.id }); - }); - const { assetID } = await inquirer.createPromptModule()({ - type: 'list', - name: 'assetID', - message: 'Multiple potential assets found, please choose one from the list below:'.cyan, - choices, - }); - - targetAsset = possibleAssets.find(asset => asset.id === assetID); - } else { - throw 'expected a chooseAsset function to be provided but it was not'; - } + targetAsset = await Promise.resolve(chooseAsset(possibleAssets)); } const tmpdir = path.resolve(os.tmpdir(), 'forge-install'); diff --git a/packages/api/core/src/util/install-dependencies.js b/packages/api/core/src/util/install-dependencies.js index 698ef98888..39ddaacce5 100644 --- a/packages/api/core/src/util/install-dependencies.js +++ b/packages/api/core/src/util/install-dependencies.js @@ -1,8 +1,6 @@ import debug from 'debug'; import { yarnOrNpmSpawn, hasYarn } from './yarn-or-npm'; -import config from './config'; - const d = debug('electron-forge:dependency-installer'); export default async (dir, deps, areDev = false, exact = false) => { @@ -25,7 +23,7 @@ export default async (dir, deps, areDev = false, exact = false) => { try { await yarnOrNpmSpawn(cmd, { cwd: dir, - stdio: config.get('verbose') ? 'inherit' : 'pipe', + stdio: 'pipe', }); } catch (err) { throw new Error(`Failed to install modules: ${JSON.stringify(deps)}\n\nWith output: ${err.message}`); diff --git a/packages/api/core/test/fast/start_spec.js b/packages/api/core/test/fast/start_spec.js index c6094bb4e0..8e4c2f9b44 100644 --- a/packages/api/core/test/fast/start_spec.js +++ b/packages/api/core/test/fast/start_spec.js @@ -175,34 +175,4 @@ describe('start', () => { enableLogging: true, })).to.eventually.equal('child'); }); - - describe('cli', () => { - let argv; - let childExitCode; - let childStub; - beforeEach(() => { - argv = process.argv; - childExitCode = 0; - childStub = { - on: (event, cb) => cb(childExitCode), - }; - }); - - it('should remove all "~" from args when in VSCode debug mode', (done) => { - process.argv = [argv[0], '--vscode', '--', '--foo', 'bar', 'this arg exists']; - proxyquire.noCallThru().load('../../src/electron-forge-start', { - './api': { - start: (startOptions) => { - expect(startOptions.args).to.deep.equal(['--foo', 'bar', 'this arg exists']); - done(); - return Promise.resolve(childStub); - }, - }, - }); - }); - - afterEach(() => { - process.argv = argv; - }); - }); }); diff --git a/packages/api/core/test/fixture/custom_init/package-lock.json b/packages/api/core/test/fixture/custom_init/package-lock.json new file mode 100644 index 0000000000..c401a3837a --- /dev/null +++ b/packages/api/core/test/fixture/custom_init/package-lock.json @@ -0,0 +1,5 @@ +{ + "name": "electron-forge-template-dummy", + "version": "1.0.0", + "lockfileVersion": 1 +} diff --git a/packages/api/core/test/mocha.opts b/packages/api/core/test/mocha.opts deleted file mode 100644 index fa5b71490e..0000000000 --- a/packages/api/core/test/mocha.opts +++ /dev/null @@ -1,2 +0,0 @@ ---require babel-register ---timeout 300000 diff --git a/packages/api/core/test/slow/api_spec_slow.js b/packages/api/core/test/slow/api_spec_slow.js index 4e742b62a1..63a48a787b 100644 --- a/packages/api/core/test/slow/api_spec_slow.js +++ b/packages/api/core/test/slow/api_spec_slow.js @@ -7,7 +7,8 @@ import path from 'path'; import { expect } from 'chai'; import proxyquire from 'proxyquire'; -import { createDefaultCertificate } from '../../src/makers/win32/appx'; +// FIXME +// import { createDefaultCertificate } from '../../src/makers/win32/appx'; import installDeps from '../../src/util/install-dependencies'; import readPackageJSON from '../../src/util/read-package-json'; import yarnOrNpm from '../../src/util/yarn-or-npm'; @@ -222,10 +223,11 @@ describe(`electron-forge API (with installer=${nodeInstaller})`, () => { path.join(__dirname, '..', 'fixture', 'bogus-private-key.pvk'), path.join(dir, 'default.pvk') ); - packageJSON.config.forge.windowsStoreConfig.devCert = await createDefaultCertificate( - 'CN=Test Author', - { certFilePath: dir } - ); + // FIXME + // packageJSON.config.forge.windowsStoreConfig.devCert = await createDefaultCertificate( + // 'CN=Test Author', + // { certFilePath: dir } + // ); } packageJSON.homepage = 'http://www.example.com/'; packageJSON.author = 'Test Author'; @@ -291,79 +293,80 @@ describe(`electron-forge API (with installer=${nodeInstaller})`, () => { return fs.readdirSync(path.resolve(__dirname, `../../src/makers/${platform}`)).map(file => path.parse(file).name); } - const goodMakers = [...getMakers(process.platform), ...getMakers('generic')]; - const badPlatforms = ['darwin', 'linux', 'win32'].filter(p => p !== process.platform); - const badMakers = []; - badPlatforms.forEach(platform => badMakers.push(...getMakers(platform))); - - const testMakeTarget = function testMakeTarget(target, shouldPass, ...options) { - describe(`make (with target=${target})`, async () => { - before(async () => { - const packageJSON = await readPackageJSON(dir); - packageJSON.config.forge.make_targets[process.platform] = [target]; - await fs.writeFile(path.resolve(dir, 'package.json'), JSON.stringify(packageJSON)); - }); - - for (const optionsFetcher of options) { - if (shouldPass) { - it(`successfully makes for config: ${JSON.stringify(optionsFetcher(), 2)}`, async () => { - const outputs = await forge.make(optionsFetcher()); - for (const outputResult of outputs) { - for (const output of outputResult.artifacts) { - expect(await fs.exists(output)).to.equal(true); - } - } - }); - } else { - it(`fails for config: ${JSON.stringify(optionsFetcher(), 2)}`, async () => { - await expect(forge.make(optionsFetcher())).to.eventually.be.rejected; - }); - } - } - }); - }; - - const targetOptionFetcher = () => ({ dir, skipPackage: true }); - for (const maker of goodMakers) { - testMakeTarget(maker, true, targetOptionFetcher); - } - - for (const maker of badMakers) { - testMakeTarget(maker, false, targetOptionFetcher); - } - - describe('make', () => { - it('throws an error when given an unrecognized platform', async () => { - await expect(forge.make({ dir, platform: 'dos' })).to.eventually.be.rejectedWith(/invalid platform/); - }); - - it('throws an error when the specified maker doesn\'t support the current platform', async () => { - const makerPath = `${process.cwd()}/test/fixture/maker-unsupported`; - await expect(forge.make({ - dir, - overrideTargets: [makerPath], - skipPackage: true, - })).to.eventually.be.rejectedWith(/the maker declared that it cannot run/); - }); - - it('throws an error when the specified maker doesn\'t implement isSupportedOnCurrentPlatform()', async () => { - const makerPath = `${process.cwd()}/test/fixture/maker-incompatible`; - await expect(forge.make({ - dir, - overrideTargets: [makerPath], - skipPackage: true, - })).to.eventually.be.rejectedWith(/incompatible with this version/); - }); - - it('can make for the MAS platform successfully', async () => { - if (process.platform !== 'darwin') return; - await expect(forge.make({ - dir, - overrideTargets: ['zip', 'dmg'], - platform: 'mas', - })).to.eventually.have.length(2); - }); - }); + // FIXME + // const goodMakers = [...getMakers(process.platform), ...getMakers('generic')]; + // const badPlatforms = ['darwin', 'linux', 'win32'].filter(p => p !== process.platform); + // const badMakers = []; + // badPlatforms.forEach(platform => badMakers.push(...getMakers(platform))); + + // const testMakeTarget = function testMakeTarget(target, shouldPass, ...options) { + // describe(`make (with target=${target})`, async () => { + // before(async () => { + // const packageJSON = await readPackageJSON(dir); + // packageJSON.config.forge.make_targets[process.platform] = [target]; + // await fs.writeFile(path.resolve(dir, 'package.json'), JSON.stringify(packageJSON)); + // }); + + // for (const optionsFetcher of options) { + // if (shouldPass) { + // it(`successfully makes for config: ${JSON.stringify(optionsFetcher(), 2)}`, async () => { + // const outputs = await forge.make(optionsFetcher()); + // for (const outputResult of outputs) { + // for (const output of outputResult.artifacts) { + // expect(await fs.exists(output)).to.equal(true); + // } + // } + // }); + // } else { + // it(`fails for config: ${JSON.stringify(optionsFetcher(), 2)}`, async () => { + // await expect(forge.make(optionsFetcher())).to.eventually.be.rejected; + // }); + // } + // } + // }); + // }; + + // const targetOptionFetcher = () => ({ dir, skipPackage: true }); + // for (const maker of goodMakers) { + // testMakeTarget(maker, true, targetOptionFetcher); + // } + + // for (const maker of badMakers) { + // testMakeTarget(maker, false, targetOptionFetcher); + // } + + // describe('make', () => { + // it('throws an error when given an unrecognized platform', async () => { + // await expect(forge.make({ dir, platform: 'dos' })).to.eventually.be.rejectedWith(/invalid platform/); + // }); + + // it('throws an error when the specified maker doesn\'t support the current platform', async () => { + // const makerPath = `${process.cwd()}/test/fixture/maker-unsupported`; + // await expect(forge.make({ + // dir, + // overrideTargets: [makerPath], + // skipPackage: true, + // })).to.eventually.be.rejectedWith(/the maker declared that it cannot run/); + // }); + + // it('throws an error when the specified maker doesn\'t implement isSupportedOnCurrentPlatform()', async () => { + // const makerPath = `${process.cwd()}/test/fixture/maker-incompatible`; + // await expect(forge.make({ + // dir, + // overrideTargets: [makerPath], + // skipPackage: true, + // })).to.eventually.be.rejectedWith(/incompatible with this version/); + // }); + + // it('can make for the MAS platform successfully', async () => { + // if (process.platform !== 'darwin') return; + // await expect(forge.make({ + // dir, + // overrideTargets: ['zip', 'dmg'], + // platform: 'mas', + // })).to.eventually.have.length(2); + // }); + // }); }); after(() => fs.remove(dir)); diff --git a/packages/installer/base/package.json b/packages/installer/base/package.json new file mode 100644 index 0000000000..9770de19c9 --- /dev/null +++ b/packages/installer/base/package.json @@ -0,0 +1,20 @@ +{ + "name": "@electron-forge/installer-base", + "version": "6.0.0-beta.0", + "description": "Base installer helper for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/Installer.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", + "test-fast": "yarn test" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + } +} \ No newline at end of file diff --git a/packages/installer/base/src/Installer.js b/packages/installer/base/src/Installer.js new file mode 100644 index 0000000000..8fe4460fe2 --- /dev/null +++ b/packages/installer/base/src/Installer.js @@ -0,0 +1,21 @@ +export default class Installer { + constructor(name) { + this.name = name; + Object.defineProperty(this, '__isElectronForgeInstaller', { + value: true, + enumerable: false, + configurable: false, + }); + } + + /** + * Installers must implement this method and install the given filePath + * when called. This method must return a promise + */ + async install({ + filePath, // eslint-disable-line + installSpinner // eslint-disable-line + }) { + throw new Error(`Installer ${this.name} did not implement the install method`); + } +} diff --git a/packages/installer/base/test/Installer_spec.js b/packages/installer/base/test/Installer_spec.js new file mode 100644 index 0000000000..5333cf45d2 --- /dev/null +++ b/packages/installer/base/test/Installer_spec.js @@ -0,0 +1,15 @@ +import { expect } from 'chai'; + +import Installer from '../src/Installer'; + +describe('Installer', () => { + it('should define __isElectronForgeInstaller', () => { + const installer = new Installer('test'); + expect(installer).to.have.property('__isElectronForgeInstaller', true); + }); + + it('should throw an error when install is called', (done) => { + const installer = new Installer('test'); + installer.install({}).catch(() => done()); + }); +}); diff --git a/packages/installer/darwin/package.json b/packages/installer/darwin/package.json new file mode 100644 index 0000000000..c234224531 --- /dev/null +++ b/packages/installer/darwin/package.json @@ -0,0 +1,25 @@ +{ + "name": "@electron-forge/installer-darwin", + "version": "6.0.0-beta.0", + "description": "Base darwin file installer for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/InstallerDarwin.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", + "test-fast": "yarn test" + }, + "devDependencies": { + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/installer-base": "^6.0.0-beta.0", + "fs-extra": "^5.0.0", + "pify": "^3.0.0", + "sudo-prompt": "^8.0.0" + } +} \ No newline at end of file diff --git a/packages/installer/darwin/src/InstallerDarwin.js b/packages/installer/darwin/src/InstallerDarwin.js new file mode 100644 index 0000000000..077b36af90 --- /dev/null +++ b/packages/installer/darwin/src/InstallerDarwin.js @@ -0,0 +1,32 @@ +import InstallerBase from '@electron-forge/installer-base'; + +import fs from 'fs-extra'; +import path from 'path'; +import pify from 'pify'; +import sudo from 'sudo-prompt'; +import { exec } from 'child_process'; + +export default class InstallerDarwin extends InstallerBase { + async moveApp(appPath, targetApplicationPath, spinner, copyInstead = false) { + let writeAccess = true; + try { + await fs.access('/Applications', fs.W_OK); + } catch (err) { + writeAccess = false; + } + + if (await fs.pathExists(targetApplicationPath)) { + spinner.fail(); + throw `The application "${path.basename(targetApplicationPath)}" appears to already exist in /Applications.`; + } + + const moveCommand = `${copyInstead ? 'cp -r' : 'mv'} "${appPath}" "${targetApplicationPath}"`; + if (writeAccess) { + await pify(exec)(moveCommand); + } else { + await pify(sudo.exec)(moveCommand, { + name: 'Electron Forge', + }); + } + } +} diff --git a/packages/installer/deb/package.json b/packages/installer/deb/package.json new file mode 100644 index 0000000000..27605629c2 --- /dev/null +++ b/packages/installer/deb/package.json @@ -0,0 +1,22 @@ +{ + "name": "@electron-forge/installer-deb", + "version": "6.0.0-beta.0", + "description": "Deb file installer for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/InstallerDeb.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", + "test-fast": "yarn test" + }, + "devDependencies": { + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/installer-linux": "^6.0.0-beta.0" + } +} \ No newline at end of file diff --git a/packages/installer/deb/src/InstallerDeb.js b/packages/installer/deb/src/InstallerDeb.js new file mode 100644 index 0000000000..377df0afe9 --- /dev/null +++ b/packages/installer/deb/src/InstallerDeb.js @@ -0,0 +1,13 @@ +import InstallerLinux from '@electron-forge/installer-linux'; + +export default class InstallerDeb extends InstallerLinux { + constructor() { + super('deb'); + } + + async install({ + filePath, + }) { + await this.sudo('Debian', 'gdebi', `-n ${filePath}`); + } +} diff --git a/packages/installer/dmg/package.json b/packages/installer/dmg/package.json new file mode 100644 index 0000000000..cc02bcdb91 --- /dev/null +++ b/packages/installer/dmg/package.json @@ -0,0 +1,25 @@ +{ + "name": "@electron-forge/installer-dmg", + "version": "6.0.0-beta.0", + "description": "DMG file installer for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/InstallerDMG.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", + "test-fast": "yarn test" + }, + "devDependencies": { + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/installer-darwin": "^6.0.0-beta.0", + "cross-spawn-promise": "^0.10.1", + "debug": "^3.0.0", + "fs-extra": "^5.0.0" + } +} \ No newline at end of file diff --git a/packages/installer/dmg/src/InstallerDMG.js b/packages/installer/dmg/src/InstallerDMG.js new file mode 100644 index 0000000000..9ecab5c526 --- /dev/null +++ b/packages/installer/dmg/src/InstallerDMG.js @@ -0,0 +1,41 @@ +import InstallerDarwin from '@electron-forge/installer-darwin'; + +import spawnPromise from 'cross-spawn-promise'; +import fs from 'fs-extra'; +import path from 'path'; + +import { getMountedImages, mountImage, unmountImage } from './util/hdiutil'; + +export default class InstallerDMG extends InstallerDarwin { + constructor() { + super('dmg'); + } + + async install({ + filePath, + installSpinner, + }) { + const mounts = await getMountedImages(); + let targetMount = mounts.find(mount => mount.imagePath === filePath); + + if (!targetMount) { + targetMount = await mountImage(filePath); + } + + try { + const volumePath = path.resolve('/Volumes', targetMount.mountPath); + const appName = (await fs.readdir(volumePath)).find(file => file.endsWith('.app')); + if (!appName) { + throw 'Failed to find .app file in DMG'; + } + const appPath = path.resolve(volumePath, appName); + const targetApplicationPath = `/Applications/${path.basename(appPath)}`; + + await this.moveApp(appPath, targetApplicationPath, installSpinner, true); + + await spawnPromise('open', ['-R', targetApplicationPath], { detached: true }); + } finally { + await unmountImage(targetMount); + } + } +} diff --git a/packages/installer/dmg/src/util/hdiutil.js b/packages/installer/dmg/src/util/hdiutil.js new file mode 100644 index 0000000000..baabdc050c --- /dev/null +++ b/packages/installer/dmg/src/util/hdiutil.js @@ -0,0 +1,42 @@ +import spawnPromise from 'cross-spawn-promise'; +import debug from 'debug'; + +const d = debug('electron-forge:hdiutil'); + +export const getMountedImages = async () => { + const output = await spawnPromise('hdiutil', ['info']); + const mounts = output.toString().split(/====\n/g); + mounts.shift(); + + const mountObjects = []; + + for (const mount of mounts) { + try { + const mountPath = /\/Volumes\/(.+)\n/g.exec(mount)[1]; + const imagePath = /image-path +: +(.+)\n/g.exec(mount)[1]; + mountObjects.push({ mountPath, imagePath }); + } catch (err) { + // Ignore + } + } + + d('identified active mounts', mountObjects); + return mountObjects; +}; + +export const mountImage = async (filePath) => { + d('mounting image:', filePath); + const output = await spawnPromise('hdiutil', ['attach', '-noautoopen', '-nobrowse', '-noverify', filePath]); + const mountPath = /\/Volumes\/(.+)\n/g.exec(output.toString())[1]; + d('mounted at:', mountPath); + + return { + mountPath, + imagePath: filePath, + }; +}; + +export const unmountImage = async (mount) => { + d('unmounting current mount:', mount); + await spawnPromise('hdiutil', ['unmount', '-force', `/Volumes/${mount.mountPath}`]); +}; diff --git a/packages/installer/exe/package.json b/packages/installer/exe/package.json new file mode 100644 index 0000000000..766fe9ea71 --- /dev/null +++ b/packages/installer/exe/package.json @@ -0,0 +1,23 @@ +{ + "name": "@electron-forge/installer-exe", + "version": "6.0.0-beta.0", + "description": "EXE file installer for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/InstallerExe.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", + "test-fast": "yarn test" + }, + "devDependencies": { + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/installer-base": "^6.0.0-beta.0", + "opn": "^5.0.0" + } +} \ No newline at end of file diff --git a/packages/installer/exe/src/InstallerExe.js b/packages/installer/exe/src/InstallerExe.js new file mode 100644 index 0000000000..5046875ac5 --- /dev/null +++ b/packages/installer/exe/src/InstallerExe.js @@ -0,0 +1,15 @@ +import InstallerBase from '@electron-forge/installer-base'; + +import opn from 'opn'; + +export default class InstallerExe extends InstallerBase { + constructor() { + super('exe'); + } + + async install({ + filePath, + }) { + return opn(filePath, { wait: false }); + } +} diff --git a/packages/installer/linux/package.json b/packages/installer/linux/package.json new file mode 100644 index 0000000000..315ef6d9fe --- /dev/null +++ b/packages/installer/linux/package.json @@ -0,0 +1,24 @@ +{ + "name": "@electron-forge/installer-linux", + "version": "6.0.0-beta.0", + "description": "Base linux file installer for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/InstallerLinux.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", + "test-fast": "yarn test" + }, + "devDependencies": { + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/installer-base": "^6.0.0-beta.0", + "pify": "^3.0.0", + "sudo-prompt": "^8.0.0" + } +} \ No newline at end of file diff --git a/packages/installer/linux/src/InstallerLinux.js b/packages/installer/linux/src/InstallerLinux.js new file mode 100644 index 0000000000..05d6c0bb1d --- /dev/null +++ b/packages/installer/linux/src/InstallerLinux.js @@ -0,0 +1,22 @@ +import InstallerBase from '@electron-forge/installer-base'; + +import { spawnSync } from 'child_process'; +import pify from 'pify'; +import sudoPrompt from 'sudo-prompt'; + +export default class InstallerLinux extends InstallerBase { + which = async (type, prog, promise) => { + if (spawnSync('which', [prog]).status === 0) { + await promise; + } else { + throw new Error(`${prog} is required to install ${type} packages`); + } + } + + sudo = (type, program, args) => + this.which( + type, + program, + pify(sudoPrompt.exec)(`${program} ${args}`, { name: 'Electron Forge' }), + ); +} diff --git a/packages/installer/rpm/package.json b/packages/installer/rpm/package.json new file mode 100644 index 0000000000..e18f8782cc --- /dev/null +++ b/packages/installer/rpm/package.json @@ -0,0 +1,22 @@ +{ + "name": "@electron-forge/installer-rpm", + "version": "6.0.0-beta.0", + "description": "RPM file installer for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/InstallerRpm.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", + "test-fast": "yarn test" + }, + "devDependencies": { + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/installer-linux": "^6.0.0-beta.0" + } +} \ No newline at end of file diff --git a/packages/installer/rpm/src/InstallerRpm.js b/packages/installer/rpm/src/InstallerRpm.js new file mode 100644 index 0000000000..3c7177f859 --- /dev/null +++ b/packages/installer/rpm/src/InstallerRpm.js @@ -0,0 +1,13 @@ +import InstallerLinux from '@electron-forge/installer-linux'; + +export default class InstallerRpm extends InstallerLinux { + constructor() { + super('rpm'); + } + + async install({ + filePath, + }) { + await this.sudo('RPM', 'dnf', `--assumeyes --nogpgcheck install ${filePath}`); + } +} diff --git a/packages/installer/zip/package.json b/packages/installer/zip/package.json new file mode 100644 index 0000000000..9a4bc9629b --- /dev/null +++ b/packages/installer/zip/package.json @@ -0,0 +1,24 @@ +{ + "name": "@electron-forge/installer-zip", + "version": "6.0.0-beta.0", + "description": "ZIP file helper for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/InstallerZip.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", + "test-fast": "yarn test" + }, + "devDependencies": { + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/installer-darwin": "^6.0.0-beta.0", + "cross-spawn-promise": "^0.10.1", + "fs-extra": "^5.0.0" + } +} \ No newline at end of file diff --git a/packages/installer/zip/src/InstallerZip.js b/packages/installer/zip/src/InstallerZip.js new file mode 100644 index 0000000000..8588783320 --- /dev/null +++ b/packages/installer/zip/src/InstallerZip.js @@ -0,0 +1,30 @@ +import InstallerDarwin from '@electron-forge/installer-darwin'; + +import spawnPromise from 'cross-spawn-promise'; +import fs from 'fs-extra'; +import path from 'path'; + +export default class InstallerZip extends InstallerDarwin { + constructor() { + super('zip'); + } + + async install({ + filePath, + installSpinner, + }) { + await spawnPromise('unzip', ['-q', '-o', path.basename(filePath)], { + cwd: path.dirname(filePath), + }); + + const appPath = (await fs.readdir(path.dirname(filePath))).filter(file => file.endsWith('.app')) + .map(file => path.resolve(path.dirname(filePath), file)) + .sort((fA, fB) => fs.statSync(fA).ctime.getTime() - fs.statSync(fB).ctime.getTime())[0]; + + const targetApplicationPath = `/Applications/${path.basename(appPath)}`; + + await this.moveApp(appPath, targetApplicationPath, installSpinner); + + await spawnPromise('open', ['-R', targetApplicationPath], { detached: true }); + } +} diff --git a/yarn.lock b/yarn.lock index da15577ea4..fec2440f7f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,477 @@ # yarn lockfile v1 +"@babel/cli@^7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.0.0-beta.40.tgz#6f96760267685a4c2f053b40316e95fe8c924a6e" + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^7.0.0" + lodash "^4.2.0" + output-file-sync "^2.0.0" + slash "^1.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^1.6.1" + +"@babel/code-frame@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.40.tgz#37e2b0cf7c56026b4b21d3927cadf81adec32ac6" + dependencies: + "@babel/highlight" "7.0.0-beta.40" + +"@babel/core@^7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0-beta.40.tgz#455464dd81d499fd97d32b473f0331f74379a33f" + dependencies: + "@babel/code-frame" "7.0.0-beta.40" + "@babel/generator" "7.0.0-beta.40" + "@babel/helpers" "7.0.0-beta.40" + "@babel/template" "7.0.0-beta.40" + "@babel/traverse" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + babylon "7.0.0-beta.40" + convert-source-map "^1.1.0" + debug "^3.0.1" + json5 "^0.5.0" + lodash "^4.2.0" + micromatch "^2.3.11" + resolve "^1.3.2" + source-map "^0.5.0" + +"@babel/generator@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.40.tgz#ab61f9556f4f71dbd1138949c795bb9a21e302ea" + dependencies: + "@babel/types" "7.0.0-beta.40" + jsesc "^2.5.1" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.40.tgz#095dd4c70b231eba17ebf61c3434e6f9d71bd574" + dependencies: + "@babel/types" "7.0.0-beta.40" + +"@babel/helper-builder-binary-assignment-operator-visitor@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.40.tgz#bec4240c95d8b646812c5d4ac536a5579dbcdd53" + dependencies: + "@babel/helper-explode-assignable-expression" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + +"@babel/helper-call-delegate@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.40.tgz#5d5000d0bf76c68ee6866961e0b7eb6e9ed52438" + dependencies: + "@babel/helper-hoist-variables" "7.0.0-beta.40" + "@babel/traverse" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + +"@babel/helper-define-map@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.40.tgz#ad64c548dd98e7746305852f113ed04dc74329c0" + dependencies: + "@babel/helper-function-name" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + lodash "^4.2.0" + +"@babel/helper-explode-assignable-expression@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.40.tgz#0ef579288d894a987c60bf0577c074ad18cfa9dd" + dependencies: + "@babel/traverse" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + +"@babel/helper-function-name@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.40.tgz#9d033341ab16517f40d43a73f2d81fc431ccd7b6" + dependencies: + "@babel/helper-get-function-arity" "7.0.0-beta.40" + "@babel/template" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + +"@babel/helper-get-function-arity@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.40.tgz#ac0419cf067b0ec16453e1274f03878195791c6e" + dependencies: + "@babel/types" "7.0.0-beta.40" + +"@babel/helper-hoist-variables@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.40.tgz#59d47fd133782d60db89af0d18083ad3c9f4801c" + dependencies: + "@babel/types" "7.0.0-beta.40" + +"@babel/helper-module-imports@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.40.tgz#251cbb6404599282e8f7356a5b32c9381bef5d2d" + dependencies: + "@babel/types" "7.0.0-beta.40" + lodash "^4.2.0" + +"@babel/helper-module-transforms@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.40.tgz#e5240afd47bd98f6ae65874b9ae508533abfee76" + dependencies: + "@babel/helper-module-imports" "7.0.0-beta.40" + "@babel/helper-simple-access" "7.0.0-beta.40" + "@babel/template" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + lodash "^4.2.0" + +"@babel/helper-optimise-call-expression@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.40.tgz#f0e7f70d455bff8ab6a248a84f0221098fa468ac" + dependencies: + "@babel/types" "7.0.0-beta.40" + +"@babel/helper-regex@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0-beta.40.tgz#b47018ecca8ff66bb390c34a95ff71bc01495833" + dependencies: + lodash "^4.2.0" + +"@babel/helper-remap-async-to-generator@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0-beta.40.tgz#33414d1cc160ebf0991ebc60afebe36b08feae05" + dependencies: + "@babel/helper-annotate-as-pure" "7.0.0-beta.40" + "@babel/helper-wrap-function" "7.0.0-beta.40" + "@babel/template" "7.0.0-beta.40" + "@babel/traverse" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + +"@babel/helper-replace-supers@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.40.tgz#2ab0c9e7fa17d313745f1634ce6b7bccaa5dd5fe" + dependencies: + "@babel/helper-optimise-call-expression" "7.0.0-beta.40" + "@babel/template" "7.0.0-beta.40" + "@babel/traverse" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + +"@babel/helper-simple-access@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.40.tgz#018f765090a3d25153778958969f235dc6ce5b57" + dependencies: + "@babel/template" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + lodash "^4.2.0" + +"@babel/helper-wrap-function@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0-beta.40.tgz#4db4630cdaf4fd47fa2c45b5b7a9ecc33ff3f2be" + dependencies: + "@babel/helper-function-name" "7.0.0-beta.40" + "@babel/template" "7.0.0-beta.40" + "@babel/traverse" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + +"@babel/helpers@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.0.0-beta.40.tgz#82f8e144f56b2896b1d624ca88ac4603023ececd" + dependencies: + "@babel/template" "7.0.0-beta.40" + "@babel/traverse" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + +"@babel/highlight@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.40.tgz#b43d67d76bf46e1d10d227f68cddcd263786b255" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + +"@babel/plugin-proposal-async-generator-functions@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0-beta.40.tgz#64f4aebc3fff33d2ae8f0a0870f0dfe2ff6815d6" + dependencies: + "@babel/helper-remap-async-to-generator" "7.0.0-beta.40" + "@babel/plugin-syntax-async-generators" "7.0.0-beta.40" + +"@babel/plugin-proposal-class-properties@^7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.0.0-beta.40.tgz#ee0549729e9f44603efa17523b459ea3021458dc" + dependencies: + "@babel/helper-function-name" "7.0.0-beta.40" + "@babel/plugin-syntax-class-properties" "7.0.0-beta.40" + +"@babel/plugin-proposal-object-rest-spread@7.0.0-beta.40", "@babel/plugin-proposal-object-rest-spread@^7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.40.tgz#ce35d2240908e52706a612eb26d67db667cd700f" + dependencies: + "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.40" + +"@babel/plugin-proposal-optional-catch-binding@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0-beta.40.tgz#e76ddcb21880eea0225f1dcde20a5e97ca85fd39" + dependencies: + "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.40" + +"@babel/plugin-proposal-unicode-property-regex@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0-beta.40.tgz#1fb2c29c8bd88d5fff82ec080dbe24e7126ec460" + dependencies: + "@babel/helper-regex" "7.0.0-beta.40" + regexpu-core "^4.1.3" + +"@babel/plugin-syntax-async-generators@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0-beta.40.tgz#6c45889569add3b3721cc9a481ae99906f240874" + +"@babel/plugin-syntax-class-properties@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.0.0-beta.40.tgz#ff82c04c6d97cdb947dc64e3f3d4bc791e85a16f" + +"@babel/plugin-syntax-object-rest-spread@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.40.tgz#d5e04536062e4df685c203ae48bb19bfe2cf235c" + +"@babel/plugin-syntax-optional-catch-binding@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0-beta.40.tgz#2e3de0919d05136bb658172ef9ba9ef7e84bce9e" + +"@babel/plugin-transform-arrow-functions@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0-beta.40.tgz#0842045b16835d6da0c334d0b09d575852f27962" + +"@babel/plugin-transform-async-to-generator@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0-beta.40.tgz#9195e2473a435b9a9aabc0b64572e9d1ec1c57cb" + dependencies: + "@babel/helper-module-imports" "7.0.0-beta.40" + "@babel/helper-remap-async-to-generator" "7.0.0-beta.40" + +"@babel/plugin-transform-block-scoped-functions@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0-beta.40.tgz#491e61f860cabe69379233983fe7ca14f879e41f" + +"@babel/plugin-transform-block-scoping@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.40.tgz#23197ee6f696b7e5ace884f0dc5434df20d7dd97" + dependencies: + lodash "^4.2.0" + +"@babel/plugin-transform-classes@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.40.tgz#c7a752009df4bb0f77179027daa0783f9a036b0b" + dependencies: + "@babel/helper-annotate-as-pure" "7.0.0-beta.40" + "@babel/helper-define-map" "7.0.0-beta.40" + "@babel/helper-function-name" "7.0.0-beta.40" + "@babel/helper-optimise-call-expression" "7.0.0-beta.40" + "@babel/helper-replace-supers" "7.0.0-beta.40" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.40.tgz#e4bd53455d9f96882cc8e9923895d71690f6969e" + +"@babel/plugin-transform-destructuring@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.40.tgz#503a4719eb9ed8c933b50d4ec3f106ed371852ee" + +"@babel/plugin-transform-dotall-regex@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0-beta.40.tgz#89b5ccff477624b97129f9a7e262a436437d7ae2" + dependencies: + "@babel/helper-regex" "7.0.0-beta.40" + regexpu-core "^4.1.3" + +"@babel/plugin-transform-duplicate-keys@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0-beta.40.tgz#91599be229d4409cf3c9bbd094fb04d354bd8068" + +"@babel/plugin-transform-exponentiation-operator@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.40.tgz#bf0bafdd5aad7061c25dba25e29e12329838baeb" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "7.0.0-beta.40" + +"@babel/plugin-transform-for-of@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.40.tgz#67920d749bac4840ceeae9907d918dad33908244" + +"@babel/plugin-transform-function-name@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.40.tgz#37b5ca4f90fba207d359c0be3af5bfecdc737a3d" + dependencies: + "@babel/helper-function-name" "7.0.0-beta.40" + +"@babel/plugin-transform-literals@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.40.tgz#a6bf8808f97accf42a171b27a133802aa0650d3e" + +"@babel/plugin-transform-modules-amd@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0-beta.40.tgz#1882f1a02b16d261a332c87c035c9aeefd402683" + dependencies: + "@babel/helper-module-transforms" "7.0.0-beta.40" + +"@babel/plugin-transform-modules-commonjs@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.40.tgz#a85f8c311f498a94a45531cc4ed5ff98b338a70a" + dependencies: + "@babel/helper-module-transforms" "7.0.0-beta.40" + "@babel/helper-simple-access" "7.0.0-beta.40" + +"@babel/plugin-transform-modules-systemjs@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0-beta.40.tgz#808b372bdbe06a28bf7a3870d8e810bd7298227a" + dependencies: + "@babel/helper-hoist-variables" "7.0.0-beta.40" + +"@babel/plugin-transform-modules-umd@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0-beta.40.tgz#5bd4e395a2673e687ed592608ad2fd4883a5a119" + dependencies: + "@babel/helper-module-transforms" "7.0.0-beta.40" + +"@babel/plugin-transform-new-target@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0-beta.40.tgz#ee52bb87fbf325ac054811ec739b25fbce97809e" + +"@babel/plugin-transform-object-super@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0-beta.40.tgz#c64f9ba3587610d76c2edfdd8f507a59ea3ba63d" + dependencies: + "@babel/helper-replace-supers" "7.0.0-beta.40" + +"@babel/plugin-transform-parameters@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.40.tgz#efa366fab0dcbd0221b46aa2662c324b4b414d1d" + dependencies: + "@babel/helper-call-delegate" "7.0.0-beta.40" + "@babel/helper-get-function-arity" "7.0.0-beta.40" + +"@babel/plugin-transform-regenerator@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.40.tgz#f8a89ce89a0fae8e9cdfc2f2768104811517374a" + dependencies: + regenerator-transform "^0.12.3" + +"@babel/plugin-transform-shorthand-properties@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0-beta.40.tgz#421835237b0fcab0e67c941726d95dfc543514f4" + +"@babel/plugin-transform-spread@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.40.tgz#881578938e5750137301750bef7fdd0e01be76be" + +"@babel/plugin-transform-sticky-regex@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.40.tgz#5b44b31f8539fc66af18962e55752b82298032ee" + dependencies: + "@babel/helper-regex" "7.0.0-beta.40" + +"@babel/plugin-transform-template-literals@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.40.tgz#5ef3377d1294aee39b913768a1f884806a45393b" + dependencies: + "@babel/helper-annotate-as-pure" "7.0.0-beta.40" + +"@babel/plugin-transform-typeof-symbol@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0-beta.40.tgz#67f0b8a5dd298b0aa5b347c3b6738c9c7baf1bcf" + +"@babel/plugin-transform-unicode-regex@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.40.tgz#a956187aad2965d7c095d64b1ae87eba10e0a2c6" + dependencies: + "@babel/helper-regex" "7.0.0-beta.40" + regexpu-core "^4.1.3" + +"@babel/preset-env@^7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.0.0-beta.40.tgz#713292f9e410f76b3f4301330756c89343c4b2e4" + dependencies: + "@babel/plugin-proposal-async-generator-functions" "7.0.0-beta.40" + "@babel/plugin-proposal-object-rest-spread" "7.0.0-beta.40" + "@babel/plugin-proposal-optional-catch-binding" "7.0.0-beta.40" + "@babel/plugin-proposal-unicode-property-regex" "7.0.0-beta.40" + "@babel/plugin-syntax-async-generators" "7.0.0-beta.40" + "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.40" + "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.40" + "@babel/plugin-transform-arrow-functions" "7.0.0-beta.40" + "@babel/plugin-transform-async-to-generator" "7.0.0-beta.40" + "@babel/plugin-transform-block-scoped-functions" "7.0.0-beta.40" + "@babel/plugin-transform-block-scoping" "7.0.0-beta.40" + "@babel/plugin-transform-classes" "7.0.0-beta.40" + "@babel/plugin-transform-computed-properties" "7.0.0-beta.40" + "@babel/plugin-transform-destructuring" "7.0.0-beta.40" + "@babel/plugin-transform-dotall-regex" "7.0.0-beta.40" + "@babel/plugin-transform-duplicate-keys" "7.0.0-beta.40" + "@babel/plugin-transform-exponentiation-operator" "7.0.0-beta.40" + "@babel/plugin-transform-for-of" "7.0.0-beta.40" + "@babel/plugin-transform-function-name" "7.0.0-beta.40" + "@babel/plugin-transform-literals" "7.0.0-beta.40" + "@babel/plugin-transform-modules-amd" "7.0.0-beta.40" + "@babel/plugin-transform-modules-commonjs" "7.0.0-beta.40" + "@babel/plugin-transform-modules-systemjs" "7.0.0-beta.40" + "@babel/plugin-transform-modules-umd" "7.0.0-beta.40" + "@babel/plugin-transform-new-target" "7.0.0-beta.40" + "@babel/plugin-transform-object-super" "7.0.0-beta.40" + "@babel/plugin-transform-parameters" "7.0.0-beta.40" + "@babel/plugin-transform-regenerator" "7.0.0-beta.40" + "@babel/plugin-transform-shorthand-properties" "7.0.0-beta.40" + "@babel/plugin-transform-spread" "7.0.0-beta.40" + "@babel/plugin-transform-sticky-regex" "7.0.0-beta.40" + "@babel/plugin-transform-template-literals" "7.0.0-beta.40" + "@babel/plugin-transform-typeof-symbol" "7.0.0-beta.40" + "@babel/plugin-transform-unicode-regex" "7.0.0-beta.40" + browserslist "^3.0.0" + invariant "^2.2.2" + semver "^5.3.0" + +"@babel/register@^7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.0.0-beta.40.tgz#40df0bdbb2fe74a7c7b09af3d59b71c8cd53c4da" + dependencies: + core-js "^2.5.3" + find-cache-dir "^1.0.0" + home-or-tmp "^3.0.0" + lodash "^4.2.0" + mkdirp "^0.5.1" + pirates "^3.0.1" + source-map-support "^0.4.2" + +"@babel/template@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.40.tgz#034988c6424eb5c3268fe6a608626de1f4410fc8" + dependencies: + "@babel/code-frame" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + babylon "7.0.0-beta.40" + lodash "^4.2.0" + +"@babel/traverse@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.40.tgz#d140e449b2e093ef9fe1a2eecc28421ffb4e521e" + dependencies: + "@babel/code-frame" "7.0.0-beta.40" + "@babel/generator" "7.0.0-beta.40" + "@babel/helper-function-name" "7.0.0-beta.40" + "@babel/types" "7.0.0-beta.40" + babylon "7.0.0-beta.40" + debug "^3.0.1" + globals "^11.1.0" + invariant "^2.2.0" + lodash "^4.2.0" + +"@babel/types@7.0.0-beta.40": + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.40.tgz#25c3d7aae14126abe05fcb098c65a66b6d6b8c14" + dependencies: + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" + "@octokit/rest@^14.0.4": version "14.0.9" resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-14.0.9.tgz#d5e0a00dcb78901dd7b2ef852acfc0aea7c479ef" @@ -89,12 +560,6 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" -ansi-colors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-1.0.1.tgz#e94c6c306005af8b482240241e2f3dea4b855ff3" - dependencies: - ansi-wrap "^0.1.0" - ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" @@ -103,12 +568,6 @@ ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" -ansi-gray@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" - dependencies: - ansi-wrap "0.1.0" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -127,10 +586,6 @@ ansi-styles@^3.2.0: dependencies: color-convert "^1.9.0" -ansi-wrap@0.1.0, ansi-wrap@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" - ansi@^0.3.0, ansi@~0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" @@ -139,6 +594,13 @@ any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" +anymatch@^1.3.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" + dependencies: + micromatch "^2.1.5" + normalize-path "^2.0.0" + anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" @@ -224,29 +686,17 @@ array-buffer-from-string@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/array-buffer-from-string/-/array-buffer-from-string-0.1.0.tgz#3b14351f86149d84efc612c5ada7ed85169d7b07" -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - -array-each@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" - array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" -array-slice@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" - array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" dependencies: array-uniq "^1.0.1" -array-uniq@^1.0.1, array-uniq@^1.0.2: +array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" @@ -424,30 +874,6 @@ babel-code-frame@^6.16.0, babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.23.1, babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.7" - slash "^1.0.0" - source-map "^0.5.6" - babel-eslint@^7.0.0: version "7.2.3" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-7.2.3.tgz#b2fe2d80126470f5c19442dc757253a897710827" @@ -481,7 +907,7 @@ babel-generator@6.26.0: source-map "^0.5.6" trim-right "^1.0.1" -babel-generator@^6.18.0, babel-generator@^6.26.0: +babel-generator@^6.18.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" dependencies: @@ -494,406 +920,20 @@ babel-generator@^6.18.0, babel-generator@^6.26.0: source-map "^0.5.7" trim-right "^1.0.1" -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-call-delegate@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-function-name@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" - dependencies: - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - dependencies: - babel-runtime "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-replace-supers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-messages@^6.23.0, babel-messages@^6.8.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" dependencies: babel-runtime "^6.22.0" -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-istanbul@^4.0.0: - version "4.1.5" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e" - dependencies: - find-up "^2.1.0" - istanbul-lib-instrument "^1.7.5" - test-exclude "^4.1.1" - -babel-plugin-syntax-async-functions@^6.13.0, babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-async-to-module-method@^6.16.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-module-method/-/babel-plugin-transform-async-to-module-method-6.24.1.tgz#9109a08987794b411cb213850ce935ec2f029cdb" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-arrow-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - regexpu-core "^2.0.0" - -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-runtime@^6.15.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz#88490d446502ea9b8e7efb0fe09ec4d99479b1ee" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@^1.6.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" - dependencies: - babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" - babel-plugin-transform-es2015-arrow-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" - babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" - babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.16.3, babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.0: +babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: +babel-template@^6.16.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" dependencies: @@ -903,7 +943,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@6.26.0, babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@6.26.0, babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: @@ -917,7 +957,7 @@ babel-traverse@6.26.0, babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-tra invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.10.2, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.10.2, babel-types@^6.18.0, babel-types@^6.23.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: @@ -930,6 +970,10 @@ babylon@6.18.0, babylon@^6.17.0, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" +babylon@7.0.0-beta.40: + version "7.0.0-beta.40" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.40.tgz#91fc8cd56d5eb98b28e6fde41045f2957779940a" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -964,10 +1008,6 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" -beeper@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - before-after-hook@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.1.0.tgz#83165e15a59460d13702cb8febd6a1807896db5a" @@ -995,7 +1035,7 @@ block-stream@*: dependencies: inherits "~2.0.0" -bluebird@^3.0.6, bluebird@^3.1.1, bluebird@^3.3.4, bluebird@^3.4.6, bluebird@^3.5.0: +bluebird@^3.0.6, bluebird@^3.1.1, bluebird@^3.3.4, bluebird@^3.5.0: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -1045,7 +1085,7 @@ bplist-creator@~0.0.3: dependencies: stream-buffers "~2.2.0" -brace-expansion@^1.0.0, brace-expansion@^1.1.7: +brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" dependencies: @@ -1080,12 +1120,12 @@ browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" -browserslist@^2.1.2: - version "2.11.3" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" +browserslist@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.1.0.tgz#6a1ccc302ddf48e70480e2ee1a9acc293eceb306" dependencies: - caniuse-lite "^1.0.30000792" - electron-to-chromium "^1.3.30" + caniuse-lite "^1.0.30000808" + electron-to-chromium "^1.3.33" buffer-crc32@~0.2.1: version "0.2.13" @@ -1178,7 +1218,7 @@ camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" -caniuse-lite@^1.0.30000792: +caniuse-lite@^1.0.30000808: version "1.0.30000808" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000808.tgz#7d759b5518529ea08b6705a19e70dbf401628ffc" @@ -1283,6 +1323,21 @@ cheerio@0.22.0: lodash.reject "^4.4.0" lodash.some "^4.4.0" +chokidar@^1.6.1: + version "1.7.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" + dependencies: + anymatch "^1.3.0" + async-each "^1.0.0" + glob-parent "^2.0.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^2.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + chokidar@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.2.tgz#4dc65139eeb2714977735b6a35d06e97b494dfd7" @@ -1370,18 +1425,6 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" -clone-stats@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - -clone@^1.0.0, clone@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" - co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -1422,10 +1465,6 @@ color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" -color-support@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" - colors@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -1454,7 +1493,7 @@ commander@2.11.0: version "2.11.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" -commander@^2.11.0, commander@^2.9.0: +commander@^2.11.0, commander@^2.8.1, commander@^2.9.0: version "2.14.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" @@ -1537,7 +1576,7 @@ conventional-commit-types@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/conventional-commit-types/-/conventional-commit-types-2.2.0.tgz#5db95739d6c212acbe7b6f656a11b940baa68946" -convert-source-map@^1.3.0, convert-source-map@^1.5.0: +convert-source-map@^1.1.0, convert-source-map@^1.3.0: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -1545,7 +1584,7 @@ copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" -core-js@^2.4.0, core-js@^2.5.0: +core-js@^2.4.0, core-js@^2.5.3: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" @@ -1720,10 +1759,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -dateformat@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" - debug-log@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" @@ -1788,12 +1823,6 @@ default-require-extensions@^1.0.0: dependencies: strip-bom "^2.0.0" -defaults@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" - dependencies: - clone "^1.0.2" - define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -1834,20 +1863,12 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" -deprecated@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/deprecated/-/deprecated-0.0.1.tgz#f9c9af5464afa1e7a971458a8bdef2aa94d5bb19" - detect-file@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" dependencies: fs-exists-sync "^0.1.0" -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - detect-indent@4.0.0, detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" @@ -1942,12 +1963,6 @@ ds-store@^0.1.5: macos-alias "~0.2.5" tn1150 "^0.1.0" -duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - dependencies: - readable-stream "~1.1.9" - duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -2120,7 +2135,7 @@ electron-rebuild@^1.6.0: spawn-rx "^2.0.10" yargs "^7.0.2" -electron-to-chromium@^1.3.30: +electron-to-chromium@^1.3.33: version "1.3.33" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.33.tgz#bf00703d62a7c65238136578c352d6c5c042a545" @@ -2166,12 +2181,6 @@ end-of-stream@^1.0.0: dependencies: once "^1.4.0" -end-of-stream@~0.1.5: - version "0.1.5" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-0.1.5.tgz#8e177206c3c80837d85632e8b9359dfe8b2f6eaf" - dependencies: - once "~1.3.0" - entities@1.0: version "1.0.0" resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26" @@ -2579,7 +2588,7 @@ extend-shallow@^2.0.1: dependencies: is-extendable "^0.1.0" -extend-shallow@^3.0.0, extend-shallow@^3.0.2: +extend-shallow@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" dependencies: @@ -2646,14 +2655,6 @@ eyes@0.1.x: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" -fancy-log@^1.1.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" - dependencies: - ansi-gray "^0.1.1" - color-support "^1.1.3" - time-stamp "^1.0.0" - fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" @@ -2737,16 +2738,20 @@ find-cache-dir@^0.1.1: mkdirp "^0.5.1" pkg-dir "^1.0.0" +find-cache-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^2.0.0" + find-config@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/find-config/-/find-config-0.3.0.tgz#c4f6b2ae491b2cae3ca8af72401f1ad84cfdd0d9" dependencies: user-home "^1.1.1" -find-index@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - find-node-modules@1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/find-node-modules/-/find-node-modules-1.0.4.tgz#b6deb3cccb699c87037677bcede2c5f5862b2550" @@ -2779,37 +2784,10 @@ findup-sync@0.4.2: version "0.4.2" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.2.tgz#a8117d0f73124f5a4546839579fe52d7129fb5e5" dependencies: - detect-file "^0.1.0" - is-glob "^2.0.1" - micromatch "^2.3.7" - resolve-dir "^0.1.0" - -findup-sync@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-2.0.0.tgz#9326b1488c22d1a6088650a86901b2d9a90a2cbc" - dependencies: - detect-file "^1.0.0" - is-glob "^3.1.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -fined@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.1.0.tgz#b37dc844b76a2f5e7081e884f7c0ae344f153476" - dependencies: - expand-tilde "^2.0.2" - is-plain-object "^2.0.3" - object.defaults "^1.1.0" - object.pick "^1.2.0" - parse-filepath "^1.0.1" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - -flagged-respawn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.0.tgz#4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7" + detect-file "^0.1.0" + is-glob "^2.0.1" + micromatch "^2.3.7" + resolve-dir "^0.1.0" flat-cache@^1.2.1: version "1.3.0" @@ -2855,12 +2833,6 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" -for-own@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - dependencies: - for-in "^1.0.1" - foreground-child@^1.5.3, foreground-child@^1.5.6: version "1.5.6" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" @@ -2973,6 +2945,10 @@ fs-extra@^5.0.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-readdir-recursive@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + fs-temp@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/fs-temp/-/fs-temp-1.1.2.tgz#cc52f038bbefe510f6bcd09ec592b79d0f69253f" @@ -3045,12 +3021,6 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" -gaze@^0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/gaze/-/gaze-0.5.2.tgz#40b709537d24d1d45767db5a908689dfe69ac44f" - dependencies: - globule "~0.1.0" - generate-changelog@^1.0.2: version "1.7.0" resolved "https://registry.yarnpkg.com/generate-changelog/-/generate-changelog-1.7.0.tgz#e6321226207d5cbcfe24de39d7ffd65d51698596" @@ -3141,33 +3111,10 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-stream@^3.1.5: - version "3.1.18" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-3.1.18.tgz#9170a5f12b790306fdfe598f313f8f7954fd143b" - dependencies: - glob "^4.3.1" - glob2base "^0.0.12" - minimatch "^2.0.1" - ordered-read-streams "^0.1.0" - through2 "^0.6.1" - unique-stream "^1.0.0" - glob-to-regexp@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab" -glob-watcher@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/glob-watcher/-/glob-watcher-0.0.6.tgz#b95b4a8df74b39c83298b0c05c978b4d9a3b710b" - dependencies: - gaze "^0.5.1" - -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - dependencies: - find-index "^0.1.1" - glob@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" @@ -3190,15 +3137,6 @@ glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glo once "^1.3.0" path-is-absolute "^1.0.0" -glob@^4.3.1: - version "4.5.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-4.5.3.tgz#c6cb73d3226c1efef04de3c56d012f03377ee15f" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "^2.0.1" - once "^1.3.0" - glob@^6.0.4: version "6.0.4" resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22" @@ -3209,14 +3147,6 @@ glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@~3.1.21: - version "3.1.21" - resolved "https://registry.yarnpkg.com/glob/-/glob-3.1.21.tgz#d29e0a055dea5138f4d07ed40e8982e83c2066cd" - dependencies: - graceful-fs "~1.2.0" - inherits "1" - minimatch "~0.2.11" - glob@~3.2.6: version "3.2.11" resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" @@ -3264,6 +3194,10 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" +globals@^11.1.0: + version "11.3.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.3.0.tgz#e04fdb7b9796d8adac9c8f64c14837b2313378b0" + globals@^9.14.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3279,20 +3213,6 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -globule@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/globule/-/globule-0.1.0.tgz#d9c8edde1da79d125a151b79533b978676346ae5" - dependencies: - glob "~3.1.21" - lodash "~1.0.1" - minimatch "~0.2.11" - -glogg@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" - dependencies: - sparkles "^1.0.0" - got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -3309,82 +3229,20 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^3.0.0, graceful-fs@~3.0.5: - version "3.0.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" - dependencies: - natives "^1.1.0" - graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" -graceful-fs@~1.2.0: - version "1.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-1.2.3.tgz#15a4806a57547cb2d2dbf27f42e89a8c3451b364" +graceful-fs@~3.0.5: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" growl@1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" -gulp-babel@^6.1.2: - version "6.1.3" - resolved "https://registry.yarnpkg.com/gulp-babel/-/gulp-babel-6.1.3.tgz#5aad8acb0db6b7f2f0be19eeee9528f2064df631" - dependencies: - babel-core "^6.23.1" - object-assign "^4.0.1" - plugin-error "^1.0.1" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl-sourcemaps-apply "^0.2.0" - -gulp-util@^3.0.0: - version "3.0.8" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp@^3.9.1: - version "3.9.1" - resolved "https://registry.yarnpkg.com/gulp/-/gulp-3.9.1.tgz#571ce45928dd40af6514fc4011866016c13845b4" - dependencies: - archy "^1.0.0" - chalk "^1.0.0" - deprecated "^0.0.1" - gulp-util "^3.0.0" - interpret "^1.0.0" - liftoff "^2.1.0" - minimist "^1.1.0" - orchestrator "^0.3.0" - pretty-hrtime "^1.0.0" - semver "^4.1.0" - tildify "^1.0.0" - v8flags "^2.0.2" - vinyl-fs "^0.3.0" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - dependencies: - glogg "^1.0.0" - handlebars@^4.0.3: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" @@ -3435,12 +3293,6 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - dependencies: - sparkles "^1.0.0" - has-own-property-x@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/has-own-property-x/-/has-own-property-x-3.2.0.tgz#1c4b112a577c8cb5805469556e54b6e959e4ded9" @@ -3539,12 +3391,9 @@ hoek@4.x.x: version "4.2.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" +home-or-tmp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-3.0.0.tgz#57a8fe24cf33cdd524860a15821ddc25c86671fb" homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: version "1.0.1" @@ -3657,10 +3506,6 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-1.0.2.tgz#ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b" - inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" @@ -3747,7 +3592,7 @@ interpret@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" -invariant@^2.2.2: +invariant@^2.2.0, invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" dependencies: @@ -3757,13 +3602,6 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" - is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -4025,6 +3863,10 @@ is-path-inside@^1.0.0: dependencies: path-is-inside "^1.0.1" +is-plain-obj@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" + is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" @@ -4055,12 +3897,6 @@ is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - dependencies: - is-unc-path "^1.0.0" - is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" @@ -4085,12 +3921,6 @@ is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - dependencies: - unc-path-regex "^0.1.2" - is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -4147,7 +3977,7 @@ istanbul-lib-hook@^1.1.0: dependencies: append-transform "^0.4.0" -istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.9.1: +istanbul-lib-instrument@^1.9.1: version "1.9.2" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.2.tgz#84905bf47f7e0b401d6b840da7bad67086b4aab6" dependencies: @@ -4227,6 +4057,10 @@ jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" +jsesc@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" + jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" @@ -4249,7 +4083,7 @@ json-stringify-safe@~5.0.0, json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json5@^0.5.1: +json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -4292,7 +4126,7 @@ just-extend@^1.1.27: version "1.1.27" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.1.0, kind-of@^3.2.0: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: @@ -4363,19 +4197,6 @@ levn@^0.3.0, levn@~0.3.0: prelude-ls "~1.1.2" type-check "~0.3.2" -liftoff@^2.1.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-2.5.0.tgz#2009291bb31cea861bbf10a7c15a28caf75c31ec" - dependencies: - extend "^3.0.0" - findup-sync "^2.0.0" - fined "^1.0.1" - flagged-respawn "^1.0.0" - is-plain-object "^2.0.4" - object.map "^1.0.0" - rechoir "^0.6.2" - resolve "^1.1.7" - load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -4402,42 +4223,10 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - -lodash._reinterpolate@^3.0.0, lodash._reinterpolate@~3.0.0: +lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" @@ -4466,12 +4255,6 @@ lodash.endswith@^4.0.1, lodash.endswith@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - dependencies: - lodash._root "^3.0.0" - lodash.filter@^4.4.0, lodash.filter@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" @@ -4496,14 +4279,6 @@ lodash.get@^4.0.0, lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - lodash.isfunction@^3.0.8: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" @@ -4516,14 +4291,6 @@ lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - lodash.map@^4.4.0, lodash.map@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" @@ -4560,10 +4327,6 @@ lodash.reject@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - lodash.some@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" @@ -4572,20 +4335,6 @@ lodash.startswith@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.startswith/-/lodash.startswith-4.2.1.tgz#c598c4adce188a27e53145731cdc6c0e7177600c" -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - lodash.template@^4.2.2, lodash.template@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" @@ -4593,13 +4342,6 @@ lodash.template@^4.2.2, lodash.template@^4.4.0: lodash._reinterpolate "~3.0.0" lodash.templatesettings "^4.0.0" -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.templatesettings@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" @@ -4618,10 +4360,6 @@ lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.0, lodash@^4.14.0, lodash@^4.16.2, lo version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" -lodash@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-1.0.2.tgz#8f57560c83b59fc270bd3d561b690043430e2551" - lodash@~2.4.1: version "2.4.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.2.tgz#fadd834b9683073da179b3eae6d9c0d15053f73e" @@ -4686,13 +4424,7 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" -make-iterator@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.0.tgz#57bef5dc85d23923ba23767324d8e8f8f3d9694b" - dependencies: - kind-of "^3.1.0" - -map-cache@^0.2.0, map-cache@^0.2.2: +map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -4776,7 +4508,7 @@ merge@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" -micromatch@^2.3.11, micromatch@^2.3.7: +micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -4794,7 +4526,7 @@ micromatch@^2.3.11, micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" -micromatch@^3.0.4, micromatch@^3.1.4: +micromatch@^3.1.4: version "3.1.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" dependencies: @@ -4847,19 +4579,6 @@ minimatch@0.3: dependencies: brace-expansion "^1.1.7" -minimatch@^2.0.1: - version "2.0.10" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-2.0.10.tgz#8d087c39c6b38c001b97fca7ce6d0e1e80afbac7" - dependencies: - brace-expansion "^1.0.0" - -minimatch@~0.2.11: - version "0.2.14" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.2.14.tgz#c74e780574f63c6f9a090e90efbe6ef53a6a756a" - dependencies: - lru-cache "2" - sigmund "~1.0.0" - minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -4932,12 +4651,6 @@ multiline@^1.0.2: dependencies: strip-indent "^1.0.0" -multipipe@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - dependencies: - duplexer2 "0.0.2" - murmur-32@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/murmur-32/-/murmur-32-0.1.0.tgz#c1a79d4fc5fabf0405749d0aff77c41402055861" @@ -5042,6 +4755,10 @@ node-gyp@^3.4.0, node-gyp@^3.6.0: tar "^2.0.0" which "1" +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + node-pre-gyp@^0.6.39: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" @@ -5111,7 +4828,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: @@ -5220,10 +4937,6 @@ oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" @@ -5261,22 +4974,6 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.defaults@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" - dependencies: - array-each "^1.0.1" - array-slice "^1.0.0" - for-own "^1.0.0" - isobject "^3.0.0" - -object.map@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" - dependencies: - for-own "^1.0.0" - make-iterator "^1.0.0" - object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -5284,7 +4981,7 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -object.pick@^1.2.0, object.pick@^1.3.0: +object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" dependencies: @@ -5296,12 +4993,6 @@ once@^1.3.0, once@^1.3.3, once@^1.4.0: dependencies: wrappy "1" -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - onetime@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" @@ -5345,18 +5036,6 @@ ora@^1.1.0, ora@^1.2.0: cli-spinners "^1.0.1" log-symbols "^2.1.0" -orchestrator@^0.3.0: - version "0.3.8" - resolved "https://registry.yarnpkg.com/orchestrator/-/orchestrator-0.3.8.tgz#14e7e9e2764f7315fbac184e506c7aa6df94ad7e" - dependencies: - end-of-stream "~0.1.5" - sequencify "~0.0.7" - stream-consume "~0.1.0" - -ordered-read-streams@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz#fd565a9af8eb4473ba69b6ed8a34352cb552f126" - os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -5379,7 +5058,7 @@ os-shim@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -5390,6 +5069,14 @@ osenv@0, osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +output-file-sync@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-2.0.1.tgz#f53118282f5f553c2799541792b723a4c71430c0" + dependencies: + graceful-fs "^4.1.11" + is-plain-obj "^1.1.0" + mkdirp "^0.5.1" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -5437,14 +5124,6 @@ parse-color@^1.0.0: dependencies: color-convert "~0.5.0" -parse-filepath@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" - dependencies: - is-absolute "^1.0.0" - map-cache "^0.2.0" - path-root "^0.1.1" - parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -5495,7 +5174,7 @@ path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -5515,16 +5194,6 @@ path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - dependencies: - path-root-regex "^0.1.0" - path-to-regexp@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" @@ -5589,12 +5258,24 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +pirates@^3.0.1: + version "3.0.2" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-3.0.2.tgz#7e6f85413fd9161ab4e12b539b06010d85954bb9" + dependencies: + node-modules-regexp "^1.0.0" + pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" dependencies: find-up "^1.0.0" +pkg-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" + dependencies: + find-up "^2.1.0" + pkg-up@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" @@ -5613,15 +5294,6 @@ plist@^2.0.0, plist@^2.1.0: xmlbuilder "8.2.2" xmldom "0.1.x" -plugin-error@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-1.0.1.tgz#77016bd8919d0ac377fdcdd0322328953ca5781c" - dependencies: - ansi-colors "^1.0.1" - arr-diff "^4.0.0" - arr-union "^3.1.0" - extend-shallow "^3.0.2" - pluralize@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" @@ -5649,11 +5321,7 @@ pretty-bytes@^1.0.2: get-stdin "^4.0.1" meow "^3.1.0" -pretty-hrtime@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz#b7e3ea42435a4c9b2759d99e0f201eb195802ee1" - -private@^0.1.6, private@^0.1.7: +private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -5813,15 +5481,6 @@ readable-stream@1.1: isarray "0.0.1" string_decoder "~0.10.x" -"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.2, readable-stream@~1.0.24, readable-stream@~1.0.26: - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@^1.0.27-1, readable-stream@^1.1.8, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" @@ -5831,7 +5490,7 @@ readable-stream@^1.0.27-1, readable-stream@^1.1.8, readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2: +readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.3.4" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" dependencies: @@ -5843,6 +5502,15 @@ readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable string_decoder "~1.0.3" util-deprecate "~1.0.1" +readable-stream@~1.0.2, readable-stream@~1.0.24, readable-stream@~1.0.26: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" @@ -5873,7 +5541,13 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" -regenerate@^1.2.1: +regenerate-unicode-properties@^5.1.1: + version "5.1.3" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-5.1.3.tgz#54f5891543468f36f2274b67c6bc4c033c27b308" + dependencies: + regenerate "^1.3.3" + +regenerate@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" @@ -5881,12 +5555,10 @@ regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" +regenerator-transform@^0.12.3: + version "0.12.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.12.3.tgz#459adfb64f6a27164ab991b7873f45ab969eca8b" dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" private "^0.1.6" regex-cache@^0.4.2: @@ -5901,13 +5573,16 @@ regex-not@^1.0.0: dependencies: extend-shallow "^2.0.1" -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" +regexpu-core@^4.1.3: + version "4.1.3" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.1.3.tgz#fb81616dbbc2a917a7419b33f8379144f51eb8d0" dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.3.3" + regenerate-unicode-properties "^5.1.1" + regjsgen "^0.3.0" + regjsparser "^0.2.1" + unicode-match-property-ecmascript "^1.0.3" + unicode-match-property-value-ecmascript "^1.0.1" registry-auth-token@^3.0.1: version "3.3.2" @@ -5922,13 +5597,13 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" +regjsgen@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.3.0.tgz#0ee4a3e9276430cda25f1e789ea6c15b87b0cb43" -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" +regjsparser@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.2.1.tgz#c3787553faf04e775c302102ef346d995000ec1c" dependencies: jsesc "~0.5.0" @@ -5963,10 +5638,6 @@ replace-comments-x@^2.0.0: require-coercible-to-string-x "^1.0.0" to-string-x "^1.4.2" -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - request@2, request@^2.45.0, request@^2.55.0, request@^2.79.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" @@ -6077,7 +5748,7 @@ resolve-dir@^0.1.0: expand-tilde "^1.2.2" global-modules "^0.2.3" -resolve-dir@^1.0.0, resolve-dir@^1.0.1: +resolve-dir@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" dependencies: @@ -6102,7 +5773,7 @@ resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" -resolve@^1.1.6, resolve@^1.1.7: +resolve@^1.1.6, resolve@^1.3.2: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" dependencies: @@ -6238,10 +5909,6 @@ semver-diff@^2.0.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -semver@^4.1.0: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - semver@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/semver/-/semver-2.2.1.tgz#7941182b3ffcc580bff1c17942acdf7951c0d213" @@ -6250,10 +5917,6 @@ semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" -sequencify@~0.0.7: - version "0.0.7" - resolved "https://registry.yarnpkg.com/sequencify/-/sequencify-0.0.7.tgz#90cff19d02e07027fd767f5ead3e7b95d1e7380c" - set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -6405,7 +6068,7 @@ source-map-resolve@^0.5.0: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.4.15: +source-map-support@^0.4.2: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" dependencies: @@ -6421,7 +6084,7 @@ source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.0, source-map@^0.5.1, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.6: +source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1, source-map@~0.5.6: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" @@ -6429,10 +6092,6 @@ source-map@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" -sparkles@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" - spawn-rx@^2.0.10: version "2.0.12" resolved "https://registry.yarnpkg.com/spawn-rx/-/spawn-rx-2.0.12.tgz#b6285294499426089beea0c3c1ec32d7fc57a376" @@ -6534,10 +6193,6 @@ stream-combiner@~0.0.2, stream-combiner@~0.0.4: dependencies: duplexer "~0.1.1" -stream-consume@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/stream-consume/-/stream-consume-0.1.1.tgz#d3bdb598c2bd0ae82b8cac7ac50b1107a7996c48" - streamsink@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/streamsink/-/streamsink-1.2.0.tgz#efafee9f1e22d3591ed7de3dcaa95c3f5e79f73c" @@ -6583,13 +6238,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-bom@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-1.0.0.tgz#85b8862f3844b5a6d5ec8467a93598173a36f794" - dependencies: - first-chunk-stream "^1.0.0" - is-utf8 "^0.2.0" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -6772,20 +6420,6 @@ throttleit@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" -through2@^0.6.1: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - through2@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" @@ -6797,16 +6431,6 @@ through@2, through@^2.3.6, through@~2.3, through@~2.3.1, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" -tildify@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/tildify/-/tildify-1.2.0.tgz#dcec03f55dca9b7aa3e5b04f21817eb56e63588a" - dependencies: - os-homedir "^1.0.0" - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" @@ -6850,6 +6474,10 @@ to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" + to-integer-x@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/to-integer-x/-/to-integer-x-3.0.0.tgz#9f3b80e668c7f0ae45e6926b40d95f52c1addc74" @@ -7047,16 +6675,31 @@ uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - undefsafe@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" dependencies: debug "^2.2.0" +unicode-canonical-property-names-ecmascript@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.3.tgz#f6119f417467593c0086357c85546b6ad5abc583" + +unicode-match-property-ecmascript@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.3.tgz#db9b1cb4ffc67e0c5583780b1b59370e4cbe97b9" + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.2" + unicode-property-aliases-ecmascript "^1.0.3" + +unicode-match-property-value-ecmascript@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.1.tgz#fea059120a016f403afd3bf586162b4db03e0604" + +unicode-property-aliases-ecmascript@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.3.tgz#ac3522583b9e630580f916635333e00c5ead690d" + union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" @@ -7066,10 +6709,6 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" -unique-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-1.0.0.tgz#d59a4a75427447d9aa6c91e70263f8d26a4b104b" - unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -7186,12 +6825,6 @@ uuid@^3.0.0, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" -v8flags@^2.0.2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" - dependencies: - user-home "^1.1.1" - validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" @@ -7211,40 +6844,6 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vinyl-fs@^0.3.0: - version "0.3.14" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-0.3.14.tgz#9a6851ce1cac1c1cea5fe86c0931d620c2cfa9e6" - dependencies: - defaults "^1.0.0" - glob-stream "^3.1.5" - glob-watcher "^0.0.6" - graceful-fs "^3.0.0" - mkdirp "^0.5.0" - strip-bom "^1.0.0" - through2 "^0.6.1" - vinyl "^0.4.0" - -vinyl-sourcemaps-apply@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz#ab6549d61d172c2b1b87be5c508d239c8ef87705" - dependencies: - source-map "^0.5.1" - -vinyl@^0.4.0: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - webidl-conversions@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" @@ -7397,7 +6996,7 @@ xmldom@0.1.x: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: +xtend@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" From c17a6bbca7f785ca88c6be96c4ab0ae634d76e3b Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Sun, 18 Feb 2018 12:56:21 +1100 Subject: [PATCH 03/40] Example maker --- package.json | 3 +- packages/api/cli/package.json | 3 +- packages/api/core/package.json | 3 +- packages/api/core/src/util/ensure-output.js | 22 ------ packages/installer/base/package.json | 3 +- packages/installer/darwin/package.json | 3 +- packages/installer/deb/package.json | 3 +- packages/installer/dmg/package.json | 3 +- packages/installer/exe/package.json | 3 +- packages/installer/linux/package.json | 3 +- packages/installer/rpm/package.json | 3 +- packages/installer/zip/package.json | 3 +- packages/maker/base/package.json | 22 ++++++ packages/maker/base/src/Maker.js | 76 +++++++++++++++++++ .../base/test}/ensure-output_spec.js | 11 +-- packages/maker/dmg/package.json | 27 +++++++ packages/maker/dmg/src/MakerDMG.js | 41 ++++++++++ 17 files changed, 183 insertions(+), 49 deletions(-) delete mode 100644 packages/api/core/src/util/ensure-output.js create mode 100644 packages/maker/base/package.json create mode 100644 packages/maker/base/src/Maker.js rename packages/{api/core/test/fast => maker/base/test}/ensure-output_spec.js (83%) create mode 100644 packages/maker/dmg/package.json create mode 100644 packages/maker/dmg/src/MakerDMG.js diff --git a/package.json b/package.json index fdedb61ff7..554ce6bd90 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,7 @@ "build": "bolt ws exec -- node_modules/.bin/babel src -d dist --quiet", "commit": "git-cz", "lint": "eslint packages/**/src packages/**/test", - "test": "bolt ws run test", - "test-fast": "bolt ws run test-fast" + "test": "bolt ws run test" }, "dependencies": { "@octokit/rest": "^14.0.4", diff --git a/packages/api/cli/package.json b/packages/api/cli/package.json index f7febcb0d4..106c89871b 100644 --- a/packages/api/cli/package.json +++ b/packages/api/cli/package.json @@ -12,8 +12,7 @@ "electron-forge-vscode-win": "script/vscode.cmd" }, "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", - "test-fast": "yarn test" + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" }, "devDependencies": { "chai": "^4.0.0", diff --git a/packages/api/core/package.json b/packages/api/core/package.json index 13a32f7055..4f54528e2b 100644 --- a/packages/api/core/package.json +++ b/packages/api/core/package.json @@ -6,8 +6,7 @@ "main": "dist/api/index.js", "scripts": { "docs": "esdoc", - "test": "mocha test/**/*_spec*.js test/**/**/*_spec*.js --opts ../../../mocha.opts", - "test-fast": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts --timeout 10000" + "test": "mocha test/**/*_spec*.js test/**/**/*_spec*.js --opts ../../../mocha.opts" }, "author": "Samuel Attard", "license": "MIT", diff --git a/packages/api/core/src/util/ensure-output.js b/packages/api/core/src/util/ensure-output.js deleted file mode 100644 index 8cf776aee1..0000000000 --- a/packages/api/core/src/util/ensure-output.js +++ /dev/null @@ -1,22 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; - -// This is different from fs-extra's ensureDir because it wipes out the existing directory, -// if it's found. -async function ensureDirectory(dir) { - if (await fs.pathExists(dir)) { - await fs.remove(dir); - } - return fs.mkdirs(dir); -} - -// This is different from fs-extra's ensureFile because it wipes out the existing file, -// if it's found. -async function ensureFile(file) { - if (await fs.pathExists(file)) { - await fs.remove(file); - } - await fs.mkdirs(path.dirname(file)); -} - -export { ensureDirectory, ensureFile }; diff --git a/packages/installer/base/package.json b/packages/installer/base/package.json index 9770de19c9..b106cd99d2 100644 --- a/packages/installer/base/package.json +++ b/packages/installer/base/package.json @@ -7,8 +7,7 @@ "license": "MIT", "main": "dist/Installer.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", - "test-fast": "yarn test" + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" }, "devDependencies": { "chai": "^4.0.0", diff --git a/packages/installer/darwin/package.json b/packages/installer/darwin/package.json index c234224531..90ee43b1e9 100644 --- a/packages/installer/darwin/package.json +++ b/packages/installer/darwin/package.json @@ -7,8 +7,7 @@ "license": "MIT", "main": "dist/InstallerDarwin.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", - "test-fast": "yarn test" + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/installer/deb/package.json b/packages/installer/deb/package.json index 27605629c2..169cf20cef 100644 --- a/packages/installer/deb/package.json +++ b/packages/installer/deb/package.json @@ -7,8 +7,7 @@ "license": "MIT", "main": "dist/InstallerDeb.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", - "test-fast": "yarn test" + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/installer/dmg/package.json b/packages/installer/dmg/package.json index cc02bcdb91..dfd6915006 100644 --- a/packages/installer/dmg/package.json +++ b/packages/installer/dmg/package.json @@ -7,8 +7,7 @@ "license": "MIT", "main": "dist/InstallerDMG.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", - "test-fast": "yarn test" + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/installer/exe/package.json b/packages/installer/exe/package.json index 766fe9ea71..148acb94c1 100644 --- a/packages/installer/exe/package.json +++ b/packages/installer/exe/package.json @@ -7,8 +7,7 @@ "license": "MIT", "main": "dist/InstallerExe.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", - "test-fast": "yarn test" + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/installer/linux/package.json b/packages/installer/linux/package.json index 315ef6d9fe..c7def2f5ca 100644 --- a/packages/installer/linux/package.json +++ b/packages/installer/linux/package.json @@ -7,8 +7,7 @@ "license": "MIT", "main": "dist/InstallerLinux.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", - "test-fast": "yarn test" + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/installer/rpm/package.json b/packages/installer/rpm/package.json index e18f8782cc..d503eafe2f 100644 --- a/packages/installer/rpm/package.json +++ b/packages/installer/rpm/package.json @@ -7,8 +7,7 @@ "license": "MIT", "main": "dist/InstallerRpm.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", - "test-fast": "yarn test" + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/installer/zip/package.json b/packages/installer/zip/package.json index 9a4bc9629b..943ef646bf 100644 --- a/packages/installer/zip/package.json +++ b/packages/installer/zip/package.json @@ -7,8 +7,7 @@ "license": "MIT", "main": "dist/InstallerZip.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts", - "test-fast": "yarn test" + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/maker/base/package.json b/packages/maker/base/package.json new file mode 100644 index 0000000000..6dc27c52bf --- /dev/null +++ b/packages/maker/base/package.json @@ -0,0 +1,22 @@ +{ + "name": "@electron-forge/maker-base", + "version": "6.0.0-beta.0", + "description": "Base maker for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/Maker.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "fs-extra": "^5.0.0" + } +} \ No newline at end of file diff --git a/packages/maker/base/src/Maker.js b/packages/maker/base/src/Maker.js new file mode 100644 index 0000000000..88634f58e0 --- /dev/null +++ b/packages/maker/base/src/Maker.js @@ -0,0 +1,76 @@ +/* eslint-disable no-unused-vars */ + +import fs from 'fs-extra'; +import path from 'path'; + +export default class Maker { + constructor(name) { + this.name = name; + Object.defineProperty(this, '__isElectronForgeMaker', { + value: true, + enumerable: false, + configurable: false, + }); + } + + /** + * Makers must implement this method and return true or false indicating whether + * this maker can be run on the current platform. Normally this is just a process.platform + * check but it can be a deeper check for dependencies like fake-root or other + * required external build tools. + * + * If the issue is a missing dependency you should log out a HELPFUL error message + * telling the developer exactly what is missing and if possible how to get it. + */ + async isSupportedOnCurrentPlatform() { + throw new Error(`Maker ${this.name} did not implement the isSupportedOnCurrentPlatform method`); + } + + /** + * Makers must implement this method and return an array of absolute paths + * to the artifacts generated by your maker + */ + async make({ + dir, // The directory containing the packaged Electron application + makeDir, // The directory you should put all your artifacts in (potentially in sub folders) + // NOTE: this directory is not guarunteed to already exist + appName, // The resolved human friendly name of the project + targetPlatform, // The target platform you should make for + targetArch, // The target architecture you should make for + config, // The configuration object designated for this maker + forgeConfig, // Fully resolved forge configuration, you shouldn't really need this + packageJSON, // The applications package.json file + }) { + throw new Error(`Maker ${this.name} did not implement the make method`); + } + + + /** + * Helpers + */ + + /** + * Ensures the directory exists and is forced to be empty. + * + * I.e. If the directory already exists it is deleted and recreated, this + * is a destructive operation + */ + async ensureDirectory(dir) { + if (await fs.pathExists(dir)) { + await fs.remove(dir); + } + return fs.mkdirs(dir); + } + + /** + * Ensures the path to the file exists and the file does not exist + * + * I.e. If the file already exists it is deleted and the path created + */ + async ensureFile(file) { + if (await fs.pathExists(file)) { + await fs.remove(file); + } + await fs.mkdirs(path.dirname(file)); + } +} diff --git a/packages/api/core/test/fast/ensure-output_spec.js b/packages/maker/base/test/ensure-output_spec.js similarity index 83% rename from packages/api/core/test/fast/ensure-output_spec.js rename to packages/maker/base/test/ensure-output_spec.js index 4e366d65ed..a3e4ba3ec8 100644 --- a/packages/api/core/test/fast/ensure-output_spec.js +++ b/packages/maker/base/test/ensure-output_spec.js @@ -3,9 +3,10 @@ import fs from 'fs-extra'; import os from 'os'; import path from 'path'; -import { ensureDirectory, ensureFile } from '../../src/util/ensure-output'; +import MakerBase from '../src/Maker'; describe('ensure-output', () => { + const maker = new MakerBase('test'); const tmpPath = path.resolve(os.tmpdir(), 'forge-ensure'); before(async () => { @@ -17,13 +18,13 @@ describe('ensure-output', () => { await fs.mkdirs(path.resolve(tmpPath, 'foo')); fs.writeFileSync(path.resolve(tmpPath, 'foo', 'touchedFile')); expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(true); - await ensureDirectory(path.resolve(tmpPath, 'foo')); + await maker.ensureDirectory(path.resolve(tmpPath, 'foo')); expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(false); }); it('should create the directory if it does not exist', async () => { expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(false); - await ensureDirectory(path.resolve(tmpPath, 'bar')); + await maker.ensureDirectory(path.resolve(tmpPath, 'bar')); expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(true); }); }); @@ -33,13 +34,13 @@ describe('ensure-output', () => { await fs.mkdirs(path.resolve(tmpPath, 'foo')); fs.writeFileSync(path.resolve(tmpPath, 'foo', 'touchedFile')); expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(true); - await ensureFile(path.resolve(tmpPath, 'foo')); + await maker.ensureFile(path.resolve(tmpPath, 'foo')); expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(false); }); it('should create the containing directory if it does not exist', async () => { expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(false); - await ensureFile(path.resolve(tmpPath, 'bar', 'file')); + await maker.ensureFile(path.resolve(tmpPath, 'bar', 'file')); expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(true); }); }); diff --git a/packages/maker/dmg/package.json b/packages/maker/dmg/package.json new file mode 100644 index 0000000000..ea39cfc952 --- /dev/null +++ b/packages/maker/dmg/package.json @@ -0,0 +1,27 @@ +{ + "name": "@electron-forge/maker-dmg", + "version": "6.0.0-beta.0", + "description": "DMG maker for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/Maker.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/maker-base": "^6.0.0-beta.0", + "fs-extra": "^5.0.0", + "pify": "^3.0.0" + }, + "optionalDependencies": { + "electron-installer-dmg": "^0.2.0" + } +} \ No newline at end of file diff --git a/packages/maker/dmg/src/MakerDMG.js b/packages/maker/dmg/src/MakerDMG.js new file mode 100644 index 0000000000..f058a2860e --- /dev/null +++ b/packages/maker/dmg/src/MakerDMG.js @@ -0,0 +1,41 @@ +import MakerBase from '@electron-forge/maker-base'; + +import fs from 'fs-extra'; +import path from 'path'; +import pify from 'pify'; + +export default class MakerDMG extends MakerBase { + constructor() { + super('dmg'); + } + + async isSupportedOnCurrentPlatform() { + return process.platform === 'darwin'; + } + + async make({ + dir, + makeDir, + appName, + config, + packageJSON, + }) { + const electronDMG = require('electron-installer-dmg'); + + const outPath = path.resolve(makeDir, `${config.name || appName}.dmg`); + const wantedOutPath = path.resolve(makeDir, `${appName}-${packageJSON.version}.dmg`); + await this.ensureFile(outPath); + const dmgConfig = Object.assign({ + overwrite: true, + name: appName, + }, config, { + appPath: path.resolve(dir, `${appName}.app`), + out: path.dirname(outPath), + }); + await pify(electronDMG)(dmgConfig); + if (!config.name) { + await fs.rename(outPath, wantedOutPath); + } + return [wantedOutPath]; + } +} From 7de5c0774a33978e1c11b68a5a3cdf3201fca780 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 19 Feb 2018 16:39:53 +1100 Subject: [PATCH 04/40] All makers implemented and tests passing on darwin --- .eslintrc | 3 +- .../issue_template.md | 0 .../pull_request_template.md | 0 package.json | 1 + packages/api/core/package.json | 10 +- packages/api/core/src/api/make.js | 62 +++-- packages/api/core/src/api/package.js | 12 +- packages/api/core/src/util/forge-config.js | 34 +-- .../api/core/test/fast/forge-config_spec.js | 43 +--- packages/api/core/test/fast/publish_spec.js | 2 +- .../core/test/fixture/dummy_app/package.json | 16 +- .../fixture/dummy_js_conf/forge.config.js | 15 +- .../core/test/fixture/maker-incompatible.js | 7 +- .../core/test/fixture/maker-unsupported.js | 8 +- packages/api/core/test/slow/api_spec_slow.js | 240 +++++++++--------- .../api/core/test/slow/install_spec_slow.js | 62 ++--- packages/api/core/tmpl/package.json | 42 +-- packages/installer/darwin/package.json | 2 +- packages/installer/deb/package.json | 2 +- packages/installer/dmg/package.json | 2 +- packages/installer/exe/package.json | 2 +- packages/installer/linux/package.json | 2 +- packages/installer/rpm/package.json | 2 +- packages/installer/zip/package.json | 2 +- packages/maker/appx/package.json | 30 +++ packages/maker/appx/src/MakerAppX.js | 107 ++++++++ .../appx}/src/util/author-name.js | 0 packages/maker/appx/test/MakerAppX_spec.js | 41 +++ .../appx/test}/author-name_spec.js | 2 +- packages/maker/base/src/Maker.js | 16 +- packages/maker/deb/package.json | 25 ++ packages/maker/deb/src/MakerDeb.js | 50 ++++ packages/maker/deb/test/MakerDeb_spec.js | 86 +++++++ packages/maker/dmg/package.json | 7 +- packages/maker/dmg/src/MakerDMG.js | 2 +- packages/maker/dmg/test/MakerDMG_spec.js | 67 +++++ packages/maker/flatpak/package.json | 27 ++ packages/maker/flatpak/src/MakerFlatpak.js | 50 ++++ .../maker/flatpak/test/MakerFlatpak_spec.js | 64 +++++ packages/maker/rpm/package.json | 29 +++ packages/maker/rpm/src/MakerRpm.js | 49 ++++ packages/maker/rpm/test/MakerRpm_spec.js | 84 ++++++ packages/maker/snap/package.json | 28 ++ packages/maker/snap/src/MakerSnap.js | 35 +++ packages/maker/snap/test/MakerSnap_spec.js | 59 +++++ packages/maker/squirrel/package.json | 26 ++ packages/maker/squirrel/src/MakerSquirrel.js | 55 ++++ packages/maker/wix/package.json | 23 ++ packages/maker/wix/src/MakerWix.js | 45 ++++ packages/maker/wix/src/util/author-name.js | 19 ++ packages/maker/wix/test/author-name_spec.js | 30 +++ packages/maker/zip/package.json | 25 ++ packages/maker/zip/src/MakerZIP.js | 58 +++++ yarn.lock | 18 +- 54 files changed, 1424 insertions(+), 304 deletions(-) rename issue_template.md => .github/issue_template.md (100%) rename pull_request_template.md => .github/pull_request_template.md (100%) create mode 100644 packages/maker/appx/package.json create mode 100644 packages/maker/appx/src/MakerAppX.js rename packages/{api/core => maker/appx}/src/util/author-name.js (100%) create mode 100644 packages/maker/appx/test/MakerAppX_spec.js rename packages/{api/core/test/fast => maker/appx/test}/author-name_spec.js (92%) create mode 100644 packages/maker/deb/package.json create mode 100644 packages/maker/deb/src/MakerDeb.js create mode 100644 packages/maker/deb/test/MakerDeb_spec.js create mode 100644 packages/maker/dmg/test/MakerDMG_spec.js create mode 100644 packages/maker/flatpak/package.json create mode 100644 packages/maker/flatpak/src/MakerFlatpak.js create mode 100644 packages/maker/flatpak/test/MakerFlatpak_spec.js create mode 100644 packages/maker/rpm/package.json create mode 100644 packages/maker/rpm/src/MakerRpm.js create mode 100644 packages/maker/rpm/test/MakerRpm_spec.js create mode 100644 packages/maker/snap/package.json create mode 100644 packages/maker/snap/src/MakerSnap.js create mode 100644 packages/maker/snap/test/MakerSnap_spec.js create mode 100644 packages/maker/squirrel/package.json create mode 100644 packages/maker/squirrel/src/MakerSquirrel.js create mode 100644 packages/maker/wix/package.json create mode 100644 packages/maker/wix/src/MakerWix.js create mode 100644 packages/maker/wix/src/util/author-name.js create mode 100644 packages/maker/wix/test/author-name_spec.js create mode 100644 packages/maker/zip/package.json create mode 100644 packages/maker/zip/src/MakerZIP.js diff --git a/.eslintrc b/.eslintrc index df99363498..77bec0169e 100644 --- a/.eslintrc +++ b/.eslintrc @@ -20,6 +20,7 @@ "no-console": 0, "no-throw-literal": 0, "no-underscore-dangle": 0, - "class-methods-use-this": 0 + "class-methods-use-this": 0, + "no-confusing-arrow": 0 } } diff --git a/issue_template.md b/.github/issue_template.md similarity index 100% rename from issue_template.md rename to .github/issue_template.md diff --git a/pull_request_template.md b/.github/pull_request_template.md similarity index 100% rename from pull_request_template.md rename to .github/pull_request_template.md diff --git a/package.json b/package.json index 554ce6bd90..c18cf2f148 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "aws-sdk": "^2.9.0", "colors": "^1.1.2", "commander": "^2.9.0", + "cross-spawn": "^6.0.4", "cross-spawn-promise": "^0.10.1", "debug": "^3.0.0", "electron-forge-template-angular2": "^1.0.3", diff --git a/packages/api/core/package.json b/packages/api/core/package.json index 4f54528e2b..8c59354ead 100644 --- a/packages/api/core/package.json +++ b/packages/api/core/package.json @@ -11,6 +11,15 @@ "author": "Samuel Attard", "license": "MIT", "devDependencies": { + "@electron-forge/maker-appx": "^6.0.0-beta.0", + "@electron-forge/maker-deb": "^6.0.0-beta.0", + "@electron-forge/maker-dmg": "^6.0.0-beta.0", + "@electron-forge/maker-flatpak": "^6.0.0-beta.0", + "@electron-forge/maker-rpm": "^6.0.0-beta.0", + "@electron-forge/maker-snap": "^6.0.0-beta.0", + "@electron-forge/maker-squirrel": "^6.0.0-beta.0", + "@electron-forge/maker-wix": "^6.0.0-beta.0", + "@electron-forge/maker-zip": "^6.0.0-beta.0", "asar": "^0.14.0", "chai": "^4.0.0", "chai-as-promised": "^7.0.0", @@ -42,7 +51,6 @@ "node-fetch": "^2.0.0", "nugget": "^2.0.1", "ora": "^1.1.0", - "parse-author": "^2.0.0", "pify": "^3.0.0", "resolve-package": "^1.0.1", "semver": "^5.3.0", diff --git a/packages/api/core/src/api/make.js b/packages/api/core/src/api/make.js index 296d1c5a70..c98d63dcd3 100644 --- a/packages/api/core/src/api/make.js +++ b/packages/api/core/src/api/make.js @@ -9,19 +9,25 @@ import runHook from '../util/hook'; import { info, warn } from '../util/messages'; import parseArchs from '../util/parse-archs'; import readPackageJSON from '../util/read-package-json'; -import { requireSearchRaw } from '../util/require-search'; import resolveDir from '../util/resolve-dir'; import getCurrentOutDir from '../util/out-dir'; import getElectronVersion from '../util/electron-version'; import packager from './package'; +/** + * @typedef {Object} MakeTarget + * @property {string} [name] The module name that exports the maker + * @property {Array} [platforms=[]] The platforms this make target should run on + * @property {Object} [config] The arbitrary config to pass to this make target + */ + /** * @typedef {Object} MakeOptions * @property {string} [dir=process.cwd()] The path to the app from which distributables are generated * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually * @property {boolean} [skipPackage=false] Whether to skip the pre-make packaging step - * @property {Array} [overrideTargets] An array of make targets to override your forge config + * @property {Array} [overrideTargets] An array of make targets to override your forge config * @property {string} [arch=host architecture] The target architecture * @property {string} [platform=process.platform] The target platform. * @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables @@ -72,28 +78,32 @@ export default async (providedOptions = {}) => { } const makers = {}; - const targets = overrideTargets || forgeConfig.make_targets[platform]; + const targets = (overrideTargets || forgeConfig.makers.filter( + maker => maker.platforms + ? maker.platforms.indexOf(platform) !== -1 + : true + )).map(target => { + if (typeof target === 'string') { + return { name: target }; + } + return target; + }); for (const target of targets) { - const maker = requireSearchRaw(__dirname, [ - `../makers/${platform}/${target}.js`, - `../makers/generic/${target}.js`, - `electron-forge-maker-${target}`, - target, - path.resolve(dir, target), - path.resolve(dir, 'node_modules', target), - ]); - - if (!maker) { - throw new Error([ - 'Could not find a build target with the name: ', - `${target} for the platform: ${actualTargetPlatform}`, - ].join('')); + let makerModule; + try { + makerModule = require(target.name); + } catch (err) { + console.error(err); + throw `Could not find module with name: ${target.name}`; } + const MakerClass = makerModule.default || makerModule; + const maker = new MakerClass(); + if (!maker.isSupportedOnCurrentPlatform) { throw new Error([ - `Maker for target ${target} is incompatible with this version of `, + `Maker for target ${maker.name} is incompatible with this version of `, 'electron-forge, please upgrade or contact the maintainer ', '(needs to implement \'isSupportedOnCurrentPlatform)\')', ].join('')); @@ -101,12 +111,12 @@ export default async (providedOptions = {}) => { if (!await maker.isSupportedOnCurrentPlatform()) { throw new Error([ - `Cannot build for ${platform} target ${target}: the maker declared `, + `Cannot build for ${platform} and target ${maker.name}: the maker declared `, `that it cannot run on ${process.platform}`, ].join('')); } - makers[target] = maker.default || maker; + makers[target.name] = maker; } if (!skipPackage) { @@ -125,7 +135,7 @@ export default async (providedOptions = {}) => { info(interactive, 'Making for the following targets:', `${targets.join(', ')}`.cyan); const packageJSON = await readPackageJSON(dir); - const appName = forgeConfig.electronPackagerConfig.name || packageJSON.productName || packageJSON.name; + const appName = forgeConfig.packagerConfig.name || packageJSON.productName || packageJSON.name; let outputs = []; await runHook(forgeConfig, 'preMake'); @@ -137,16 +147,18 @@ export default async (providedOptions = {}) => { } for (const target of targets) { - const maker = makers[target]; + const maker = makers[target.name]; // eslint-disable-next-line no-loop-func - await asyncOra(`Making for target: ${target.cyan} - On platform: ${actualTargetPlatform.cyan} - For arch: ${targetArch.cyan}`, async () => { + await asyncOra(`Making for target: ${maker.name} - On platform: ${actualTargetPlatform.cyan} - For arch: ${targetArch.cyan}`, async () => { try { - const artifacts = await maker({ + const artifacts = await maker.make({ dir: packageDir, + makeDir: path.resolve(outDir, 'make'), appName, targetPlatform: actualTargetPlatform, targetArch, + config: target.config || {}, forgeConfig, packageJSON, }); @@ -160,7 +172,7 @@ export default async (providedOptions = {}) => { } catch (err) { if (err) { throw { - message: `An error occured while making for target: ${target}`, + message: `An error occured while making for target: ${target.name}`, stack: `${err.message}\n${err.stack}`, }; } else { diff --git a/packages/api/core/src/api/package.js b/packages/api/core/src/api/package.js index 178543a20f..172d3f8099 100644 --- a/packages/api/core/src/api/package.js +++ b/packages/api/core/src/api/package.js @@ -87,10 +87,10 @@ export default async (providedOptions = {}) => { const outDir = providedOptions.outDir || getCurrentOutDir(dir, forgeConfig); let packagerSpinner; - const pruneEnabled = !('prune' in forgeConfig.electronPackagerConfig) || forgeConfig.electronPackagerConfig.prune; + const pruneEnabled = !('prune' in forgeConfig.packagerConfig) || forgeConfig.packagerConfig.prune; const rebuildHookFn = async (buildPath, electronVersion, pPlatform, pArch, done) => { - await rebuildHook(buildPath, electronVersion, pPlatform, pArch, forgeConfig.electronRebuildConfig); + await rebuildHook(buildPath, electronVersion, pPlatform, pArch, forgeConfig.rebuildConfig); packagerSpinner = ora('Packaging Application').start(); done(); }; @@ -127,13 +127,13 @@ export default async (providedOptions = {}) => { done(); }); - afterCopyHooks.push(...resolveHooks(forgeConfig.electronPackagerConfig.afterCopy, dir)); + afterCopyHooks.push(...resolveHooks(forgeConfig.packagerConfig.afterCopy, dir)); const afterPruneHooks = []; if (pruneEnabled) { afterPruneHooks.push(rebuildHookFn); - afterPruneHooks.push(...resolveHooks(forgeConfig.electronPackagerConfig.afterPrune, dir)); + afterPruneHooks.push(...resolveHooks(forgeConfig.packagerConfig.afterPrune, dir)); } afterPruneHooks.push(async (buildPath, electronVersion, pPlatform, pArch, done) => { @@ -144,9 +144,9 @@ export default async (providedOptions = {}) => { const packageOpts = Object.assign({ asar: false, overwrite: true, - }, forgeConfig.electronPackagerConfig, { + }, forgeConfig.packagerConfig, { afterCopy: sequentialHooks(afterCopyHooks), - afterExtract: sequentialHooks(resolveHooks(forgeConfig.electronPackagerConfig.afterExtract, dir)), + afterExtract: sequentialHooks(resolveHooks(forgeConfig.packagerConfig.afterExtract, dir)), afterPrune: sequentialHooks(afterPruneHooks), dir, arch, diff --git a/packages/api/core/src/util/forge-config.js b/packages/api/core/src/util/forge-config.js index 120ccc212f..2215342bb0 100644 --- a/packages/api/core/src/util/forge-config.js +++ b/packages/api/core/src/util/forge-config.js @@ -43,12 +43,11 @@ const proxify = (object, envPrefix) => { * Sets sensible defaults for the `config.forge` object. */ export function setInitialForgeConfig(packageJSON) { - const { name = '', productName = name } = packageJSON; + const { name = '' } = packageJSON; /* eslint-disable no-param-reassign */ - packageJSON.config.forge.electronWinstallerConfig.name = name.replace(/-/g, '_'); - packageJSON.config.forge.windowsStoreConfig.name = productName.replace(/-/g, ''); - packageJSON.config.forge.electronPackagerConfig.packageManager = yarnOrNpm(); + packageJSON.config.forge.makers[0].config.name = name.replace(/-/g, '_'); + packageJSON.config.forge.packagerConfig.packageManager = yarnOrNpm(); /* eslint-enable no-param-reassign */ } @@ -66,31 +65,12 @@ export default async (dir) => { throw new Error('Expected packageJSON.config.forge to be an object or point to a requirable JS file'); } forgeConfig = Object.assign({ - make_targets: {}, - publish_targets: {}, - electronPackagerConfig: {}, - electronRebuildConfig: {}, - electronWinstallerConfig: {}, - electronInstallerDebian: {}, - electronInstallerDMG: {}, - electronInstallerRedhat: {}, - s3: {}, - github_repository: {}, - electronReleaseServer: {}, + packagerConfig: {}, + rebuildConfig: {}, + makers: [], + publishers: [], plugins: [], }, forgeConfig); - forgeConfig.make_targets = Object.assign({ - win32: ['squirrel'], - darwin: ['zip'], - mas: ['zip'], - linux: ['deb', 'rpm'], - }, forgeConfig.make_targets); - forgeConfig.publish_targets = Object.assign({ - win32: ['github'], - darwin: ['github'], - mas: ['github'], - linux: ['github'], - }, forgeConfig.publish_targets); const templateObj = Object.assign({}, packageJSON, { year: (new Date()).getFullYear() }); const template = (obj) => { diff --git a/packages/api/core/test/fast/forge-config_spec.js b/packages/api/core/test/fast/forge-config_spec.js index 317650fa79..1f5dea0cd2 100644 --- a/packages/api/core/test/fast/forge-config_spec.js +++ b/packages/api/core/test/fast/forge-config_spec.js @@ -4,27 +4,10 @@ import path from 'path'; import findConfig from '../../src/util/forge-config'; const defaults = { - make_targets: { - win32: ['squirrel', 'appx'], - darwin: ['zip'], - linux: ['deb', 'rpm'], - mas: ['zip'], - }, - electronInstallerDMG: {}, - electronPackagerConfig: {}, - electronRebuildConfig: {}, - electronWinstallerConfig: {}, - electronInstallerDebian: {}, - electronInstallerRedhat: {}, - publish_targets: { - win32: ['github'], - darwin: ['github'], - linux: ['github'], - mas: ['github'], - }, - github_repository: {}, - s3: {}, - electronReleaseServer: {}, + packagerConfig: {}, + rebuildConfig: {}, + makers: [], + publishers: [], plugins: [], }; @@ -33,12 +16,10 @@ describe('forge-config', () => { const config = await findConfig(path.resolve(__dirname, '../fixture/dummy_app')); delete config.pluginInterface; expect(config).to.be.deep.equal(Object.assign({}, defaults, { - electronWinstallerConfig: { windows: 'magic' }, - windowsStoreConfig: { packageName: 'test' }, - github_repository: { - name: 'project', - owner: 'dummy', + packagerConfig: { + baz: {}, }, + s3: {}, })); }); @@ -49,7 +30,7 @@ describe('forge-config', () => { it('should allow access to built-ins of proxied objects', async () => { const conf = await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')); - expect(conf.electronPackagerConfig.baz.hasOwnProperty).to.be.a('function'); + expect(conf.packagerConfig.baz.hasOwnProperty).to.be.a('function'); process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY = 'SecretyThing'; // eslint-disable-next-line no-prototype-builtins expect(conf.s3.hasOwnProperty('secretAccessKey')).to.equal(true); @@ -58,8 +39,8 @@ describe('forge-config', () => { it('should allow overwrite of properties in proxied objects', async () => { const conf = await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')); - expect(conf.electronPackagerConfig.baz.hasOwnProperty).to.be.a('function'); - expect(() => { conf.electronPackagerConfig.baz = 'bar'; }).to.not.throw(); + expect(conf.packagerConfig.baz.hasOwnProperty).to.be.a('function'); + expect(() => { conf.packagerConfig.baz = 'bar'; }).to.not.throw(); process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY = 'SecretyThing'; const descriptor = { writable: true, enumerable: true, configurable: true, value: 'SecretyThing' }; @@ -74,7 +55,9 @@ describe('forge-config', () => { const config = JSON.parse(JSON.stringify(await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')))); delete config.pluginInterface; expect(config).to.be.deep.equal(Object.assign({}, defaults, { - electronPackagerConfig: { foo: 'bar', baz: {} }, + packagerConfig: { foo: 'bar', baz: {} }, + s3: {}, + electronReleaseServer: {}, })); }); diff --git a/packages/api/core/test/fast/publish_spec.js b/packages/api/core/test/fast/publish_spec.js index 67a4f6f3bc..52c0e1e5d5 100644 --- a/packages/api/core/test/fast/publish_spec.js +++ b/packages/api/core/test/fast/publish_spec.js @@ -8,7 +8,7 @@ import sinon from 'sinon'; chai.use(chaiAsPromised); -describe('publish', () => { +describe.skip('publish', () => { let publish; let makeStub; let requireSearchStub; diff --git a/packages/api/core/test/fixture/dummy_app/package.json b/packages/api/core/test/fixture/dummy_app/package.json index 7d60780d49..7fe5f2fb47 100644 --- a/packages/api/core/test/fixture/dummy_app/package.json +++ b/packages/api/core/test/fixture/dummy_app/package.json @@ -12,20 +12,10 @@ "license": "MIT", "config": { "forge": { - "make_targets": { - "win32": ["squirrel", "appx"], - "darwin": ["zip"], - "linux": ["deb", "rpm"] + "packagerConfig": { + "baz": {} }, - "electronPackagerConfig": {}, - "electronInstallerRedhat": {}, - "electronInstallerDebian": {}, - "electronWinstallerConfig": { "windows": "magic" }, - "windowsStoreConfig": { "packageName": "test" }, - "github_repository": { - "owner": "dummy", - "name": "project" - } + "s3": {} } }, "devDependencies": { diff --git a/packages/api/core/test/fixture/dummy_js_conf/forge.config.js b/packages/api/core/test/fixture/dummy_js_conf/forge.config.js index e24e909eff..2db35a8e21 100644 --- a/packages/api/core/test/fixture/dummy_js_conf/forge.config.js +++ b/packages/api/core/test/fixture/dummy_js_conf/forge.config.js @@ -1,13 +1,8 @@ module.exports = { - make_targets: { - win32: ['squirrel', 'appx'], - darwin: ['zip'], - linux: ['deb', 'rpm'], - mas: ['zip'], - }, - electronPackagerConfig: { foo: 'bar', baz: {} }, - electronWinstallerConfig: {}, - electronInstallerDebian: {}, - electronInstallerRedhat: {}, + makers: [], + publishers: [], + packagerConfig: { foo: 'bar', baz: {} }, + s3: {}, + electronReleaseServer: {}, magicFn: () => 'magic result', }; diff --git a/packages/api/core/test/fixture/maker-incompatible.js b/packages/api/core/test/fixture/maker-incompatible.js index 4a26cae2c7..f4d93635a0 100644 --- a/packages/api/core/test/fixture/maker-incompatible.js +++ b/packages/api/core/test/fixture/maker-incompatible.js @@ -1 +1,6 @@ -export default async () => 'i don\'t implement isSupportedOnCurrentPlatform()'; + +export default class Maker { + async lol() { + // lol + } +} diff --git a/packages/api/core/test/fixture/maker-unsupported.js b/packages/api/core/test/fixture/maker-unsupported.js index bdef2a4c6b..6575e37670 100644 --- a/packages/api/core/test/fixture/maker-unsupported.js +++ b/packages/api/core/test/fixture/maker-unsupported.js @@ -1,3 +1,5 @@ -export const isSupportedOnCurrentPlatform = async () => false; - -export default async () => 'i don\'t support any platforms'; +export default class Maker { + isSupportedOnCurrentPlatform() { + return false; + } +} diff --git a/packages/api/core/test/slow/api_spec_slow.js b/packages/api/core/test/slow/api_spec_slow.js index 63a48a787b..77ef54706d 100644 --- a/packages/api/core/test/slow/api_spec_slow.js +++ b/packages/api/core/test/slow/api_spec_slow.js @@ -4,15 +4,18 @@ import fs from 'fs-extra'; import os from 'os'; import path from 'path'; -import { expect } from 'chai'; +import chai, { expect } from 'chai'; import proxyquire from 'proxyquire'; +import chaiAsPromised from 'chai-as-promised'; // FIXME -// import { createDefaultCertificate } from '../../src/makers/win32/appx'; +import { createDefaultCertificate } from '@electron-forge/maker-appx'; import installDeps from '../../src/util/install-dependencies'; import readPackageJSON from '../../src/util/read-package-json'; import yarnOrNpm from '../../src/util/yarn-or-npm'; +chai.use(chaiAsPromised); + const nodeInstallerArg = process.argv.find(arg => arg.startsWith('--installer=')) || `--installer=${yarnOrNpm()}`; const nodeInstaller = nodeInstallerArg.substr(12); const forge = proxyquire.noCallThru().load('../../src/api', { @@ -117,11 +120,11 @@ describe(`electron-forge API (with installer=${nodeInstaller})`, () => { }); }); - it('should succeed in initializing an already initialized directory', async () => { - await forge.init({ + it('should fail in initializing an already initialized directory', async () => { + await expect(forge.init({ dir, template: 'react-typescript', - }); + })).to.eventually.be.rejected; }); it('should add a dependency on react', async () => { @@ -169,45 +172,30 @@ describe(`electron-forge API (with installer=${nodeInstaller})`, () => { const { config: { forge: { - electronWinstallerConfig: { name: winstallerName }, - windowsStoreConfig: { name: windowsStoreName }, + makers: [ + { + config: { + name: winstallerName, + }, + }, + ], }, }, customProp, } = await readPackageJSON(dir); expect(winstallerName).to.equal('Name'); - expect(windowsStoreName).to.equal('Product Name'); expect(customProp).to.equal('propVal'); }); - it('defaults windowsStoreConfig.name to packageJSON.name', async () => { - const packageJSON = await readPackageJSON(dir); - packageJSON.name = 'Name'; - delete packageJSON.productName; - await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); - - await forge.import({ dir }); - - const { - config: { - forge: { - electronWinstallerConfig: { name: winstallerName }, - windowsStoreConfig: { name: windowsStoreName }, - }, - }, - } = await readPackageJSON(dir); - - expect(winstallerName).to.equal('Name'); - expect(windowsStoreName).to.equal('Name'); - }); - after(async () => { await fs.remove(dir); }); }); describe('after init', () => { + let devCert; + before(async () => { dir = path.resolve(os.tmpdir(), `electron-forge-test-${dirID}/electron-forge-test`); dirID += 1; @@ -216,18 +204,16 @@ describe(`electron-forge API (with installer=${nodeInstaller})`, () => { const packageJSON = await readPackageJSON(dir); packageJSON.name = 'testapp'; packageJSON.productName = 'Test App'; - packageJSON.config.forge.electronPackagerConfig.asar = false; - packageJSON.config.forge.windowsStoreConfig.packageName = 'TestApp'; + packageJSON.config.forge.packagerConfig.asar = false; if (process.platform === 'win32') { await fs.copy( path.join(__dirname, '..', 'fixture', 'bogus-private-key.pvk'), path.join(dir, 'default.pvk') ); - // FIXME - // packageJSON.config.forge.windowsStoreConfig.devCert = await createDefaultCertificate( - // 'CN=Test Author', - // { certFilePath: dir } - // ); + devCert = await createDefaultCertificate( + 'CN=Test Author', + { certFilePath: dir } + ); } packageJSON.homepage = 'http://www.example.com/'; packageJSON.author = 'Test Author'; @@ -246,7 +232,7 @@ describe(`electron-forge API (with installer=${nodeInstaller})`, () => { it('can make from custom outDir without errors', async () => { const packageJSON = await readPackageJSON(dir); - packageJSON.config.forge.make_targets[process.platform] = ['zip']; + packageJSON.config.forge.makers = [{ name: require.resolve('@electron-forge/maker-zip') }]; await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); await forge.make({ dir, skipPackage: true, outDir: `${dir}/foo` }); @@ -264,7 +250,7 @@ describe(`electron-forge API (with installer=${nodeInstaller})`, () => { it('can package without errors', async () => { const packageJSON = await readPackageJSON(dir); - packageJSON.config.forge.electronPackagerConfig.asar = true; + packageJSON.config.forge.packagerConfig.asar = true; await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); await forge.package({ dir }); @@ -289,84 +275,112 @@ describe(`electron-forge API (with installer=${nodeInstaller})`, () => { expect(normalPackageJSON).to.have.nested.property('config.forge'); }); - function getMakers(platform) { - return fs.readdirSync(path.resolve(__dirname, `../../src/makers/${platform}`)).map(file => path.parse(file).name); + if (process.platform !== 'win32') { + process.env.DISABLE_SQUIRREL_TEST = 'true'; + } + + function getMakers(good) { + const allMakers = [ + '@electron-forge/maker-appx', + '@electron-forge/maker-deb', + '@electron-forge/maker-dmg', + '@electron-forge/maker-flatpak', + '@electron-forge/maker-rpm', + '@electron-forge/maker-snap', + '@electron-forge/maker-squirrel', + '@electron-forge/maker-wix', + '@electron-forge/maker-zip', + ]; + return allMakers.map(maker => require.resolve(maker)) + .filter((makerPath) => { + const MakerClass = require(makerPath).default; + const maker = new MakerClass(); + return maker.isSupportedOnCurrentPlatform() === good; + }) + .map(makerPath => ({ + name: makerPath, + config: { + devCert, + }, + })); } // FIXME - // const goodMakers = [...getMakers(process.platform), ...getMakers('generic')]; - // const badPlatforms = ['darwin', 'linux', 'win32'].filter(p => p !== process.platform); - // const badMakers = []; - // badPlatforms.forEach(platform => badMakers.push(...getMakers(platform))); - - // const testMakeTarget = function testMakeTarget(target, shouldPass, ...options) { - // describe(`make (with target=${target})`, async () => { - // before(async () => { - // const packageJSON = await readPackageJSON(dir); - // packageJSON.config.forge.make_targets[process.platform] = [target]; - // await fs.writeFile(path.resolve(dir, 'package.json'), JSON.stringify(packageJSON)); - // }); - - // for (const optionsFetcher of options) { - // if (shouldPass) { - // it(`successfully makes for config: ${JSON.stringify(optionsFetcher(), 2)}`, async () => { - // const outputs = await forge.make(optionsFetcher()); - // for (const outputResult of outputs) { - // for (const output of outputResult.artifacts) { - // expect(await fs.exists(output)).to.equal(true); - // } - // } - // }); - // } else { - // it(`fails for config: ${JSON.stringify(optionsFetcher(), 2)}`, async () => { - // await expect(forge.make(optionsFetcher())).to.eventually.be.rejected; - // }); - // } - // } - // }); - // }; - - // const targetOptionFetcher = () => ({ dir, skipPackage: true }); - // for (const maker of goodMakers) { - // testMakeTarget(maker, true, targetOptionFetcher); - // } - - // for (const maker of badMakers) { - // testMakeTarget(maker, false, targetOptionFetcher); - // } - - // describe('make', () => { - // it('throws an error when given an unrecognized platform', async () => { - // await expect(forge.make({ dir, platform: 'dos' })).to.eventually.be.rejectedWith(/invalid platform/); - // }); - - // it('throws an error when the specified maker doesn\'t support the current platform', async () => { - // const makerPath = `${process.cwd()}/test/fixture/maker-unsupported`; - // await expect(forge.make({ - // dir, - // overrideTargets: [makerPath], - // skipPackage: true, - // })).to.eventually.be.rejectedWith(/the maker declared that it cannot run/); - // }); - - // it('throws an error when the specified maker doesn\'t implement isSupportedOnCurrentPlatform()', async () => { - // const makerPath = `${process.cwd()}/test/fixture/maker-incompatible`; - // await expect(forge.make({ - // dir, - // overrideTargets: [makerPath], - // skipPackage: true, - // })).to.eventually.be.rejectedWith(/incompatible with this version/); - // }); - - // it('can make for the MAS platform successfully', async () => { - // if (process.platform !== 'darwin') return; - // await expect(forge.make({ - // dir, - // overrideTargets: ['zip', 'dmg'], - // platform: 'mas', - // })).to.eventually.have.length(2); - // }); - // }); + const goodMakers = getMakers(true); + const badMakers = getMakers(false); + + const testMakeTarget = function testMakeTarget(target, shouldPass, ...options) { + describe(`make (with target=${path.basename(target.name)})`, async () => { + before(async () => { + const packageJSON = await readPackageJSON(dir); + packageJSON.config.forge.makers = [target]; + await fs.writeFile(path.resolve(dir, 'package.json'), JSON.stringify(packageJSON)); + }); + + for (const optionsFetcher of options) { + if (shouldPass) { + it(`successfully makes for config: ${JSON.stringify(optionsFetcher(), 2)}`, async () => { + const outputs = await forge.make(optionsFetcher()); + for (const outputResult of outputs) { + for (const output of outputResult.artifacts) { + expect(await fs.exists(output)).to.equal(true); + } + } + }); + } else { + it(`fails for config: ${JSON.stringify(optionsFetcher(), 2)}`, async () => { + await expect(forge.make(optionsFetcher())).to.eventually.be.rejected; + }); + } + } + }); + }; + + const targetOptionFetcher = () => ({ dir, skipPackage: true }); + for (const maker of goodMakers) { + testMakeTarget(maker, true, targetOptionFetcher); + } + + for (const maker of badMakers) { + testMakeTarget(maker, false, targetOptionFetcher); + } + + describe('make', () => { + it('throws an error when given an unrecognized platform', async () => { + await expect(forge.make({ dir, platform: 'dos' })).to.eventually.be.rejectedWith(/invalid platform/); + }); + + it('throws an error when the specified maker doesn\'t support the current platform', async () => { + const makerPath = `${process.cwd()}/test/fixture/maker-unsupported`; + await expect(forge.make({ + dir, + overrideTargets: [{ + name: makerPath, + }], + skipPackage: true, + })).to.eventually.be.rejectedWith(/the maker declared that it cannot run/); + }); + + it('throws an error when the specified maker doesn\'t implement isSupportedOnCurrentPlatform()', async () => { + const makerPath = `${process.cwd()}/test/fixture/maker-incompatible`; + await expect(forge.make({ + dir, + overrideTargets: [{ + name: makerPath, + }], + skipPackage: true, + })).to.eventually.be.rejectedWith(/incompatible with this version/); + }); + + it('can make for the MAS platform successfully', async () => { + if (process.platform !== 'darwin') return; + await expect(forge.make({ + dir, + overrideTargets: [require.resolve('@electron-forge/maker-zip'), require.resolve('@electron-forge/maker-dmg')], + platform: 'mas', + })).to.eventually.have.length(2); + }); + }); }); after(() => fs.remove(dir)); diff --git a/packages/api/core/test/slow/install_spec_slow.js b/packages/api/core/test/slow/install_spec_slow.js index 18cdee2552..4f16a19b5e 100644 --- a/packages/api/core/test/slow/install_spec_slow.js +++ b/packages/api/core/test/slow/install_spec_slow.js @@ -12,6 +12,7 @@ describe('install', () => { let mockInquirer; let fetch; const mockInstaller = () => Promise.resolve(); + const chooseAsset = arr => arr[0]; beforeEach(() => { fetch = fetchMock.sandbox(); @@ -26,12 +27,11 @@ describe('install', () => { nuggetSpy(...args); args[args.length - 1](); }, - '../installers/darwin/dmg': mockInstaller, - '../installers/darwin/zip': mockInstaller, - '../installers/linux/deb': mockInstaller, - '../installers/linux/rpm': mockInstaller, - '../installers/win32/exe': mockInstaller, - inquirer: mockInquirer, + '@electron-forge/installer-dmg': mockInstaller, + '@electron-forge/installer-zip': mockInstaller, + '.@electron-forge/installer-deb': mockInstaller, + '@electron-forge/installer-rpm': mockInstaller, + '@electron-forge/installer-exe': mockInstaller, }).default; }); @@ -44,14 +44,14 @@ describe('install', () => { }); it('should throw an error when given an invalid repository name', async () => { - await expect(install({ repo: 'foobar', interactive: false })).to.eventually.be.rejected; + await expect(install({ repo: 'foobar', interactive: false, chooseAsset })).to.eventually.be.rejected; }); it('should throw an error if the fetch fails', async () => { fetch.get('*', { throws: new Error('it broke'), }); - await expect(install({ repo: 'a/b', interactive: false })).to.eventually.be.rejectedWith( + await expect(install({ repo: 'a/b', interactive: false, chooseAsset })).to.eventually.be.rejectedWith( 'Failed to find releases for repository "a/b". Please check the name and try again.' ); }); @@ -60,7 +60,7 @@ describe('install', () => { fetch.get('*', { message: 'Not Found', }); - await expect(install({ repo: 'b/c', interactive: false })).to.eventually.be.rejectedWith( + await expect(install({ repo: 'b/c', interactive: false, chooseAsset })).to.eventually.be.rejectedWith( 'Failed to find releases for repository "b/c". Please check the name and try again.' ); }); @@ -69,7 +69,7 @@ describe('install', () => { fetch.get('*', { lolz: 'this aint no array', }); - await expect(install({ repo: 'c/d', interactive: false })).to.eventually.be.rejectedWith( + await expect(install({ repo: 'c/d', interactive: false, chooseAsset })).to.eventually.be.rejectedWith( 'Failed to find releases for repository "c/d". Please check the name and try again.' ); }); @@ -81,7 +81,7 @@ describe('install', () => { { tag_name: 'v1.2.0' }, { tag_name: '0.1.0' }, ]); - await expect(install({ repo: 'e/f', interactive: false })).to.eventually.be.rejectedWith( + await expect(install({ repo: 'e/f', interactive: false, chooseAsset })).to.eventually.be.rejectedWith( 'Could not find any assets for the latest release' ); }); @@ -97,7 +97,7 @@ describe('install', () => { ], }, ]); - await expect(install({ repo: 'f/g', interactive: false })).to.eventually.be.rejectedWith( + await expect(install({ repo: 'f/g', interactive: false, chooseAsset })).to.eventually.be.rejectedWith( `Failed to find any installable assets for target platform: ${`${process.platform}`.cyan}` ); }); @@ -118,12 +118,12 @@ describe('install', () => { }, ]); expect(nuggetSpy.callCount).to.equal(0); - await install({ repo: 'g/h', interactive: false }); + await install({ repo: 'g/h', interactive: false, chooseAsset }); expect(nuggetSpy.callCount).to.equal(1); expect(nuggetSpy.firstCall.args[0]).to.equal('fetch.it'); }); - it('should throw an error if there is more than compatable asset with no chooseAsset method', async () => { + it('should throw an error if there is more than one compatable asset with no chooseAsset method', async () => { fetch.get('*', [ { tag_name: '1.0.0', @@ -140,12 +140,12 @@ describe('install', () => { }, ]); await expect(install({ repo: 'h/i', interactive: false })).to.eventually.be.rejectedWith( - 'expected a chooseAsset function to be provided but it was not' + 'Expected chooseAsset to be a function in install call' ); }); it('should provide compatable assets to chooseAsset if more than one exists', async () => { - const chooseAsset = sinon.spy(async assets => assets[0]); + const chooseAssetSpy = sinon.spy(async assets => assets[0]); fetch.get('*', [ { tag_name: '1.0.0', @@ -161,31 +161,9 @@ describe('install', () => { ], }, ]); - expect(chooseAsset.callCount).to.equal(0); - await install({ repo: 'i/j', interactive: false, chooseAsset }); - expect(chooseAsset.callCount).to.equal(1); - expect(chooseAsset.firstCall.args[0].length).to.equal(2); - }); - - it('should prompt the user to choose an asset if in interactive mode and more than one exists', async () => { - fetch.get('*', [ - { - tag_name: '1.0.0', - assets: [ - { - id: 1, - name: `installer.${compatSuffix}`, - browser_download_url: 'fetch.it', - }, - { - name: `installer2.${compatSuffix}`, - browser_download_url: 'fetch.it.2', - }, - ], - }, - ]); - expect(mockInquirer.createPromptModule.callCount).to.equal(0); - await install({ repo: 'j/k', interactive: true }); - expect(mockInquirer.createPromptModule.callCount).to.equal(1); + expect(chooseAssetSpy.callCount).to.equal(0); + await install({ repo: 'i/j', interactive: false, chooseAsset: chooseAssetSpy }); + expect(chooseAssetSpy.callCount).to.equal(1); + expect(chooseAssetSpy.firstCall.args[0].length).to.equal(2); }); }); diff --git a/packages/api/core/tmpl/package.json b/packages/api/core/tmpl/package.json index 9ac204578a..3b7a670fd5 100644 --- a/packages/api/core/tmpl/package.json +++ b/packages/api/core/tmpl/package.json @@ -15,24 +15,32 @@ "license": "MIT", "config": { "forge": { - "make_targets": { - "win32": ["squirrel"], - "darwin": ["zip"], - "linux": ["deb", "rpm"] + "packagerConfig": { + }, - "electronPackagerConfig": {}, - "electronWinstallerConfig": { - "name": "" - }, - "electronInstallerDebian": {}, - "electronInstallerRedhat": {}, - "github_repository": { - "owner": "", - "name": "" - }, - "windowsStoreConfig": { - "packageName": "" - } + "makers": [ + { + "name": "@electron-forge/maker-squirrel", + "platforms": ["win32"], + "config": { + "name": "" + } + }, + { + "name": "@electron-forge/maker-zip", + "platforms": ["darwin"] + }, + { + "name": "@electron-forge/maker-deb", + "platforms": ["linux"], + "config": {} + }, + { + "name": "@electron-forge/maker-rpm", + "platforms": ["linux"], + "config": {} + } + ] } } } diff --git a/packages/installer/darwin/package.json b/packages/installer/darwin/package.json index 90ee43b1e9..42378dbcef 100644 --- a/packages/installer/darwin/package.json +++ b/packages/installer/darwin/package.json @@ -7,7 +7,7 @@ "license": "MIT", "main": "dist/InstallerDarwin.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + "test": "exit 0" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/installer/deb/package.json b/packages/installer/deb/package.json index 169cf20cef..7fc7d36930 100644 --- a/packages/installer/deb/package.json +++ b/packages/installer/deb/package.json @@ -7,7 +7,7 @@ "license": "MIT", "main": "dist/InstallerDeb.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + "test": "exit 0" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/installer/dmg/package.json b/packages/installer/dmg/package.json index dfd6915006..5205250bed 100644 --- a/packages/installer/dmg/package.json +++ b/packages/installer/dmg/package.json @@ -7,7 +7,7 @@ "license": "MIT", "main": "dist/InstallerDMG.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + "test": "exit 0" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/installer/exe/package.json b/packages/installer/exe/package.json index 148acb94c1..fad65bd3b0 100644 --- a/packages/installer/exe/package.json +++ b/packages/installer/exe/package.json @@ -7,7 +7,7 @@ "license": "MIT", "main": "dist/InstallerExe.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + "test": "exit 0" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/installer/linux/package.json b/packages/installer/linux/package.json index c7def2f5ca..50f17b7fe6 100644 --- a/packages/installer/linux/package.json +++ b/packages/installer/linux/package.json @@ -7,7 +7,7 @@ "license": "MIT", "main": "dist/InstallerLinux.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + "test": "exit 0" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/installer/rpm/package.json b/packages/installer/rpm/package.json index d503eafe2f..404a6b7a46 100644 --- a/packages/installer/rpm/package.json +++ b/packages/installer/rpm/package.json @@ -7,7 +7,7 @@ "license": "MIT", "main": "dist/InstallerRpm.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + "test": "exit 0" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/installer/zip/package.json b/packages/installer/zip/package.json index 943ef646bf..da991da9e7 100644 --- a/packages/installer/zip/package.json +++ b/packages/installer/zip/package.json @@ -7,7 +7,7 @@ "license": "MIT", "main": "dist/InstallerZip.js", "scripts": { - "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + "test": "exit 0" }, "devDependencies": { "mocha": "^5.0.0" diff --git a/packages/maker/appx/package.json b/packages/maker/appx/package.json new file mode 100644 index 0000000000..8cbada57bc --- /dev/null +++ b/packages/maker/appx/package.json @@ -0,0 +1,30 @@ +{ + "name": "@electron-forge/maker-appx", + "version": "6.0.0-beta.0", + "description": "AppX maker for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/MakerAppX.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/maker-base": "^6.0.0-beta.0", + "cross-spawn": "^6.0.4", + "fs-extra": "^5.0.0", + "parse-author": "^2.0.0", + "pify": "^3.0.0" + }, + "optionalDependencies": { + "electron-installer-dmg": "^0.2.0", + "electron-windows-store": "^0.12.0" + } +} \ No newline at end of file diff --git a/packages/maker/appx/src/MakerAppX.js b/packages/maker/appx/src/MakerAppX.js new file mode 100644 index 0000000000..12c5783fb0 --- /dev/null +++ b/packages/maker/appx/src/MakerAppX.js @@ -0,0 +1,107 @@ +import MakerBase from '@electron-forge/maker-base'; + +import fs from 'fs-extra'; +import path from 'path'; +import resolveCommand from 'cross-spawn/lib/util/resolveCommand'; +import windowsStore from 'electron-windows-store'; +import { isValidPublisherName, makeCert } from 'electron-windows-store/lib/sign'; + +import getNameFromAuthor from './util/author-name'; + +// NB: This is not a typo, we require AppXs to be built on 64-bit +// but if we're running in a 32-bit node.js process, we're going to +// be Wow64 redirected +const windowsSdkPath = process.arch === 'x64' ? + 'C:\\Program Files (x86)\\Windows Kits\\10\\bin\\x64' : + 'C:\\Program Files\\Windows Kits\\10\\bin\\x64'; + +async function findSdkTool(exe) { + let sdkTool = path.join(windowsSdkPath, exe); + if (!await fs.exists(sdkTool)) { + sdkTool = resolveCommand(exe, true); + } + + if (!await fs.exists(sdkTool)) { + throw `Can't find ${exe} in PATH. You probably need to install the Windows SDK.`; + } + + return sdkTool; +} + +export async function createDefaultCertificate(publisherName, { certFilePath, certFileName, install, program }) { + const makeCertOptions = { + publisherName, + certFilePath: certFilePath || process.cwd(), + certFileName: certFileName || 'default', + install: typeof install === 'boolean' ? install : false, + program: program || { windowsKit: path.dirname(await findSdkTool('makecert.exe')) }, + }; + + if (!isValidPublisherName(publisherName)) { + throw new Error(`Received invalid publisher name: '${publisherName}' did not conform to X.500 distinguished name syntax for MakeCert.`); + } + + return await makeCert(makeCertOptions); +} + +export default class MakerAppX extends MakerBase { + constructor() { + super('appx'); + } + + isSupportedOnCurrentPlatform() { + return process.platform === 'win32'; + } + + async make({ + dir, + makeDir, + appName, + config, + packageJSON, + targetArch, + }) { + const outPath = path.resolve(makeDir, `appx/${targetArch}`); + await this.ensureDirectory(outPath); + + const opts = Object.assign({ + publisher: `CN=${getNameFromAuthor(packageJSON.author)}`, + flatten: false, + deploy: false, + packageVersion: `${packageJSON.version}.0`, + packageName: appName.replace(/-/g, ''), + packageDisplayName: appName, + packageDescription: packageJSON.description || appName, + packageExecutable: `app\\${appName}.exe`, + windowsKit: config.windowsKit || path.dirname(findSdkTool('makeappx.exe')), + }, config, { + inputDirectory: dir, + outputDirectory: outPath, + }); + + if (!opts.publisher) { + throw 'Please set config.forge.windowsStoreConfig.publisher or author.name in package.json for the appx target'; + } + + if (!opts.devCert) { + opts.devCert = await createDefaultCertificate(opts.publisher, { certFilePath: outPath, program: opts }); + } + + if (opts.packageVersion.match(/-/)) { + if (opts.makeVersionWinStoreCompatible) { + const noBeta = opts.packageVersion.replace(/-.*/, ''); + opts.packageVersion = `${noBeta}.0`; + } else { + throw 'Windows Store version numbers don\'t support semver beta tags. To' + + 'automatically fix this, set makeVersionWinStoreCompatible to true or ' + + 'explicitly set packageVersion to a version of the format X.Y.Z.A'; + } + } + + delete opts.makeVersionWinStoreCompatible; + + await windowsStore(opts); + + return [path.resolve(outPath, `${opts.packageName}.appx`)]; + } +} diff --git a/packages/api/core/src/util/author-name.js b/packages/maker/appx/src/util/author-name.js similarity index 100% rename from packages/api/core/src/util/author-name.js rename to packages/maker/appx/src/util/author-name.js diff --git a/packages/maker/appx/test/MakerAppX_spec.js b/packages/maker/appx/test/MakerAppX_spec.js new file mode 100644 index 0000000000..5bdfd73ef7 --- /dev/null +++ b/packages/maker/appx/test/MakerAppX_spec.js @@ -0,0 +1,41 @@ +import { tmpdir } from 'os'; +import { join } from 'path'; +import fs from 'fs-extra'; +import { expect } from 'chai'; + +import { createDefaultCertificate } from '../src/MakerAppX'; + +describe('MakerApPX', () => { + describe('createDefaultCertificate', () => { + const tmpDir = join(tmpdir(), `electron-forge-maker-appx-test-${Date.now()}`); + + before(async () => { + await fs.ensureDir(tmpDir); + }); + + after(async () => { + await fs.remove(tmpDir); + }); + + let def = it; + if (process.platform !== 'win32') { + def = it.skip; + } + + def('should create a .pfx file', async () => { + await fs.copy( + join(__dirname, '..', '..', 'fixture', 'bogus-private-key.pvk'), + join(tmpDir, 'dummy.pvk') + ); + const outputCertPath = await createDefaultCertificate('CN=Test', { + certFilePath: tmpDir, + certFileName: 'dummy', + install: false, + }); + + const fileContents = await fs.readFile(outputCertPath); + expect(fileContents).to.be.an.instanceof(Buffer); + expect(fileContents.length).to.be.above(0); + }); + }); +}); diff --git a/packages/api/core/test/fast/author-name_spec.js b/packages/maker/appx/test/author-name_spec.js similarity index 92% rename from packages/api/core/test/fast/author-name_spec.js rename to packages/maker/appx/test/author-name_spec.js index 177c86e77e..12f9c6ab45 100644 --- a/packages/api/core/test/fast/author-name_spec.js +++ b/packages/maker/appx/test/author-name_spec.js @@ -1,6 +1,6 @@ import { expect } from 'chai'; -import getNameFromAuthor from '../../src/util/author-name'; +import getNameFromAuthor from '../src/util/author-name'; describe('author-name', () => { describe('getNameFromAuthor', () => { diff --git a/packages/maker/base/src/Maker.js b/packages/maker/base/src/Maker.js index 88634f58e0..e5394105fe 100644 --- a/packages/maker/base/src/Maker.js +++ b/packages/maker/base/src/Maker.js @@ -22,7 +22,7 @@ export default class Maker { * If the issue is a missing dependency you should log out a HELPFUL error message * telling the developer exactly what is missing and if possible how to get it. */ - async isSupportedOnCurrentPlatform() { + isSupportedOnCurrentPlatform() { throw new Error(`Maker ${this.name} did not implement the isSupportedOnCurrentPlatform method`); } @@ -73,4 +73,18 @@ export default class Maker { } await fs.mkdirs(path.dirname(file)); } + + /** + * Checks if the given module is installed, used for testing if optional dependencies + * are installed or not + */ + isInstalled(module) { + try { + require(module); + return true; + } catch (e) { + // Package doesn't exist -- must not be installable on this platform + return false; + } + } } diff --git a/packages/maker/deb/package.json b/packages/maker/deb/package.json new file mode 100644 index 0000000000..7e10c10f85 --- /dev/null +++ b/packages/maker/deb/package.json @@ -0,0 +1,25 @@ +{ + "name": "@electron-forge/maker-deb", + "version": "6.0.0-beta.0", + "description": "Deb maker for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/MakerDeb.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + }, + "devDependencies": { + "chai": "^4.0.0", + "chai-as-promised": "^7.0.0", + "mocha": "^5.0.0", + "proxyquire": "^1.7.10", + "sinon": "^4.1.2" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/maker-base": "^6.0.0-beta.0" + } +} \ No newline at end of file diff --git a/packages/maker/deb/src/MakerDeb.js b/packages/maker/deb/src/MakerDeb.js new file mode 100644 index 0000000000..6dca35ac1c --- /dev/null +++ b/packages/maker/deb/src/MakerDeb.js @@ -0,0 +1,50 @@ +import MakerBase from '@electron-forge/maker-base'; + +import path from 'path'; + +export function debianArch(nodeArch) { + switch (nodeArch) { + case 'ia32': return 'i386'; + case 'x64': return 'amd64'; + case 'armv7l': return 'armhf'; + case 'arm': return 'armel'; + default: return nodeArch; + } +} + +export default class MakerDeb extends MakerBase { + constructor() { + super('dmg'); + } + + isSupportedOnCurrentPlatform() { + return this.isInstalled('electron-installer-debian') && process.platform === 'linux'; + } + + async make({ + dir, + makeDir, + targetArch, + config, + packageJSON, + }) { + const installer = require('electron-installer-debian'); + + const arch = debianArch(targetArch); + const name = (config.options || {}).name || packageJSON.name; + const versionedName = `${name}_${packageJSON.version}_${arch}`; + const outPath = path.resolve(makeDir, `${versionedName}.deb`); + + await this.ensureFile(outPath); + + await installer(Object.assign({ + options: {}, + }, config, { + src: dir, + dest: path.dirname(outPath), + arch, + })); + + return [outPath]; + } +} diff --git a/packages/maker/deb/test/MakerDeb_spec.js b/packages/maker/deb/test/MakerDeb_spec.js new file mode 100644 index 0000000000..7cc5dfea8b --- /dev/null +++ b/packages/maker/deb/test/MakerDeb_spec.js @@ -0,0 +1,86 @@ +import chai, { expect } from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import path from 'path'; +import proxyquire from 'proxyquire'; +import { stub } from 'sinon'; + +chai.use(chaiAsPromised); + +describe('MakerDeb', () => { + let MakerDeb; + let eidStub; + let ensureFileStub; + let config; + let maker; + + const dir = '/my/test/dir/out'; + const makeDir = '/foo/bar/make'; + const appName = 'My Test App'; + const targetArch = process.arch; + const packageJSON = { version: '1.2.3' }; + + beforeEach(() => { + ensureFileStub = stub().returns(Promise.resolve()); + eidStub = stub().resolves(); + config = {}; + + MakerDeb = proxyquire.noPreserveCache().noCallThru().load('../src/MakerDeb', { + 'electron-installer-debian': eidStub, + }); + maker = new MakerDeb.default(); // eslint-disable-line + maker.ensureFile = ensureFileStub; + }); + + it('should pass through correct defaults', async () => { + await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + const opts = eidStub.firstCall.args[0]; + expect(opts).to.deep.equal({ + arch: MakerDeb.debianArch(process.arch), + options: {}, + src: dir, + dest: makeDir, + }); + }); + + it('should have config cascade correctly', async () => { + config = { + arch: 'overridden', + options: { + productName: 'Debian', + }, + }; + + await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + const opts = eidStub.firstCall.args[0]; + expect(opts).to.deep.equal({ + arch: MakerDeb.debianArch(process.arch), + options: { + productName: 'Debian', + }, + src: dir, + dest: makeDir, + }); + }); + + describe('debianArch', () => { + it('should convert ia32 to i386', () => { + expect(MakerDeb.debianArch('ia32')).to.equal('i386'); + }); + + it('should convert x64 to amd64', () => { + expect(MakerDeb.debianArch('x64')).to.equal('amd64'); + }); + + it('should convert arm to armel', () => { + expect(MakerDeb.debianArch('arm')).to.equal('armel'); + }); + + it('should convert armv7l to armhf', () => { + expect(MakerDeb.debianArch('armv7l')).to.equal('armhf'); + }); + + it('should leave unknown values alone', () => { + expect(MakerDeb.debianArch('foo')).to.equal('foo'); + }); + }); +}); diff --git a/packages/maker/dmg/package.json b/packages/maker/dmg/package.json index ea39cfc952..4155303698 100644 --- a/packages/maker/dmg/package.json +++ b/packages/maker/dmg/package.json @@ -5,13 +5,16 @@ "repository": "https://github.com/electron-userland/electron-forge", "author": "Samuel Attard", "license": "MIT", - "main": "dist/Maker.js", + "main": "dist/MakerDMG.js", "scripts": { "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" }, "devDependencies": { "chai": "^4.0.0", - "mocha": "^5.0.0" + "chai-as-promised": "^7.0.0", + "mocha": "^5.0.0", + "proxyquire": "^1.7.10", + "sinon": "^4.1.2" }, "engines": { "node": ">= 6.0" diff --git a/packages/maker/dmg/src/MakerDMG.js b/packages/maker/dmg/src/MakerDMG.js index f058a2860e..322de41c8a 100644 --- a/packages/maker/dmg/src/MakerDMG.js +++ b/packages/maker/dmg/src/MakerDMG.js @@ -9,7 +9,7 @@ export default class MakerDMG extends MakerBase { super('dmg'); } - async isSupportedOnCurrentPlatform() { + isSupportedOnCurrentPlatform() { return process.platform === 'darwin'; } diff --git a/packages/maker/dmg/test/MakerDMG_spec.js b/packages/maker/dmg/test/MakerDMG_spec.js new file mode 100644 index 0000000000..e19b14b272 --- /dev/null +++ b/packages/maker/dmg/test/MakerDMG_spec.js @@ -0,0 +1,67 @@ +import chai, { expect } from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import path from 'path'; +import proxyquire from 'proxyquire'; +import { stub } from 'sinon'; + +chai.use(chaiAsPromised); + +describe('MakerDMG', () => { + let MakerDMG; + let ensureFileStub; + let eidStub; + let renameStub; + let config; + let maker; + + const dir = '/my/test/dir/out'; + const makeDir = '/my/test/dir/make'; + const appName = 'My Test App'; + const targetArch = process.arch; + const packageJSON = { version: '1.2.3' }; + + beforeEach(() => { + ensureFileStub = stub().returns(Promise.resolve()); + eidStub = stub().callsArg(1); + renameStub = stub().returns(Promise.resolve()); + config = {}; + + MakerDMG = proxyquire.noPreserveCache().noCallThru().load('../src/MakerDMG', { + '../../util/ensure-output': { ensureFile: ensureFileStub }, + 'electron-installer-dmg': eidStub, + 'fs-extra': { + rename: renameStub, + }, + }).default; + maker = new MakerDMG(); + maker.ensureFile = ensureFileStub; + }); + + it('should pass through correct defaults', async () => { + await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + const opts = eidStub.firstCall.args[0]; + expect(opts).to.deep.equal({ + overwrite: true, + name: appName, + appPath: path.resolve(`${dir}/My Test App.app`), + out: path.resolve(`${dir.substr(0, dir.length - 4)}/make`), + }); + }); + + it('should attempt to rename the DMG file if no custom name is set', async () => { + await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + expect(renameStub.callCount).to.equal(1); + expect(renameStub.firstCall.args[1]).to.include('1.2.3'); + }); + + it('should rename the DMG file to include the version if no custom name is set', async () => { + await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + expect(renameStub.firstCall.args[1]).to.include('1.2.3'); + }); + + it('should not attempt to rename the DMG file if a custom name is set', async () => { + config.name = 'foobar'; + await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + expect(renameStub.callCount).to.equal(0); + }); +}); diff --git a/packages/maker/flatpak/package.json b/packages/maker/flatpak/package.json new file mode 100644 index 0000000000..f6649c2d8e --- /dev/null +++ b/packages/maker/flatpak/package.json @@ -0,0 +1,27 @@ +{ + "name": "@electron-forge/maker-flatpak", + "version": "6.0.0-beta.0", + "description": "Flatpak maker for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/MakerFlatpak.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/maker-base": "^6.0.0-beta.0", + "fs-extra": "^5.0.0", + "pify": "^3.0.0" + }, + "optionalDependencies": { + "electron-installer-flatpak": "^0.8.0" + } +} \ No newline at end of file diff --git a/packages/maker/flatpak/src/MakerFlatpak.js b/packages/maker/flatpak/src/MakerFlatpak.js new file mode 100644 index 0000000000..794a270bcd --- /dev/null +++ b/packages/maker/flatpak/src/MakerFlatpak.js @@ -0,0 +1,50 @@ +import MakerBase from '@electron-forge/maker-base'; + +import fs from 'fs-extra'; +import path from 'path'; +import pify from 'pify'; + +export function flatpakArch(nodeArch) { + switch (nodeArch) { + case 'ia32': return 'i386'; + case 'x64': return 'x86_64'; + case 'armv7l': return 'arm'; + // arm => arm + default: return nodeArch; + } +} + +export default class MakerFlatpak extends MakerBase { + constructor() { + super('flatpak'); + } + + isSupportedOnCurrentPlatform() { + return this.isInstalled('electron-installer-flatpak') && process.platform === 'linux'; + } + + async make({ + dir, + makeDir, + targetArch, + config, + }) { + const installer = require('electron-installer-flatpak'); + + const arch = flatpakArch(targetArch); + const outDir = path.resolve(makeDir, 'flatpak'); + + await this.ensureDirectory(outDir); + const flatpakConfig = Object.assign({}, config, { + arch, + src: dir, + dest: outDir, + }); + + await pify(installer)(flatpakConfig); + + return (await fs.readdir(outDir)) + .filter(basename => basename.endsWith('.flatpak')) + .map(basename => path.join(outDir, basename)); + } +} diff --git a/packages/maker/flatpak/test/MakerFlatpak_spec.js b/packages/maker/flatpak/test/MakerFlatpak_spec.js new file mode 100644 index 0000000000..f920009ff5 --- /dev/null +++ b/packages/maker/flatpak/test/MakerFlatpak_spec.js @@ -0,0 +1,64 @@ +import chai, { expect } from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import path from 'path'; +import proxyquire from 'proxyquire'; +import { stub } from 'sinon'; + +chai.use(chaiAsPromised); + +describe('MakerFlatpak', () => { + let flatpakModule; + let maker; + let eidStub; + let ensureDirectoryStub; + let config; + + const dir = '/my/test/dir/out'; + const makeDir = '/make/dir'; + const appName = 'My Test App'; + const targetArch = process.arch; + const packageJSON = { version: '1.2.3' }; + + beforeEach(() => { + ensureDirectoryStub = stub().returns(Promise.resolve()); + eidStub = stub().callsArg(1); + config = {}; + + flatpakModule = proxyquire.noPreserveCache().noCallThru().load('../src/MakerFlatpak', { + 'fs-extra': { readdir: stub().returns(Promise.resolve([])) }, + 'electron-installer-flatpak': eidStub, + }); + maker = new flatpakModule.default(); // eslint-disable-line + maker.ensureDirectory = ensureDirectoryStub; + }); + + it('should pass through correct defaults', async () => { + await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + const opts = eidStub.firstCall.args[0]; + expect(opts).to.deep.equal({ + arch: flatpakModule.flatpakArch(process.arch), + src: dir, + dest: path.resolve(makeDir, 'flatpak'), + }); + }); + + it('should have config cascade correctly', async () => { + config = { + arch: 'overridden', + options: { + productName: 'Flatpak', + }, + }; + + await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + const opts = eidStub.firstCall.args[0]; + expect(opts).to.deep.equal({ + arch: flatpakModule.flatpakArch(process.arch), + options: { + productName: 'Flatpak', + }, + src: dir, + dest: path.resolve(makeDir, 'flatpak'), + }); + }); +}); diff --git a/packages/maker/rpm/package.json b/packages/maker/rpm/package.json new file mode 100644 index 0000000000..7c70a3afc2 --- /dev/null +++ b/packages/maker/rpm/package.json @@ -0,0 +1,29 @@ +{ + "name": "@electron-forge/maker-rpm", + "version": "6.0.0-beta.0", + "description": "Rpm maker for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/MakerRpm.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + }, + "devDependencies": { + "chai": "^4.0.0", + "chai-as-promised": "^7.0.0", + "mocha": "^5.0.0", + "proxyquire": "^1.7.10", + "sinon": "^4.1.2" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/maker-base": "^6.0.0-beta.0", + "pify": "^3.0.0" + }, + "optionalDependencies": { + "electron-installer-redhat": "^0.5.0" + } +} \ No newline at end of file diff --git a/packages/maker/rpm/src/MakerRpm.js b/packages/maker/rpm/src/MakerRpm.js new file mode 100644 index 0000000000..514c74d4bb --- /dev/null +++ b/packages/maker/rpm/src/MakerRpm.js @@ -0,0 +1,49 @@ +import MakerBase from '@electron-forge/maker-base'; + +import path from 'path'; +import pify from 'pify'; + +export function rpmArch(nodeArch) { + switch (nodeArch) { + case 'ia32': return 'i386'; + case 'x64': return 'x86_64'; + case 'armv7l': return 'armv7hl'; + case 'arm': return 'armv6hl'; + default: return nodeArch; + } +} + +export default class MakerRpm extends MakerBase { + constructor() { + super('rpm'); + } + + isSupportedOnCurrentPlatform() { + return this.isInstalled('electron-installer-redhat') && process.platform === 'linux'; + } + + async make({ + dir, + makeDir, + targetArch, + config, + packageJSON, + }) { + const installer = require('electron-installer-redhat'); + + const arch = rpmArch(targetArch); + const name = (config.options || {}).name || packageJSON.name; + const versionedName = `${name}-${packageJSON.version}.${arch}`; + const outPath = path.resolve(makeDir, `${versionedName}.rpm`); + + await this.ensureFile(outPath); + const rpmConfig = Object.assign({}, config, { + arch, + src: dir, + dest: path.dirname(outPath), + }); + + await pify(installer)(rpmConfig); + return [outPath]; + } +} diff --git a/packages/maker/rpm/test/MakerRpm_spec.js b/packages/maker/rpm/test/MakerRpm_spec.js new file mode 100644 index 0000000000..f6e9354786 --- /dev/null +++ b/packages/maker/rpm/test/MakerRpm_spec.js @@ -0,0 +1,84 @@ +import chai, { expect } from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import proxyquire from 'proxyquire'; +import { stub } from 'sinon'; + +chai.use(chaiAsPromised); + +describe('MakerRpm', () => { + let rpmModule; + let maker; + let eidStub; + let ensureFileStub; + let config; + + const dir = '/my/test/dir/out'; + const makeDir = '/make/dir'; + const appName = 'My Test App'; + const targetArch = process.arch; + const packageJSON = { version: '1.2.3' }; + + beforeEach(() => { + ensureFileStub = stub().returns(Promise.resolve()); + eidStub = stub().callsArg(1); + config = {}; + + rpmModule = proxyquire.noPreserveCache().noCallThru().load('../src/MakerRpm', { + 'electron-installer-redhat': eidStub, + }); + maker = new rpmModule.default(); // eslint-disable-line + maker.ensureFile = ensureFileStub; + }); + + it('should pass through correct defaults', async () => { + await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + const opts = eidStub.firstCall.args[0]; + expect(opts).to.deep.equal({ + arch: rpmModule.rpmArch(process.arch), + src: dir, + dest: makeDir, + }); + }); + + it('should have config cascade correctly', async () => { + config = { + arch: 'overridden', + options: { + productName: 'Redhat', + }, + }; + + await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + const opts = eidStub.firstCall.args[0]; + expect(opts).to.deep.equal({ + arch: rpmModule.rpmArch(process.arch), + options: { + productName: 'Redhat', + }, + src: dir, + dest: makeDir, + }); + }); + + describe('rpmArch', () => { + it('should convert ia32 to i386', () => { + expect(rpmModule.rpmArch('ia32')).to.equal('i386'); + }); + + it('should convert x64 to x86_64', () => { + expect(rpmModule.rpmArch('x64')).to.equal('x86_64'); + }); + + it('should convert arm to armv6hl', () => { + expect(rpmModule.rpmArch('arm')).to.equal('armv6hl'); + }); + + it('should convert armv7l to armv7hl', () => { + expect(rpmModule.rpmArch('armv7l')).to.equal('armv7hl'); + }); + + it('should leave unknown values alone', () => { + expect(rpmModule.rpmArch('foo')).to.equal('foo'); + }); + }); +}); diff --git a/packages/maker/snap/package.json b/packages/maker/snap/package.json new file mode 100644 index 0000000000..23630e843e --- /dev/null +++ b/packages/maker/snap/package.json @@ -0,0 +1,28 @@ +{ + "name": "@electron-forge/maker-snap", + "version": "6.0.0-beta.0", + "description": "Snap maker for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/MakerSnap.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + }, + "devDependencies": { + "chai": "^4.0.0", + "chai-as-promised": "^7.0.0", + "mocha": "^5.0.0", + "proxyquire": "^1.7.10", + "sinon": "^4.1.2" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/maker-base": "^6.0.0-beta.0" + }, + "optionalDependencies": { + "electron-installer-snap": "^2.0.0" + } +} \ No newline at end of file diff --git a/packages/maker/snap/src/MakerSnap.js b/packages/maker/snap/src/MakerSnap.js new file mode 100644 index 0000000000..4b51ea1c26 --- /dev/null +++ b/packages/maker/snap/src/MakerSnap.js @@ -0,0 +1,35 @@ +import MakerBase from '@electron-forge/maker-base'; + +import path from 'path'; + +export default class MakerSnap extends MakerBase { + constructor() { + super('snap'); + } + + isSupportedOnCurrentPlatform() { + return process.platform === 'linux'; + } + + async make({ + dir, + makeDir, + targetArch, + config, + }) { + const installer = require('electron-installer-snap'); + + const outPath = path.resolve(makeDir, 'snap'); + + await this.ensureDirectory(outPath); + + const snapDefaults = { + arch: targetArch, + dest: outPath, + src: dir, + }; + const snapConfig = Object.assign({}, config, snapDefaults); + + return [await installer(snapConfig)]; + } +} diff --git a/packages/maker/snap/test/MakerSnap_spec.js b/packages/maker/snap/test/MakerSnap_spec.js new file mode 100644 index 0000000000..ecccb7ca1c --- /dev/null +++ b/packages/maker/snap/test/MakerSnap_spec.js @@ -0,0 +1,59 @@ +import chai, { expect } from 'chai'; +import chaiAsPromised from 'chai-as-promised'; +import path from 'path'; +import proxyquire from 'proxyquire'; +import { stub } from 'sinon'; + +chai.use(chaiAsPromised); + +describe('MakerSnap', () => { + let MakerSnapModule; + let maker; + let eisStub; + let ensureDirectoryStub; + let config; + + const dir = '/my/test/dir/out/foo-linux-x64'; + const makeDir = '/make/dir'; + const appName = 'My Test App'; + const targetArch = process.arch; + const packageJSON = { version: '1.2.3' }; + + beforeEach(() => { + ensureDirectoryStub = stub().returns(Promise.resolve()); + eisStub = stub().resolves('/my/test/dir/out/make/foo_0.0.1_amd64.snap'); + config = {}; + + MakerSnapModule = proxyquire.noPreserveCache().noCallThru().load('../src/MakerSnap', { + 'electron-installer-snap': eisStub, + }); + maker = new MakerSnapModule.default(); // eslint-disable-line + maker.ensureDirectory = ensureDirectoryStub; + }); + + it('should pass through correct defaults', async () => { + await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + const opts = eisStub.firstCall.args[0]; + expect(opts).to.deep.equal({ + arch: process.arch, + src: dir, + dest: path.resolve(makeDir, 'snap'), + }); + }); + + it('should have config cascade correctly', async () => { + config = { + arch: 'overridden', + description: 'Snap description', + }; + + await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + const opts = eisStub.firstCall.args[0]; + expect(opts).to.deep.equal({ + arch: process.arch, + src: dir, + dest: path.resolve(makeDir, 'snap'), + description: 'Snap description', + }); + }); +}); diff --git a/packages/maker/squirrel/package.json b/packages/maker/squirrel/package.json new file mode 100644 index 0000000000..624e1de3fe --- /dev/null +++ b/packages/maker/squirrel/package.json @@ -0,0 +1,26 @@ +{ + "name": "@electron-forge/maker-squirrel", + "version": "6.0.0-beta.0", + "description": "Squirrel maker for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/MakerSquirrel.js", + "scripts": { + "test": "exit 0" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/maker-base": "^6.0.0-beta.0", + "fs-extra": "^5.0.0" + }, + "optionalDependencies": { + "electron-winstaller": "^2.5.0" + } +} \ No newline at end of file diff --git a/packages/maker/squirrel/src/MakerSquirrel.js b/packages/maker/squirrel/src/MakerSquirrel.js new file mode 100644 index 0000000000..17fd708287 --- /dev/null +++ b/packages/maker/squirrel/src/MakerSquirrel.js @@ -0,0 +1,55 @@ +import MakerBase from '@electron-forge/maker-base'; + +import fs from 'fs-extra'; +import path from 'path'; + +export default class MakerSquirrel extends MakerBase { + constructor() { + super('squirel'); + } + + isSupportedOnCurrentPlatform() { + return this.isInstalled('electron-winstaller') && !process.env.DISABLE_SQUIRREL_TEST; + } + + async make({ + dir, + makeDir, + targetArch, + packageJSON, + appName, + config, + }) { + const { createWindowsInstaller } = require('electron-winstaller'); + + const outPath = path.resolve(makeDir, `squirrel.windows/${targetArch}`); + await this.ensureDirectory(outPath); + + const winstallerConfig = Object.assign({ + name: appName, + noMsi: true, + exe: `${appName}.exe`, + setupExe: `${appName}-${packageJSON.version} Setup.exe`, + }, config, { + appDirectory: dir, + outputDirectory: outPath, + }); + + await createWindowsInstaller(winstallerConfig); + + const artifacts = [ + path.resolve(outPath, 'RELEASES'), + path.resolve(outPath, winstallerConfig.setupExe || `${appName}Setup.exe`), + path.resolve(outPath, `${winstallerConfig.name}-${packageJSON.version}-full.nupkg`), + ]; + const deltaPath = path.resolve(outPath, `${winstallerConfig.name}-${packageJSON.version}-delta.nupkg`); + if (winstallerConfig.remoteReleases || await fs.pathExists(deltaPath)) { + artifacts.push(deltaPath); + } + const msiPath = path.resolve(outPath, winstallerConfig.setupMsi || `${appName}Setup.msi`); + if (!winstallerConfig.noMsi && await fs.pathExists(msiPath)) { + artifacts.push(msiPath); + } + return artifacts; + } +} diff --git a/packages/maker/wix/package.json b/packages/maker/wix/package.json new file mode 100644 index 0000000000..4579073c4e --- /dev/null +++ b/packages/maker/wix/package.json @@ -0,0 +1,23 @@ +{ + "name": "@electron-forge/maker-wix", + "version": "6.0.0-beta.0", + "description": "Wix maker for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/MakerWix.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/maker-base": "^6.0.0-beta.0", + "electron-wix-msi": "^1.3.0" + } +} \ No newline at end of file diff --git a/packages/maker/wix/src/MakerWix.js b/packages/maker/wix/src/MakerWix.js new file mode 100644 index 0000000000..4ace7ee6ef --- /dev/null +++ b/packages/maker/wix/src/MakerWix.js @@ -0,0 +1,45 @@ +import MakerBase from '@electron-forge/maker-base'; + +import path from 'path'; + +import getNameFromAuthor from './util/author-name'; + +export default class MakerWix extends MakerBase { + constructor() { + super('wix'); + } + + isSupportedOnCurrentPlatform() { + return process.platform === 'win32'; + } + + async make({ + dir, + makeDir, + targetArch, + packageJSON, + appName, + config, + }) { + const { MSICreator } = require('electron-wix-msi'); + + const outPath = path.resolve(makeDir, `/wix/${targetArch}`); + await this.ensureDirectory(outPath); + + const creator = new MSICreator(Object.assign({ + description: packageJSON.description, + name: appName, + version: packageJSON.version, + manufacturer: getNameFromAuthor(packageJSON.author), + exe: `${appName}.exe`, + }, config, { + appDirectory: dir, + outputDirectory: outPath, + })); + + await creator.create(); + const { msiFile } = await creator.compile(); + + return [msiFile]; + } +} diff --git a/packages/maker/wix/src/util/author-name.js b/packages/maker/wix/src/util/author-name.js new file mode 100644 index 0000000000..944c6febb9 --- /dev/null +++ b/packages/maker/wix/src/util/author-name.js @@ -0,0 +1,19 @@ +import parseAuthor from 'parse-author'; + +export default function getNameFromAuthor(author) { + let publisher = author || ''; + + if (typeof publisher === 'string') { + publisher = parseAuthor(publisher); + } + + if (typeof publisher.name === 'string') { + publisher = publisher.name; + } + + if (typeof publisher !== 'string') { + publisher = ''; + } + + return publisher; +} diff --git a/packages/maker/wix/test/author-name_spec.js b/packages/maker/wix/test/author-name_spec.js new file mode 100644 index 0000000000..12f9c6ab45 --- /dev/null +++ b/packages/maker/wix/test/author-name_spec.js @@ -0,0 +1,30 @@ +import { expect } from 'chai'; + +import getNameFromAuthor from '../src/util/author-name'; + +describe('author-name', () => { + describe('getNameFromAuthor', () => { + [{ + author: 'First Last', + expectedReturnValue: 'First Last', + }, { + author: 'First Last ', + expectedReturnValue: 'First Last', + }, { + author: { + name: 'First Last', + }, + expectedReturnValue: 'First Last', + }, { + author: undefined, + expectedReturnValue: '', + }, { + author: '', + expectedReturnValue: '', + }].forEach((scenario) => { + it(`${JSON.stringify(scenario.author)} -> "${scenario.expectedReturnValue}"`, () => { + expect(getNameFromAuthor(scenario.author)).to.equal(scenario.expectedReturnValue); + }); + }); + }); +}); diff --git a/packages/maker/zip/package.json b/packages/maker/zip/package.json new file mode 100644 index 0000000000..d8b2cd541b --- /dev/null +++ b/packages/maker/zip/package.json @@ -0,0 +1,25 @@ +{ + "name": "@electron-forge/maker-zip", + "version": "6.0.0-beta.0", + "description": "ZIP maker for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/MakerZIP.js", + "scripts": { + "test": "exit 0" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/maker-base": "^6.0.0-beta.0", + "fs-extra": "^5.0.0", + "pify": "^3.0.0", + "zip-folder": "^1.0.0" + } +} \ No newline at end of file diff --git a/packages/maker/zip/src/MakerZIP.js b/packages/maker/zip/src/MakerZIP.js new file mode 100644 index 0000000000..51d6374e3a --- /dev/null +++ b/packages/maker/zip/src/MakerZIP.js @@ -0,0 +1,58 @@ +import MakerBase from '@electron-forge/maker-base'; + +import { spawn } from 'child_process'; +import path from 'path'; +import pify from 'pify'; + +export default class MakerZIP extends MakerBase { + constructor() { + super('zip'); + } + + isSupportedOnCurrentPlatform() { + return true; + } + + async make({ + dir, + makeDir, + appName, + packageJSON, + targetPlatform, + }) { + const zipFolder = require('zip-folder'); + + const zipPath = path.resolve(makeDir, `${path.basename(dir)}-${packageJSON.version}.zip`); + await this.ensureFile(zipPath); + switch (targetPlatform) { + case 'win32': + await pify(zipFolder)(dir, zipPath); + break; + case 'mas': + case 'darwin': + await this.zipPromise(path.resolve(dir, `${appName}.app`), zipPath); + break; + case 'linux': + await this.zipPromise(dir, zipPath); + break; + default: + throw `Unrecognized platform: ${process.platform}`; + } + return [zipPath]; + } + + zipPromise = (from, to) => + new Promise((resolve, reject) => { + const child = spawn('zip', ['-r', '-y', to, path.basename(from)], { + cwd: path.dirname(from), + }); + + child.stdout.on('data', () => {}); + child.stderr.on('data', () => {}); + + child.on('close', (code) => { + if (code === 0) return resolve(); + reject(new Error(`Failed to zip, exitted with code: ${code}`)); + }); + }); +} diff --git a/yarn.lock b/yarn.lock index fec2440f7f..4f14a4cde4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1662,6 +1662,16 @@ cross-spawn@^5.0.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: shebang-command "^1.2.0" which "^1.2.9" +cross-spawn@^6.0.4: + version "6.0.4" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.4.tgz#bbf44ccb30fb8314a08f178b62290c669c36d808" + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" + cryptiles@0.2.x: version "0.2.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-0.2.2.tgz#ed91ff1f17ad13d3748288594f8a48a0d26f325c" @@ -4717,6 +4727,10 @@ nested-error-stacks@^1.0.1: dependencies: inherits "~2.0.1" +nice-try@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.4.tgz#d93962f6c52f2c1558c0fbda6d512819f1efe1c4" + nise@^1.2.0: version "1.2.5" resolved "https://registry.yarnpkg.com/nise/-/nise-1.2.5.tgz#a143371b65014b6807d3a6e6b4556063f3a53363" @@ -5186,7 +5200,7 @@ path-key@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" -path-key@^2.0.0: +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -5905,7 +5919,7 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" From c5617fdc60d1fbc3ea9382466878809030ba10cb Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 19 Feb 2018 16:41:28 +1100 Subject: [PATCH 05/40] Add v6 branches to travis config --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 2d0ae083af..85ed50c895 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,7 @@ env: branches: only: - master + - /^v6.*/ - /^v\d+\.\d+\.\d+/ install: - yarn global add bolt From bf0a3bd7c97092404f4f46ed5372498c26a7e782 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 19 Feb 2018 16:42:38 +1100 Subject: [PATCH 06/40] Add v6 branches to appveyor config --- .appveyor.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.appveyor.yml b/.appveyor.yml index 0d2e2060ac..1c37c0766a 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -10,6 +10,8 @@ cache: branches: only: - master + - v6 + - v6-api install: - ps: Install-Product node $env:nodejs_version $env:platform From c4213b81e860397d2941de9abbc3388d2fa66395 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 19 Feb 2018 16:46:07 +1100 Subject: [PATCH 07/40] Gitignore _old --- .gitignore | 3 +- packages/_old/.editorconfig | 14 - packages/_old/.esdoc.json | 28 - packages/_old/.eslintignore | 1 - packages/_old/.gitignore | 6 - packages/_old/.npmignore | 4 - packages/_old/CHANGELOG.md | 1059 ----------------- packages/_old/package.json | 97 -- packages/_old/script/vscode.cmd | 9 - packages/_old/script/vscode.sh | 7 - packages/_old/src/api/import.js | 166 --- packages/_old/src/api/index.js | 28 - packages/_old/src/api/init.js | 46 - packages/_old/src/api/install.js | 163 --- packages/_old/src/api/lint.js | 58 - packages/_old/src/api/make.js | 182 --- packages/_old/src/api/package.js | 174 --- packages/_old/src/api/publish.js | 155 --- packages/_old/src/api/start.js | 98 -- packages/_old/src/electron-forge-import.js | 26 - packages/_old/src/electron-forge-init.js | 32 - packages/_old/src/electron-forge-install.js | 23 - packages/_old/src/electron-forge-lint.js | 27 - packages/_old/src/electron-forge-make.js | 47 - packages/_old/src/electron-forge-package.js | 34 - packages/_old/src/electron-forge-publish.js | 43 - packages/_old/src/electron-forge-start.js | 73 -- packages/_old/src/electron-forge.js | 75 -- packages/_old/src/init/init-custom.js | 62 - packages/_old/src/init/init-directory.js | 25 - packages/_old/src/init/init-git.js | 26 - packages/_old/src/init/init-npm.js | 42 - packages/_old/src/init/init-starter-files.js | 31 - packages/_old/src/installers/darwin/dmg.js | 31 - packages/_old/src/installers/darwin/zip.js | 20 - packages/_old/src/installers/linux/deb.js | 5 - packages/_old/src/installers/linux/rpm.js | 5 - packages/_old/src/installers/win32/exe.js | 3 - packages/_old/src/makers/darwin/dmg.js | 32 - packages/_old/src/makers/generic/zip.js | 48 - packages/_old/src/makers/linux/deb.js | 38 - packages/_old/src/makers/linux/flatpak.js | 43 - packages/_old/src/makers/linux/rpm.js | 39 - packages/_old/src/makers/linux/snap.js | 22 - packages/_old/src/makers/win32/appx.js | 102 -- packages/_old/src/makers/win32/squirrel.js | 42 - packages/_old/src/makers/win32/wix.js | 31 - .../src/publishers/electron-release-server.js | 114 -- packages/_old/src/publishers/github.js | 72 -- packages/_old/src/publishers/s3.js | 72 -- packages/_old/src/publishers/snapcraft.js | 28 - packages/_old/src/util/author-name.js | 19 - packages/_old/src/util/check-system.js | 71 -- packages/_old/src/util/config-fn.js | 6 - packages/_old/src/util/config.js | 49 - .../_old/src/util/confirm-if-interactive.js | 12 - packages/_old/src/util/deprecate.js | 8 - packages/_old/src/util/electron-version.js | 6 - packages/_old/src/util/ensure-output.js | 22 - packages/_old/src/util/forge-config.js | 114 -- packages/_old/src/util/github.js | 30 - packages/_old/src/util/hdiutil.js | 42 - packages/_old/src/util/hook.js | 13 - .../_old/src/util/install-dependencies.js | 33 - packages/_old/src/util/is-installed.js | 9 - packages/_old/src/util/linux-config.js | 19 - packages/_old/src/util/messages.js | 13 - packages/_old/src/util/move-app.js | 39 - packages/_old/src/util/ora-handler.js | 44 - packages/_old/src/util/ora.js | 39 - packages/_old/src/util/out-dir.js | 14 - packages/_old/src/util/parse-archs.js | 9 - packages/_old/src/util/plugin-interface.js | 50 - packages/_old/src/util/publish-state.js | 72 -- packages/_old/src/util/read-package-json.js | 5 - packages/_old/src/util/rebuild.js | 26 - packages/_old/src/util/require-search.js | 25 - packages/_old/src/util/resolve-dir.js | 36 - packages/_old/src/util/terminate.js | 25 - packages/_old/src/util/yarn-or-npm.js | 23 - packages/_old/tabtab-install.js | 21 - packages/_old/test/.eslintrc | 9 - packages/_old/test/fast/author-name_spec.js | 30 - packages/_old/test/fast/config_spec.js | 31 - .../test/fast/confirm-if-interactive_spec.js | 36 - .../test/fast/electron_forge_start_spec.js | 152 --- packages/_old/test/fast/ensure-output_spec.js | 50 - packages/_old/test/fast/forge-config_spec.js | 98 -- packages/_old/test/fast/github_spec.js | 94 -- packages/_old/test/fast/hook_spec.js | 27 - .../test/fast/install-dependencies_spec.js | 99 -- packages/_old/test/fast/makers/appx_spec.js | 38 - packages/_old/test/fast/makers/deb_spec.js | 64 - packages/_old/test/fast/makers/dmg_spec.js | 64 - .../_old/test/fast/makers/flatpak_spec.js | 65 - packages/_old/test/fast/makers/rpm_spec.js | 64 - packages/_old/test/fast/makers/snap_spec.js | 59 - packages/_old/test/fast/makers_spec.js | 24 - packages/_old/test/fast/ora-handler_spec.js | 115 -- packages/_old/test/fast/out-dir_spec.js | 26 - packages/_old/test/fast/parse-archs_spec.js | 21 - packages/_old/test/fast/publish_spec.js | 234 ---- .../_old/test/fast/read-package-json_spec.js | 10 - .../_old/test/fast/require-search_spec.js | 16 - packages/_old/test/fast/resolve-dir_spec.js | 15 - packages/_old/test/fast/start_spec.js | 208 ---- packages/_old/test/fast/system_spec.js | 24 - packages/_old/test/fast/yarn-or-npm_spec.js | 39 - .../_old/test/fixture/bogus-private-key.pvk | Bin 1196 -> 0 bytes .../_old/test/fixture/custom_init/index.js | 8 - .../test/fixture/custom_init/package.json | 12 - .../_old/test/fixture/custom_init/tmpl/_bar | 0 .../test/fixture/custom_init/tmpl/src/foo.js | 0 packages/_old/test/fixture/dummy_app/foo/null | 0 .../_old/test/fixture/dummy_app/package.json | 34 - .../fixture/dummy_js_conf/forge.config.js | 13 - .../test/fixture/dummy_js_conf/package.json | 19 - .../_old/test/fixture/maker-incompatible.js | 1 - .../_old/test/fixture/maker-unsupported.js | 3 - .../_old/test/fixture/native_app/package.json | 27 - packages/_old/test/mocha.opts | 2 - packages/_old/test/slow/api_spec_slow.js | 371 ------ .../slow/install-dependencies_spec_slow.js | 23 - packages/_old/test/slow/install_spec_slow.js | 191 --- packages/_old/test/slow/rebuild_spec_slow.js | 79 -- packages/_old/tmpl/_appveyor.yml | 26 - packages/_old/tmpl/_gitignore | 2 - packages/_old/tmpl/_travis.yml | 33 - packages/_old/tmpl/index.html | 10 - packages/_old/tmpl/index.js | 57 - packages/_old/tmpl/package.json | 38 - 131 files changed, 2 insertions(+), 7164 deletions(-) delete mode 100644 packages/_old/.editorconfig delete mode 100644 packages/_old/.esdoc.json delete mode 100644 packages/_old/.eslintignore delete mode 100644 packages/_old/.gitignore delete mode 100644 packages/_old/.npmignore delete mode 100644 packages/_old/CHANGELOG.md delete mode 100644 packages/_old/package.json delete mode 100755 packages/_old/script/vscode.cmd delete mode 100755 packages/_old/script/vscode.sh delete mode 100644 packages/_old/src/api/import.js delete mode 100644 packages/_old/src/api/index.js delete mode 100644 packages/_old/src/api/init.js delete mode 100644 packages/_old/src/api/install.js delete mode 100644 packages/_old/src/api/lint.js delete mode 100644 packages/_old/src/api/make.js delete mode 100644 packages/_old/src/api/package.js delete mode 100644 packages/_old/src/api/publish.js delete mode 100644 packages/_old/src/api/start.js delete mode 100644 packages/_old/src/electron-forge-import.js delete mode 100644 packages/_old/src/electron-forge-init.js delete mode 100644 packages/_old/src/electron-forge-install.js delete mode 100644 packages/_old/src/electron-forge-lint.js delete mode 100644 packages/_old/src/electron-forge-make.js delete mode 100644 packages/_old/src/electron-forge-package.js delete mode 100644 packages/_old/src/electron-forge-publish.js delete mode 100644 packages/_old/src/electron-forge-start.js delete mode 100644 packages/_old/src/electron-forge.js delete mode 100644 packages/_old/src/init/init-custom.js delete mode 100644 packages/_old/src/init/init-directory.js delete mode 100644 packages/_old/src/init/init-git.js delete mode 100644 packages/_old/src/init/init-npm.js delete mode 100644 packages/_old/src/init/init-starter-files.js delete mode 100644 packages/_old/src/installers/darwin/dmg.js delete mode 100644 packages/_old/src/installers/darwin/zip.js delete mode 100644 packages/_old/src/installers/linux/deb.js delete mode 100644 packages/_old/src/installers/linux/rpm.js delete mode 100644 packages/_old/src/installers/win32/exe.js delete mode 100644 packages/_old/src/makers/darwin/dmg.js delete mode 100644 packages/_old/src/makers/generic/zip.js delete mode 100644 packages/_old/src/makers/linux/deb.js delete mode 100644 packages/_old/src/makers/linux/flatpak.js delete mode 100644 packages/_old/src/makers/linux/rpm.js delete mode 100644 packages/_old/src/makers/linux/snap.js delete mode 100644 packages/_old/src/makers/win32/appx.js delete mode 100644 packages/_old/src/makers/win32/squirrel.js delete mode 100644 packages/_old/src/makers/win32/wix.js delete mode 100644 packages/_old/src/publishers/electron-release-server.js delete mode 100644 packages/_old/src/publishers/github.js delete mode 100644 packages/_old/src/publishers/s3.js delete mode 100644 packages/_old/src/publishers/snapcraft.js delete mode 100644 packages/_old/src/util/author-name.js delete mode 100644 packages/_old/src/util/check-system.js delete mode 100644 packages/_old/src/util/config-fn.js delete mode 100644 packages/_old/src/util/config.js delete mode 100644 packages/_old/src/util/confirm-if-interactive.js delete mode 100644 packages/_old/src/util/deprecate.js delete mode 100644 packages/_old/src/util/electron-version.js delete mode 100644 packages/_old/src/util/ensure-output.js delete mode 100644 packages/_old/src/util/forge-config.js delete mode 100644 packages/_old/src/util/github.js delete mode 100644 packages/_old/src/util/hdiutil.js delete mode 100644 packages/_old/src/util/hook.js delete mode 100644 packages/_old/src/util/install-dependencies.js delete mode 100644 packages/_old/src/util/is-installed.js delete mode 100644 packages/_old/src/util/linux-config.js delete mode 100644 packages/_old/src/util/messages.js delete mode 100644 packages/_old/src/util/move-app.js delete mode 100644 packages/_old/src/util/ora-handler.js delete mode 100644 packages/_old/src/util/ora.js delete mode 100644 packages/_old/src/util/out-dir.js delete mode 100644 packages/_old/src/util/parse-archs.js delete mode 100644 packages/_old/src/util/plugin-interface.js delete mode 100644 packages/_old/src/util/publish-state.js delete mode 100644 packages/_old/src/util/read-package-json.js delete mode 100644 packages/_old/src/util/rebuild.js delete mode 100644 packages/_old/src/util/require-search.js delete mode 100644 packages/_old/src/util/resolve-dir.js delete mode 100644 packages/_old/src/util/terminate.js delete mode 100644 packages/_old/src/util/yarn-or-npm.js delete mode 100644 packages/_old/tabtab-install.js delete mode 100644 packages/_old/test/.eslintrc delete mode 100644 packages/_old/test/fast/author-name_spec.js delete mode 100644 packages/_old/test/fast/config_spec.js delete mode 100644 packages/_old/test/fast/confirm-if-interactive_spec.js delete mode 100644 packages/_old/test/fast/electron_forge_start_spec.js delete mode 100644 packages/_old/test/fast/ensure-output_spec.js delete mode 100644 packages/_old/test/fast/forge-config_spec.js delete mode 100644 packages/_old/test/fast/github_spec.js delete mode 100644 packages/_old/test/fast/hook_spec.js delete mode 100644 packages/_old/test/fast/install-dependencies_spec.js delete mode 100644 packages/_old/test/fast/makers/appx_spec.js delete mode 100644 packages/_old/test/fast/makers/deb_spec.js delete mode 100644 packages/_old/test/fast/makers/dmg_spec.js delete mode 100644 packages/_old/test/fast/makers/flatpak_spec.js delete mode 100644 packages/_old/test/fast/makers/rpm_spec.js delete mode 100644 packages/_old/test/fast/makers/snap_spec.js delete mode 100644 packages/_old/test/fast/makers_spec.js delete mode 100644 packages/_old/test/fast/ora-handler_spec.js delete mode 100644 packages/_old/test/fast/out-dir_spec.js delete mode 100644 packages/_old/test/fast/parse-archs_spec.js delete mode 100644 packages/_old/test/fast/publish_spec.js delete mode 100644 packages/_old/test/fast/read-package-json_spec.js delete mode 100644 packages/_old/test/fast/require-search_spec.js delete mode 100644 packages/_old/test/fast/resolve-dir_spec.js delete mode 100644 packages/_old/test/fast/start_spec.js delete mode 100644 packages/_old/test/fast/system_spec.js delete mode 100644 packages/_old/test/fast/yarn-or-npm_spec.js delete mode 100755 packages/_old/test/fixture/bogus-private-key.pvk delete mode 100644 packages/_old/test/fixture/custom_init/index.js delete mode 100644 packages/_old/test/fixture/custom_init/package.json delete mode 100644 packages/_old/test/fixture/custom_init/tmpl/_bar delete mode 100644 packages/_old/test/fixture/custom_init/tmpl/src/foo.js delete mode 100644 packages/_old/test/fixture/dummy_app/foo/null delete mode 100644 packages/_old/test/fixture/dummy_app/package.json delete mode 100644 packages/_old/test/fixture/dummy_js_conf/forge.config.js delete mode 100644 packages/_old/test/fixture/dummy_js_conf/package.json delete mode 100644 packages/_old/test/fixture/maker-incompatible.js delete mode 100644 packages/_old/test/fixture/maker-unsupported.js delete mode 100644 packages/_old/test/fixture/native_app/package.json delete mode 100644 packages/_old/test/mocha.opts delete mode 100644 packages/_old/test/slow/api_spec_slow.js delete mode 100644 packages/_old/test/slow/install-dependencies_spec_slow.js delete mode 100644 packages/_old/test/slow/install_spec_slow.js delete mode 100644 packages/_old/test/slow/rebuild_spec_slow.js delete mode 100644 packages/_old/tmpl/_appveyor.yml delete mode 100644 packages/_old/tmpl/_gitignore delete mode 100644 packages/_old/tmpl/_travis.yml delete mode 100644 packages/_old/tmpl/index.html delete mode 100644 packages/_old/tmpl/index.js delete mode 100644 packages/_old/tmpl/package.json diff --git a/.gitignore b/.gitignore index 65e3fd0d8e..e6efd147e7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ node_modules dist -yarn-error.log \ No newline at end of file +yarn-error.log +packages/.old \ No newline at end of file diff --git a/packages/_old/.editorconfig b/packages/_old/.editorconfig deleted file mode 100644 index 1fc2eea28c..0000000000 --- a/packages/_old/.editorconfig +++ /dev/null @@ -1,14 +0,0 @@ -root = true - -[{*.html,*.js,*.json,*.md,*.yml,*eslintrc}] -indent_style = space -indent_size = 2 -insert_final_newline = true -max_line_length = 160 -trim_trailing_whitespace = true - -[*.sh] -indent_style = space -indent_size = 4 -insert_final_newline = true -trim_trailing_whitespace = true diff --git a/packages/_old/.esdoc.json b/packages/_old/.esdoc.json deleted file mode 100644 index d980babe1f..0000000000 --- a/packages/_old/.esdoc.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "source": "./src/api", - "destination": "./docs", - "plugins": [ - { - "name": "esdoc-standard-plugin", - "option": { - "coverage": {"enable": true}, - "lint": {"enable": true} - } - }, - { - "name": "esdoc-importpath-plugin", - "option": { - "replaces": [ - { - "from": ".js", - "to": "" - }, - { - "from": "api/", - "to": "dist/api/" - } - ] - } - } - ] -} diff --git a/packages/_old/.eslintignore b/packages/_old/.eslintignore deleted file mode 100644 index 14e485a5bc..0000000000 --- a/packages/_old/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -tmpl diff --git a/packages/_old/.gitignore b/packages/_old/.gitignore deleted file mode 100644 index 1c988ca8c8..0000000000 --- a/packages/_old/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -dist -node_modules -docs -.nyc_output -coverage -npm-debug.log diff --git a/packages/_old/.npmignore b/packages/_old/.npmignore deleted file mode 100644 index 971d74d520..0000000000 --- a/packages/_old/.npmignore +++ /dev/null @@ -1,4 +0,0 @@ -src -test -.travis.yml -ci diff --git a/packages/_old/CHANGELOG.md b/packages/_old/CHANGELOG.md deleted file mode 100644 index a655e2784e..0000000000 --- a/packages/_old/CHANGELOG.md +++ /dev/null @@ -1,1059 +0,0 @@ -#### [5.1.1](https://github.com/electron-userland/electron-forge/releases/tag/v5.1.1) (2018-02-15) - -##### Chores - -* **packager:** upgrade electron-packager to 11.0.0 ([dee72fd1](https://github.com/electron-userland/electron-forge/commit/dee72fd1)) -* **generic:** upgrade node-fetch to 2.0.0 and fetch-mock to 6.0.0 ([42abee35](https://github.com/electron-userland/electron-forge/commit/42abee35)) - -### [5.1.0](https://github.com/electron-userland/electron-forge/releases/tag/v5.1.0) (2018-02-05) - -##### New Features - -* **publisher:** add GitHub Enterprise/HTTP proxy support to the GitHub publisher ([14151022](https://github.com/electron-userland/electron-forge/commit/14151022)) - -## [5.0.0](https://github.com/electron-userland/electron-forge/releases/tag/v5.0.0) (2018-02-01) - -##### New Features - -* **publisher:** - * add snapcraft publisher ([c5b7d0d7](https://github.com/electron-userland/electron-forge/commit/c5b7d0d7)) - * add dir to publisher args & convert args from positional to keyword ([45ace6cf](https://github.com/electron-userland/electron-forge/commit/45ace6cf)) -* **maker:** add builtin snap support ([86f987d7](https://github.com/electron-userland/electron-forge/commit/86f987d7)) - -### [4.3.0](https://github.com/electron-userland/electron-forge/releases/tag/v4.3.0) (2018-01-31) - -##### New Features - -* **maker:** add Wix support ([76166af3](https://github.com/electron-userland/electron-forge/commit/76166af3)) - -##### Bug Fixes - -* **maker:** wix only works on win32 currently ([707a1e33](https://github.com/electron-userland/electron-forge/commit/707a1e33)) - -##### Other Changes - -* add Wix to PATH ([52a64080](https://github.com/electron-userland/electron-forge/commit/52a64080)) - -##### Refactors - -* **maker:** extract author name parsing into its own function ([fa80cd3d](https://github.com/electron-userland/electron-forge/commit/fa80cd3d)) - -#### [4.2.1](https://github.com/electron-userland/electron-forge/releases/tag/v4.2.1) (2018-01-29) - -##### Chores - -* **generic:** - * upgrade mocha to 5.x ([01857a8e](https://github.com/electron-userland/electron-forge/commit/01857a8e)) - * upgrade electron-installer-debian to 0.8.x ([0bcedfe8](https://github.com/electron-userland/electron-forge/commit/0bcedfe8)) - * replace node-github with @octokit/rest ([e1f26075](https://github.com/electron-userland/electron-forge/commit/e1f26075)) - * upgrade github to v13 ([a80ff504](https://github.com/electron-userland/electron-forge/commit/a80ff504)) - * upgrade fs-extra to v5 and inquirer to v5 ([0ecc57dd](https://github.com/electron-userland/electron-forge/commit/0ecc57dd)) - -##### Documentation Changes - -* **generic:** add support document & move debugging section there ([d3f610c4](https://github.com/electron-userland/electron-forge/commit/d3f610c4)) - -##### Bug Fixes - -* **installer:** hdiutil output should be a string ([e511206b](https://github.com/electron-userland/electron-forge/commit/e511206b)) - -### [4.2.0](https://github.com/electron-userland/electron-forge/releases/tag/v4.2.0) (2018-01-08) - -##### New Features - -* **generic:** allow specifying a build identifier that segregates build artifacts ([0e483659](https://github.com/electron-userland/electron-forge/commit/0e483659)) -* **rebuilder:** allow configuration of electron-rebuild ([b986f264](https://github.com/electron-userland/electron-forge/commit/b986f264)) - -#### [4.1.9](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.9) (2018-01-08) - -##### Bug Fixes - -* **packager:** packager hooks should be executed sequentially ([e844b1d1](https://github.com/electron-userland/electron-forge/commit/e844b1d1)) - -#### [4.1.8](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.8) (2018-01-08) - -##### Chores - -* **maker:** upgrade electron-installer-flatpak to 0.8.0 & re-enable its tests ([9c199e0d](https://github.com/electron-userland/electron-forge/commit/9c199e0d)) - -##### Documentation Changes - -* **starter:** add note to readme about debugging on the command line ([26f347a6](https://github.com/electron-userland/electron-forge/commit/26f347a6)) -* **generic:** add link to electronforge.io repository in contributing docs ([c3332688](https://github.com/electron-userland/electron-forge/commit/c3332688)) - -##### Bug Fixes - -* **generic:** tabtab install breaks in bash for windows ([a5f8b40f](https://github.com/electron-userland/electron-forge/commit/a5f8b40f)) -* **maker:** fix detection of flatpak artifact ([4d5378c2](https://github.com/electron-userland/electron-forge/commit/4d5378c2)) - -#### [4.1.7](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.7) (2017-12-24) - -##### Chores - -* **generic:** - * don't nonzero-exit when trying to install tabtab completions ([0e18fe34](https://github.com/electron-userland/electron-forge/commit/0e18fe34)) - * don't use deprecated mocha CLI flag ([e13e6380](https://github.com/electron-userland/electron-forge/commit/e13e6380)) -* **tests:** - * move default test config to mocha.opts file ([f681176c](https://github.com/electron-userland/electron-forge/commit/f681176c)) - * remove intermediate layer when running via Docker ([6282a115](https://github.com/electron-userland/electron-forge/commit/6282a115)) - * cache node_modules in CI ([fcef3826](https://github.com/electron-userland/electron-forge/commit/fcef3826)) - -##### Documentation Changes - -* **packager:** - * clarify why dir/platform can't be set in Packager config ([f2b5c4a3](https://github.com/electron-userland/electron-forge/commit/f2b5c4a3)) - * clarify why arch can't be set in Packager config ([df5a018e](https://github.com/electron-userland/electron-forge/commit/df5a018e)) - -##### Bug Fixes - -* **packager:** package spinner isn't defined when asar.unpack is checked ([435e83d0](https://github.com/electron-userland/electron-forge/commit/435e83d0)) -* **initializer:** electron versions for babel-preset-env should be strings ([35120b1c](https://github.com/electron-userland/electron-forge/commit/35120b1c)) - -##### Other Changes - -* use yarn instead ([907a377e](https://github.com/electron-userland/electron-forge/commit/907a377e)) - -##### Refactors - -* **generic:** Use readJson and writeJson ([1a1884d1](https://github.com/electron-userland/electron-forge/commit/1a1884d1)) - -#### [4.1.6](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.6) (2017-12-06) - -##### Bug Fixes - -* **importer:** - * Fix typo in dependency check ([24267fe4](https://github.com/electron-userland/electron-forge/commit/24267fe4)) - * handle the case where productName doesn't exist ([23f191a8](https://github.com/electron-userland/electron-forge/commit/23f191a8)) -* **generic:** assume invalid semver package manager versions are incompatible ([076c78e1](https://github.com/electron-userland/electron-forge/commit/076c78e1)) - -##### Refactors - -* **maker:** DRY up linux config transformations ([a39011b8](https://github.com/electron-userland/electron-forge/commit/a39011b8)) - -#### [4.1.5](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.5) (2017-11-24) - -##### Bug Fixes - -* **packager:** fix custom afterCopy, afterPrune not being included ([c9e23e38](https://github.com/electron-userland/electron-forge/commit/c9e23e38)) - -#### [4.1.4](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.4) (2017-11-21) - -##### New Features - -* **packager:** add support for hook files for electronPackagerConfig.afterPrune ([e847a78e](https://github.com/electron-userland/electron-forge/commit/e847a78e)) - -##### Bug Fixes - -* **publisher:** fix publishing a saved dry run on a different device from the initial dry run ([a2c33eb8](https://github.com/electron-userland/electron-forge/commit/a2c33eb8)) -* **packager:** move the rebuild hook to after pruning finishes ([cce9db42](https://github.com/electron-userland/electron-forge/commit/cce9db42)) -* **importer:** adjust Forge config defaults just like in init ([38f9a3d4](https://github.com/electron-userland/electron-forge/commit/38f9a3d4)) - -##### Refactors - -* **packager:** resolve hook files in a common function ([08d55772](https://github.com/electron-userland/electron-forge/commit/08d55772)) - -#### [4.1.3](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.3) (2017-11-10) - -##### Chores - -* **generic:** replace the deprecated babel-preset-es2015 with babel-preset-env ([b3499edf](https://github.com/electron-userland/electron-forge/commit/b3499edf)) - -##### Bug Fixes - -* **make:** allow building for MAS inside make logic ([5e6411ec](https://github.com/electron-userland/electron-forge/commit/5e6411ec)) -* **packager:** warn if the app version is not set ([29070ca6](https://github.com/electron-userland/electron-forge/commit/29070ca6)) -* **importer:** warn if the package.json being imported does not have a version ([e55ea98d](https://github.com/electron-userland/electron-forge/commit/e55ea98d)) -* **starter:** throw an error if the app version is not set in package.json ([69b29958](https://github.com/electron-userland/electron-forge/commit/69b29958)) - -##### Tests - -* **make:** add mas test ([359b2799](https://github.com/electron-userland/electron-forge/commit/359b2799)) - -#### [4.1.2](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.2) (2017-09-27) - -##### Bug Fixes - -* **generic:** correct the getOwnPropertyDescriptor proxy hook to respect current properties writabil ([8e9872bc](https://github.com/electron-userland/electron-forge/commit/8e9872bc)) - -#### [4.1.1](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.1) (2017-09-27) - -##### Bug Fixes - -* **generic:** ensure config proxy doesn't prevent access to built-ins ([07047889](https://github.com/electron-userland/electron-forge/commit/07047889)) - -### [4.1.0](https://github.com/electron-userland/electron-forge/releases/tag/v4.1.0) (2017-09-26) - -##### Chores - -* **generic:** - * upgrade electron-windows-store to 0.12 ([fcdc0a02](https://github.com/electron-userland/electron-forge/commit/fcdc0a02)) - * upgrade cz-customizable, and github ([9156296b](https://github.com/electron-userland/electron-forge/commit/9156296b)) - -##### Documentation Changes - -* **maker:** mention that make can support non-host platforms ([6c302198](https://github.com/electron-userland/electron-forge/commit/6c302198)) - -##### New Features - -* **initializer:** add electron-squirrel-startup to the default template ([e0e42aa2](https://github.com/electron-userland/electron-forge/commit/e0e42aa2)) - -##### Bug Fixes - -* **generic:** - * automatically warn w/a nightly package manager version ([d997ba0c](https://github.com/electron-userland/electron-forge/commit/d997ba0c)) - * blacklist NPM 5.4.[01] on Windows ([063caca4](https://github.com/electron-userland/electron-forge/commit/063caca4)) -* **init:** run package manager commands via cross-spawn ([cbee55e2](https://github.com/electron-userland/electron-forge/commit/cbee55e2)) -* **publisher:** allow config for Electron Release Server to be read from envars ([50d35374](https://github.com/electron-userland/electron-forge/commit/50d35374)) -* **tests:** use a newer version of native-metrics ([1e7c175e](https://github.com/electron-userland/electron-forge/commit/1e7c175e)) - -##### Refactors - -* **generic:** - * use cross-spawn-promise instead of spawn-rx ([5a9848c7](https://github.com/electron-userland/electron-forge/commit/5a9848c7)) - * replace electron-host-arch with hostArch in Electron Packager ([45afdfb5](https://github.com/electron-userland/electron-forge/commit/45afdfb5)) -* **maker:** - * use makeCert from electron-windows-store ([c31ceef6](https://github.com/electron-userland/electron-forge/commit/c31ceef6)) - * use the target platform/arch API from Packager to determine "all" archs ([f9c4c20c](https://github.com/electron-userland/electron-forge/commit/f9c4c20c)) - -#### [4.0.2](https://github.com/electron-userland/electron-forge/releases/tag/v4.0.2) (2017-09-10) - -##### Bug Fixes - -* **generic:** whitelist yarn >= 1.0.0 ([36bc34ad](https://github.com/electron-userland/electron-forge/commit/36bc34ad)) -* **linter:** don't pass --color to linters that don't support it ([66354fb6](https://github.com/electron-userland/electron-forge/commit/66354fb6)) -* **tests:** - * use fakeOra properly in system spec ([bb4c7875](https://github.com/electron-userland/electron-forge/commit/bb4c7875)) - * stub ora.warn ([969a0359](https://github.com/electron-userland/electron-forge/commit/969a0359)) - -#### [4.0.1](https://github.com/electron-userland/electron-forge/releases/tag/v4.0.1) (2017-9-5) - -##### Bug Fixes - -* **generic:** tabtab install script fails on non-*nix systems ([fc3c0301](https://github.com/electron-userland/electron-forge/commit/fc3c0301)) - -## [4.0.0](https://github.com/electron-userland/electron-forge/releases/tag/v4.0.0) (2017-08-30) - -##### Chores - -* **publisher:** use SHA256 instead of md5 ([c69db80f](https://github.com/electron-userland/electron-forge/commit/c69db80f)) -* **generic:** upgrade Electron Packager to 9.x ([6275d2bf](https://github.com/electron-userland/electron-forge/commit/6275d2bf)) - -##### Documentation Changes - -* **publisher:** - * improve docs for publish function ([7766a27c](https://github.com/electron-userland/electron-forge/commit/7766a27c)) - * mention that multiple targets are allowed ([3ec0cfa6](https://github.com/electron-userland/electron-forge/commit/3ec0cfa6)) - * fix S3 config key typo ([4225683b](https://github.com/electron-userland/electron-forge/commit/4225683b)) -* **maker:** document the return result of make ([5399f500](https://github.com/electron-userland/electron-forge/commit/5399f500)) - -##### New Features - -* **publisher:** adds dryRun and resumeDryRun to the API to allow post-make publishes ([288edbc1](https://github.com/electron-userland/electron-forge/commit/288edbc1)) -* **initializer:** - * only copy CI files if specified ([fd6f2f9b](https://github.com/electron-userland/electron-forge/commit/fd6f2f9b)) - * add Travis/AppVeyor CI files to default template ([296bdde8](https://github.com/electron-userland/electron-forge/commit/296bdde8)) - -##### Bug Fixes - -* **generic:** - * clean up package manager warning output ([894ed0a9](https://github.com/electron-userland/electron-forge/commit/894ed0a9)) - * add yarn 0.27.5 to the whitelist, but only for darwin/linux ([88b92fce](https://github.com/electron-userland/electron-forge/commit/88b92fce)) - * fix installing tab completion when installing Forge locally ([7ea49812](https://github.com/electron-userland/electron-forge/commit/7ea49812)) - -##### Refactors - -* **publisher:** - * make dryRun object storage make more sense ([f8d807ed](https://github.com/electron-userland/electron-forge/commit/f8d807ed)) - * rename target option to publishTargets in API ([4b68880d](https://github.com/electron-userland/electron-forge/commit/4b68880d)) -* **initializer:** make init options camelcase ([f4459822](https://github.com/electron-userland/electron-forge/commit/f4459822)) - -##### Tests - -* **maker:** Fix make test for new return type ([d6393567](https://github.com/electron-userland/electron-forge/commit/d6393567)) -* **publisher:** fix dry run specs ([d2085812](https://github.com/electron-userland/electron-forge/commit/d2085812)) - -### [3.2.0](https://github.com/electron-userland/electron-forge/releases/tag/v3.2.0) (2017-08-17) - -##### Chores - -* **generic:** - * use the xcode8.3 image for Travis OSX ([c24ae48c](https://github.com/electron-userland/electron-forge/commit/c24ae48c)) - * upgrade dependencies ([9d17ca9e](https://github.com/electron-userland/electron-forge/commit/9d17ca9e)) -* **tests:** fixup comma arch test ([565fce42](https://github.com/electron-userland/electron-forge/commit/565fce42)) - -##### Documentation Changes - -* **generic:** mention alternate ways of creating new Electron apps with Forge ([419962a8](https://github.com/electron-userland/electron-forge/commit/419962a8)) -* **packager:** list the Packager options that are not configurable ([bb33d9b6](https://github.com/electron-userland/electron-forge/commit/bb33d9b6)) - -##### New Features - -* **initializer:** add Forge as a devDependency to new Electron projects ([6d2cf4b0](https://github.com/electron-userland/electron-forge/commit/6d2cf4b0)) -* **generic:** print a warning if the package manager used is not a known good version ([a4c36fa4](https://github.com/electron-userland/electron-forge/commit/a4c36fa4)) - -##### Bug Fixes - -* **maker:** allow comma seperated arches in make as well as package ([9c69b08b](https://github.com/electron-userland/electron-forge/commit/9c69b08b)) - -#### [3.0.5](https://github.com/electron-userland/electron-forge/releases/tag/v3.0.5) (2017-6-17) - -##### Bug Fixes - -* **maker:** fix debian and redhat maker path calculation ([c2dca211](https://github.com/electron-userland/electron-forge/commit/c2dca211)) - -#### [3.0.4](https://github.com/electron-userland/electron-forge/releases/tag/v3.0.4) (2017-6-15) - -##### Chores - -* **tests:** remove unnecessary chai-fetch-mock dependency ([196a64db](https://github.com/electron-userland/electron-forge/commit/196a64db)) - -##### Bug Fixes - -* **maker:** handle name option for the deb, rpm makers as well as dmg ([d335741a](https://github.com/electron-userland/electron-forge/commit/d335741a)) -* **generic:** add executable permissions to vscode.cmd ([33532f79](https://github.com/electron-userland/electron-forge/commit/33532f79)) - -##### Refactors - -* **installer:** replace electron-sudo with sudo-prompt ([0ea55fab](https://github.com/electron-userland/electron-forge/commit/0ea55fab)) - -#### [3.0.3](https://github.com/electron-userland/electron-forge/releases/tag/v3.0.3) (2017-5-26) - -##### Bug Fixes - -* **initializer:** fix bad logic RE argument parsing from the top level forge command ([774b8769](https://github.com/electron-userland/electron-forge/commit/774b8769)) - -#### [3.0.2](https://github.com/electron-userland/electron-forge/releases/tag/v3.0.2) (2017-5-25) - -##### Bug Fixes - -* **starter:** fix double dash arg pass through ([0379e5fc](https://github.com/electron-userland/electron-forge/commit/0379e5fc)) -* **maker:** fix renaming of DMG output when a custom name is provided ([14cc927a](https://github.com/electron-userland/electron-forge/commit/14cc927a)) -* **tests:** fix appx tests (maker did not return output path) ([8d895cfc](https://github.com/electron-userland/electron-forge/commit/8d895cfc)) -* **initializer:** fix linting install for airbnb style ([b3446184](https://github.com/electron-userland/electron-forge/commit/b3446184)) - -##### Refactors - -* **generic:** replace fs-promise with fs-extra ([012b152f](https://github.com/electron-userland/electron-forge/commit/012b152f)) - -##### Tests - -* **maker:** add tests for the DMG maker to ensure the renaming logic is correct ([8f5f9691](https://github.com/electron-userland/electron-forge/commit/8f5f9691)) - -#### [3.0.1](https://github.com/electron-userland/electron-forge/releases/tag/v3.0.1) (2017-5-3) - -##### Bug Fixes - -* **publisher:** fix ers publisher not publishing when version already exists ([1c643ef9](https://github.com/electron-userland/electron-forge/commit/1c643ef9)) -* **maker:** fix dmg output path and add test to enforce in future ([a41d6db3](https://github.com/electron-userland/electron-forge/commit/a41d6db3)) - -## [3.0.0](https://github.com/electron-userland/electron-forge/releases/tag/v3.0.0) (2017-5-1) - -##### Chores - -* **undefined:** fix devDependency peer dep versions ([c5c8e9a9](https://github.com/electron-userland/electron-forge/commit/c5c8e9a9)) -* **generic:** add breaking changes prompt to `npm run commit` ([566fd6fb](https://github.com/electron-userland/electron-forge/commit/566fd6fb)) - -##### Documentation Changes - -* **publisher:** add docs for the new ers publisher ([e70405a8](https://github.com/electron-userland/electron-forge/commit/e70405a8)) - -##### New Features - -* **publisher:** add new publisher for electron-release-server ([0c68ebab](https://github.com/electron-userland/electron-forge/commit/0c68ebab)) -* **makers:** Ensure all assets outputted by make are versioned ([6dda5179](https://github.com/electron-userland/electron-forge/commit/6dda5179)) -* **maker:** - * create and consume a common util to check makers' supported platforms ([fa53340b](https://github.com/electron-userland/electron-forge/commit/fa53340b)) - * declare deb maker support for darwin & linux platforms ([f10fbd18](https://github.com/electron-userland/electron-forge/commit/f10fbd18)) - -##### Bug Fixes - -* **start:** exit forge with same status code as Electron if nonzero ([a509f55a](https://github.com/electron-userland/electron-forge/commit/a509f55a)) -* **tests:** make optionFetcher-related tests compile again ([1097f8bd](https://github.com/electron-userland/electron-forge/commit/1097f8bd)) -* **docs:** rm note that package api's platform opt is ignored ([eefa93f0](https://github.com/electron-userland/electron-forge/commit/eefa93f0)) - -##### Refactors - -* **starter:** use double dash instead of triple dash to pass args through ([e3a1be64](https://github.com/electron-userland/electron-forge/commit/e3a1be64)) -* **utils:** filter packages' os declarations to exclude blacklist entries ([fbaec97f](https://github.com/electron-userland/electron-forge/commit/fbaec97f)) -* **maker:** support make for targets on non-host platforms ([f79f6f78](https://github.com/electron-userland/electron-forge/commit/f79f6f78)) -* **util:** extend requireSearch to export a raw search fn ([84f0134b](https://github.com/electron-userland/electron-forge/commit/84f0134b)) - -##### Tests - -* **publisher:** fix publisher tests for new syntax ([c19d1c2a](https://github.com/electron-userland/electron-forge/commit/c19d1c2a)) -* **maker:** add test to confirm dummy maker does not get called ([556deaac](https://github.com/electron-userland/electron-forge/commit/556deaac)) - -### [2.12.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.12.0) (2017-4-25) - -##### New Features - -* **maker:** basic hooks for preMake, postMake, generateAssets, prePackage and postPackage ([1a17189b](https://github.com/electron-userland/electron-forge/commit/1a17189b)) - -##### Bug Fixes - -* **maker:** do not enforce the name property on the DMG maker ([1b10fd57](https://github.com/electron-userland/electron-forge/commit/1b10fd57)) - -#### [2.11.1](https://github.com/electron-userland/electron-forge/releases/tag/v2.11.1) (2017-4-19) - -### [2.11.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.11.0) (2017-4-19) - -##### New Features - -* **maker:** allow maker configs to be functions that return values based on arch ([d9cbec5a](https://github.com/electron-userland/electron-forge/commit/d9cbec5a)) - -### [2.10.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.10.0) (2017-4-16) - -##### Chores - -* **generic:** - * fix/rename coverage sending script ([547c044f](https://github.com/electron-userland/electron-forge/commit/547c044f)) - * update various dependencies ([0f97292c](https://github.com/electron-userland/electron-forge/commit/0f97292c)) - -##### New Features - -* **starter:** - * windows implementation of the vscode debug command ([9cb7f42c](https://github.com/electron-userland/electron-forge/commit/9cb7f42c)) - * provide an executable to start forge in a vscode debugger compatible way ([1238dee5](https://github.com/electron-userland/electron-forge/commit/1238dee5)) - -### [2.9.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.9.0) (2017-4-2) - -##### Chores - -* **generic:** add .editorconfig ([5aaf871e](https://github.com/electron-userland/electron-forge/commit/5aaf871e)) - -##### New Features - -* **importer:** add configurable outDir support for gitignore ([9369284f](https://github.com/electron-userland/electron-forge/commit/9369284f)) - -##### Bug Fixes - -* **initializer:** - * update Electron version type in .compilerc template, for completeness ([a4fa4bfc](https://github.com/electron-userland/electron-forge/commit/a4fa4bfc)) - * set electron version to be float in init step ([710129b7](https://github.com/electron-userland/electron-forge/commit/710129b7)) -* **maker:** - * upgrade rpm maker for better package.json handling ([926032e8](https://github.com/electron-userland/electron-forge/commit/926032e8)) - * test outDir on zip target only, after other targets run ([a2c92499](https://github.com/electron-userland/electron-forge/commit/a2c92499)) - * pass computed outDir to packager ([686200f6](https://github.com/electron-userland/electron-forge/commit/686200f6)) - * search local node_modules folder for maker when installed globally ([9b8f2970](https://github.com/electron-userland/electron-forge/commit/9b8f2970)) -* **tests:** - * stop awaiting mocha and ensure we clean up out dirs ([2e6dc384](https://github.com/electron-userland/electron-forge/commit/2e6dc384)) - * use expect(await ...) syntax per @marshallofsound ([59ddf9af](https://github.com/electron-userland/electron-forge/commit/59ddf9af)) -* **generic:** use path.resolve (vs /-delimited) to compute default outDir ([ff167447](https://github.com/electron-userland/electron-forge/commit/ff167447)) -* **packager:** correct main file reference in thrown error from packageJson.name to .main ([a68284b1](https://github.com/electron-userland/electron-forge/commit/a68284b1)) -* **publisher:** check local node_modules when searching for publisher ([42fad7f3](https://github.com/electron-userland/electron-forge/commit/42fad7f3)) - -##### Refactors - -* **maker:** compute outDir from providedOptions w/default ([d69e7626](https://github.com/electron-userland/electron-forge/commit/d69e7626)) -* **packager:** compute outDir from providedOptions w/default ([1e26d258](https://github.com/electron-userland/electron-forge/commit/1e26d258)) - -##### Code Style Changes - -* **initializer:** fix typo ([dd6aec48](https://github.com/electron-userland/electron-forge/commit/dd6aec48)) - -##### Tests - -* **tests:** add tests for packager & maker outDir support ([32cecffd](https://github.com/electron-userland/electron-forge/commit/32cecffd)) - -#### [2.8.3](https://github.com/electron-userland/electron-forge/releases/tag/v2.8.3) (2017-3-10) - -##### Chores - -* **generic:** - * update react-typescript template ([30516e78](https://github.com/electron-userland/electron-forge/commit/30516e78)) - * make release script work on windows ([0ff6a7ab](https://github.com/electron-userland/electron-forge/commit/0ff6a7ab)) - -##### New Features - -* **starter:** automatically wipe the ELECTRON_RUN_AS_NODE variable unless specified ([c702fe4a](https://github.com/electron-userland/electron-forge/commit/c702fe4a)) -* **generic:** - * Support setting the Electron app path in start() ([47c5572e](https://github.com/electron-userland/electron-forge/commit/47c5572e)) - * allow third party modules to be named whatever they want ([fddb40e6](https://github.com/electron-userland/electron-forge/commit/fddb40e6)) - -##### Bug Fixes - -* **publisher:** use updated node-github response API ([0f8e6c4f](https://github.com/electron-userland/electron-forge/commit/0f8e6c4f)) -* **maker:** - * fix the squirrel maker app name logic ([84031ecb](https://github.com/electron-userland/electron-forge/commit/84031ecb)) - * allow most appx default config to be overridden by the user ([b1e90538](https://github.com/electron-userland/electron-forge/commit/b1e90538)) -* **tests:** ensure test project has proper metadata filled ([0bc81858](https://github.com/electron-userland/electron-forge/commit/0bc81858)) - -#### [2.8.2](https://github.com/electron-userland/electron-forge/releases/tag/v2.8.2) (2017-2-28) - -##### Chores - -* **templates:** bump all template versions ([32297344](https://github.com/electron-userland/electron-forge/commit/32297344)) - -##### Bug Fixes - -* **ci:** Use the preinstalled yarn on AppVeyor (#146) ([7a1deee7](https://github.com/electron-userland/electron-forge/commit/7a1deee7)) -* **publisher:** Fix secret access key ([0a9710b5](https://github.com/electron-userland/electron-forge/commit/0a9710b5)) - -#### [2.8.1](https://github.com/electron-userland/electron-forge/releases/tag/v2.8.1) (2017-2-23) - -##### Chores - -* **generic:** - * add checkboxes and intros to the issue/PR templates ([a1ab1c3a](https://github.com/electron-userland/electron-forge/commit/a1ab1c3a)) - * fix formatting in GitHub issue template ([da95b42b](https://github.com/electron-userland/electron-forge/commit/da95b42b)) -* **tests:** remove now obsolete flatpak call in Linux tests ([b93b6cfe](https://github.com/electron-userland/electron-forge/commit/b93b6cfe)) - -##### Documentation Changes - -* **publisher:** - * mention the standard AWS environment variables in the README ([efc7ea14](https://github.com/electron-userland/electron-forge/commit/efc7ea14)) - * add example for GitHub publish target ([3fc0a9c2](https://github.com/electron-userland/electron-forge/commit/3fc0a9c2)) - -##### New Features - -* **packager:** remove the users forge config after packaging for safety reasons ([7432e034](https://github.com/electron-userland/electron-forge/commit/7432e034)) -* **publisher:** - * allow usage of standard AWS environment variables for S3 publishing ([d31ce248](https://github.com/electron-userland/electron-forge/commit/d31ce248)) - * add S3 publish target ([fa31902a](https://github.com/electron-userland/electron-forge/commit/fa31902a)) - * allow platform level config for publish targets ([8572cad6](https://github.com/electron-userland/electron-forge/commit/8572cad6)) -* **generic:** allow config options to be automagically pulled in from process.env ([250c197f](https://github.com/electron-userland/electron-forge/commit/250c197f)) - -##### Bug Fixes - -* **tests:** - * fix forge config deletion tests on all platforms ([7b99e847](https://github.com/electron-userland/electron-forge/commit/7b99e847)) - * fix test failures caused by config structure changes ([3a3cdfdb](https://github.com/electron-userland/electron-forge/commit/3a3cdfdb)) -* **importer:** - * install electron-prebuilt-compile as devDep ([e80be32a](https://github.com/electron-userland/electron-forge/commit/e80be32a)) - * check updateScripts value at script install vs deps removal ([4942cb60](https://github.com/electron-userland/electron-forge/commit/4942cb60)) - * ensure electronName exists before resolving its path ([9dcf2ec5](https://github.com/electron-userland/electron-forge/commit/9dcf2ec5)) -* **publisher:** throw an exception if a GitHub token isn't specified ([bc299b7a](https://github.com/electron-userland/electron-forge/commit/bc299b7a)) -* **initializer:** add github_repository.name to package.json in default template ([d1ceadf3](https://github.com/electron-userland/electron-forge/commit/d1ceadf3)) - -##### Refactors - -* **publisher:** add deprecate method call to inform the user ([24571197](https://github.com/electron-userland/electron-forge/commit/24571197)) - -##### Code Style Changes - -* **util:** fix typo re: imagePath ([9e064cf3](https://github.com/electron-userland/electron-forge/commit/9e064cf3)) - -### [2.8.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.8.0) (2017-2-2) - -##### Chores - -* **gitignore:** ignore npm-debug.log files ([06b824ee](https://github.com/electron-userland/electron-forge/commit/06b824ee)) - -##### New Features - -* **importer:** allow the implementer to decide whether to override scripts or not ([f85e194f](https://github.com/electron-userland/electron-forge/commit/f85e194f)) -* **starter:** resolve start api usage with a handle to the spawned process ([b5ba30e3](https://github.com/electron-userland/electron-forge/commit/b5ba30e3)) - -##### Bug Fixes - -* **importer:** if no electron was found install the latest version by default ([c8b12fbf](https://github.com/electron-userland/electron-forge/commit/c8b12fbf)) -* **generic:** make all process.exit and console calls respect the interactive setting ([a3e43315](https://github.com/electron-userland/electron-forge/commit/a3e43315)) - -##### Refactors - -* **generic:** add wrappers for console.info and console.warn ([f223df85](https://github.com/electron-userland/electron-forge/commit/f223df85)) - -##### Tests - -* **starter:** add test for returned childProcess.spawn ([f2c128e4](https://github.com/electron-userland/electron-forge/commit/f2c128e4)) - -#### [2.7.5](https://github.com/electron-userland/electron-forge/releases/tag/v2.7.5) (2017-1-29) - -##### Chores - -* **tests:** add eslint-plugin-mocha ([74397232](https://github.com/electron-userland/electron-forge/commit/74397232)) -* **generic:** update electron-installer-dmg to version 0.2.0 ([aa8034b1](https://github.com/electron-userland/electron-forge/commit/aa8034b1)) - -##### Bug Fixes - -* **tests:** update tests due to changes in #101 ([912b4f69](https://github.com/electron-userland/electron-forge/commit/912b4f69)) -* **maker:** detect out path of package step correctly ([6d15c62d](https://github.com/electron-userland/electron-forge/commit/6d15c62d)) -* **tabtab:** dont install tabtab in a development environment and ignore tabtab install errors ([f0cb0417](https://github.com/electron-userland/electron-forge/commit/f0cb0417)) - -##### Code Style Changes - -* **generic:** fixed typos ([2f869d81](https://github.com/electron-userland/electron-forge/commit/2f869d81)) -* **tests:** ignore intentionally wrong code in test ([f01f9907](https://github.com/electron-userland/electron-forge/commit/f01f9907)) - -##### Tests - -* **initializer:** add nonexistent template test ([6f26c64f](https://github.com/electron-userland/electron-forge/commit/6f26c64f)) -* **generic:** increase test coverage of the init API ([2c9caddf](https://github.com/electron-userland/electron-forge/commit/2c9caddf)) -* **starter:** add test coverage for starter ([0d2f5712](https://github.com/electron-userland/electron-forge/commit/0d2f5712)) -* **installer:** add test coverage for the installer ([4049e31c](https://github.com/electron-userland/electron-forge/commit/4049e31c)) -* **tests:** increase test coverage on util modules ([6c63aafa](https://github.com/electron-userland/electron-forge/commit/6c63aafa)) - -#### [2.7.4](https://github.com/electron-userland/electron-forge/releases/tag/v2.7.4) (2017-1-27) - -##### Documentation Changes - -* **generic:** clarify what the major package dependencies are ([559956b3](https://github.com/electron-userland/electron-forge/commit/559956b3)) - -##### Refactors - -* **generic:** move ora.ora to an ora helper for ease of submodule use ([ee33638a](https://github.com/electron-userland/electron-forge/commit/ee33638a)) - -#### [2.7.3](https://github.com/electron-userland/electron-forge/releases/tag/v2.7.3) (2017-1-25) - -##### New Features - -* **installer:** manually mount and scan a DMG file when installing for the .app ([7ea5af8a](https://github.com/electron-userland/electron-forge/commit/7ea5af8a)) - -##### Bug Fixes - -* **packager:** fix resolving of afterCopy and afterExtract hook paths ([bd4df685](https://github.com/electron-userland/electron-forge/commit/bd4df685)) -* **installer:** fix install prompt when multiple compatable targets found ([9a2f36c9](https://github.com/electron-userland/electron-forge/commit/9a2f36c9)) - -##### Code Style Changes - -* **generic:** remove unnecessary eslint pragmas ([23d1aa9f](https://github.com/electron-userland/electron-forge/commit/23d1aa9f)) - -#### [2.7.2](https://github.com/electron-userland/electron-forge/releases/tag/v2.7.2) (2017-1-18) - -##### Bug Fixes - -* **packager:** force upgrade to electron-rebuild 1.5.7 ([f2912db5](https://github.com/electron-userland/electron-forge/commit/f2912db5)) - -#### [2.7.1](https://github.com/electron-userland/electron-forge/releases/tag/v2.7.1) (2017-1-15) - -##### Chores - -* **generic:** - * alphabetize custom eslint rules ([e7f6eeb6](https://github.com/electron-userland/electron-forge/commit/e7f6eeb6)) - * disable the no-throw-literal eslint rule ([05f893e8](https://github.com/electron-userland/electron-forge/commit/05f893e8)) - -##### Bug Fixes - -* **initializer:** handle local templates correctly ([42bf745a](https://github.com/electron-userland/electron-forge/commit/42bf745a)) -* **alias:** fix the forge alias so that it can run the make command ([725e6b06](https://github.com/electron-userland/electron-forge/commit/725e6b06)) - -### [2.7.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.7.0) (2017-1-14) - -##### Documentation Changes - -* **initializer:** document the built in templates ([b0eec7c3](https://github.com/electron-userland/electron-forge/commit/b0eec7c3)) - -##### New Features - -* **initializer:** add userland templates to forge ([bcba06a2](https://github.com/electron-userland/electron-forge/commit/bcba06a2)) - -### [2.6.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.6.0) (2017-1-10) - -##### Chores - -* **deps:** Update electron-windows-store ([761464f0](https://github.com/electron-userland/electron-forge/commit/761464f0)) - -##### New Features - -* **importer:** - * ensure the user is aware of any script changes we make ([cbb73e7e](https://github.com/electron-userland/electron-forge/commit/cbb73e7e)) - * import now sets the scripts section in package.json to be forge scripts ([cb01d406](https://github.com/electron-userland/electron-forge/commit/cb01d406)) -* **initializer:** template package.json now includes package and make scripts ([272d9b1e](https://github.com/electron-userland/electron-forge/commit/272d9b1e)) -* **rebuilder:** show rebuild progress from the electron-rebuild lifecycle ([26f23b48](https://github.com/electron-userland/electron-forge/commit/26f23b48)) -* **generic:** - * use electron-rebuild instead of generic rebuild logic ([3d26da5b](https://github.com/electron-userland/electron-forge/commit/3d26da5b)) - * add basic tab completion for top level commands ([30082bbf](https://github.com/electron-userland/electron-forge/commit/30082bbf)) - -##### Bug Fixes - -* **packager:** - * check asar.unpack correctly ([150ea5dd](https://github.com/electron-userland/electron-forge/commit/150ea5dd)) - * clarify entry point error messages ([969ab1ea](https://github.com/electron-userland/electron-forge/commit/969ab1ea)) - * throw errors on an uncompilable entrypoint ([b7f7b81c](https://github.com/electron-userland/electron-forge/commit/b7f7b81c)) -* **initializer:** - * unpin electron-compilers ([9e2aefaa](https://github.com/electron-userland/electron-forge/commit/9e2aefaa)) - * unpin eslint-plugin-jsx-a11y ([02b6e367](https://github.com/electron-userland/electron-forge/commit/02b6e367)) - * pin electron-compilers dependency due to typescript bug ([4ebafa8d](https://github.com/electron-userland/electron-forge/commit/4ebafa8d)) - -##### Refactors - -* **packager:** upgrade to Electron Packager 8.5.0 ([b8489b47](https://github.com/electron-userland/electron-forge/commit/b8489b47)) - -#### [2.5.2](https://github.com/electron-userland/electron-forge/releases/tag/v2.5.2) (2017-1-7) - -##### Bug Fixes - -* **publisher:** dont call make twice while publishing ([55bfe1ac](https://github.com/electron-userland/electron-forge/commit/55bfe1ac)) - -#### [2.5.1](https://github.com/electron-userland/electron-forge/releases/tag/v2.5.1) (2017-1-5) - -##### Chores - -* **undefined:** - * istanbul-lib-instrument is no longer required ([f60dd586](https://github.com/electron-userland/electron-forge/commit/f60dd586)) - * upgrade to version of babel-plugin-istanbul that should address regression ([0913506b](https://github.com/electron-userland/electron-forge/commit/0913506b)) - -##### Bug Fixes - -* **importer:** fix relative path to tmpl directory ([b39c1008](https://github.com/electron-userland/electron-forge/commit/b39c1008)) -* **undefined:** regression in istanbul-lib-instrument and babel-plugin-istanbul should now be addressed ([58b9791e](https://github.com/electron-userland/electron-forge/commit/58b9791e)) - -### [2.5.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.5.0) (2017-1-3) - -##### Chores - -* **generic:** - * only publish CI coverage on success ([7fbbef72](https://github.com/electron-userland/electron-forge/commit/7fbbef72)) - * enable coveralls ([2f821155](https://github.com/electron-userland/electron-forge/commit/2f821155)) -* **tests:** - * fix appx tests on rebased branch ([75f217a5](https://github.com/electron-userland/electron-forge/commit/75f217a5)) - * move tests to be unit tests on the API and enable coverage ([54603c1e](https://github.com/electron-userland/electron-forge/commit/54603c1e)) - -##### Documentation Changes - -* **generic:** - * fix option variable names ([0923ac1e](https://github.com/electron-userland/electron-forge/commit/0923ac1e)) - * cleanup API docs ([9c118a4f](https://github.com/electron-userland/electron-forge/commit/9c118a4f)) - * add doc formatting guidelines based off of pycodestyle ([6efa5259](https://github.com/electron-userland/electron-forge/commit/6efa5259)) -* **importer:** - * tweak description ([e885cd5e](https://github.com/electron-userland/electron-forge/commit/e885cd5e)) - * mention import in the README ([d5eab37a](https://github.com/electron-userland/electron-forge/commit/d5eab37a)) - -##### New Features - -* **generic:** - * expose some util methods through JS API ([a506dd33](https://github.com/electron-userland/electron-forge/commit/a506dd33)) - * expose top level methods as JS APIs ([93fb48f5](https://github.com/electron-userland/electron-forge/commit/93fb48f5)) -* **publisher:** add draft and prerelease options for publishing to github ([898de235](https://github.com/electron-userland/electron-forge/commit/898de235)) - -##### Bug Fixes - -* **generic:** lock istanbul dependency versions to prevent bug ([205104c4](https://github.com/electron-userland/electron-forge/commit/205104c4)) - -##### Refactors - -* **generic:** refactor confirm prompts into a helper for interactive mode ([b495012e](https://github.com/electron-userland/electron-forge/commit/b495012e)) - -##### Tests - -* **generic:** add tests for lots of the utils ([d0962b93](https://github.com/electron-userland/electron-forge/commit/d0962b93)) - -### [2.4.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.4.0) (2017-1-3) - -##### New Features - -* **maker:** add support for Windows Store (AppX) packages ([74a12163](https://github.com/electron-userland/electron-forge/commit/74a12163)) -* **starter:** switch the default Babel preset to use babel-preset-env ([4e3bb17b](https://github.com/electron-userland/electron-forge/commit/4e3bb17b)) - -##### Bug Fixes - -* **starter:** ensure linebreak-style is disabled ([ac7a20bc](https://github.com/electron-userland/electron-forge/commit/ac7a20bc)) - -### [2.3.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.3.0) (2017-1-1) - -##### Chores - -* **installer:** use the ora helper in the install command ([9358eb42](https://github.com/electron-userland/electron-forge/commit/9358eb42)) -* **generic:** - * add installer to cz config ([3b253b11](https://github.com/electron-userland/electron-forge/commit/3b253b11)) - * only send slack notifications on build change ([838d70e7](https://github.com/electron-userland/electron-forge/commit/838d70e7)) -* **tests:** make sure ora knows that the Docker container is for CI ([41d25ea7](https://github.com/electron-userland/electron-forge/commit/41d25ea7)) - -##### New Features - -* **installer:** - * add rpm installer ([f8f9baa5](https://github.com/electron-userland/electron-forge/commit/f8f9baa5)) - * don't suffix temp install files with .forge-install ([1c2bfd81](https://github.com/electron-userland/electron-forge/commit/1c2bfd81)) - * add deb installer ([fb217c74](https://github.com/electron-userland/electron-forge/commit/fb217c74)) - * add DMG support for macOS installer ([3465d261](https://github.com/electron-userland/electron-forge/commit/3465d261)) - * add inital app installer for macOS platform ([da3150d9](https://github.com/electron-userland/electron-forge/commit/da3150d9)) -* **generic:** - * use an ora/promise helper instead of a global uncaughtRejection handler (#50) ([1b6b7276](https://github.com/electron-userland/electron-forge/commit/1b6b7276)) - * travis build notifications ([d25f1461](https://github.com/electron-userland/electron-forge/commit/d25f1461)) - -##### Bug Fixes - -* **installer:** - * fix installer debug key ([24454950](https://github.com/electron-userland/electron-forge/commit/24454950)) - * dont fetch prerelease versions unless instructed ([1b88b153](https://github.com/electron-userland/electron-forge/commit/1b88b153)) - * await promises through the linux install chain ([a0b5ac70](https://github.com/electron-userland/electron-forge/commit/a0b5ac70)) - * remove flatpak check ([0b044134](https://github.com/electron-userland/electron-forge/commit/0b044134)) - * wildcard the extension matchers ([1489e641](https://github.com/electron-userland/electron-forge/commit/1489e641)) - -##### Refactors - -* **installer:** - * use single regexp to make repo path safe ([1255803b](https://github.com/electron-userland/electron-forge/commit/1255803b)) - * finish replacing sudo-prompt with electron-sudo ([d8587930](https://github.com/electron-userland/electron-forge/commit/d8587930)) - * replace sudo-prompt with git branch of electron-sudo for Linux installers ([9834cb1b](https://github.com/electron-userland/electron-forge/commit/9834cb1b)) - * check that the linux installer program exists first ([fb56c542](https://github.com/electron-userland/electron-forge/commit/fb56c542)) - * update the ora text wh have resolved a repo but not found a release ([5cbf8cb8](https://github.com/electron-userland/electron-forge/commit/5cbf8cb8)) - -### [2.2.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.2.0) (2016-12-30) - -##### New Features - -* **initializer:** allow custom initialzers ([9e6ddfa0](https://github.com/electron-userland/electron-forge/commit/9e6ddfa0)) - -##### Tests - -* **initializer:** add test for custom initializer ([0dc62307](https://github.com/electron-userland/electron-forge/commit/0dc62307)) - -### [2.1.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.1.0) (2016-12-30) - -##### Chores - -* **generic:** add importer to the git-cz list ([fbf691cb](https://github.com/electron-userland/electron-forge/commit/fbf691cb)) -* **tests:** remove .only from util_spec ([3b01f08c](https://github.com/electron-userland/electron-forge/commit/3b01f08c)) - -##### New Features - -* **importer:** - * confirm build tool package removal from user ([3b548557](https://github.com/electron-userland/electron-forge/commit/3b548557)) - * delete existing Electron build tools from package.json ([4152bd2d](https://github.com/electron-userland/electron-forge/commit/4152bd2d)) - * move babel config in existing project to .compilerc ([b09fc3d6](https://github.com/electron-userland/electron-forge/commit/b09fc3d6)) - * fix the projects gitignore on import ([75366bfe](https://github.com/electron-userland/electron-forge/commit/75366bfe)) - * create inital import logic ([bddb9038](https://github.com/electron-userland/electron-forge/commit/bddb9038)) -* **maker:** allow user to override make targets ([bac86800](https://github.com/electron-userland/electron-forge/commit/bac86800)) -* **generic:** allow config options to use string templating ([5a568cb8](https://github.com/electron-userland/electron-forge/commit/5a568cb8)) - -##### Bug Fixes - -* **importer:** - * pretty print the compilerc file ([07f06b40](https://github.com/electron-userland/electron-forge/commit/07f06b40)) - * update the logging as per PR feedback ([dac33f0d](https://github.com/electron-userland/electron-forge/commit/dac33f0d)) -* **rebuild:** skip dependencies without a package.json file ([3348223d](https://github.com/electron-userland/electron-forge/commit/3348223d)) -* **packager:** remove stray .bin files leftover by yarn installs during packaging ([50ad8e6d](https://github.com/electron-userland/electron-forge/commit/50ad8e6d)) - -##### Refactors - -* **importer:** - * use readPackageJSON ([e000eaf1](https://github.com/electron-userland/electron-forge/commit/e000eaf1)) - * de-rimrafify ([df4193a4](https://github.com/electron-userland/electron-forge/commit/df4193a4)) - -## [2.0.0](https://github.com/electron-userland/electron-forge/releases/tag/v2.0.0) (2016-12-30) - -##### Chores - -* **generic:** add publisher to cz config ([8653b62b](https://github.com/electron-userland/electron-forge/commit/8653b62b)) - -##### Documentation Changes - -* **publisher:** document the API for custom makers and publishers ([81ed28d7](https://github.com/electron-userland/electron-forge/commit/81ed28d7)) - -##### New Features - -* **publisher:** initial work on a publish command to sent make artifacts to github ([189cb0cc](https://github.com/electron-userland/electron-forge/commit/189cb0cc)) -* **generic:** map the alias bin commands to the correct commander files ([f1cac740](https://github.com/electron-userland/electron-forge/commit/f1cac740)) - -##### Bug Fixes - -* **publisher:** - * publish to the correct version ([02fe5699](https://github.com/electron-userland/electron-forge/commit/02fe5699)) - * throw custom 404 if we cant find the release ([6f4e1ed4](https://github.com/electron-userland/electron-forge/commit/6f4e1ed4)) -* **maker:** fix RPM maker outPath variable ([4b32fe42](https://github.com/electron-userland/electron-forge/commit/4b32fe42)) - -##### Refactors - -* **publisher:** move github publish logic to own file ([bdaff3ce](https://github.com/electron-userland/electron-forge/commit/bdaff3ce)) - -##### Tests - -* **generic:** add tests for the require-search util ([b7930eaa](https://github.com/electron-userland/electron-forge/commit/b7930eaa)) - -### [1.1.0](https://github.com/electron-userland/electron-forge/releases/tag/v1.1.0) (2016-12-27) - -##### Chores - -* **tests:** run flatpak runtime install in local Dockerfile ([d046965f](https://github.com/electron-userland/electron-forge/commit/d046965f)) -* **generic:** add pretest step to improve development ([558fae31](https://github.com/electron-userland/electron-forge/commit/558fae31)) -* **packages:** upgrade fs-promise and inquirer (#18) ([d51d482f](https://github.com/electron-userland/electron-forge/commit/d51d482f)) - -##### Documentation Changes - -* **generic:** document the new JS file option for config ([2d44c41f](https://github.com/electron-userland/electron-forge/commit/2d44c41f)) - -##### New Features - -* **rebuilder:** only rebuild prod and optional deps (ignore dev deps) ([d751a85f](https://github.com/electron-userland/electron-forge/commit/d751a85f)) -* **generic:** allow JS files to provide the config object ([e57f3c78](https://github.com/electron-userland/electron-forge/commit/e57f3c78)) - -##### Bug Fixes - -* **packager:** allow hooks to be strings or functions depending on config setup ([ec0caecc](https://github.com/electron-userland/electron-forge/commit/ec0caecc)) -* **rebuilder:** rebuild modules inside @ scoped folders as well (#19) ([bc21528d](https://github.com/electron-userland/electron-forge/commit/bc21528d)) -* **generic:** document that the minimum Node version is 6 ([1f5ac7f2](https://github.com/electron-userland/electron-forge/commit/1f5ac7f2)) - -##### Refactors - -* **generic:** - * standardize reading package.json files (#33) ([0855eacf](https://github.com/electron-userland/electron-forge/commit/0855eacf)) - * replace mkdirp/rimraf calls with equivalent fs-promise calls ([bb2c6cf3](https://github.com/electron-userland/electron-forge/commit/bb2c6cf3)) -* **tests:** use different native modules so the tests run on CI ([d20387b7](https://github.com/electron-userland/electron-forge/commit/d20387b7)) - -##### Tests - -* **generic:** only skip help spec on Windows (#34) ([202987e1](https://github.com/electron-userland/electron-forge/commit/202987e1)) -* **builder:** add tests to ensure correct behvior of the native module builder ([b79c7af5](https://github.com/electron-userland/electron-forge/commit/b79c7af5)) - -#### [1.0.1](https://github.com/electron-userland/electron-forge/releases/tag/v1.0.1) (2016-12-12) - -##### Chores - -* **tests:** add AppVeyor support (#15) ([fe63ac0b](https://github.com/electron-userland/electron-forge/commit/fe63ac0b)) - -##### Bug Fixes - -* **starter:** fix launching on newest yarn ([8c5bc656](https://github.com/electron-userland/electron-forge/commit/8c5bc656)) - -## [1.0.0](https://github.com/electron-userland/electron-forge/releases/tag/v1.0.0) (2016-12-11) - -##### Chores - -* **generic:** - * rename all instances of marshallofsound to electron-userland ([9981fcbb](https://github.com/electron-userland/electron-forge/commit/9981fcbb)) - * fix changelog link parsing ([07defb76](https://github.com/electron-userland/electron-forge/commit/07defb76)) -* **packager:** remove commented code ([35745594](https://github.com/electron-userland/electron-forge/commit/35745594)) -* **maker:** add mas default targets ([775459cd](https://github.com/electron-userland/electron-forge/commit/775459cd)) - -##### New Features - -* **maker:** - * enable MAS makes on darwin platform ([d8ac9ad8](https://github.com/electron-userland/electron-forge/commit/d8ac9ad8)) - * allow make to target different or multiple arches ([3d4ee593](https://github.com/electron-userland/electron-forge/commit/3d4ee593)) - -##### Bug Fixes - -* **maker:** build armv7l distributables when arch=all ([f6d28c32](https://github.com/electron-userland/electron-forge/commit/f6d28c32)) -* **packager:** - * change arch name when armv7l is packaged during arch=all ([132b3670](https://github.com/electron-userland/electron-forge/commit/132b3670)) - * fix the third arch ora on linux ([894fd4e7](https://github.com/electron-userland/electron-forge/commit/894fd4e7)) - * fix ora sequencing when running with --arch=all ([e4dfdede](https://github.com/electron-userland/electron-forge/commit/e4dfdede)) - -##### Refactors - -* **generic:** replace process.arch with a function that handles arm arches better ([81fa0943](https://github.com/electron-userland/electron-forge/commit/81fa0943)) - -### [0.1.0](https://github.com/electron-userland/electron-forge/releases/tag/v0.1.0) (2016-12-11) - -##### Chores - -* **tests:** - * install g++ since Docker Hub won't create a new image ([f219e994](https://github.com/electron-userland/electron-forge/commit/f219e994)) - * disable building branches on Travis CI ([12e5d99e](https://github.com/electron-userland/electron-forge/commit/12e5d99e)) -* **initializer:** output logs of the install step on failure ([20c0b12a](https://github.com/electron-userland/electron-forge/commit/20c0b12a)) -* **generic:** - * make the changelog link to the relevent commits ([ee6a7d86](https://github.com/electron-userland/electron-forge/commit/ee6a7d86)) - * set up changelog generation ([9a3854f1](https://github.com/electron-userland/electron-forge/commit/9a3854f1)) - -##### Documentation Changes - -* **generic:** - * add contributing/issue/pull request docs + news ([d25d701d](https://github.com/electron-userland/electron-forge/commit/d25d701d)) - * clean up README ([eddd61d8](https://github.com/electron-userland/electron-forge/commit/eddd61d8)) -* **packager:** fix syntax of hook docs ([84a1a063](https://github.com/electron-userland/electron-forge/commit/84a1a063)) - -##### New Features - -* **packager:** rebuild native modules automatically in all the right places ([1d1ff74d](https://github.com/electron-userland/electron-forge/commit/1d1ff74d)) - -##### Bug Fixes - -* **packager:** - * output rebuild errors if there are any ([f8ffca13](https://github.com/electron-userland/electron-forge/commit/f8ffca13)) - * rebuild pre-gyp modules with their binary variables ([ed9137dd](https://github.com/electron-userland/electron-forge/commit/ed9137dd)) - -##### Refactors - -* **packager:** make the rebuild a promise and use an ora ([bc1ec28d](https://github.com/electron-userland/electron-forge/commit/bc1ec28d)) - -#### [0.0.9](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.9) (2016-12-11) - -##### Documentation Changes - -* **packager:** document the require mapping of the hooks ([87fb6aa6](https://github.com/electron-userland/electron-forge/commit/87fb6aa6)) - -##### New Features - -* **packager:** map afterExtract hooks to require calls ([623a0001](https://github.com/electron-userland/electron-forge/commit/623a0001)) - -#### [0.0.8](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.8) (2016-12-11) - -##### New Features - -* **maker:** add the flatpak maker for the linux target ([218518ef](https://github.com/electron-userland/electron-forge/commit/218518ef)) - -##### Refactors - -* **packager:** - * move packager compile logic to a electron-packager afterCopy hook ([c10bcd29](https://github.com/electron-userland/electron-forge/commit/c10bcd29)) - * upgrade to Electron Packager 8.4.0 (with quiet option) ([9ab19b5f](https://github.com/electron-userland/electron-forge/commit/9ab19b5f)) - -#### [0.0.7](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.7) (2016-12-11) - -##### Documentation Changes - -* **generic:** - * tweak the readme ([c6ededf6](https://github.com/electron-userland/electron-forge/commit/c6ededf6)) - * update readme ([f03ffeb5](https://github.com/electron-userland/electron-forge/commit/f03ffeb5)) - -##### Bug Fixes - -* **starter:** pass through env to started application ([834729fb](https://github.com/electron-userland/electron-forge/commit/834729fb)) -* **maker:** spawn the zip command in the containing directory ([e909a0c4](https://github.com/electron-userland/electron-forge/commit/e909a0c4)) -* **initializer:** add electron-compile to the prod dependencies of the initialized app ([5a56efb9](https://github.com/electron-userland/electron-forge/commit/5a56efb9)) - -#### [0.0.6](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.6) (2016-12-11) - -##### Chores - -* **tests:** - * run different package installers in different Travis workers ([028bcfbf](https://github.com/electron-userland/electron-forge/commit/028bcfbf)) - * run Travis with OSX and Linux workers ([9d1b0291](https://github.com/electron-userland/electron-forge/commit/9d1b0291)) - -##### Documentation Changes - -* **README:** - * fix license badge url ([026141c0](https://github.com/electron-userland/electron-forge/commit/026141c0)) - * add badges to the readme ([f912c24f](https://github.com/electron-userland/electron-forge/commit/f912c24f)) -* **LICENSE:** add a license file ([89ada6e9](https://github.com/electron-userland/electron-forge/commit/89ada6e9)) - -##### New Features - -* **maker:** - * add the rpm maker for the linux target ([85821f27](https://github.com/electron-userland/electron-forge/commit/85821f27)) - * add the deb maker for the linux target ([5c5ce67a](https://github.com/electron-userland/electron-forge/commit/5c5ce67a)) - * add the dmg maker for the darwin target ([aaceb3f2](https://github.com/electron-userland/electron-forge/commit/aaceb3f2)) -* **build:** add git-cz for semantic versioned commits ([cdbc78b6](https://github.com/electron-userland/electron-forge/commit/cdbc78b6)) - -##### Bug Fixes - -* **maker:** - * add a santizied app id to the electronWinstaller config on init ([20ae889e](https://github.com/electron-userland/electron-forge/commit/20ae889e)) - * move electron-installer-debian to optional deps so that installs work on windows ([661b1eb6](https://github.com/electron-userland/electron-forge/commit/661b1eb6)) - * correct path/arch of generated deb file ([63ff52b2](https://github.com/electron-userland/electron-forge/commit/63ff52b2)) -* **generic:** fix package.json warning about repository ([f21a87aa](https://github.com/electron-userland/electron-forge/commit/f21a87aa)) -* **packager:** throw error when electron-prebuilt-compile is not found ([23449956](https://github.com/electron-userland/electron-forge/commit/23449956)) - -##### Refactors - -* **maker:** - * DRY up app name ([f5ae494f](https://github.com/electron-userland/electron-forge/commit/f5ae494f)) - * add packageJSON to the function arguments ([e8e1054a](https://github.com/electron-userland/electron-forge/commit/e8e1054a)) - * create ensure{Directory,File} to rimraf+mkdirp the given output ([b3b616a0](https://github.com/electron-userland/electron-forge/commit/b3b616a0)) -* **generic:** - * add debug calls to the linter ([3e116109](https://github.com/electron-userland/electron-forge/commit/3e116109)) - * add the 'debug' module for standard debug logging ([9f4c0b49](https://github.com/electron-userland/electron-forge/commit/9f4c0b49)) -* **packager:** - * remove stray log ([f4f36b59](https://github.com/electron-userland/electron-forge/commit/f4f36b59)) - * move the electron-packager dependency to forge instead of the users module ([2e695c21](https://github.com/electron-userland/electron-forge/commit/2e695c21)) - -##### Code Style Changes - -* **generic:** - * disable some eslint rules that don't make sense in a CLI tool ([f1f06acf](https://github.com/electron-userland/electron-forge/commit/f1f06acf)) - * change eslint rules to allow strange linebreaks ([4b7a22e3](https://github.com/electron-userland/electron-forge/commit/4b7a22e3)) - -##### Tests - -* **resolve-dir:** add a fixture that is actually an electron-forge package.json file ([e0e712dd](https://github.com/electron-userland/electron-forge/commit/e0e712dd)) - -#### [0.0.5](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.5) (2016-12-11) - -#### [0.0.4](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.4) (2016-12-11) - -#### [0.0.3](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.3) (2016-12-11) - -#### [0.0.2](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.2) (2016-12-11) - -#### [0.0.1](https://github.com/electron-userland/electron-forge/releases/tag/v0.0.1) (2016-12-11) diff --git a/packages/_old/package.json b/packages/_old/package.json deleted file mode 100644 index 0efda3f6a0..0000000000 --- a/packages/_old/package.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "name": "@electron-forge/cli", - "version": "6.0.0-beta.0", - "description": "A complete tool for building modern Electron applications", - "repository": "https://github.com/electron-userland/electron-forge", - "main": "dist/api/index.js", - "bin": { - "electron-forge": "dist/electron-forge.js", - "forge": "dist/electron-forge.js", - "electron-forge-vscode-nix": "script/vscode.sh", - "electron-forge-vscode-win": "script/vscode.cmd" - }, - "scripts": { - "precommit": "npm run lint", - "docs": "esdoc", - "install": "node tabtab-install.js", - "test": "yarn test-all", - "test-coverage": "npm run lint && npm run test-all-coverage", - "test-all": "mocha test/**/*_spec*.js test/**/**/*_spec*.js", - "test-fast": "mocha test/**/*_spec.js test/**/**/*_spec.js --timeout=10000", - "test-all-coverage": "cross-env NODE_ENV=test nyc npm run test-all", - "test-fast-coverage": "cross-env NODE_ENV=test nyc npm run test-fast", - "release:patch": "changelog -p && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version patch && git push origin && git push origin --tags", - "release:minor": "changelog -m && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version minor && git push origin && git push origin --tags", - "release:major": "changelog -M && node ci/fix-changelog.js && git add CHANGELOG.md && git commit -m \"updated CHANGELOG.md\" && npm version major && git push origin && git push origin --tags", - "watch-link": "nodemon --watch src --exec \"npm link\"" - }, - "author": "Samuel Attard", - "license": "MIT", - "devDependencies": { - "asar": "^0.14.0", - "chai": "^4.0.0", - "chai-as-promised": "^7.0.0", - "coveralls": "^3.0.0", - "cross-env": "^5.0.0", - "esdoc": "^1.0.1", - "esdoc-importpath-plugin": "^1.0.0", - "esdoc-standard-plugin": "^1.0.0", - "fetch-mock": "^6.0.0", - "generate-changelog": "^1.0.2", - "mocha": "^5.0.0", - "nodemon": "^1.11.0", - "nyc": "^11.0.0", - "proxyquire": "^1.7.10", - "sinon": "^4.1.2" - }, - "dependencies": { - "@octokit/rest": "^14.0.4", - "aws-sdk": "^2.9.0", - "colors": "^1.1.2", - "commander": "^2.9.0", - "cross-spawn-promise": "^0.10.1", - "debug": "^3.0.0", - "electron-forge-template-angular2": "^1.0.3", - "electron-forge-template-react": "^1.0.2", - "electron-forge-template-react-typescript": "^1.0.3", - "electron-forge-template-vue": "^1.0.2", - "electron-packager": "^11.0.0", - "electron-rebuild": "^1.6.0", - "form-data": "^2.1.4", - "fs-extra": "^5.0.0", - "glob": "^7.1.1", - "inquirer": "^5.0.0", - "lodash.merge": "^4.6.0", - "lodash.template": "^4.4.0", - "log-symbols": "^2.0.0", - "mime-types": "^2.1.17", - "node-fetch": "^2.0.0", - "node-gyp": "^3.4.0", - "nugget": "^2.0.1", - "opn": "^5.0.0", - "ora": "^1.1.0", - "parse-author": "^2.0.0", - "pify": "^3.0.0", - "resolve-package": "^1.0.1", - "s3": "^4.4.0", - "semver": "^5.3.0", - "sudo-prompt": "^8.0.0", - "tabtab": "^2.2.1", - "username": "^3.0.0", - "yarn-or-npm": "^2.0.2", - "zip-folder": "^1.0.0" - }, - "optionalDependencies": { - "electron-installer-debian": "^0.8.0", - "electron-installer-dmg": "^0.2.0", - "electron-installer-flatpak": "^0.8.0", - "electron-installer-redhat": "^0.5.0", - "electron-installer-snap": "^2.0.0", - "electron-windows-store": "^0.12.0", - "electron-winstaller": "^2.5.0", - "electron-wix-msi": "^1.3.0" - }, - "engines": { - "node": ">= 6.0" - } -} diff --git a/packages/_old/script/vscode.cmd b/packages/_old/script/vscode.cmd deleted file mode 100755 index b447f966f2..0000000000 --- a/packages/_old/script/vscode.cmd +++ /dev/null @@ -1,9 +0,0 @@ -@echo off - -SETLOCAL -SET FORGE_ARGS=%* - -SET FORGE_ARGS=%FORGE_ARGS: =~ ~% -node "%~dp0/../../electron-forge/dist/electron-forge-start.js" --vscode -- ~%FORGE_ARGS%~ - -ENDLOCAL \ No newline at end of file diff --git a/packages/_old/script/vscode.sh b/packages/_old/script/vscode.sh deleted file mode 100755 index 8f0e891508..0000000000 --- a/packages/_old/script/vscode.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -ARGS=$@ -ARGS=${ARGS// /\~ \~} - -node $DIR/../electron-forge/dist/electron-forge-start --vscode -- \~$ARGS\~ \ No newline at end of file diff --git a/packages/_old/src/api/import.js b/packages/_old/src/api/import.js deleted file mode 100644 index f2b7840fd0..0000000000 --- a/packages/_old/src/api/import.js +++ /dev/null @@ -1,166 +0,0 @@ -import debug from 'debug'; -import fs from 'fs-extra'; -import path from 'path'; - -import initGit from '../init/init-git'; -import { deps, devDeps, exactDevDeps } from '../init/init-npm'; - -import { setInitialForgeConfig } from '../util/forge-config'; -import asyncOra from '../util/ora-handler'; -import { info, warn } from '../util/messages'; -import installDepList from '../util/install-dependencies'; -import readPackageJSON from '../util/read-package-json'; -import confirmIfInteractive from '../util/confirm-if-interactive'; - -const d = debug('electron-forge:import'); - -/** - * @typedef {Object} ImportOptions - * @property {string} [dir=process.cwd()] The path to the app to be imported - * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually - * @property {boolean} [updateScripts=true] Whether to update the modules package.json scripts to be electron-forge commands - * @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables - */ - -/** - * Attempt to import a given module directory to the Electron Forge standard. - * - * - Sets up `git` and the correct NPM dependencies - * - Adds a template forge config to `package.json` - * - * @param {ImportOptions} providedOptions - Options for the import method - * @return {Promise} Will resolve when the import process is complete - */ -export default async (providedOptions = {}) => { - const { dir, interactive, updateScripts } = Object.assign({ - dir: process.cwd(), - interactive: false, - updateScripts: true, - }, providedOptions); - - const outDir = providedOptions.outDir || 'out'; - asyncOra.interactive = interactive; - - d(`Attempting to import project in: ${dir}`); - if (!await fs.pathExists(dir) || !await fs.pathExists(path.resolve(dir, 'package.json'))) { - throw `We couldn't find a project in: ${dir}`; - } - - // eslint-disable-next-line max-len - const confirm = await confirmIfInteractive(interactive, `WARNING: We will now attempt to import: "${dir}". This will involve modifying some files, are you sure you want to continue?`); - - if (!confirm) { - process.exit(0); - } - - await initGit(dir); - - let packageJSON = await readPackageJSON(dir); - if (packageJSON.config && packageJSON.config.forge) { - warn(interactive, 'It looks like this project is already configured for "electron-forge"'.green); - const shouldContinue = await confirmIfInteractive(interactive, 'Are you sure you want to continue?'); - - if (!shouldContinue) { - process.exit(0); - } - } - - packageJSON.dependencies = packageJSON.dependencies || {}; - packageJSON.devDependencies = packageJSON.devDependencies || {}; - - const keys = Object.keys(packageJSON.dependencies).concat(Object.keys(packageJSON.devDependencies)); - const buildToolPackages = { - 'electron-builder': 'provides mostly equivalent functionality', - 'electron-download': 'already uses this module as a transitive dependency', - 'electron-installer-debian': 'already uses this module as a transitive dependency', - 'electron-installer-dmg': 'already uses this module as a transitive dependency', - 'electron-installer-flatpak': 'already uses this module as a transitive dependency', - 'electron-installer-redhat': 'already uses this module as a transitive dependency', - 'electron-osx-sign': 'already uses this module as a transitive dependency', - 'electron-packager': 'already uses this module as a transitive dependency', - 'electron-winstaller': 'already uses this module as a transitive dependency', - }; - - for (const key of keys) { - if (buildToolPackages[key]) { - const explanation = buildToolPackages[key]; - // eslint-disable-next-line max-len - const shouldRemoveDependency = await confirmIfInteractive(interactive, `Do you want us to remove the "${key}" dependency in package.json? Electron Forge ${explanation}.`); - - if (shouldRemoveDependency) { - delete packageJSON.dependencies[key]; - delete packageJSON.devDependencies[key]; - } - } - } - - packageJSON.scripts = packageJSON.scripts || {}; - d('reading current scripts object:', packageJSON.scripts); - - const updatePackageScript = async (scriptName, newValue) => { - if (packageJSON.scripts[scriptName] !== newValue) { - // eslint-disable-next-line max-len - const shouldUpdate = await confirmIfInteractive(interactive, `Do you want us to update the "${scriptName}" script to instead call the electron-forge task "${newValue}"`, updateScripts); - if (shouldUpdate) { - packageJSON.scripts[scriptName] = newValue; - } - } - }; - - await updatePackageScript('start', 'electron-forge start'); - await updatePackageScript('package', 'electron-forge package'); - await updatePackageScript('make', 'electron-forge make'); - - d('forgified scripts object:', packageJSON.scripts); - - const writeChanges = async () => { - await asyncOra('Writing modified package.json file', async () => { - await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON, { spaces: 2 }); - }); - }; - - await writeChanges(); - - await asyncOra('Installing dependencies', async () => { - d('deleting old dependencies forcefully'); - await fs.remove(path.resolve(dir, 'node_modules/.bin/electron')); - await fs.remove(path.resolve(dir, 'node_modules/.bin/electron.cmd')); - - d('installing dependencies'); - await installDepList(dir, deps); - - d('installing devDependencies'); - await installDepList(dir, devDeps, true); - - d('installing exactDevDependencies'); - await installDepList(dir, exactDevDeps, true, true); - }); - - packageJSON = await readPackageJSON(dir); - - if (!packageJSON.version) { - warn(interactive, "Please set the 'version' in your application's package.json".yellow); - } - - packageJSON.config = packageJSON.config || {}; - const templatePackageJSON = await readPackageJSON(path.resolve(__dirname, '../../tmpl')); - packageJSON.config.forge = templatePackageJSON.config.forge; - setInitialForgeConfig(packageJSON); - - await writeChanges(); - - await asyncOra('Fixing .gitignore', async () => { - if (await fs.pathExists(path.resolve(dir, '.gitignore'))) { - const gitignore = await fs.readFile(path.resolve(dir, '.gitignore')); - if (!gitignore.includes(outDir)) { - await fs.writeFile(path.resolve(dir, '.gitignore'), `${gitignore}\n${outDir}/`); - } - } - }); - - info(interactive, ` - -We have ATTEMPTED to convert your app to be in a format that electron-forge understands. - -Thanks for using ${'"electron-forge"'.green}!!!`); -}; diff --git a/packages/_old/src/api/index.js b/packages/_old/src/api/index.js deleted file mode 100644 index a3e63e4a92..0000000000 --- a/packages/_old/src/api/index.js +++ /dev/null @@ -1,28 +0,0 @@ -import 'colors'; - -import _import from './import'; -import init from './init'; -import install from './install'; -import lint from './lint'; -import make from './make'; -import _package from './package'; -import publish from './publish'; -import start from './start'; - -import getForgeConfig from '../util/forge-config'; -import readPackageJSON from '../util/read-package-json'; - -module.exports = { - 'import': _import, // eslint-disable-line - init, - install, - lint, - make, - 'package': _package, // eslint-disable-line - publish, - start, - utils: { - getForgeConfig, - readPackageJSON, - }, -}; diff --git a/packages/_old/src/api/init.js b/packages/_old/src/api/init.js deleted file mode 100644 index 2f295432a1..0000000000 --- a/packages/_old/src/api/init.js +++ /dev/null @@ -1,46 +0,0 @@ -import debug from 'debug'; - -import initCustom from '../init/init-custom'; -import initDirectory from '../init/init-directory'; -import initGit from '../init/init-git'; -import initNPM from '../init/init-npm'; -import initStarter from '../init/init-starter-files'; - -import asyncOra from '../util/ora-handler'; - -const d = debug('electron-forge:init'); - -/** - * @typedef {Object} InitOptions - * @property {string} [dir=process.cwd()] The path to the app to be initialized - * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually - * @property {boolean} [copyCIFiles=false] Whether to copy Travis and AppVeyor CI files - * @property {string} [template] The custom template to use. If left empty, the default template is used - */ - -/** - * Initialize a new Electron Forge template project in the given directory. - * - * @param {InitOptions} providedOptions - Options for the init method - * @return {Promise} Will resolve when the initialization process is complete - */ -export default async (providedOptions = {}) => { - // eslint-disable-next-line prefer-const, no-unused-vars - let { dir, interactive, copyCIFiles, template } = Object.assign({ - dir: process.cwd(), - interactive: false, - copyCIFiles: false, - template: null, - }, providedOptions); - asyncOra.interactive = interactive; - - d(`Initializing in: ${dir}`); - - await initDirectory(dir, interactive); - await initGit(dir); - await initStarter(dir, { copyCIFiles }); - await initNPM(dir); - if (template) { - await initCustom(dir, template); - } -}; diff --git a/packages/_old/src/api/install.js b/packages/_old/src/api/install.js deleted file mode 100644 index f573327611..0000000000 --- a/packages/_old/src/api/install.js +++ /dev/null @@ -1,163 +0,0 @@ -import 'colors'; -import debug from 'debug'; -import fetch from 'node-fetch'; -import fs from 'fs-extra'; -import inquirer from 'inquirer'; -import nugget from 'nugget'; -import os from 'os'; -import path from 'path'; -import pify from 'pify'; -import semver from 'semver'; - -import asyncOra from '../util/ora-handler'; -import { info } from '../util/messages'; - -import darwinDMGInstaller from '../installers/darwin/dmg'; -import darwinZipInstaller from '../installers/darwin/zip'; -import linuxDebInstaller from '../installers/linux/deb'; -import linuxRPMInstaller from '../installers/linux/rpm'; -import win32ExeInstaller from '../installers/win32/exe'; - -const d = debug('electron-forge:install'); - -const GITHUB_API = 'https://api.github.com'; - -/** - * @typedef {Object} InstallOptions - * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually - * @property {boolean} [prerelease=false] Whether to install prerelease versions - * @property {string} repo The GitHub repository to install from, in the format owner/name - * @property {function} chooseAsset A function that must return the asset to use/install from a provided array of compatible GitHub assets - */ - -/** - * Install an Electron application from GitHub. If you leave interactive as `false`, you MUST provide a `chooseAsset` function. - * - * @param {InstallOptions} providedOptions - Options for the install method - * @return {Promise} Will resolve when the install process is complete - */ -export default async (providedOptions = {}) => { - // eslint-disable-next-line prefer-const, no-unused-vars - let { interactive, prerelease, repo, chooseAsset } = Object.assign({ - interactive: false, - prerelease: false, - }, providedOptions); - asyncOra.interactive = interactive; - - let latestRelease; - let possibleAssets = []; - - await asyncOra('Searching for Application', async (searchSpinner) => { - if (!repo || repo.indexOf('/') === -1) { - throw 'Invalid repository name, must be in the format owner/name'; - } - - d('searching for repo:', repo); - let releases; - try { - releases = await (await fetch(`${GITHUB_API}/repos/${repo}/releases`)).json(); - } catch (err) { - // Ignore error - } - - if (!releases || releases.message === 'Not Found' || !Array.isArray(releases)) { - throw `Failed to find releases for repository "${repo}". Please check the name and try again.`; - } - - releases = releases.filter(release => !release.prerelease || prerelease); - - const sortedReleases = releases.sort((releaseA, releaseB) => { - let tagA = releaseA.tag_name; - if (tagA.substr(0, 1) === 'v') tagA = tagA.substr(1); - let tagB = releaseB.tag_name; - if (tagB.substr(0, 1) === 'v') tagB = tagB.substr(1); - return (semver.gt(tagB, tagA) ? 1 : -1); - }); - latestRelease = sortedReleases[0]; - - searchSpinner.text = 'Searching for Releases'; // eslint-disable-line - - const assets = latestRelease.assets; - if (!assets || !Array.isArray(assets)) { - throw 'Could not find any assets for the latest release'; - } - - const installTargets = { - win32: [/\.exe$/], - darwin: [/OSX.*\.zip$/, /darwin.*\.zip$/, /macOS.*\.zip$/, /mac.*\.zip$/, /\.dmg$/], - linux: [/\.rpm$/, /\.deb$/], - }; - - possibleAssets = assets.filter((asset) => { - const targetSuffixes = installTargets[process.platform]; - for (const suffix of targetSuffixes) { - if (suffix.test(asset.name)) return true; - } - return false; - }); - - if (possibleAssets.length === 0) { - throw `Failed to find any installable assets for target platform: ${`${process.platform}`.cyan}`; - } - }); - - info(interactive, `Found latest release${prerelease ? ' (including prereleases)' : ''}: ${latestRelease.tag_name.cyan}`); - - let targetAsset = possibleAssets[0]; - if (possibleAssets.length > 1) { - if (chooseAsset) { - targetAsset = await Promise.resolve(chooseAsset(possibleAssets)); - } else if (interactive) { - const choices = []; - possibleAssets.forEach((asset) => { - choices.push({ name: asset.name, value: asset.id }); - }); - const { assetID } = await inquirer.createPromptModule()({ - type: 'list', - name: 'assetID', - message: 'Multiple potential assets found, please choose one from the list below:'.cyan, - choices, - }); - - targetAsset = possibleAssets.find(asset => asset.id === assetID); - } else { - throw 'expected a chooseAsset function to be provided but it was not'; - } - } - - const tmpdir = path.resolve(os.tmpdir(), 'forge-install'); - const pathSafeRepo = repo.replace(/[/\\]/g, '-'); - const filename = `${pathSafeRepo}-${latestRelease.tag_name}-${targetAsset.name}`; - - const fullFilePath = path.resolve(tmpdir, filename); - if (!await fs.pathExists(fullFilePath) || (await fs.stat(fullFilePath)).size !== targetAsset.size) { - await fs.mkdirs(tmpdir); - - const nuggetOpts = { - target: filename, - dir: tmpdir, - resume: true, - strictSSL: true, - }; - await pify(nugget)(targetAsset.browser_download_url, nuggetOpts); - } - - await asyncOra('Installing Application', async (installSpinner) => { - const installActions = { - win32: { - '.exe': win32ExeInstaller, - }, - darwin: { - '.zip': darwinZipInstaller, - '.dmg': darwinDMGInstaller, - }, - linux: { - '.deb': linuxDebInstaller, - '.rpm': linuxRPMInstaller, - }, - }; - - const suffixFnIdent = Object.keys(installActions[process.platform]).find(suffix => targetAsset.name.endsWith(suffix)); - await installActions[process.platform][suffixFnIdent](fullFilePath, installSpinner); - }); -}; diff --git a/packages/_old/src/api/lint.js b/packages/_old/src/api/lint.js deleted file mode 100644 index 8a5486f8e8..0000000000 --- a/packages/_old/src/api/lint.js +++ /dev/null @@ -1,58 +0,0 @@ -import 'colors'; -import debug from 'debug'; -import { yarnOrNpmSpawn } from '../util/yarn-or-npm'; - -import asyncOra from '../util/ora-handler'; -import resolveDir from '../util/resolve-dir'; - -const d = debug('electron-forge:lint'); - -/** - * @typedef {Object} LintOptions - * @property {string} [dir=process.cwd()] The path to the module to import - * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually - */ - -/** - * Lint a local Electron application. - * - * The promise will be rejected with the stdout+stderr of the linting process if linting fails or - * will be resolved if it succeeds. - * - * @param {LintOptions} providedOptions - Options for the Lint method - * @return {Promise} Will resolve when the lint process is complete - */ -export default async (providedOptions = {}) => { - // eslint-disable-next-line prefer-const, no-unused-vars - let { dir, interactive } = Object.assign({ - dir: process.cwd(), - interactive: false, - }, providedOptions); - asyncOra.interactive = interactive; - - let success = true; - let result = null; - - await asyncOra('Linting Application', async (lintSpinner) => { - dir = await resolveDir(dir); - if (!dir) { - throw 'Failed to locate lintable Electron application'; - } - - d('executing "run lint" in dir:', dir); - try { - await yarnOrNpmSpawn(['run', 'lint'], { - stdio: process.platform === 'win32' ? 'inherit' : 'pipe', - cwd: dir, - }); - } catch (err) { - lintSpinner.fail(); - success = false; - result = err; - } - }); - - if (!success) { - throw result; - } -}; diff --git a/packages/_old/src/api/make.js b/packages/_old/src/api/make.js deleted file mode 100644 index 296d1c5a70..0000000000 --- a/packages/_old/src/api/make.js +++ /dev/null @@ -1,182 +0,0 @@ -import 'colors'; -import fs from 'fs-extra'; -import path from 'path'; -import { hostArch } from 'electron-packager/targets'; - -import asyncOra from '../util/ora-handler'; -import getForgeConfig from '../util/forge-config'; -import runHook from '../util/hook'; -import { info, warn } from '../util/messages'; -import parseArchs from '../util/parse-archs'; -import readPackageJSON from '../util/read-package-json'; -import { requireSearchRaw } from '../util/require-search'; -import resolveDir from '../util/resolve-dir'; -import getCurrentOutDir from '../util/out-dir'; -import getElectronVersion from '../util/electron-version'; - -import packager from './package'; - -/** - * @typedef {Object} MakeOptions - * @property {string} [dir=process.cwd()] The path to the app from which distributables are generated - * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually - * @property {boolean} [skipPackage=false] Whether to skip the pre-make packaging step - * @property {Array} [overrideTargets] An array of make targets to override your forge config - * @property {string} [arch=host architecture] The target architecture - * @property {string} [platform=process.platform] The target platform. - * @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables - */ - -/** - * @typedef {Object} MakeResult - * @property {Array} artifacts An array of paths to artifacts generated for this make run - * @property {Object} packageJSON The state of the package.json file when the make happened - * @property {string} platform The platform this make run was for - * @property {string} arch The arch this make run was for - */ - -/** - * Make distributables for an Electron application. - * - * @param {MakeOptions} providedOptions - Options for the make method - * @return {Promise>} Will resolve when the make process is complete - */ -export default async (providedOptions = {}) => { - // eslint-disable-next-line prefer-const, no-unused-vars - let { dir, interactive, skipPackage, overrideTargets, arch, platform } = Object.assign({ - dir: process.cwd(), - interactive: false, - skipPackage: false, - arch: hostArch(), - platform: process.platform, - }, providedOptions); - - asyncOra.interactive = interactive; - - let forgeConfig; - await asyncOra('Resolving Forge Config', async () => { - dir = await resolveDir(dir); - if (!dir) { - throw 'Failed to locate makeable Electron application'; - } - - forgeConfig = await getForgeConfig(dir); - }); - - const outDir = providedOptions.outDir || getCurrentOutDir(dir, forgeConfig); - - const actualTargetPlatform = platform; - platform = platform === 'mas' ? 'darwin' : platform; - if (!['darwin', 'win32', 'linux', 'mas'].includes(actualTargetPlatform)) { - throw new Error(`'${actualTargetPlatform}' is an invalid platform. Choices are 'darwin', 'mas', 'win32' or 'linux'`); - } - - const makers = {}; - const targets = overrideTargets || forgeConfig.make_targets[platform]; - - for (const target of targets) { - const maker = requireSearchRaw(__dirname, [ - `../makers/${platform}/${target}.js`, - `../makers/generic/${target}.js`, - `electron-forge-maker-${target}`, - target, - path.resolve(dir, target), - path.resolve(dir, 'node_modules', target), - ]); - - if (!maker) { - throw new Error([ - 'Could not find a build target with the name: ', - `${target} for the platform: ${actualTargetPlatform}`, - ].join('')); - } - - if (!maker.isSupportedOnCurrentPlatform) { - throw new Error([ - `Maker for target ${target} is incompatible with this version of `, - 'electron-forge, please upgrade or contact the maintainer ', - '(needs to implement \'isSupportedOnCurrentPlatform)\')', - ].join('')); - } - - if (!await maker.isSupportedOnCurrentPlatform()) { - throw new Error([ - `Cannot build for ${platform} target ${target}: the maker declared `, - `that it cannot run on ${process.platform}`, - ].join('')); - } - - makers[target] = maker.default || maker; - } - - if (!skipPackage) { - info(interactive, 'We need to package your application before we can make it'.green); - await packager({ - dir, - interactive, - arch, - outDir, - platform: actualTargetPlatform, - }); - } else { - warn(interactive, 'WARNING: Skipping the packaging step, this could result in an out of date build'.red); - } - - info(interactive, 'Making for the following targets:', `${targets.join(', ')}`.cyan); - - const packageJSON = await readPackageJSON(dir); - const appName = forgeConfig.electronPackagerConfig.name || packageJSON.productName || packageJSON.name; - let outputs = []; - - await runHook(forgeConfig, 'preMake'); - - for (const targetArch of parseArchs(platform, arch, getElectronVersion(packageJSON))) { - const packageDir = path.resolve(outDir, `${appName}-${actualTargetPlatform}-${targetArch}`); - if (!(await fs.pathExists(packageDir))) { - throw new Error(`Couldn't find packaged app at: ${packageDir}`); - } - - for (const target of targets) { - const maker = makers[target]; - - // eslint-disable-next-line no-loop-func - await asyncOra(`Making for target: ${target.cyan} - On platform: ${actualTargetPlatform.cyan} - For arch: ${targetArch.cyan}`, async () => { - try { - const artifacts = await maker({ - dir: packageDir, - appName, - targetPlatform: actualTargetPlatform, - targetArch, - forgeConfig, - packageJSON, - }); - - outputs.push({ - artifacts, - packageJSON, - platform: actualTargetPlatform, - arch: targetArch, - }); - } catch (err) { - if (err) { - throw { - message: `An error occured while making for target: ${target}`, - stack: `${err.message}\n${err.stack}`, - }; - } else { - throw new Error(`An unknown error occured while making for target: ${target}`); - } - } - }); - } - } - - const result = await runHook(forgeConfig, 'postMake', outputs); - // If the postMake hooks modifies the locations / names of the outputs it must return - // the new locations so that the publish step knows where to look - if (Array.isArray(result)) { - outputs = result; - } - - return outputs; -}; diff --git a/packages/_old/src/api/package.js b/packages/_old/src/api/package.js deleted file mode 100644 index 178543a20f..0000000000 --- a/packages/_old/src/api/package.js +++ /dev/null @@ -1,174 +0,0 @@ -import 'colors'; -import debug from 'debug'; -import fs from 'fs-extra'; -import glob from 'glob'; -import path from 'path'; -import pify from 'pify'; -import packager from 'electron-packager'; -import { hostArch } from 'electron-packager/targets'; - -import getForgeConfig from '../util/forge-config'; -import runHook from '../util/hook'; -import { warn } from '../util/messages'; -import realOra, { fakeOra } from '../util/ora'; -import readPackageJSON from '../util/read-package-json'; -import rebuildHook from '../util/rebuild'; -import requireSearch from '../util/require-search'; -import resolveDir from '../util/resolve-dir'; -import getCurrentOutDir from '../util/out-dir'; -import getElectronVersion from '../util/electron-version'; - -const d = debug('electron-forge:packager'); - -/** - * @typedef {Object} PackageOptions - * @property {string} [dir=process.cwd()] The path to the app to package - * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually - * @property {string} [arch=process.arch] The target arch - * @property {string} [platform=process.platform] The target platform. - * @property {string} [outDir=`${dir}/out`] The path to the output directory for packaged apps - */ - -/** - * Resolves hooks if they are a path to a file (instead of a `Function`). - */ -function resolveHooks(hooks, dir) { - if (hooks) { - return hooks.map(hook => (typeof hook === 'string' ? requireSearch(dir, [hook]) : hook)); - } - - return []; -} - -function sequentialHooks(hooks) { - return [async (...args) => { - const done = args[args.length - 1]; - const passedArgs = args.splice(0, args.length - 1); - for (const hook of hooks) { - await pify(hook)(...passedArgs); - } - done(); - }]; -} - -/** - * Package an Electron application into an platform dependent format. - * - * @param {PackageOptions} providedOptions - Options for the Package method - * @return {Promise} Will resolve when the package process is complete - */ -export default async (providedOptions = {}) => { - // eslint-disable-next-line prefer-const, no-unused-vars - let { dir, interactive, arch, platform } = Object.assign({ - dir: process.cwd(), - interactive: false, - arch: hostArch(), - platform: process.platform, - }, providedOptions); - - const ora = interactive ? realOra : fakeOra; - - let prepareSpinner = ora(`Preparing to Package Application for arch: ${(arch === 'all' ? 'ia32' : arch).cyan}`).start(); - let prepareCounter = 0; - - dir = await resolveDir(dir); - if (!dir) { - throw 'Failed to locate compilable Electron application'; - } - - const packageJSON = await readPackageJSON(dir); - - if (path.dirname(require.resolve(path.resolve(dir, packageJSON.main))) === dir) { - console.error(`Entry point: ${packageJSON.main}`.red); - throw 'The entry point to your application ("packageJSON.main") must be in a subfolder not in the top level directory'; - } - - const forgeConfig = await getForgeConfig(dir); - const outDir = providedOptions.outDir || getCurrentOutDir(dir, forgeConfig); - let packagerSpinner; - - const pruneEnabled = !('prune' in forgeConfig.electronPackagerConfig) || forgeConfig.electronPackagerConfig.prune; - - const rebuildHookFn = async (buildPath, electronVersion, pPlatform, pArch, done) => { - await rebuildHook(buildPath, electronVersion, pPlatform, pArch, forgeConfig.electronRebuildConfig); - packagerSpinner = ora('Packaging Application').start(); - done(); - }; - - const afterCopyHooks = [ - async (buildPath, electronVersion, pPlatform, pArch, done) => { - if (packagerSpinner) { - packagerSpinner.succeed(); - prepareCounter += 1; - prepareSpinner = ora(`Preparing to Package Application for arch: ${(prepareCounter === 2 ? 'armv7l' : 'x64').cyan}`).start(); - } - const bins = await pify(glob)(path.join(buildPath, '**/.bin/**/*')); - for (const bin of bins) { - await fs.remove(bin); - } - done(); - }, async (buildPath, electronVersion, pPlatform, pArch, done) => { - prepareSpinner.succeed(); - await runHook(forgeConfig, 'packageAfterCopy', buildPath, electronVersion, pPlatform, pArch); - done(); - }, - ]; - - if (!pruneEnabled) { - afterCopyHooks.push(rebuildHookFn); - } - - afterCopyHooks.push(async (buildPath, electronVersion, pPlatform, pArch, done) => { - const copiedPackageJSON = await readPackageJSON(buildPath); - if (copiedPackageJSON.config && copiedPackageJSON.config.forge) { - delete copiedPackageJSON.config.forge; - } - await fs.writeJson(path.resolve(buildPath, 'package.json'), copiedPackageJSON, { spaces: 2 }); - done(); - }); - - afterCopyHooks.push(...resolveHooks(forgeConfig.electronPackagerConfig.afterCopy, dir)); - - const afterPruneHooks = []; - - if (pruneEnabled) { - afterPruneHooks.push(rebuildHookFn); - afterPruneHooks.push(...resolveHooks(forgeConfig.electronPackagerConfig.afterPrune, dir)); - } - - afterPruneHooks.push(async (buildPath, electronVersion, pPlatform, pArch, done) => { - await runHook(forgeConfig, 'packageAfterPrune', buildPath, electronVersion, pPlatform, pArch); - done(); - }); - - const packageOpts = Object.assign({ - asar: false, - overwrite: true, - }, forgeConfig.electronPackagerConfig, { - afterCopy: sequentialHooks(afterCopyHooks), - afterExtract: sequentialHooks(resolveHooks(forgeConfig.electronPackagerConfig.afterExtract, dir)), - afterPrune: sequentialHooks(afterPruneHooks), - dir, - arch, - platform, - out: outDir, - electronVersion: getElectronVersion(packageJSON), - }); - packageOpts.quiet = true; - - if (!packageJSON.version && !packageOpts.appVersion) { - // eslint-disable-next-line max-len - warn(interactive, "Please set 'version' or 'config.forge.electronPackagerConfig.appVersion' in your application's package.json so auto-updates work properly".yellow); - } - - await runHook(forgeConfig, 'generateAssets'); - await runHook(forgeConfig, 'prePackage'); - - d('packaging with options', packageOpts); - - await packager(packageOpts); - - await runHook(forgeConfig, 'postPackage'); - - packagerSpinner.succeed(); -}; diff --git a/packages/_old/src/api/publish.js b/packages/_old/src/api/publish.js deleted file mode 100644 index 04d8f09587..0000000000 --- a/packages/_old/src/api/publish.js +++ /dev/null @@ -1,155 +0,0 @@ -import 'colors'; -import debug from 'debug'; -import fs from 'fs-extra'; -import path from 'path'; - -import asyncOra from '../util/ora-handler'; -import getForgeConfig from '../util/forge-config'; -import readPackageJSON from '../util/read-package-json'; -import requireSearch from '../util/require-search'; -import resolveDir from '../util/resolve-dir'; -import PublishState from '../util/publish-state'; -import getCurrentOutDir from '../util/out-dir'; - -import make from './make'; - -const d = debug('electron-forge:publish'); - -/** - * @typedef {Object} PublishOptions - * @property {string} [dir=process.cwd()] The path to the app to be published - * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually - * @property {string} [authToken] An authentication token to use when publishing - * @property {string} [tag=packageJSON.version] The string to tag this release with - * @property {Array} [publishTargets=[github]] The publish targets - * @property {MakeOptions} [makeOptions] Options object to passed through to make() - * @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables - * @property {boolean} [dryRun=false] Whether to generate dry run meta data but not actually publish - * @property {boolean} [dryRunResume=false] Whether or not to attempt to resume a previously saved `dryRun` and publish - * @property {MakeResult} [makeResults=null] Provide results from make so that the publish step doesn't run make itself - */ - -/** - * Publish an Electron application into the given target service. - * - * @param {PublishOptions} providedOptions - Options for the Publish method - * @return {Promise} Will resolve when the publish process is complete - */ -const publish = async (providedOptions = {}) => { - // eslint-disable-next-line prefer-const, no-unused-vars - let { dir, interactive, authToken, tag, publishTargets, makeOptions, dryRun, dryRunResume, makeResults } = Object.assign({ - dir: process.cwd(), - interactive: false, - tag: null, - makeOptions: {}, - publishTargets: null, - dryRun: false, - dryRunResume: false, - makeResults: null, - }, providedOptions); - asyncOra.interactive = interactive; - - if (dryRun && dryRunResume) { - throw 'Can\'t dry run and resume a dry run at the same time'; - } - if (dryRunResume && makeResults) { - throw 'Can\'t resume a dry run and use the provided makeResults at the same time'; - } - - let packageJSON = await readPackageJSON(dir); - - const forgeConfig = await getForgeConfig(dir); - const outDir = providedOptions.outDir || getCurrentOutDir(dir, forgeConfig); - const dryRunDir = path.resolve(outDir, 'publish-dry-run'); - - if (dryRunResume) { - d('attempting to resume from dry run'); - const publishes = await PublishState.loadFromDirectory(dryRunDir, dir); - for (const publishStates of publishes) { - d('publishing for given state set'); - await publish({ - dir, - interactive, - authToken, - tag, - publishTargets, - makeOptions, - dryRun: false, - dryRunResume: false, - makeResults: publishStates.map(({ state }) => state), - }); - } - return; - } else if (!makeResults) { - d('triggering make'); - makeResults = await make(Object.assign({ - dir, - interactive, - }, makeOptions)); - } else { - // Restore values from dry run - d('restoring publish settings from dry run'); - - for (const makeResult of makeResults) { - packageJSON = makeResult.packageJSON; - makeOptions.platform = makeResult.platform; - makeOptions.arch = makeResult.arch; - - for (const makePath of makeResult.artifacts) { - if (!await fs.exists(makePath)) { - throw `Attempted to resume a dry run but an artifact (${makePath}) could not be found`; - } - } - } - } - - if (dryRun) { - d('saving results of make in dry run state', makeResults); - await fs.remove(dryRunDir); - await PublishState.saveToDirectory(dryRunDir, makeResults, dir); - return; - } - - dir = await resolveDir(dir); - if (!dir) { - throw 'Failed to locate publishable Electron application'; - } - - const artifacts = makeResults.reduce((accum, makeResult) => { - accum.push(...makeResult.artifacts); - return accum; - }, []); - - if (publishTargets === null) { - publishTargets = forgeConfig.publish_targets[makeOptions.platform || process.platform]; - } - - for (const publishTarget of publishTargets) { - let publisher; - await asyncOra(`Resolving publish target: ${`${publishTarget}`.cyan}`, async () => { // eslint-disable-line no-loop-func - publisher = requireSearch(__dirname, [ - `../publishers/${publishTarget}.js`, - `electron-forge-publisher-${publishTarget}`, - publishTarget, - path.resolve(dir, publishTarget), - path.resolve(dir, 'node_modules', publishTarget), - ]); - if (!publisher) { - throw `Could not find a publish target with the name: ${publishTarget}`; - } - }); - - await publisher({ - dir, - artifacts, - packageJSON, - forgeConfig, - authToken, - tag, - platform: makeOptions.platform || process.platform, - arch: makeOptions.arch || process.arch, - }); - } -}; - -export default publish; diff --git a/packages/_old/src/api/start.js b/packages/_old/src/api/start.js deleted file mode 100644 index e30c6c6696..0000000000 --- a/packages/_old/src/api/start.js +++ /dev/null @@ -1,98 +0,0 @@ -import 'colors'; -import { spawn } from 'child_process'; -import path from 'path'; - -import asyncOra from '../util/ora-handler'; -import readPackageJSON from '../util/read-package-json'; -import rebuild from '../util/rebuild'; -import resolveDir from '../util/resolve-dir'; -import getForgeConfig from '../util/forge-config'; -import runHook from '../util/hook'; -import getElectronVersion from '../util/electron-version'; - -/** - * @typedef {Object} StartOptions - * @property {string} [dir=process.cwd()] The path to the electron forge project to run - * @property {string} [appPath='.'] The path (relative to dir) to the electron app to run relative to the project directory - * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually - * @property {boolean} [enableLogging=false] Enables advanced internal Electron debug calls - * @property {Array} [args] Arguments to pass through to the launched Electron application - */ - -/** - * Start an Electron application. - * - * @param {StartOptions} providedOptions - Options for the Publish method - * @return {Promise} Will resolve when the application is launched - */ -export default async (providedOptions = {}) => { - // eslint-disable-next-line prefer-const, no-unused-vars - let { dir, interactive, enableLogging, appPath, args, runAsNode, inspect } = Object.assign({ - dir: process.cwd(), - appPath: '.', - interactive: false, - enableLogging: false, - args: [], - runAsNode: false, - inspect: false, - }, providedOptions); - asyncOra.interactive = interactive; - - await asyncOra('Locating Application', async () => { - dir = await resolveDir(dir); - if (!dir) { - throw 'Failed to locate startable Electron application'; - } - }); - - const packageJSON = await readPackageJSON(dir); - - if (!packageJSON.version) { - throw `Please set your application's 'version' in '${dir}/package.json'.`; - } - - const forgeConfig = await getForgeConfig(dir); - - await rebuild(dir, getElectronVersion(packageJSON), process.platform, process.arch, forgeConfig.electronRebuildConfig); - - await runHook(forgeConfig, 'generateAssets'); - - // If a plugin has taken over the start command let's stop here - const spawnedPluginChild = await forgeConfig.pluginInterface.overrideStartLogic({ - dir, - appPath, - interactive, - enableLogging, - args, - runAsNode, - inspect, - }); - if (spawnedPluginChild) return spawnedPluginChild; - - const spawnOpts = { - cwd: dir, - stdio: 'inherit', - env: Object.assign({}, process.env, enableLogging ? { - ELECTRON_ENABLE_LOGGING: true, - ELECTRON_ENABLE_STACK_DUMPING: true, - } : {}), - }; - - if (runAsNode) { - spawnOpts.env.ELECTRON_RUN_AS_NODE = true; - } else { - delete spawnOpts.env.ELECTRON_RUN_AS_NODE; - } - - if (inspect) { - args = ['--inspect'].concat(args); - } - - let spawned; - - await asyncOra('Launching Application', async () => { - spawned = spawn(process.execPath, [path.resolve(dir, 'node_modules/electron/cli'), appPath].concat(args), spawnOpts); - }); - - return spawned; -}; diff --git a/packages/_old/src/electron-forge-import.js b/packages/_old/src/electron-forge-import.js deleted file mode 100644 index c80785d45c..0000000000 --- a/packages/_old/src/electron-forge-import.js +++ /dev/null @@ -1,26 +0,0 @@ -import path from 'path'; -import program from 'commander'; - -import './util/terminate'; -import importAPI from './api/import'; - -(async () => { - let dir = process.cwd(); - program - .version(require('../package.json').version) - .arguments('[name]') - .action((name) => { - if (!name) return; - if (path.isAbsolute(name)) { - dir = name; - } else { - dir = path.resolve(dir, name); - } - }) - .parse(process.argv); - - await importAPI({ - dir, - interactive: true, - }); -})(); diff --git a/packages/_old/src/electron-forge-init.js b/packages/_old/src/electron-forge-init.js deleted file mode 100644 index 94eef629b4..0000000000 --- a/packages/_old/src/electron-forge-init.js +++ /dev/null @@ -1,32 +0,0 @@ -import path from 'path'; -import program from 'commander'; - -import './util/terminate'; -import { init } from './api'; - -(async () => { - let dir = process.cwd(); - program - .version(require('../package.json').version) - .arguments('[name]') - .option('-t, --template [name]', 'Name of the forge template to use') - .option('-c, --copy-ci-files', 'Whether to copy the templated CI files (defaults to false)', false) - .action((name) => { - if (!name) return; - if (path.isAbsolute(name)) { - dir = name; - } else { - dir = path.resolve(dir, name); - } - }) - .parse(process.argv); - - const initOpts = { - dir, - interactive: true, - copyCIFiles: !!program.copyCiFiles, - }; - if (program.template) initOpts.template = program.template; - - await init(initOpts); -})(); diff --git a/packages/_old/src/electron-forge-install.js b/packages/_old/src/electron-forge-install.js deleted file mode 100644 index 96ec7473b3..0000000000 --- a/packages/_old/src/electron-forge-install.js +++ /dev/null @@ -1,23 +0,0 @@ -import program from 'commander'; - -import './util/terminate'; -import { install } from './api'; - -(async () => { - let repo; - - program - .version(require('../package.json').version) - .arguments('[repository]') - .option('--prerelease', 'Fetch prerelease versions') - .action((repository) => { - repo = repository; - }) - .parse(process.argv); - - await install({ - repo, - interactive: true, - prerelease: program.prerelease, - }); -})(); diff --git a/packages/_old/src/electron-forge-lint.js b/packages/_old/src/electron-forge-lint.js deleted file mode 100644 index a23761588f..0000000000 --- a/packages/_old/src/electron-forge-lint.js +++ /dev/null @@ -1,27 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import program from 'commander'; - -import './util/terminate'; -import { lint } from './api'; - -(async () => { - let dir = process.cwd(); - program - .version(require('../package.json').version) - .arguments('[cwd]') - .action((cwd) => { - if (!cwd) return; - if (path.isAbsolute(cwd) && fs.existsSync(cwd)) { - dir = cwd; - } else if (fs.existsSync(path.resolve(dir, cwd))) { - dir = path.resolve(dir, cwd); - } - }) - .parse(process.argv); - - await lint({ - dir, - interactive: true, - }); -})(); diff --git a/packages/_old/src/electron-forge-make.js b/packages/_old/src/electron-forge-make.js deleted file mode 100644 index 7652294b90..0000000000 --- a/packages/_old/src/electron-forge-make.js +++ /dev/null @@ -1,47 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; -import program from 'commander'; - -import './util/terminate'; -import { make } from './api'; - -// eslint-disable-next-line import/prefer-default-export -export const getMakeOptions = () => { - let dir = process.cwd(); - program - .version(require('../package.json').version) - .arguments('[cwd]') - .option('--skip-package', 'Assume the app is already packaged') - .option('-a, --arch [arch]', 'Target architecture') - .option('-p, --platform [platform]', 'Target build platform') - .option('--targets [targets]', 'Override your make targets for this run') - .allowUnknownOption(true) - .action((cwd) => { - if (!cwd) return; - if (path.isAbsolute(cwd) && fs.existsSync(cwd)) { - dir = cwd; - } else if (fs.existsSync(path.resolve(dir, cwd))) { - dir = path.resolve(dir, cwd); - } - }) - .parse(process.argv); - - const makeOpts = { - dir, - interactive: true, - skipPackage: program.skipPackage, - }; - if (program.targets) makeOpts.overrideTargets = program.targets.split(','); - if (program.arch) makeOpts.arch = program.arch; - if (program.platform) makeOpts.platform = program.platform; - - return makeOpts; -}; - -if (process.mainModule === module || global.__LINKED_FORGE__) { - (async () => { - const makeOpts = getMakeOptions(); - - await make(makeOpts); - })(); -} diff --git a/packages/_old/src/electron-forge-package.js b/packages/_old/src/electron-forge-package.js deleted file mode 100644 index 881a2565ed..0000000000 --- a/packages/_old/src/electron-forge-package.js +++ /dev/null @@ -1,34 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; -import program from 'commander'; - -import './util/terminate'; -import packageAPI from './api/package'; - -(async () => { - let dir = process.cwd(); - - program - .version(require('../package.json').version) - .arguments('[cwd]') - .option('-a, --arch [arch]', 'Target architecture') - .option('-p, --platform [platform]', 'Target build platform') - .action((cwd) => { - if (!cwd) return; - if (path.isAbsolute(cwd) && fs.existsSync(cwd)) { - dir = cwd; - } else if (fs.existsSync(path.resolve(dir, cwd))) { - dir = path.resolve(dir, cwd); - } - }) - .parse(process.argv); - - const packageOpts = { - dir, - interactive: true, - }; - if (program.arch) packageOpts.arch = program.arch; - if (program.platform) packageOpts.platform = program.platform; - - await packageAPI(packageOpts); -})(); diff --git a/packages/_old/src/electron-forge-publish.js b/packages/_old/src/electron-forge-publish.js deleted file mode 100644 index b961d1d830..0000000000 --- a/packages/_old/src/electron-forge-publish.js +++ /dev/null @@ -1,43 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; -import program from 'commander'; - -import './util/terminate'; -import { publish } from './api'; -import { getMakeOptions } from './electron-forge-make'; - -(async () => { - let dir = process.cwd(); - program - .version(require('../package.json').version) - .arguments('[cwd]') - .option('--auth-token', 'Authorization token for your publisher target (if required)') - .option('--tag', 'The tag to publish to on GitHub') - .option('--target [target[,target...]]', 'The comma-separated deployment targets, defaults to "github"') - .option('--dry-run', 'Triggers a publish dry run which saves state and doesn\'t upload anything') - .option('--from-dry-run', 'Attempts to publish artifacts from the last saved dry run') - .allowUnknownOption(true) - .action((cwd) => { - if (!cwd) return; - if (path.isAbsolute(cwd) && fs.existsSync(cwd)) { - dir = cwd; - } else if (fs.existsSync(path.resolve(dir, cwd))) { - dir = path.resolve(dir, cwd); - } - }) - .parse(process.argv); - - const publishOpts = { - dir, - interactive: true, - authToken: program.authToken, - tag: program.tag, - dryRun: program.dryRun, - dryRunResume: program.fromDryRun, - }; - if (program.target) publishOpts.publishTargets = program.target.split(','); - - publishOpts.makeOptions = getMakeOptions(); - - await publish(publishOpts); -})(); diff --git a/packages/_old/src/electron-forge-start.js b/packages/_old/src/electron-forge-start.js deleted file mode 100644 index 237b82dbc7..0000000000 --- a/packages/_old/src/electron-forge-start.js +++ /dev/null @@ -1,73 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; -import program from 'commander'; - -import './util/terminate'; -import { start } from './api'; - -(async () => { - let commandArgs = process.argv; - let appArgs; - - const doubleDashIndex = process.argv.indexOf('--'); - if (doubleDashIndex !== -1) { - commandArgs = process.argv.slice(0, doubleDashIndex); - appArgs = process.argv.slice(doubleDashIndex + 1); - } - - let dir = process.cwd(); - program - .version(require('../package.json').version) - .arguments('[cwd]') - .option('-p, --app-path ', "Override the path to the Electron app to launch (defaults to '.')") - .option('-l, --enable-logging', 'Enable advanced logging. This will log internal Electron things') - .option('-n, --run-as-node', 'Run the Electron app as a Node.JS script') - .option('--vscode', 'Used to enable arg transformation for debugging Electron through VSCode. Do not use yourself.') - .option('-i, --inspect-electron', 'Triggers inspect mode on Electron to allow debugging the main process. Electron >1.7 only') - .action((cwd) => { - if (!cwd) return; - if (path.isAbsolute(cwd) && fs.existsSync(cwd)) { - dir = cwd; - } else if (fs.existsSync(path.resolve(dir, cwd))) { - dir = path.resolve(dir, cwd); - } - }) - .parse(commandArgs); - - program.on('--help', () => { - console.log(" Any arguments found after '--' will be passed to the Electron app, e.g."); - console.log(''); - console.log(' $ electron-forge /path/to/project -l -- -d -f foo.txt'); - console.log(''); - console.log(" will pass the arguments '-d -f foo.txt' to the Electron app"); - }); - - const opts = { - dir, - interactive: true, - enableLogging: !!program.enableLogging, - runAsNode: !!program.runAsNode, - inspect: !!program.inspectElectron, - }; - - if (program.vscode && appArgs) { - // Args are in the format ~arg~ so we need to strip the "~" - appArgs = appArgs - .map(arg => arg.substr(1, arg.length - 2)) - .filter(arg => arg.length > 0); - } - - if (program.appPath) opts.appPath = program.appPath; - if (appArgs) opts.args = appArgs; - - const spawned = await start(opts); - - await new Promise((resolve) => { - spawned.on('exit', (code) => { - if (code !== 0) { - process.exit(code); - } - resolve(); - }); - }); -})(); diff --git a/packages/_old/src/electron-forge.js b/packages/_old/src/electron-forge.js deleted file mode 100644 index f3beec6ae5..0000000000 --- a/packages/_old/src/electron-forge.js +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env node -import 'colors'; -import program from 'commander'; -import tabtab from 'tabtab'; - -import './util/terminate'; -import asyncOra from './util/ora-handler'; -import checkSystem from './util/check-system'; -import config from './util/config'; - -const originalSC = program.executeSubCommand.bind(program); -program.executeSubCommand = (argv, args, unknown) => { - let indexOfDoubleDash = process.argv.indexOf('--'); - indexOfDoubleDash = indexOfDoubleDash < 0 ? process.argv.length + 1 : indexOfDoubleDash; - - const passThroughArgs = args.filter(arg => process.argv.indexOf(arg) > indexOfDoubleDash); - const normalArgs = args.filter(arg => process.argv.indexOf(arg) <= indexOfDoubleDash); - - let newArgs = args; - let newUnknown = unknown; - if (passThroughArgs.length > 0) { - newArgs = normalArgs.concat(unknown).concat('--').concat(passThroughArgs); - newUnknown = []; - } - return originalSC(argv, newArgs, newUnknown); -}; - -program - .version(require('../package.json').version) - .option('--verbose', 'Enables verbose mode') - .command('init', 'Initialize a new Electron application') - .command('import', 'Attempts to navigate you through the process of importing an existing project to "electron-forge"') - .command('lint', 'Lints the current Electron application') - .command('package', 'Package the current Electron application') - .command('make', 'Generate distributables for the current Electron application') - .command('start', 'Start the current Electron application') - .command('publish', 'Publish the current Electron application to GitHub') - .command('install', 'Install an Electron application from GitHub'); - -const tab = tabtab({ - name: 'electron-forge', -}); -tab.on('electron-forge', (data, done) => { - if (data.line.split(' ').length <= 2) { - done( - null, - program.commands - .filter(cmd => cmd._name.startsWith(data.lastPartial)) - .map(cmd => `${cmd._name}:${cmd._description}`).sort() - ); - } else { - done(null, []); - } -}); -tab.start(); - -if (process.argv[2] !== 'completion') { - (async () => { - let goodSystem; - await asyncOra('Checking your system', async (ora) => { - goodSystem = await checkSystem(ora); - }); - - if (!goodSystem) { - console.error(('It looks like you are missing some dependencies you need to get Electron running.\n' + - 'Make sure you have git installed and Node.js version 6.0.0+').red); - process.exit(1); - } - - program.parse(process.argv); - - config.reset(); - config.set('verbose', !!program.verbose); - })(); -} diff --git a/packages/_old/src/init/init-custom.js b/packages/_old/src/init/init-custom.js deleted file mode 100644 index eb01e83c47..0000000000 --- a/packages/_old/src/init/init-custom.js +++ /dev/null @@ -1,62 +0,0 @@ -import debug from 'debug'; -import fs from 'fs-extra'; -import glob from 'glob'; -import resolvePackage from 'resolve-package'; -import path from 'path'; - -import { copy } from './init-starter-files'; -import asyncOra from '../util/ora-handler'; -import installDepList from '../util/install-dependencies'; -import ora from '../util/ora'; - -const d = debug('electron-forge:init:custom'); - -export default async (dir, template) => { - let templateModulePath; - await asyncOra(`Locating custom template: "${template}"`, async () => { - try { - templateModulePath = await resolvePackage(`electron-forge-template-${template}`); - d('using global template'); - } catch (err) { - try { - templateModulePath = require.resolve(`electron-forge-template-${template}`); - d('using local template'); - } catch (err2) { - throw `Failed to locate custom template: "${template}"\n\nTry \`npm install -g electron-forge-template-${template}\``; - } - } - }); - - let templateModule = require(templateModulePath); - - templateModule = templateModule.default || templateModule; - - await asyncOra('Installing Template Dependencies', async () => { - d('installing dependencies'); - await installDepList(dir, templateModule.dependencies || []); - d('installing devDependencies'); - await installDepList(dir, templateModule.devDependencies || [], true); - }); - - await asyncOra('Copying Template Files', async () => { - const templateDirectory = templateModule.templateDirectory; - if (templateDirectory) { - const tmplPath = templateDirectory; - if (!path.isAbsolute(templateDirectory)) { - throw `Custom template path needs to be absolute, this is an issue with "electron-forge-template-${template}"`; - } - - const files = glob.sync(path.resolve(tmplPath, '**/*')); - - for (const file of files) { - if ((await fs.stat(file)).isFile()) { - await copy(file, path.resolve(dir, path.relative(tmplPath, file).replace(/^_/, '.'))); - } - } - } - }); - - if (typeof templateModule.postCopy === 'function') { - await Promise.resolve(templateModule.postCopy(dir, ora)); - } -}; diff --git a/packages/_old/src/init/init-directory.js b/packages/_old/src/init/init-directory.js deleted file mode 100644 index 4fad521286..0000000000 --- a/packages/_old/src/init/init-directory.js +++ /dev/null @@ -1,25 +0,0 @@ -import debug from 'debug'; -import fs from 'fs-extra'; -import logSymbols from 'log-symbols'; - -import asyncOra from '../util/ora-handler'; -import confirmIfInteractive from '../util/confirm-if-interactive'; - -const d = debug('electron-forge:init:directory'); - -export default async (dir, interactive) => { - await asyncOra('Initializing Project Directory', async (initSpinner) => { - d('creating directory:', dir); - await fs.mkdirs(dir); - - const files = await fs.readdir(dir); - if (files.length !== 0) { - d('found', files.length, 'files in the directory. warning the user'); - initSpinner.stop(logSymbols.warning); - const confirm = await confirmIfInteractive(interactive, `WARNING: The specified path: "${dir}" is not empty, do you wish to continue?`); - if (!confirm) { - throw 'Cancelled by user'; // eslint-disable-line - } - } - }); -}; diff --git a/packages/_old/src/init/init-git.js b/packages/_old/src/init/init-git.js deleted file mode 100644 index 6074b8c300..0000000000 --- a/packages/_old/src/init/init-git.js +++ /dev/null @@ -1,26 +0,0 @@ -import { exec } from 'child_process'; -import debug from 'debug'; -import fs from 'fs-extra'; -import path from 'path'; - -import asyncOra from '../util/ora-handler'; - -const d = debug('electron-forge:init:git'); - -export default async (dir) => { - await asyncOra('Initializing Git Repository', async () => { - await new Promise(async (resolve, reject) => { - if (await fs.pathExists(path.resolve(dir, '.git'))) { - d('.git directory already exists, skipping git initialization'); - return resolve(); - } - d('executing "git init" in directory:', dir); - exec('git init', { - cwd: dir, - }, (err) => { - if (err) return reject(err); - resolve(); - }); - }); - }); -}; diff --git a/packages/_old/src/init/init-npm.js b/packages/_old/src/init/init-npm.js deleted file mode 100644 index b67237259e..0000000000 --- a/packages/_old/src/init/init-npm.js +++ /dev/null @@ -1,42 +0,0 @@ -import debug from 'debug'; -import fs from 'fs-extra'; -import path from 'path'; -import username from 'username'; - -import { setInitialForgeConfig } from '../util/forge-config'; -import installDepList from '../util/install-dependencies'; -import readPackageJSON from '../util/read-package-json'; -import asyncOra from '../util/ora-handler'; - -const d = debug('electron-forge:init:npm'); - -export const deps = ['electron-squirrel-startup']; -export const devDeps = ['electron-forge']; -export const exactDevDeps = ['electron']; - -export default async (dir) => { - await asyncOra('Initializing NPM Module', async () => { - const packageJSON = await readPackageJSON(path.resolve(__dirname, '../../tmpl')); - packageJSON.productName = packageJSON.name = path.basename(dir).toLowerCase(); - packageJSON.author = await username(); - setInitialForgeConfig(packageJSON); - - packageJSON.scripts.lint = 'echo "No linting configured"'; - - d('writing package.json to:', dir); - await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON, { spaces: 2 }); - }); - - await asyncOra('Installing NPM Dependencies', async () => { - d('installing dependencies'); - await installDepList(dir, deps); - - d('installing devDependencies'); - await installDepList(dir, devDeps, true); - - d('installing exact dependencies'); - for (const packageName of exactDevDeps) { - await installDepList(dir, [packageName], true, true); - } - }); -}; diff --git a/packages/_old/src/init/init-starter-files.js b/packages/_old/src/init/init-starter-files.js deleted file mode 100644 index e54e662b0c..0000000000 --- a/packages/_old/src/init/init-starter-files.js +++ /dev/null @@ -1,31 +0,0 @@ -import debug from 'debug'; -import fs from 'fs-extra'; -import path from 'path'; - -import asyncOra from '../util/ora-handler'; - -const d = debug('electron-forge:init:starter-files'); - -export const copy = async (source, target) => { - d(`copying "${source}" --> "${target}"`); - await fs.copy(source, target); -}; - -export default async (dir, { copyCIFiles }) => { - await asyncOra('Copying Starter Files', async () => { - const tmplPath = path.resolve(__dirname, '../../tmpl'); - - d('creating directory:', path.resolve(dir, 'src')); - await fs.mkdirs(path.resolve(dir, 'src')); - const rootFiles = ['_gitignore']; - if (copyCIFiles) rootFiles.push(...['_travis.yml', '_appveyor.yml']); - const srcFiles = ['index.js', 'index.html']; - - for (const file of rootFiles) { - await copy(path.resolve(tmplPath, file), path.resolve(dir, file.replace(/^_/, '.'))); - } - for (const file of srcFiles) { - await copy(path.resolve(tmplPath, file), path.resolve(dir, 'src', file)); - } - }); -}; diff --git a/packages/_old/src/installers/darwin/dmg.js b/packages/_old/src/installers/darwin/dmg.js deleted file mode 100644 index 1c76675f72..0000000000 --- a/packages/_old/src/installers/darwin/dmg.js +++ /dev/null @@ -1,31 +0,0 @@ -import spawnPromise from 'cross-spawn-promise'; -import fs from 'fs-extra'; -import path from 'path'; - -import { getMountedImages, mountImage, unmountImage } from '../../util/hdiutil'; -import moveApp from '../../util/move-app'; - -export default async (filePath, installSpinner) => { - const mounts = await getMountedImages(); - let targetMount = mounts.find(mount => mount.imagePath === filePath); - - if (!targetMount) { - targetMount = await mountImage(filePath); - } - - try { - const volumePath = path.resolve('/Volumes', targetMount.mountPath); - const appName = (await fs.readdir(volumePath)).find(file => file.endsWith('.app')); - if (!appName) { - throw 'Failed to find .app file in DMG'; - } - const appPath = path.resolve(volumePath, appName); - const targetApplicationPath = `/Applications/${path.basename(appPath)}`; - - await moveApp(appPath, targetApplicationPath, installSpinner, true); - - await spawnPromise('open', ['-R', targetApplicationPath], { detached: true }); - } finally { - await unmountImage(targetMount); - } -}; diff --git a/packages/_old/src/installers/darwin/zip.js b/packages/_old/src/installers/darwin/zip.js deleted file mode 100644 index 3f4bba322d..0000000000 --- a/packages/_old/src/installers/darwin/zip.js +++ /dev/null @@ -1,20 +0,0 @@ -import spawnPromise from 'cross-spawn-promise'; -import fs from 'fs-extra'; -import path from 'path'; -import moveApp from '../../util/move-app'; - -export default async (filePath, installSpinner) => { - await spawnPromise('unzip', ['-q', '-o', path.basename(filePath)], { - cwd: path.dirname(filePath), - }); - - const appPath = (await fs.readdir(path.dirname(filePath))).filter(file => file.endsWith('.app')) - .map(file => path.resolve(path.dirname(filePath), file)) - .sort((fA, fB) => fs.statSync(fA).ctime.getTime() - fs.statSync(fB).ctime.getTime())[0]; - - const targetApplicationPath = `/Applications/${path.basename(appPath)}`; - - await moveApp(appPath, targetApplicationPath, installSpinner); - - await spawnPromise('open', ['-R', targetApplicationPath], { detached: true }); -}; diff --git a/packages/_old/src/installers/linux/deb.js b/packages/_old/src/installers/linux/deb.js deleted file mode 100644 index 04c4a7b7c7..0000000000 --- a/packages/_old/src/installers/linux/deb.js +++ /dev/null @@ -1,5 +0,0 @@ -import { sudo } from '../../util/linux-installer'; - -export default async (filePath) => { - await sudo('Debian', 'gdebi', `-n ${filePath}`); -}; diff --git a/packages/_old/src/installers/linux/rpm.js b/packages/_old/src/installers/linux/rpm.js deleted file mode 100644 index 687ce5e871..0000000000 --- a/packages/_old/src/installers/linux/rpm.js +++ /dev/null @@ -1,5 +0,0 @@ -import { sudo } from '../../util/linux-installer'; - -export default async (filePath) => { - await sudo('RPM', 'dnf', `--assumeyes --nogpgcheck install ${filePath}`); -}; diff --git a/packages/_old/src/installers/win32/exe.js b/packages/_old/src/installers/win32/exe.js deleted file mode 100644 index 526b48ce52..0000000000 --- a/packages/_old/src/installers/win32/exe.js +++ /dev/null @@ -1,3 +0,0 @@ -import opn from 'opn'; - -export default async filePath => await opn(filePath, { wait: false }); diff --git a/packages/_old/src/makers/darwin/dmg.js b/packages/_old/src/makers/darwin/dmg.js deleted file mode 100644 index 0906fad681..0000000000 --- a/packages/_old/src/makers/darwin/dmg.js +++ /dev/null @@ -1,32 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; -import pify from 'pify'; - -import { ensureFile } from '../../util/ensure-output'; -import configFn from '../../util/config-fn'; - -// electron-installer-dmg doesn't set its 'os' field even though it depends on -// appdmg, which is darwin-only -export const isSupportedOnCurrentPlatform = async () => process.platform === 'darwin'; - -export default async ({ dir, appName, targetArch, forgeConfig, packageJSON }) => { - const electronDMG = require('electron-installer-dmg'); - - const userConfig = configFn(forgeConfig.electronInstallerDMG, targetArch); - - const outPath = path.resolve(dir, '../make', `${userConfig.name || appName}.dmg`); - const wantedOutPath = path.resolve(dir, '../make', `${appName}-${packageJSON.version}.dmg`); - await ensureFile(outPath); - const dmgConfig = Object.assign({ - overwrite: true, - name: appName, - }, userConfig, { - appPath: path.resolve(dir, `${appName}.app`), - out: path.dirname(outPath), - }); - await pify(electronDMG)(dmgConfig); - if (!userConfig.name) { - await fs.rename(outPath, wantedOutPath); - } - return [wantedOutPath]; -}; diff --git a/packages/_old/src/makers/generic/zip.js b/packages/_old/src/makers/generic/zip.js deleted file mode 100644 index 6eafe5574b..0000000000 --- a/packages/_old/src/makers/generic/zip.js +++ /dev/null @@ -1,48 +0,0 @@ -import { spawn } from 'child_process'; -import path from 'path'; -import pify from 'pify'; - -import { ensureFile } from '../../util/ensure-output'; - -export const isSupportedOnCurrentPlatform = async () => true; - -const zipPromise = (from, to) => - new Promise((resolve, reject) => { - const child = spawn('zip', ['-r', '-y', to, path.basename(from)], { - cwd: path.dirname(from), - }); - - child.stdout.on('data', () => {}); - child.stderr.on('data', () => {}); - - child.on('close', (code) => { - if (code === 0) return resolve(); - reject(new Error(`Failed to zip, exitted with code: ${code}`)); - }); - }); - -export default async ({ dir, appName, targetPlatform, packageJSON }) => { - const zipFolder = require('zip-folder'); - - const zipPath = path.resolve(dir, '../make', `${path.basename(dir)}-${packageJSON.version}.zip`); - await ensureFile(zipPath); - switch (targetPlatform) { - // This case is tested but not on the coverage reporting platform - /* istanbul ignore next */ - case 'win32': - await pify(zipFolder)(dir, zipPath); - break; - case 'mas': - case 'darwin': - await zipPromise(path.resolve(dir, `${appName}.app`), zipPath); - break; - // This case is tested but not on the coverage reporting platform - /* istanbul ignore next */ - case 'linux': - await zipPromise(dir, zipPath); - break; - default: - throw new Error('Unrecognized platform'); - } - return [zipPath]; -}; diff --git a/packages/_old/src/makers/linux/deb.js b/packages/_old/src/makers/linux/deb.js deleted file mode 100644 index 854b275f7c..0000000000 --- a/packages/_old/src/makers/linux/deb.js +++ /dev/null @@ -1,38 +0,0 @@ -import path from 'path'; - -import { ensureFile } from '../../util/ensure-output'; -import isInstalled from '../../util/is-installed'; -import { linuxConfig, populateConfig } from '../../util/linux-config'; - -export const isSupportedOnCurrentPlatform = async () => isInstalled('electron-installer-debian'); - -export function debianArch(nodeArch) { - switch (nodeArch) { - case 'ia32': return 'i386'; - case 'x64': return 'amd64'; - case 'armv7l': return 'armhf'; - case 'arm': return 'armel'; - default: return nodeArch; - } -} - -export default async ({ dir, targetArch, forgeConfig, packageJSON }) => { - const installer = require('electron-installer-debian'); - - const arch = debianArch(targetArch); - const config = populateConfig({ forgeConfig, configKey: 'electronInstallerDebian', targetArch }); - const name = config.options.name || packageJSON.name; - const versionedName = `${name}_${packageJSON.version}_${arch}`; - const outPath = path.resolve(dir, '../make', `${versionedName}.deb`); - - await ensureFile(outPath); - const debianConfig = linuxConfig({ - config, - pkgArch: arch, - dir, - outPath, - }); - - await installer(debianConfig); - return [outPath]; -}; diff --git a/packages/_old/src/makers/linux/flatpak.js b/packages/_old/src/makers/linux/flatpak.js deleted file mode 100644 index 3fb8dd19bf..0000000000 --- a/packages/_old/src/makers/linux/flatpak.js +++ /dev/null @@ -1,43 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; -import pify from 'pify'; - -import { ensureDirectory } from '../../util/ensure-output'; -import isInstalled from '../../util/is-installed'; -import { linuxConfig, populateConfig } from '../../util/linux-config'; - -export const isSupportedOnCurrentPlatform = async () => isInstalled('electron-installer-flatpak'); - -export function flatpakArch(nodeArch) { - switch (nodeArch) { - case 'ia32': return 'i386'; - case 'x64': return 'x86_64'; - case 'armv7l': return 'arm'; - // arm => arm - default: return nodeArch; - } -} - -export default async ({ dir, targetArch, forgeConfig }) => { - const installer = require('electron-installer-flatpak'); - - const arch = flatpakArch(targetArch); - const config = populateConfig({ forgeConfig, configKey: 'electronInstallerFlatpak', targetArch }); - const outDir = path.resolve(dir, '../make'); - - await ensureDirectory(outDir); - const flatpakConfig = linuxConfig({ - config, - pkgArch: arch, - dir, - // electron-installer-flatpak uses a filename scheme with default config options that we don't - // have access to, so we need to detect the flatpak filename after it's created. - outPath: path.join(outDir, 'dummy.flatpak'), - }); - - await pify(installer)(flatpakConfig); - - return (await fs.readdir(outDir)) - .filter(basename => basename.endsWith('.flatpak')) - .map(basename => path.join(outDir, basename)); -}; diff --git a/packages/_old/src/makers/linux/rpm.js b/packages/_old/src/makers/linux/rpm.js deleted file mode 100644 index b0bb729aed..0000000000 --- a/packages/_old/src/makers/linux/rpm.js +++ /dev/null @@ -1,39 +0,0 @@ -import path from 'path'; -import pify from 'pify'; - -import { ensureFile } from '../../util/ensure-output'; -import isInstalled from '../../util/is-installed'; -import { linuxConfig, populateConfig } from '../../util/linux-config'; - -export const isSupportedOnCurrentPlatform = async () => isInstalled('electron-installer-redhat'); - -export function rpmArch(nodeArch) { - switch (nodeArch) { - case 'ia32': return 'i386'; - case 'x64': return 'x86_64'; - case 'armv7l': return 'armv7hl'; - case 'arm': return 'armv6hl'; - default: return nodeArch; - } -} - -export default async ({ dir, targetArch, forgeConfig, packageJSON }) => { - const installer = require('electron-installer-redhat'); - - const arch = rpmArch(targetArch); - const config = populateConfig({ forgeConfig, configKey: 'electronInstallerRedhat', targetArch }); - const name = config.options.name || packageJSON.name; - const versionedName = `${name}-${packageJSON.version}.${arch}`; - const outPath = path.resolve(dir, '../make', `${versionedName}.rpm`); - - await ensureFile(outPath); - const rpmConfig = linuxConfig({ - config, - pkgArch: arch, - dir, - outPath, - }); - - await pify(installer)(rpmConfig); - return [outPath]; -}; diff --git a/packages/_old/src/makers/linux/snap.js b/packages/_old/src/makers/linux/snap.js deleted file mode 100644 index b214ea0704..0000000000 --- a/packages/_old/src/makers/linux/snap.js +++ /dev/null @@ -1,22 +0,0 @@ -import path from 'path'; - -import { ensureDirectory } from '../../util/ensure-output'; -import configFn from '../../util/config-fn'; - -export const isSupportedOnCurrentPlatform = async () => process.platform === 'linux'; - -export default async ({ dir, targetArch, forgeConfig }) => { - const installer = require('electron-installer-snap'); - - const outPath = path.resolve(dir, '../make'); - - await ensureDirectory(outPath); - const snapDefaults = { - arch: targetArch, - dest: outPath, - src: dir, - }; - const snapConfig = Object.assign({}, configFn(forgeConfig.electronInstallerSnap, targetArch), snapDefaults); - - return [await installer(snapConfig)]; -}; diff --git a/packages/_old/src/makers/win32/appx.js b/packages/_old/src/makers/win32/appx.js deleted file mode 100644 index 94bd9a61f9..0000000000 --- a/packages/_old/src/makers/win32/appx.js +++ /dev/null @@ -1,102 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import resolveCommand from 'cross-spawn/lib/util/resolveCommand'; -import windowsStore from 'electron-windows-store'; -import { isValidPublisherName, makeCert } from 'electron-windows-store/lib/sign'; - -import configFn from '../../util/config-fn'; -import getNameFromAuthor from '../../util/author-name'; -import { ensureDirectory } from '../../util/ensure-output'; - -// electron-windows-store doesn't set its 'os' field even though it only runs on -// win32 -export const isSupportedOnCurrentPlatform = async () => process.platform === 'win32'; - -// NB: This is not a typo, we require AppXs to be built on 64-bit -// but if we're running in a 32-bit node.js process, we're going to -// be Wow64 redirected -const windowsSdkPath = process.arch === 'x64' ? - 'C:\\Program Files (x86)\\Windows Kits\\10\\bin\\x64' : - 'C:\\Program Files\\Windows Kits\\10\\bin\\x64'; - -function findSdkTool(exe) { - let sdkTool = path.join(windowsSdkPath, exe); - if (!fs.existsSync(sdkTool)) { - sdkTool = resolveCommand(exe, true); - } - - if (!fs.existsSync(sdkTool)) { - throw new Error(`Can't find ${exe} in PATH. You probably need to install the Windows SDK.`); - } - - return sdkTool; -} - -export async function createDefaultCertificate(publisherName, { certFilePath, certFileName, install, program }) { - const makeCertOptions = { - publisherName, - certFilePath: certFilePath || process.cwd(), - certFileName: certFileName || 'default', - install: typeof install === 'boolean' ? install : false, - program: program || { windowsKit: path.dirname(findSdkTool('makecert.exe')) }, - }; - - if (!isValidPublisherName(publisherName)) { - throw new Error(`Received invalid publisher name: '${publisherName}' did not conform to X.500 distinguished name syntax for MakeCert.`); - } - - return await makeCert(makeCertOptions); -} - -function getDistinguishedNameFromAuthor(author) { - return `CN=${getNameFromAuthor(author)}`; -} - -export default async ({ dir, appName, targetArch, forgeConfig, packageJSON }) => { - const outPath = path.resolve(dir, `../make/appx/${targetArch}`); - await ensureDirectory(outPath); - - const userConfig = configFn(forgeConfig.windowsStoreConfig, targetArch); - - const opts = Object.assign({ - publisher: getDistinguishedNameFromAuthor(packageJSON.author), - flatten: false, - deploy: false, - packageVersion: `${packageJSON.version}.0`, - packageName: appName.replace(/-/g, ''), - packageDisplayName: appName, - packageDescription: packageJSON.description || appName, - packageExecutable: `app\\${appName}.exe`, - windowsKit: userConfig.windowsKit || path.dirname(findSdkTool('makeappx.exe')), - }, userConfig, { - inputDirectory: dir, - outputDirectory: outPath, - }); - - if (!opts.publisher) { - throw 'Please set config.forge.windowsStoreConfig.publisher or author.name in package.json for the appx target'; - } - - if (!opts.devCert) { - opts.devCert = await createDefaultCertificate(opts.publisher, { certFilePath: outPath, program: opts }); - } - - if (opts.packageVersion.match(/-/)) { - if (opts.makeVersionWinStoreCompatible) { - const noBeta = opts.packageVersion.replace(/-.*/, ''); - opts.packageVersion = `${noBeta}.0`; - } else { - const err = "Windows Store version numbers don't support semver beta tags. To" + - 'automatically fix this, set makeVersionWinStoreCompatible to true or ' + - 'explicitly set packageVersion to a version of the format X.Y.Z.A'; - - throw new Error(err); - } - } - - delete opts.makeVersionWinStoreCompatible; - - await windowsStore(opts); - - return [path.resolve(outPath, `${opts.packageName}.appx`)]; -}; diff --git a/packages/_old/src/makers/win32/squirrel.js b/packages/_old/src/makers/win32/squirrel.js deleted file mode 100644 index 7cc221f89f..0000000000 --- a/packages/_old/src/makers/win32/squirrel.js +++ /dev/null @@ -1,42 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; - -import { ensureDirectory } from '../../util/ensure-output'; -import configFn from '../../util/config-fn'; -import isInstalled from '../../util/is-installed'; - -export const isSupportedOnCurrentPlatform = async () => isInstalled('electron-winstaller'); - -export default async ({ dir, appName, targetArch, forgeConfig, packageJSON }) => { - const { createWindowsInstaller } = require('electron-winstaller'); - - const outPath = path.resolve(dir, `../make/squirrel.windows/${targetArch}`); - await ensureDirectory(outPath); - - const winstallerConfig = Object.assign({ - name: appName, - noMsi: true, - exe: `${appName}.exe`, - setupExe: `${appName}-${packageJSON.version} Setup.exe`, - }, configFn(forgeConfig.electronWinstallerConfig, targetArch), { - appDirectory: dir, - outputDirectory: outPath, - }); - - await createWindowsInstaller(winstallerConfig); - - const artifacts = [ - path.resolve(outPath, 'RELEASES'), - path.resolve(outPath, winstallerConfig.setupExe || `${appName}Setup.exe`), - path.resolve(outPath, `${winstallerConfig.name}-${packageJSON.version}-full.nupkg`), - ]; - const deltaPath = path.resolve(outPath, `${winstallerConfig.name}-${packageJSON.version}-delta.nupkg`); - if (winstallerConfig.remoteReleases || await fs.pathExists(deltaPath)) { - artifacts.push(deltaPath); - } - const msiPath = path.resolve(outPath, winstallerConfig.setupMsi || `${appName}Setup.msi`); - if (!winstallerConfig.noMsi && await fs.pathExists(msiPath)) { - artifacts.push(msiPath); - } - return artifacts; -}; diff --git a/packages/_old/src/makers/win32/wix.js b/packages/_old/src/makers/win32/wix.js deleted file mode 100644 index f5eccb0bea..0000000000 --- a/packages/_old/src/makers/win32/wix.js +++ /dev/null @@ -1,31 +0,0 @@ -import path from 'path'; - -import { ensureDirectory } from '../../util/ensure-output'; -import getNameFromAuthor from '../../util/author-name'; -import configFn from '../../util/config-fn'; - -// electron-wix-msi doesn't set its 'os' field even though it only runs on win32 -export const isSupportedOnCurrentPlatform = async () => process.platform === 'win32'; - -export default async ({ dir, appName, targetArch, forgeConfig, packageJSON }) => { - const { MSICreator } = require('electron-wix-msi'); - - const outPath = path.resolve(dir, `../make/wix/${targetArch}`); - await ensureDirectory(outPath); - - const creator = new MSICreator(Object.assign({ - description: packageJSON.description, - name: appName, - version: packageJSON.version, - manufacturer: getNameFromAuthor(packageJSON.author), - exe: `${appName}.exe`, - }, configFn(forgeConfig.electronWixMSIConfig, targetArch), { - appDirectory: dir, - outputDirectory: outPath, - })); - - await creator.create(); - const { msiFile } = await creator.compile(); - - return [msiFile]; -}; diff --git a/packages/_old/src/publishers/electron-release-server.js b/packages/_old/src/publishers/electron-release-server.js deleted file mode 100644 index 8bc693d8dc..0000000000 --- a/packages/_old/src/publishers/electron-release-server.js +++ /dev/null @@ -1,114 +0,0 @@ -import debug from 'debug'; -import fetch from 'node-fetch'; -import FormData from 'form-data'; -import fs from 'fs-extra'; -import path from 'path'; - -import asyncOra from '../util/ora-handler'; - -const d = debug('electron-forge:publish:ers'); - -const ersPlatform = (platform, arch) => { - switch (platform) { - case 'darwin': - return 'osx_64'; - case 'linux': - return arch === 'ia32' ? 'linux_32' : 'linux_64'; - case 'win32': - return arch === 'ia32' ? 'windows_32' : 'windows_64'; - default: - return platform; - } -}; - -export default async ({ artifacts, packageJSON, forgeConfig, platform, arch }) => { - const ersConfig = forgeConfig.electronReleaseServer; - if (!(ersConfig.baseUrl && ersConfig.username && ersConfig.password)) { - throw 'In order to publish to ERS you must set the "electronReleaseServer.baseUrl", "electronReleaseServer.username" and "electronReleaseServer.password" properties in your forge config. See the docs for more info'; // eslint-disable-line - } - - d('attempting to authenticate to ERS'); - - const api = apiPath => `${ersConfig.baseUrl}/${apiPath}`; - - const { token } = await (await fetch(api('api/auth/login'), { - method: 'POST', - body: JSON.stringify({ - username: ersConfig.username, - password: ersConfig.password, - }), - headers: { - 'Content-Type': 'application/json', - }, - })).json(); - - const authFetch = (apiPath, options) => fetch(api(apiPath), Object.assign({}, options || {}, { - headers: Object.assign({}, (options || {}).headers, { Authorization: `Bearer ${token}` }), - })); - - const versions = await (await authFetch('api/version')).json(); - const existingVersion = versions.find(version => version.name === packageJSON.version); - - let channel = 'stable'; - if (packageJSON.version.indexOf('beta') !== -1) { - channel = 'beta'; - } - if (packageJSON.version.indexOf('alpha') !== -1) { - channel = 'alpha'; - } - - if (!existingVersion) { - await authFetch('api/version', { - method: 'POST', - body: JSON.stringify({ - channel: { - name: channel, - }, - name: packageJSON.version, - notes: '', - }), - headers: { - 'Content-Type': 'application/json', - }, - }); - } - - let uploaded = 0; - await asyncOra(`Uploading Artifacts ${uploaded}/${artifacts.length}`, async (uploadSpinner) => { - const updateSpinner = () => { - uploadSpinner.text = `Uploading Artifacts ${uploaded}/${artifacts.length}`; // eslint-disable-line no-param-reassign - }; - - await Promise.all(artifacts.map(artifactPath => - new Promise(async (resolve, reject) => { - if (existingVersion) { - const existingAsset = existingVersion.assets.find(asset => asset.name === path.basename(artifactPath)); - if (existingAsset) { - d('asset at path:', artifactPath, 'already exists on server'); - uploaded += 1; - updateSpinner(); - return; - } - } - try { - d('attempting to upload asset:', artifactPath); - const artifactForm = new FormData(); - artifactForm.append('token', token); - artifactForm.append('version', packageJSON.version); - artifactForm.append('platform', ersPlatform(platform, arch)); - artifactForm.append('file', fs.createReadStream(artifactPath)); - await authFetch('api/asset', { - method: 'POST', - body: artifactForm, - headers: artifactForm.getHeaders(), - }); - d('upload successful for asset:', artifactPath); - uploaded += 1; - updateSpinner(); - } catch (err) { - reject(err); - } - }) - )); - }); -}; diff --git a/packages/_old/src/publishers/github.js b/packages/_old/src/publishers/github.js deleted file mode 100644 index 940b723e77..0000000000 --- a/packages/_old/src/publishers/github.js +++ /dev/null @@ -1,72 +0,0 @@ -import fs from 'fs-extra'; -import mime from 'mime-types'; -import path from 'path'; - -import asyncOra from '../util/ora-handler'; -import GitHub from '../util/github'; - -export default async ({ artifacts, packageJSON, forgeConfig, authToken, tag }) => { - if (!(forgeConfig.github_repository && typeof forgeConfig.github_repository === 'object' && - forgeConfig.github_repository.owner && forgeConfig.github_repository.name)) { - throw 'In order to publish to github you must set the "github_repository.owner" and "github_repository.name" properties in your forge config. See the docs for more info'; // eslint-disable-line - } - - const github = new GitHub(authToken, true, forgeConfig.github_repository.options); - - let release; - await asyncOra('Searching for target release', async () => { - try { - release = (await github.getGitHub().repos.getReleases({ - owner: forgeConfig.github_repository.owner, - repo: forgeConfig.github_repository.name, - per_page: 100, - })).data.find(testRelease => testRelease.tag_name === (tag || `v${packageJSON.version}`)); - if (!release) { - throw { code: 404 }; - } - } catch (err) { - if (err.code === 404) { - // Release does not exist, let's make it - release = (await github.getGitHub().repos.createRelease({ - owner: forgeConfig.github_repository.owner, - repo: forgeConfig.github_repository.name, - tag_name: tag || `v${packageJSON.version}`, - name: tag || `v${packageJSON.version}`, - draft: forgeConfig.github_repository.draft !== false, - prerelease: forgeConfig.github_repository.prerelease === true, - })).data; - } else { - // Unknown error - throw err; - } - } - }); - - let uploaded = 0; - await asyncOra(`Uploading Artifacts ${uploaded}/${artifacts.length}`, async (uploadSpinner) => { - const updateSpinner = () => { - uploadSpinner.text = `Uploading Artifacts ${uploaded}/${artifacts.length}`; // eslint-disable-line - }; - - await Promise.all(artifacts.map(artifactPath => - new Promise(async (resolve) => { - const done = () => { - uploaded += 1; - updateSpinner(); - resolve(); - }; - if (release.assets.find(asset => asset.name === path.basename(artifactPath))) { - return done(); - } - await github.getGitHub().repos.uploadAsset({ - url: release.upload_url, - file: fs.createReadStream(artifactPath), - contentType: mime.lookup(artifactPath) || 'application/octet-stream', - contentLength: (await fs.stat(artifactPath)).size, - name: path.basename(artifactPath), - }); - return done(); - }) - )); - }); -}; diff --git a/packages/_old/src/publishers/s3.js b/packages/_old/src/publishers/s3.js deleted file mode 100644 index 1e9349acb8..0000000000 --- a/packages/_old/src/publishers/s3.js +++ /dev/null @@ -1,72 +0,0 @@ -import AWS from 'aws-sdk'; -import debug from 'debug'; -import path from 'path'; -import s3 from 's3'; - -import asyncOra from '../util/ora-handler'; - -const d = debug('electron-forge:publish:s3'); - -AWS.util.update(AWS.S3.prototype, { - addExpect100Continue: function addExpect100Continue() { - // Hack around large upload issue: https://github.com/andrewrk/node-s3-client/issues/74 - }, -}); - -export default async ({ artifacts, packageJSON, forgeConfig, authToken, tag }) => { - const s3Config = forgeConfig.s3; - - s3Config.secretAccessKey = s3Config.secretAccessKey || authToken; - - const s3Client = new AWS.S3({ - accessKeyId: s3Config.accessKeyId, - secretAccessKey: s3Config.secretAccessKey, - }); - - if (!s3Client.config.credentials || !s3Config.bucket) { - throw 'In order to publish to s3 you must set the "s3.accessKeyId", "process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY" and "s3.bucket" properties in your forge config. See the docs for more info'; // eslint-disable-line - } - - d('creating s3 client with options:', s3Config); - - const client = s3.createClient({ - s3Client, - }); - client.s3.addExpect100Continue = () => {}; - - const folder = s3Config.folder || tag || packageJSON.version; - - let uploaded = 0; - await asyncOra(`Uploading Artifacts ${uploaded}/${artifacts.length}`, async (uploadSpinner) => { - const updateSpinner = () => { - uploadSpinner.text = `Uploading Artifacts ${uploaded}/${artifacts.length}`; // eslint-disable-line - }; - - await Promise.all(artifacts.map(artifactPath => - new Promise(async (resolve, reject) => { - const done = (err) => { - if (err) return reject(err); - uploaded += 1; - updateSpinner(); - resolve(); - }; - - const uploader = client.uploadFile({ - localFile: artifactPath, - s3Params: { - Bucket: s3Config.bucket, - Key: `${folder}/${path.basename(artifactPath)}`, - ACL: s3Config.public ? 'public-read' : 'private', - }, - }); - d('uploading:', artifactPath); - - uploader.on('error', err => done(err)); - uploader.on('progress', () => { - d(`Upload Progress (${path.basename(artifactPath)}) ${Math.round((uploader.progressAmount / uploader.progressTotal) * 100)}%`); - }); - uploader.on('end', () => done()); - }) - )); - }); -}; diff --git a/packages/_old/src/publishers/snapcraft.js b/packages/_old/src/publishers/snapcraft.js deleted file mode 100644 index 49ccf41536..0000000000 --- a/packages/_old/src/publishers/snapcraft.js +++ /dev/null @@ -1,28 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; -import Snapcraft from 'electron-installer-snap/snapcraft'; - -import asyncOra from '../util/ora-handler'; - -/** - * `forgeConfig.snapStore`: - * * `release`: comma-separated list of channels to release to - */ -export default async ({ dir, artifacts, forgeConfig }) => { - const snapArtifacts = artifacts.filter(artifact => artifact.endsWith('.snap')); - - if (snapArtifacts.length === 0) { - throw 'No snap files to upload. Please ensure that "snap" is listed in the "make_targets" in Forge config.'; - } - - const snapcraftCfgPath = path.join(dir, '.snapcraft', 'snapcraft.cfg'); - - if (!await fs.pathExists(snapcraftCfgPath)) { - throw `Snapcraft credentials not found at "${snapcraftCfgPath}". It can be generated with the command "snapcraft export-login" (snapcraft 2.37 and above).`; - } - - await asyncOra('Pushing snap to the snap store', async () => { - const snapcraft = new Snapcraft(); - await snapcraft.run(dir, 'push', forgeConfig.snapStore, snapArtifacts); - }); -}; diff --git a/packages/_old/src/util/author-name.js b/packages/_old/src/util/author-name.js deleted file mode 100644 index 944c6febb9..0000000000 --- a/packages/_old/src/util/author-name.js +++ /dev/null @@ -1,19 +0,0 @@ -import parseAuthor from 'parse-author'; - -export default function getNameFromAuthor(author) { - let publisher = author || ''; - - if (typeof publisher === 'string') { - publisher = parseAuthor(publisher); - } - - if (typeof publisher.name === 'string') { - publisher = publisher.name; - } - - if (typeof publisher !== 'string') { - publisher = ''; - } - - return publisher; -} diff --git a/packages/_old/src/util/check-system.js b/packages/_old/src/util/check-system.js deleted file mode 100644 index 3332255764..0000000000 --- a/packages/_old/src/util/check-system.js +++ /dev/null @@ -1,71 +0,0 @@ -import { exec } from 'child_process'; -import debug from 'debug'; -import semver from 'semver'; - -import { hasYarn, yarnOrNpmSpawn } from './yarn-or-npm'; - -const d = debug('electron-forge:check-system'); - -async function checkGitExists() { - return new Promise((resolve) => { - exec('git --version', (err) => { - if (err) return resolve(false); - resolve(true); - }); - }); -} - -async function checkNodeVersion() { - return Promise.resolve(semver.gt(process.versions.node, '6.0.0')); -} - -const NPM_WHITELISTED_VERSIONS = { - all: '^3.0.0 || ^4.0.0 || ~5.1.0 || ~5.2.0 || >= 5.4.2', - darwin: '>= 5.4.0', - linux: '>= 5.4.0', -}; -const YARN_WHITELISTED_VERSIONS = { - all: '0.23.3 || 0.24.6 || >= 1.0.0', - darwin: '0.27.5', - linux: '0.27.5', -}; - -export function validPackageManagerVersion(packageManager, version, whitelistedVersions, ora) { - try { - return semver.satisfies(version, whitelistedVersions); - } catch (e) { - ora.warn(`Could not check ${packageManager} version "${version}", assuming incompatible`); - d(`Exception while checking version: ${e}`); - return false; - } -} - -function warnIfPackageManagerIsntAKnownGoodVersion(packageManager, version, whitelistedVersions, ora) { - const osVersions = whitelistedVersions[process.platform]; - const versions = osVersions ? `${whitelistedVersions.all} || ${osVersions}` : whitelistedVersions.all; - const versionString = version.toString(); - if (!validPackageManagerVersion(packageManager, versionString, versions, ora)) { - ora.warn( - `You are using ${packageManager}, but not a known good version.\n` + - `The known versions that work with Electron Forge are: ${versions}` - ); - } -} - -async function checkPackageManagerVersion(ora) { - return yarnOrNpmSpawn(['--version']) - .then((version) => { - if (hasYarn()) { - warnIfPackageManagerIsntAKnownGoodVersion('Yarn', version, YARN_WHITELISTED_VERSIONS, ora); - } else { - warnIfPackageManagerIsntAKnownGoodVersion('NPM', version, NPM_WHITELISTED_VERSIONS, ora); - } - - return true; - }); -} - -export default async function (ora) { - return (await Promise.all([checkGitExists(ora), checkNodeVersion(ora), checkPackageManagerVersion(ora)])) - .every(check => check); -} diff --git a/packages/_old/src/util/config-fn.js b/packages/_old/src/util/config-fn.js deleted file mode 100644 index 39f6341275..0000000000 --- a/packages/_old/src/util/config-fn.js +++ /dev/null @@ -1,6 +0,0 @@ -export default (configObject, ...args) => { - if (typeof configObject === 'function') { - return configObject(...args); - } - return configObject; -}; diff --git a/packages/_old/src/util/config.js b/packages/_old/src/util/config.js deleted file mode 100644 index 787200e485..0000000000 --- a/packages/_old/src/util/config.js +++ /dev/null @@ -1,49 +0,0 @@ -import debug from 'debug'; -import fs from 'fs-extra'; -import os from 'os'; -import path from 'path'; - -const d = debug('electron-forge:runtime-config'); - -/* - * Let's be real: sharing config across spawned processes must be easier than - * this... - */ -class BasicConfigStore { - constructor() { - this._store = {}; - this._dir = path.resolve(os.tmpdir(), 'electron-forge'); - this._path = path.resolve(this._dir, '.runtime.config'); - fs.mkdirsSync(this._dir); - - process.on('exit', () => { - this.reset(); - }); - } - - get(key) { - this._load(); - d('fetching key', key); - return this._store[key]; - } - - set(key, value) { - this._load(); - this._store[key] = value; - d('setting key:', key, 'to value:', value); - fs.writeJsonSync(this._path, this._store); - } - - _load() { - if (fs.existsSync(this._path)) { - this._store = fs.readJsonSync(this._path); - } - } - - reset() { - this._store = {}; - fs.writeJsonSync(this._path, this._store); - } -} - -export default new BasicConfigStore(); diff --git a/packages/_old/src/util/confirm-if-interactive.js b/packages/_old/src/util/confirm-if-interactive.js deleted file mode 100644 index adb85d1ad2..0000000000 --- a/packages/_old/src/util/confirm-if-interactive.js +++ /dev/null @@ -1,12 +0,0 @@ -import inquirer from 'inquirer'; - -export default async (interactive, message, defaultValue = true) => { - if (interactive) { - return (await inquirer.createPromptModule()({ - type: 'confirm', - name: 'confirm', - message, - })).confirm; - } - return defaultValue; -}; diff --git a/packages/_old/src/util/deprecate.js b/packages/_old/src/util/deprecate.js deleted file mode 100644 index 75a5a6ce33..0000000000 --- a/packages/_old/src/util/deprecate.js +++ /dev/null @@ -1,8 +0,0 @@ -import 'colors'; -import logSymbols from 'log-symbols'; - -export default what => ({ - replaceWith: (replacement) => { - console.warn(logSymbols.warning, `WARNING: ${what} is deprecated, please use ${replacement} instead`.yellow); - }, -}); diff --git a/packages/_old/src/util/electron-version.js b/packages/_old/src/util/electron-version.js deleted file mode 100644 index 7e20cc6cd7..0000000000 --- a/packages/_old/src/util/electron-version.js +++ /dev/null @@ -1,6 +0,0 @@ -export default (packageJSON) => { - if (!packageJSON.devDependencies) return null; - return (packageJSON.devDependencies['electron-prebuilt-compile'] - || packageJSON.devDependencies['electron-prebuilt'] - || packageJSON.devDependencies.electron); -}; diff --git a/packages/_old/src/util/ensure-output.js b/packages/_old/src/util/ensure-output.js deleted file mode 100644 index 8cf776aee1..0000000000 --- a/packages/_old/src/util/ensure-output.js +++ /dev/null @@ -1,22 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; - -// This is different from fs-extra's ensureDir because it wipes out the existing directory, -// if it's found. -async function ensureDirectory(dir) { - if (await fs.pathExists(dir)) { - await fs.remove(dir); - } - return fs.mkdirs(dir); -} - -// This is different from fs-extra's ensureFile because it wipes out the existing file, -// if it's found. -async function ensureFile(file) { - if (await fs.pathExists(file)) { - await fs.remove(file); - } - await fs.mkdirs(path.dirname(file)); -} - -export { ensureDirectory, ensureFile }; diff --git a/packages/_old/src/util/forge-config.js b/packages/_old/src/util/forge-config.js deleted file mode 100644 index 120ccc212f..0000000000 --- a/packages/_old/src/util/forge-config.js +++ /dev/null @@ -1,114 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; -import _template from 'lodash.template'; -import readPackageJSON from './read-package-json'; -import yarnOrNpm from './yarn-or-npm'; -import PluginInterface from './plugin-interface'; - -const underscoreCase = str => str.replace(/(.)([A-Z][a-z]+)/g, '$1_$2').replace(/([a-z0-9])([A-Z])/g, '$1_$2').toUpperCase(); - -const proxify = (object, envPrefix) => { - const newObject = {}; - - Object.keys(object).forEach((key) => { - if (typeof object[key] === 'object' && !Array.isArray(object[key]) && key !== 'pluginInterface') { - newObject[key] = proxify(object[key], `${envPrefix}_${underscoreCase(key)}`); - } else { - newObject[key] = object[key]; - } - }); - - return new Proxy(newObject, { - get(target, name) { - // eslint-disable-next-line no-prototype-builtins - if (!target.hasOwnProperty(name) && typeof name === 'string') { - const envValue = process.env[`${envPrefix}_${underscoreCase(name)}`]; - if (envValue) return envValue; - } - return target[name]; - }, - getOwnPropertyDescriptor(target, name) { - const envValue = process.env[`${envPrefix}_${underscoreCase(name)}`]; - // eslint-disable-next-line no-prototype-builtins - if (target.hasOwnProperty(name)) { - return Object.getOwnPropertyDescriptor(target, name); - } else if (envValue) { - return { writable: true, enumerable: true, configurable: true, value: envValue }; - } - }, - }); -}; - -/** - * Sets sensible defaults for the `config.forge` object. - */ -export function setInitialForgeConfig(packageJSON) { - const { name = '', productName = name } = packageJSON; - - /* eslint-disable no-param-reassign */ - packageJSON.config.forge.electronWinstallerConfig.name = name.replace(/-/g, '_'); - packageJSON.config.forge.windowsStoreConfig.name = productName.replace(/-/g, ''); - packageJSON.config.forge.electronPackagerConfig.packageManager = yarnOrNpm(); - /* eslint-enable no-param-reassign */ -} - -export default async (dir) => { - const packageJSON = await readPackageJSON(dir); - let forgeConfig = packageJSON.config.forge; - if (typeof forgeConfig === 'string' && (await fs.pathExists(path.resolve(dir, forgeConfig)) || await fs.pathExists(path.resolve(dir, `${forgeConfig}.js`)))) { - try { - forgeConfig = require(path.resolve(dir, forgeConfig)); - } catch (err) { - console.error(`Failed to load: ${path.resolve(dir, forgeConfig)}`); - throw err; - } - } else if (typeof forgeConfig !== 'object') { - throw new Error('Expected packageJSON.config.forge to be an object or point to a requirable JS file'); - } - forgeConfig = Object.assign({ - make_targets: {}, - publish_targets: {}, - electronPackagerConfig: {}, - electronRebuildConfig: {}, - electronWinstallerConfig: {}, - electronInstallerDebian: {}, - electronInstallerDMG: {}, - electronInstallerRedhat: {}, - s3: {}, - github_repository: {}, - electronReleaseServer: {}, - plugins: [], - }, forgeConfig); - forgeConfig.make_targets = Object.assign({ - win32: ['squirrel'], - darwin: ['zip'], - mas: ['zip'], - linux: ['deb', 'rpm'], - }, forgeConfig.make_targets); - forgeConfig.publish_targets = Object.assign({ - win32: ['github'], - darwin: ['github'], - mas: ['github'], - linux: ['github'], - }, forgeConfig.publish_targets); - - const templateObj = Object.assign({}, packageJSON, { year: (new Date()).getFullYear() }); - const template = (obj) => { - Object.keys(obj).forEach((objKey) => { - if (typeof obj[objKey] === 'object' && obj !== null) { - template(obj[objKey]); - } else if (typeof obj[objKey] === 'string') { - obj[objKey] = _template(obj[objKey])(templateObj); // eslint-disable-line - if (obj[objKey].startsWith('require:')) { - obj[objKey] = require(path.resolve(dir, obj[objKey].substr(8))); // eslint-disable-line - } - } - }); - }; - - template(forgeConfig); - - forgeConfig.pluginInterface = new PluginInterface(dir, forgeConfig); - - return proxify(forgeConfig, 'ELECTRON_FORGE'); -}; diff --git a/packages/_old/src/util/github.js b/packages/_old/src/util/github.js deleted file mode 100644 index c50813affb..0000000000 --- a/packages/_old/src/util/github.js +++ /dev/null @@ -1,30 +0,0 @@ -import GitHubAPI from '@octokit/rest'; -import merge from 'lodash.merge'; - -export default class GitHub { - constructor(authToken, requireAuth, options = {}) { - this.options = merge( - { protocol: 'https' }, - options, - { headers: { 'user-agent': 'Electron Forge' } } - ); - if (authToken) { - this.token = authToken; - } else if (process.env.GITHUB_TOKEN) { - this.token = process.env.GITHUB_TOKEN; - } else if (requireAuth) { - throw 'Please set GITHUB_TOKEN in your environment to access these features'; - } - } - - getGitHub() { - const github = new GitHubAPI(this.options); - if (this.token) { - github.authenticate({ - type: 'token', - token: this.token, - }); - } - return github; - } -} diff --git a/packages/_old/src/util/hdiutil.js b/packages/_old/src/util/hdiutil.js deleted file mode 100644 index baabdc050c..0000000000 --- a/packages/_old/src/util/hdiutil.js +++ /dev/null @@ -1,42 +0,0 @@ -import spawnPromise from 'cross-spawn-promise'; -import debug from 'debug'; - -const d = debug('electron-forge:hdiutil'); - -export const getMountedImages = async () => { - const output = await spawnPromise('hdiutil', ['info']); - const mounts = output.toString().split(/====\n/g); - mounts.shift(); - - const mountObjects = []; - - for (const mount of mounts) { - try { - const mountPath = /\/Volumes\/(.+)\n/g.exec(mount)[1]; - const imagePath = /image-path +: +(.+)\n/g.exec(mount)[1]; - mountObjects.push({ mountPath, imagePath }); - } catch (err) { - // Ignore - } - } - - d('identified active mounts', mountObjects); - return mountObjects; -}; - -export const mountImage = async (filePath) => { - d('mounting image:', filePath); - const output = await spawnPromise('hdiutil', ['attach', '-noautoopen', '-nobrowse', '-noverify', filePath]); - const mountPath = /\/Volumes\/(.+)\n/g.exec(output.toString())[1]; - d('mounted at:', mountPath); - - return { - mountPath, - imagePath: filePath, - }; -}; - -export const unmountImage = async (mount) => { - d('unmounting current mount:', mount); - await spawnPromise('hdiutil', ['unmount', '-force', `/Volumes/${mount.mountPath}`]); -}; diff --git a/packages/_old/src/util/hook.js b/packages/_old/src/util/hook.js deleted file mode 100644 index 255b5f56bc..0000000000 --- a/packages/_old/src/util/hook.js +++ /dev/null @@ -1,13 +0,0 @@ -import debug from 'debug'; - -const d = debug('electron-forge:hook'); - -export default async (forgeConfig, hookName, ...hookArgs) => { - const hooks = forgeConfig.hooks || {}; - d(`hook triggered: ${hookName}`); - if (typeof hooks[hookName] === 'function') { - d('calling hook:', hookName, 'with args:', hookArgs); - await hooks[hookName](forgeConfig, ...hookArgs); - } - await forgeConfig.pluginInterface.triggerHook(hookName, hookArgs); -}; diff --git a/packages/_old/src/util/install-dependencies.js b/packages/_old/src/util/install-dependencies.js deleted file mode 100644 index 698ef98888..0000000000 --- a/packages/_old/src/util/install-dependencies.js +++ /dev/null @@ -1,33 +0,0 @@ -import debug from 'debug'; -import { yarnOrNpmSpawn, hasYarn } from './yarn-or-npm'; - -import config from './config'; - -const d = debug('electron-forge:dependency-installer'); - -export default async (dir, deps, areDev = false, exact = false) => { - d('installing', JSON.stringify(deps), 'in:', dir, `dev=${areDev},exact=${exact},withYarn=${hasYarn()}`); - if (deps.length === 0) { - d('nothing to install, stopping immediately'); - return Promise.resolve(); - } - let cmd = ['install'].concat(deps); - if (hasYarn()) { - cmd = ['add'].concat(deps); - if (areDev) cmd.push('--dev'); - if (exact) cmd.push('--exact'); - } else { - if (exact) cmd.push('--save-exact'); - if (areDev) cmd.push('--save-dev'); - if (!areDev) cmd.push('--save'); - } - d('executing', JSON.stringify(cmd), 'in:', dir); - try { - await yarnOrNpmSpawn(cmd, { - cwd: dir, - stdio: config.get('verbose') ? 'inherit' : 'pipe', - }); - } catch (err) { - throw new Error(`Failed to install modules: ${JSON.stringify(deps)}\n\nWith output: ${err.message}`); - } -}; diff --git a/packages/_old/src/util/is-installed.js b/packages/_old/src/util/is-installed.js deleted file mode 100644 index ad2c8f67c4..0000000000 --- a/packages/_old/src/util/is-installed.js +++ /dev/null @@ -1,9 +0,0 @@ -export default function isInstalled(pkg) { - try { - require(pkg); - return true; - } catch (e) { - // Package doesn't exist -- must not be installable on this platform - return false; - } -} diff --git a/packages/_old/src/util/linux-config.js b/packages/_old/src/util/linux-config.js deleted file mode 100644 index eed0c812e1..0000000000 --- a/packages/_old/src/util/linux-config.js +++ /dev/null @@ -1,19 +0,0 @@ -import merge from 'lodash.merge'; -import path from 'path'; - -import configFn from './config-fn'; - -export function populateConfig({ forgeConfig, configKey, targetArch }) { - const config = configFn(forgeConfig[configKey] || {}, targetArch); - config.options = config.options || {}; - - return config; -} - -export function linuxConfig({ config, pkgArch, dir, outPath }) { - return merge({}, config, { - arch: pkgArch, - dest: path.dirname(outPath), - src: dir, - }); -} diff --git a/packages/_old/src/util/messages.js b/packages/_old/src/util/messages.js deleted file mode 100644 index 90309cdad2..0000000000 --- a/packages/_old/src/util/messages.js +++ /dev/null @@ -1,13 +0,0 @@ -function info(interactive, message) { - if (interactive) { - console.info(message); - } -} - -function warn(interactive, message) { - if (interactive) { - console.warn(message); - } -} - -export { info, warn }; diff --git a/packages/_old/src/util/move-app.js b/packages/_old/src/util/move-app.js deleted file mode 100644 index f9154fe02c..0000000000 --- a/packages/_old/src/util/move-app.js +++ /dev/null @@ -1,39 +0,0 @@ -import fs from 'fs-extra'; -import inquirer from 'inquirer'; -import path from 'path'; -import pify from 'pify'; -import sudo from 'sudo-prompt'; -import { exec } from 'child_process'; - -export default async (appPath, targetApplicationPath, spinner, copyInstead = false) => { - let writeAccess = true; - try { - await fs.access('/Applications', fs.W_OK); - } catch (err) { - writeAccess = false; - } - - if (await fs.pathExists(targetApplicationPath)) { - spinner.stop(); - const { confirm } = await inquirer.createPromptModule()({ - type: 'confirm', - name: 'confirm', - message: `The application "${path.basename(targetApplicationPath)}" appears to already exist in /Applications. Do you want to replace it?`, - }); - if (!confirm) { - throw 'Installation stopped by user'; - } else { - spinner.start(); - await fs.remove(targetApplicationPath); - } - } - - const moveCommand = `${copyInstead ? 'cp -r' : 'mv'} "${appPath}" "${targetApplicationPath}"`; - if (writeAccess) { - await pify(exec)(moveCommand); - } else { - await pify(sudo.exec)(moveCommand, { - name: 'Electron Forge', - }); - } -}; diff --git a/packages/_old/src/util/ora-handler.js b/packages/_old/src/util/ora-handler.js deleted file mode 100644 index a99870591f..0000000000 --- a/packages/_old/src/util/ora-handler.js +++ /dev/null @@ -1,44 +0,0 @@ -import colors from 'colors'; -import ora from './ora'; - -class MockOra { - succeed() { return this; } - fail() { return this; } - start() { return this; } - stop() { return this; } -} - -const asyncOra = (initialOraValue, asyncFn, processExitFn = process.exit) => { - let fnOra = new MockOra(); - if (asyncOra.interactive) { - fnOra = ora(initialOraValue).start(); - } - return new Promise((resolve, reject) => { - asyncFn(fnOra).then(() => { - fnOra.succeed(); - resolve(); - }).catch((err) => { - fnOra.fail(); - if (asyncOra.interactive) { - if (err && err.message && err.stack) { - console.error('\nAn unhandled error has occurred inside Forge:'.red); - console.error(colors.red(err.message)); - console.error(colors.red(err.stack)); - } else { - console.error('\nElectron forge was terminated:'.red); - console.error(colors.red(typeof err === 'string' ? err : JSON.stringify(err))); - } - processExitFn(1); - // If the process is still alive we should continue because either something went really wrong - // or we are testing this function - setTimeout(() => resolve(), 500); - } else { - reject(err); - } - }); - }); -}; - -asyncOra.interactive = true; - -export default asyncOra; diff --git a/packages/_old/src/util/ora.js b/packages/_old/src/util/ora.js deleted file mode 100644 index 9c464424b4..0000000000 --- a/packages/_old/src/util/ora.js +++ /dev/null @@ -1,39 +0,0 @@ -import 'colors'; -import debug from 'debug'; -import logSymbols from 'log-symbols'; -import realOra from 'ora'; - -const d = debug('electron-forge:lifecycle'); - -const useFakeOra = (process.env.DEBUG && process.env.DEBUG.includes('electron-forge')); - -if (useFakeOra) { - console.warn('WARNING: DEBUG environment variable detected. Progress indicators will be sent over electron-forge:lifecycle'.red); -} - -export const fakeOra = (name) => { - const fake = { - start: () => { - d('Process Started:', name); - return fake; - }, - warn: (msg) => { - console.warn(logSymbols.warning, msg.yellow); - }, - fail: () => { - d(`Process Failed: ${name}`.red); - return fake; - }, - succeed: () => { - d('Process Succeeded:', name); - return fake; - }, - stop: () => { - d('Process Stopped:', name); - return fake; - }, - }; - return fake; -}; - -export default useFakeOra ? fakeOra : realOra; diff --git a/packages/_old/src/util/out-dir.js b/packages/_old/src/util/out-dir.js deleted file mode 100644 index 372395d8a8..0000000000 --- a/packages/_old/src/util/out-dir.js +++ /dev/null @@ -1,14 +0,0 @@ -const path = require('path'); - -const BASE_OUT_DIR = 'out'; - -export default (baseDir, forgeConfig) => { - if (forgeConfig.buildIdentifier) { - let identifier = forgeConfig.buildIdentifier; - if (typeof identifier === 'function') { - identifier = identifier(); - } - if (identifier) return path.resolve(baseDir, BASE_OUT_DIR, identifier); - } - return path.resolve(baseDir, BASE_OUT_DIR); -}; diff --git a/packages/_old/src/util/parse-archs.js b/packages/_old/src/util/parse-archs.js deleted file mode 100644 index 6f6c2073a5..0000000000 --- a/packages/_old/src/util/parse-archs.js +++ /dev/null @@ -1,9 +0,0 @@ -import { allOfficialArchsForPlatformAndVersion } from 'electron-packager/targets'; - -export default function parseArchs(platform, declaredArch, electronVersion) { - if (declaredArch === 'all') { - return allOfficialArchsForPlatformAndVersion(platform, electronVersion) || ['x64']; - } - - return declaredArch.split(','); -} diff --git a/packages/_old/src/util/plugin-interface.js b/packages/_old/src/util/plugin-interface.js deleted file mode 100644 index 42f19db614..0000000000 --- a/packages/_old/src/util/plugin-interface.js +++ /dev/null @@ -1,50 +0,0 @@ -import debug from 'debug'; - -import asyncOra from './ora-handler'; - -const d = debug('electron-forge:plugins'); - -export default class PluginInterface { - constructor(dir, forgeConfig) { - this.plugins = forgeConfig.plugins; - Object.defineProperty(this, 'config', { - value: forgeConfig, - enumerable: false, - configurable: false, - writable: false, - }); - - for (const plugin of this.plugins) { - plugin.init(dir, forgeConfig, asyncOra); - } - - this.triggerHook = this.triggerHook.bind(this); - this.overrideStartLogic = this.overrideStartLogic.bind(this); - } - - async triggerHook(hookName, hookArgs) { - for (const plugin of this.plugins) { - if (typeof plugin.getHook === 'function') { - const hook = plugin.getHook(hookName); - if (hook) await hook(...hookArgs); - } - } - } - - async overrideStartLogic(opts) { - let newStartFn; - const claimed = []; - for (const plugin of this.plugins) { - if (typeof plugin.startLogic === 'function') { - claimed.push(plugin.name); - newStartFn = plugin.startLogic; - } - } - if (claimed.length > 1) throw `Multiple plugins tried to take control of the start command, please remove one of them\n --> ${claimed.join(', ')}`; - if (claimed.length === 1) { - d(`plugin: "${claimed[0]}" has taken control of the start command`); - return await newStartFn(opts); - } - return false; - } -} diff --git a/packages/_old/src/util/publish-state.js b/packages/_old/src/util/publish-state.js deleted file mode 100644 index ddf198f0c7..0000000000 --- a/packages/_old/src/util/publish-state.js +++ /dev/null @@ -1,72 +0,0 @@ -import crypto from 'crypto'; -import fs from 'fs-extra'; -import path from 'path'; - -const EXTENSION = '.forge.publish'; - -export default class PublishState { - static async loadFromDirectory(directory, rootDir) { - if (!await fs.exists(directory)) { - throw new Error(`Attempted to load publish state from a missing directory: ${directory}`); - } - - const publishes = []; - for (const dirName of await fs.readdir(directory)) { - const subDir = path.resolve(directory, dirName); - const states = []; - if ((await fs.stat(subDir)).isDirectory()) { - const filePaths = (await fs.readdir(subDir)) - .filter(fileName => fileName.endsWith(EXTENSION)) - .map(fileName => path.resolve(subDir, fileName)); - - for (const filePath of filePaths) { - const state = new PublishState(filePath); - await state.load(); - state.state.artifacts = state.state.artifacts.map(artifactPath => path.resolve(rootDir, artifactPath)); - states.push(state); - } - } - publishes.push(states); - } - return publishes; - } - - static async saveToDirectory(directory, artifacts, rootDir) { - const id = crypto.createHash('SHA256').update(JSON.stringify(artifacts)).digest('hex'); - for (const artifact of artifacts) { - artifact.artifacts = artifact.artifacts.map(artifactPath => path.relative(rootDir, artifactPath)); - const state = new PublishState(path.resolve(directory, id, 'null'), '', false); - state.setState(artifact); - await state.saveToDisk(); - } - } - - constructor(filePath, hasHash = true) { - this.dir = path.dirname(filePath); - this.path = filePath; - this.hasHash = hasHash; - } - - generateHash() { - const content = JSON.stringify(this.state || {}); - return crypto.createHash('SHA256').update(content).digest('hex'); - } - - setState(state) { - this.state = state; - } - - async load() { - this.state = await fs.readJson(this.path); - } - - async saveToDisk() { - if (!this.hasHash) { - this.path = path.resolve(this.dir, `${this.generateHash()}${EXTENSION}`); - this.hasHash = true; - } - - await fs.mkdirs(path.dirname(this.path)); - await fs.writeJson(this.path, this.state); - } -} diff --git a/packages/_old/src/util/read-package-json.js b/packages/_old/src/util/read-package-json.js deleted file mode 100644 index cee775dc1e..0000000000 --- a/packages/_old/src/util/read-package-json.js +++ /dev/null @@ -1,5 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; - -export default async dir => - await fs.readJson(path.resolve(dir, 'package.json')); diff --git a/packages/_old/src/util/rebuild.js b/packages/_old/src/util/rebuild.js deleted file mode 100644 index 4d8c29f276..0000000000 --- a/packages/_old/src/util/rebuild.js +++ /dev/null @@ -1,26 +0,0 @@ -import rebuild from 'electron-rebuild'; - -import asyncOra from '../util/ora-handler'; - -export default async (buildPath, electronVersion, platform, arch, config = {}) => { - await asyncOra('Preparing native dependencies', async (rebuildSpinner) => { - const rebuilder = rebuild(Object.assign({}, config, { - buildPath, - electronVersion, - arch, - })); - const { lifecycle } = rebuilder; - - let found = 0; - let done = 0; - - const redraw = () => { - rebuildSpinner.text = `Preparing native dependencies: ${done} / ${found}`; // eslint-disable-line - }; - - lifecycle.on('module-found', () => { found += 1; redraw(); }); - lifecycle.on('module-done', () => { done += 1; redraw(); }); - - await rebuilder; - }); -}; diff --git a/packages/_old/src/util/require-search.js b/packages/_old/src/util/require-search.js deleted file mode 100644 index 23c265b351..0000000000 --- a/packages/_old/src/util/require-search.js +++ /dev/null @@ -1,25 +0,0 @@ -import debug from 'debug'; -import path from 'path'; - -const d = debug('electron-forge:require-search'); - -export function requireSearchRaw(relativeTo, paths) { - const testPaths = paths - .concat(paths.map(mapPath => path.resolve(relativeTo, mapPath))) - .concat(paths.map(mapPath => path.resolve(relativeTo, 'node_modules', mapPath))); - d('searching', testPaths, 'relative to', relativeTo); - for (const testPath of testPaths) { - try { - d('testing', testPath); - return require(testPath); - } catch (err) { - // Ignore the error - } - } - d('failed to find a module in', testPaths); -} - -export default (relativeTo, paths) => { - const result = requireSearchRaw(relativeTo, paths); - return typeof result === 'object' && result && result.default ? result.default : result; -}; diff --git a/packages/_old/src/util/resolve-dir.js b/packages/_old/src/util/resolve-dir.js deleted file mode 100644 index 66a70ba157..0000000000 --- a/packages/_old/src/util/resolve-dir.js +++ /dev/null @@ -1,36 +0,0 @@ -import debug from 'debug'; -import fs from 'fs-extra'; -import path from 'path'; -import readPackageJSON from './read-package-json'; -import getElectronVersion from './electron-version'; - -const d = debug('electron-forge:project-resolver'); - -export default async (dir) => { - let mDir = dir; - let prevDir; - while (prevDir !== mDir) { - prevDir = mDir; - const testPath = path.resolve(mDir, 'package.json'); - d('searching for project in:', mDir); - if (await fs.pathExists(testPath)) { - const packageJSON = await readPackageJSON(mDir); - - const electronVersion = getElectronVersion(packageJSON); - if (electronVersion) { - if (!/[0-9]/.test(electronVersion[0])) { - throw `You must depend on an EXACT version of electron not a range (${electronVersion})`; - } - } else { - throw 'You must depend on "electron" in your devDependencies'; - } - - if (packageJSON.config && packageJSON.config.forge) { - d('electron-forge compatible package.json found in', testPath); - return mDir; - } - } - mDir = path.dirname(mDir); - } - return null; -}; diff --git a/packages/_old/src/util/terminate.js b/packages/_old/src/util/terminate.js deleted file mode 100644 index aac9aef978..0000000000 --- a/packages/_old/src/util/terminate.js +++ /dev/null @@ -1,25 +0,0 @@ -import colors from 'colors'; - -process.on('unhandledRejection', (err) => { - if (err && err.message && err.stack) { - console.error('\nAn unhandled rejection has occurred inside Forge:'.red); - console.error(colors.red(err.message)); - console.error(colors.red(err.stack)); - } else { - console.error('\nElectron forge was terminated:'.red); - console.error(colors.red(typeof err === 'string' ? err : JSON.stringify(err))); - } - process.exit(1); -}); - -process.on('uncaughtException', (err) => { - if (err && err.message && err.stack) { - console.error('\nAn unhandled exception has occurred inside Forge:'.red); - console.error(colors.red(err.message)); - console.error(colors.red(err.stack)); - } else { - console.error('\nElectron forge was terminated:'.red); - console.error(colors.red(typeof err === 'string' ? err : JSON.stringify(err))); - } - process.exit(1); -}); diff --git a/packages/_old/src/util/yarn-or-npm.js b/packages/_old/src/util/yarn-or-npm.js deleted file mode 100644 index e233201879..0000000000 --- a/packages/_old/src/util/yarn-or-npm.js +++ /dev/null @@ -1,23 +0,0 @@ -import spawnPromise from 'cross-spawn-promise'; -import logSymbols from 'log-symbols'; -import yarnOrNpm from 'yarn-or-npm'; - -const safeYarnOrNpm = () => { - const system = yarnOrNpm(); - switch (process.env.NODE_INSTALLER) { - case 'yarn': - case 'npm': - return process.env.NODE_INSTALLER; - default: - if (process.env.NODE_INSTALLER) { - console.warn(`${logSymbols.warning} Unknown NODE_INSTALLER, using detected installer ${system}`.yellow); - } - return system; - } -}; - -export default safeYarnOrNpm; - -export const yarnOrNpmSpawn = (...args) => spawnPromise(safeYarnOrNpm(), ...args); - -export const hasYarn = () => safeYarnOrNpm() === 'yarn'; diff --git a/packages/_old/tabtab-install.js b/packages/_old/tabtab-install.js deleted file mode 100644 index 4802f2ed25..0000000000 --- a/packages/_old/tabtab-install.js +++ /dev/null @@ -1,21 +0,0 @@ -try { - const Complete = require('tabtab/src/complete'); - const Installer = require('tabtab/src/installer'); - - const options = { auto: true, name: 'electron-forge' }; - const complete = new Complete(options); - const installer = new Installer(options, complete); - - let shell = process.env.SHELL; - if (shell) shell = shell.split((process.platform !== 'win32') ? '/' : '\\').slice(-1)[0]; - - if (installer[shell]) { - installer.handle(options.name, options) - .catch(e => console.warn(`Failed to install tab completion: ${e}`)); - } else { - console.warn(`User shell ${shell} not supported, skipping completion install`); - } -} catch (err) { - console.log('tabtab install went wrong', err); - process.exit(0); -} diff --git a/packages/_old/test/.eslintrc b/packages/_old/test/.eslintrc deleted file mode 100644 index fcf427ed5d..0000000000 --- a/packages/_old/test/.eslintrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "env": { - "mocha": true - }, - "rules": { - "class-methods-use-this": 0, - "import/no-extraneous-dependencies": 0 - } -} diff --git a/packages/_old/test/fast/author-name_spec.js b/packages/_old/test/fast/author-name_spec.js deleted file mode 100644 index 177c86e77e..0000000000 --- a/packages/_old/test/fast/author-name_spec.js +++ /dev/null @@ -1,30 +0,0 @@ -import { expect } from 'chai'; - -import getNameFromAuthor from '../../src/util/author-name'; - -describe('author-name', () => { - describe('getNameFromAuthor', () => { - [{ - author: 'First Last', - expectedReturnValue: 'First Last', - }, { - author: 'First Last ', - expectedReturnValue: 'First Last', - }, { - author: { - name: 'First Last', - }, - expectedReturnValue: 'First Last', - }, { - author: undefined, - expectedReturnValue: '', - }, { - author: '', - expectedReturnValue: '', - }].forEach((scenario) => { - it(`${JSON.stringify(scenario.author)} -> "${scenario.expectedReturnValue}"`, () => { - expect(getNameFromAuthor(scenario.author)).to.equal(scenario.expectedReturnValue); - }); - }); - }); -}); diff --git a/packages/_old/test/fast/config_spec.js b/packages/_old/test/fast/config_spec.js deleted file mode 100644 index b7c48808d9..0000000000 --- a/packages/_old/test/fast/config_spec.js +++ /dev/null @@ -1,31 +0,0 @@ -import { expect } from 'chai'; -import fs from 'fs-extra'; - -import config from '../../src/util/config'; - -describe('cross-process config', () => { - it('should get all values as undefined initially', () => { - expect(config.get('foobar')).to.equal(undefined); - }); - - it('should set a value in the current process', () => { - config.set('foobar', 'magical'); - expect(config.get('foobar')).to.equal('magical'); - }); - - it('should reset the value on process exit', () => { - config.reset(); - expect(config.get('foobar')).to.equal(undefined); - }); - - it('should not have issues if the config file is cleaned up', async () => { - await fs.remove(config._path); - expect(config.get('foobar')).to.equal(undefined); - config.set('foobar', '123'); - expect(config.get('foobar')).to.equal('123'); - }); - - after(() => { - config.reset(); - }); -}); diff --git a/packages/_old/test/fast/confirm-if-interactive_spec.js b/packages/_old/test/fast/confirm-if-interactive_spec.js deleted file mode 100644 index 314f20752a..0000000000 --- a/packages/_old/test/fast/confirm-if-interactive_spec.js +++ /dev/null @@ -1,36 +0,0 @@ -import { expect } from 'chai'; -import inquirer from 'inquirer'; -import sinon from 'sinon'; - -import confirmIfInteractive from '../../src/util/confirm-if-interactive'; - -describe('confirm if interactive', () => { - describe('if interactive=true', () => { - let createPromptModuleSpy; - - beforeEach(() => { - createPromptModuleSpy = sinon.stub(inquirer, 'createPromptModule'); - createPromptModuleSpy.returns(() => Promise.resolve({ confirm: 'resolved' })); - }); - - it('should call inquirer prompt', async () => { - const val = await confirmIfInteractive(true, 'Please say yes?'); - expect(createPromptModuleSpy.callCount).to.equal(1); - expect(val).to.equal('resolved'); - }); - - afterEach(() => { - createPromptModuleSpy.restore(); - }); - }); - - describe('if interactive=false', () => { - it('should return true', async () => { - expect(await confirmIfInteractive(false, 'Yolo!')).to.equal(true); - }); - - it('should return the defaultValue if provided', async () => { - expect(await confirmIfInteractive(false, 'Yolo!', 'default_value')).to.equal('default_value'); - }); - }); -}); diff --git a/packages/_old/test/fast/electron_forge_start_spec.js b/packages/_old/test/fast/electron_forge_start_spec.js deleted file mode 100644 index 83c2a77256..0000000000 --- a/packages/_old/test/fast/electron_forge_start_spec.js +++ /dev/null @@ -1,152 +0,0 @@ -import chai, { expect } from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import proxyquire from 'proxyquire'; -import sinon from 'sinon'; -import { Command } from 'commander'; -import path from 'path'; - -chai.use(chaiAsPromised); - -describe('electron-forge start', () => { - let argv; - let startStub; - let runCommand; - let childExitCode; - let childStub; - - beforeEach(() => { - ({ argv } = process); - - childExitCode = 0; - childStub = { - on: (event, cb) => cb(childExitCode), - }; - startStub = sinon.stub().returns(Promise.resolve(childStub)); - - runCommand = async (args = []) => { - process.argv = ['node', 'electron-forge-start'].concat(args); - return proxyquire.noCallThru().load('../../src/electron-forge-start', { - commander: new Command(), - './api': { start: startStub }, - }); - }; - }); - - afterEach(() => { - process.argv = argv; - }); - - it('should pass through correct defaults', async () => { - await runCommand(); - expect(startStub.callCount).to.equal(1); - expect(startStub.firstCall.args[0]).to.deep.equal({ - dir: process.cwd(), - interactive: true, - enableLogging: false, - runAsNode: false, - inspect: false, - }); - }); - - it('should handle an absolute project directory', async () => { - await runCommand([path.join(process.cwd(), 'test', 'fixture', 'dummy_app')]); - expect(startStub.callCount).to.equal(1); - expect(startStub.firstCall.args[0]).to.deep.equal({ - dir: path.join(process.cwd(), 'test', 'fixture', 'dummy_app'), - interactive: true, - enableLogging: false, - runAsNode: false, - inspect: false, - }); - }); - - it('should handle a relative project directory', async () => { - await runCommand([path.join('test', 'fixture', 'dummy_app')]); - expect(startStub.callCount).to.equal(1); - expect(startStub.firstCall.args[0]).to.deep.equal({ - dir: path.join(process.cwd(), 'test', 'fixture', 'dummy_app'), - interactive: true, - enableLogging: false, - runAsNode: false, - inspect: false, - }); - }); - - it('should handle an app path', async () => { - await runCommand(['-p', path.join('foo', 'electron.js')]); - expect(startStub.callCount).to.equal(1); - expect(startStub.firstCall.args[0]).to.deep.equal({ - dir: process.cwd(), - appPath: path.join('foo', 'electron.js'), - interactive: true, - enableLogging: false, - runAsNode: false, - inspect: false, - }); - }); - - it('should be able to enable logging', async () => { - await runCommand(['-l']); - expect(startStub.callCount).to.equal(1); - expect(startStub.firstCall.args[0]).to.deep.equal({ - dir: process.cwd(), - enableLogging: true, - interactive: true, - runAsNode: false, - inspect: false, - }); - }); - - it('should handle app args', async () => { - await runCommand(['-l', '--', '-a', 'foo', '-l']); - expect(startStub.callCount).to.equal(1); - expect(startStub.firstCall.args[0]).to.deep.equal({ - dir: process.cwd(), - enableLogging: true, - interactive: true, - args: ['-a', 'foo', '-l'], - runAsNode: false, - inspect: false, - }); - }); - - it('should handle run-as-node', async () => { - await runCommand(['--run-as-node']); - expect(startStub.callCount).to.equal(1); - expect(startStub.firstCall.args[0]).to.deep.equal({ - dir: process.cwd(), - enableLogging: false, - interactive: true, - runAsNode: true, - inspect: false, - }); - }); - - it('should handle inspect-electron', async () => { - await runCommand(['--inspect-electron']); - expect(startStub.callCount).to.equal(1); - expect(startStub.firstCall.args[0]).to.deep.equal({ - dir: process.cwd(), - enableLogging: false, - interactive: true, - runAsNode: false, - inspect: true, - }); - }); - - it('should exit with the status code of the spawned Electron instance if it is not zero', async () => { - childExitCode = 1; - const originalExit = process.exit; - process.exit = sinon.stub().returns(0); - - await runCommand(); - - const getExitCode = new Promise((resolve) => { - const check = () => (process.exit.firstCall ? resolve(process.exit.firstCall.args[0]) : setTimeout(check, 1)); - check(); - }); - - await expect(getExitCode).to.eventually.equal(childExitCode); - process.exit = originalExit; - }); -}); diff --git a/packages/_old/test/fast/ensure-output_spec.js b/packages/_old/test/fast/ensure-output_spec.js deleted file mode 100644 index 4e366d65ed..0000000000 --- a/packages/_old/test/fast/ensure-output_spec.js +++ /dev/null @@ -1,50 +0,0 @@ -import { expect } from 'chai'; -import fs from 'fs-extra'; -import os from 'os'; -import path from 'path'; - -import { ensureDirectory, ensureFile } from '../../src/util/ensure-output'; - -describe('ensure-output', () => { - const tmpPath = path.resolve(os.tmpdir(), 'forge-ensure'); - - before(async () => { - await fs.mkdirs(tmpPath); - }); - - describe('ensureDirectory', () => { - it('should delete the directory contents if it exists', async () => { - await fs.mkdirs(path.resolve(tmpPath, 'foo')); - fs.writeFileSync(path.resolve(tmpPath, 'foo', 'touchedFile')); - expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(true); - await ensureDirectory(path.resolve(tmpPath, 'foo')); - expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(false); - }); - - it('should create the directory if it does not exist', async () => { - expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(false); - await ensureDirectory(path.resolve(tmpPath, 'bar')); - expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(true); - }); - }); - - describe('ensureFile', () => { - it('should delete the file if it exists', async () => { - await fs.mkdirs(path.resolve(tmpPath, 'foo')); - fs.writeFileSync(path.resolve(tmpPath, 'foo', 'touchedFile')); - expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(true); - await ensureFile(path.resolve(tmpPath, 'foo')); - expect(await fs.pathExists(path.resolve(tmpPath, 'foo', 'touchedFile'))).to.equal(false); - }); - - it('should create the containing directory if it does not exist', async () => { - expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(false); - await ensureFile(path.resolve(tmpPath, 'bar', 'file')); - expect(await fs.pathExists(path.resolve(tmpPath, 'bar'))).to.equal(true); - }); - }); - - afterEach(async () => { - await fs.remove(tmpPath); - }); -}); diff --git a/packages/_old/test/fast/forge-config_spec.js b/packages/_old/test/fast/forge-config_spec.js deleted file mode 100644 index 317650fa79..0000000000 --- a/packages/_old/test/fast/forge-config_spec.js +++ /dev/null @@ -1,98 +0,0 @@ -import { expect } from 'chai'; -import path from 'path'; - -import findConfig from '../../src/util/forge-config'; - -const defaults = { - make_targets: { - win32: ['squirrel', 'appx'], - darwin: ['zip'], - linux: ['deb', 'rpm'], - mas: ['zip'], - }, - electronInstallerDMG: {}, - electronPackagerConfig: {}, - electronRebuildConfig: {}, - electronWinstallerConfig: {}, - electronInstallerDebian: {}, - electronInstallerRedhat: {}, - publish_targets: { - win32: ['github'], - darwin: ['github'], - linux: ['github'], - mas: ['github'], - }, - github_repository: {}, - s3: {}, - electronReleaseServer: {}, - plugins: [], -}; - -describe('forge-config', () => { - it('should resolve the object in package.json with defaults if one exists', async () => { - const config = await findConfig(path.resolve(__dirname, '../fixture/dummy_app')); - delete config.pluginInterface; - expect(config).to.be.deep.equal(Object.assign({}, defaults, { - electronWinstallerConfig: { windows: 'magic' }, - windowsStoreConfig: { packageName: 'test' }, - github_repository: { - name: 'project', - owner: 'dummy', - }, - })); - }); - - it('should set a pluginInterface', async () => { - const config = await findConfig(path.resolve(__dirname, '../fixture/dummy_app')); - expect(config).to.have.property('pluginInterface'); - }); - - it('should allow access to built-ins of proxied objects', async () => { - const conf = await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')); - expect(conf.electronPackagerConfig.baz.hasOwnProperty).to.be.a('function'); - process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY = 'SecretyThing'; - // eslint-disable-next-line no-prototype-builtins - expect(conf.s3.hasOwnProperty('secretAccessKey')).to.equal(true); - delete process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY; - }); - - it('should allow overwrite of properties in proxied objects', async () => { - const conf = await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')); - expect(conf.electronPackagerConfig.baz.hasOwnProperty).to.be.a('function'); - expect(() => { conf.electronPackagerConfig.baz = 'bar'; }).to.not.throw(); - process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY = 'SecretyThing'; - - const descriptor = { writable: true, enumerable: true, configurable: true, value: 'SecretyThing' }; - expect(Object.getOwnPropertyDescriptor(conf.s3, 'secretAccessKey')).to.be.deep.equal(descriptor); - expect(() => { conf.s3.secretAccessKey = 'bar'; }).to.not.throw(); - expect(conf.s3.secretAccessKey).to.equal('bar'); - delete process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY; - }); - - - it('should resolve the JS file exports in config.forge points to a JS file', async () => { - const config = JSON.parse(JSON.stringify(await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')))); - delete config.pluginInterface; - expect(config).to.be.deep.equal(Object.assign({}, defaults, { - electronPackagerConfig: { foo: 'bar', baz: {} }, - })); - }); - - it('should resolve the JS file exports in config.forge points to a JS file and maintain functions', async () => { - const conf = await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')); - expect(conf.magicFn).to.be.a('function'); - expect(conf.magicFn()).to.be.equal('magic result'); - }); - - it('should magically map properties to environment variables', async () => { - const conf = await findConfig(path.resolve(__dirname, '../fixture/dummy_js_conf')); - expect(conf.s3.secretAccessKey).to.equal(undefined); - - process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY = 'SecretyThing'; - process.env.ELECTRON_FORGE_ELECTRON_RELEASE_SERVER_BASE_URL = 'http://example.com'; - expect(conf.s3.secretAccessKey).to.equal('SecretyThing'); - expect(conf.electronReleaseServer.baseUrl).to.equal('http://example.com'); - delete process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY; - delete process.env.ELECTRON_FORGE_ELECTRON_RELEASE_SERVER_BASE_URL; - }); -}); diff --git a/packages/_old/test/fast/github_spec.js b/packages/_old/test/fast/github_spec.js deleted file mode 100644 index 71fc80ab32..0000000000 --- a/packages/_old/test/fast/github_spec.js +++ /dev/null @@ -1,94 +0,0 @@ -import { expect } from 'chai'; -import proxyquire from 'proxyquire'; -import sinon from 'sinon'; - -describe('GitHub', () => { - let GitHub; - let gitHubSpy; - let gitHubAuthSpy; - let MockGitHub; - - beforeEach(() => { - gitHubSpy = sinon.spy(); - gitHubAuthSpy = sinon.spy(); - MockGitHub = class { - constructor(options) { - gitHubSpy(); - this.options = options; - } - - authenticate() { - gitHubAuthSpy(); - } - }; - GitHub = proxyquire.noCallThru().load('../../src/util/github', { - '@octokit/rest': MockGitHub, - }).default; - }); - - it('should read token from constructor', () => { - expect(new GitHub('token1').token).to.equal('token1'); - }); - - it('should fall back to token from environment', () => { - process.env.GITHUB_TOKEN = 'abc123'; - expect(new GitHub().token).to.equal('abc123'); - delete process.env.GITHUB_TOKEN; - }); - - describe('getGitHub', () => { - it('should create a new GitHubAPI', () => { - const gh = new GitHub(); - expect(gitHubSpy.callCount).to.equal(0); - gh.getGitHub(); - expect(gitHubSpy.callCount).to.equal(1); - }); - - it('should be able to set the Enterprise URL settings', () => { - const gh = new GitHub('1234', true, { - host: 'github.example.com', - port: 8443, - pathPrefix: '/enterprise', - }); - const api = gh.getGitHub(); - - expect(api.options).to.deep.equal({ - protocol: 'https', - host: 'github.example.com', - port: 8443, - pathPrefix: '/enterprise', - headers: { - 'user-agent': 'Electron Forge', - }, - }); - }); - - it('should not override the user agent', () => { - const gh = new GitHub('1234', true, { headers: { 'user-agent': 'Something' } }); - const api = gh.getGitHub(); - - expect(api.options.headers['user-agent']).to.equal('Electron Forge'); - }); - - it('should authenticate if a token is present', () => { - const gh = new GitHub('token'); - expect(gitHubAuthSpy.callCount).to.equal(0); - gh.getGitHub(); - expect(gitHubAuthSpy.callCount).to.equal(1); - }); - - it('should not authenticate if a token is not present', () => { - const gh = new GitHub(); - expect(gitHubAuthSpy.callCount).to.equal(0); - gh.getGitHub(); - expect(gitHubAuthSpy.callCount).to.equal(0); - }); - - it('should throw an exception if a token is required', () => { - expect(() => { - const gh = new GitHub(null, true); - gh.getGitHub(); - }).to.throw('Please set GITHUB_TOKEN in your environment to access these features'); - }); - }); -}); diff --git a/packages/_old/test/fast/hook_spec.js b/packages/_old/test/fast/hook_spec.js deleted file mode 100644 index 9484fb18c7..0000000000 --- a/packages/_old/test/fast/hook_spec.js +++ /dev/null @@ -1,27 +0,0 @@ -import { expect } from 'chai'; -import { stub } from 'sinon'; - -import runHook from '../../src/util/hook'; - -const fakeConfig = { - pluginInterface: { - triggerHook: async () => false, - }, -}; - -describe('runHook', () => { - it('should not error when running non existent hooks', async () => { - await runHook(Object.assign({}, fakeConfig), 'magic'); - }); - - it('should not error when running a hook that is not a function', async () => { - await runHook(Object.assign({ hooks: { myHook: 'abc' } }, fakeConfig), 'abc'); - }); - - it('should run the hook if it is provided as a function', async () => { - const myStub = stub(); - myStub.returns(Promise.resolve()); - await runHook(Object.assign({ hooks: { myHook: myStub } }, fakeConfig), 'myHook'); - expect(myStub.callCount).to.equal(1); - }); -}); diff --git a/packages/_old/test/fast/install-dependencies_spec.js b/packages/_old/test/fast/install-dependencies_spec.js deleted file mode 100644 index cc714f43d9..0000000000 --- a/packages/_old/test/fast/install-dependencies_spec.js +++ /dev/null @@ -1,99 +0,0 @@ -import { expect } from 'chai'; -import proxyquire from 'proxyquire'; -import sinon from 'sinon'; - -describe('Install dependencies', () => { - let install; - let spawnSpy; - let hasYarnSpy; - let spawnPromise; - let spawnPromiseResolve; - let spawnPromiseReject; - - beforeEach(() => { - spawnSpy = sinon.stub(); - spawnPromise = new Promise((resolve, reject) => { - spawnPromiseResolve = resolve; - spawnPromiseReject = reject; - }); - spawnSpy.returns(spawnPromise); - hasYarnSpy = sinon.stub(); - install = proxyquire.noCallThru().load('../../src/util/install-dependencies', { - './yarn-or-npm': { - yarnOrNpmSpawn: spawnSpy, - hasYarn: hasYarnSpy, - }, - }).default; - }); - - it('should immediately resolve if no deps are provided', async () => { - await install('mydir', []); - expect(spawnSpy.callCount).to.equal(0); - }); - - it('should reject if reject the promise if exit code is not 0', (done) => { - const p = install('void', ['electron']); - p.then(() => done(new Error('expected install to be rejected'))) - .catch(() => done()); - spawnPromiseReject(); - }); - - it('should resolve if reject the promise if exit code is 0', (done) => { - const p = install('void', ['electron']); - p.then(() => done()) - .catch(() => done(new Error('expected install to be resolved'))); - spawnPromiseResolve(); - }); - - describe('with yarn', () => { - beforeEach(() => { - hasYarnSpy.returns(true); - }); - - it('should install prod deps', () => { - install('mydir', ['react']); - expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['add', 'react']); - }); - - it('should install dev deps', () => { - install('mydir', ['eslint'], true); - expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['add', 'eslint', '--dev']); - }); - - it('should install exact deps', () => { - install('mydir', ['react-dom'], false, true); - expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['add', 'react-dom', '--exact']); - }); - - it('should install exact dev deps', () => { - install('mydir', ['mocha'], true, true); - expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['add', 'mocha', '--dev', '--exact']); - }); - }); - - describe('with npm', () => { - beforeEach(() => { - hasYarnSpy.returns(false); - }); - - it('should install prod deps', () => { - install('mydir', ['react']); - expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['install', 'react', '--save']); - }); - - it('should install dev deps', () => { - install('mydir', ['eslint'], true); - expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['install', 'eslint', '--save-dev']); - }); - - it('should install exact deps', () => { - install('mydir', ['react-dom'], false, true); - expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['install', 'react-dom', '--save-exact', '--save']); - }); - - it('should install exact dev deps', () => { - install('mydir', ['mocha'], true, true); - expect(spawnSpy.firstCall.args[0]).to.be.deep.equal(['install', 'mocha', '--save-exact', '--save-dev']); - }); - }); -}); diff --git a/packages/_old/test/fast/makers/appx_spec.js b/packages/_old/test/fast/makers/appx_spec.js deleted file mode 100644 index e4154259f7..0000000000 --- a/packages/_old/test/fast/makers/appx_spec.js +++ /dev/null @@ -1,38 +0,0 @@ -import { tmpdir } from 'os'; -import { join } from 'path'; -import fs from 'fs-extra'; -import { expect } from 'chai'; - -import { createDefaultCertificate } from '../../../src/makers/win32/appx'; - -describe('appx maker', () => { - describe('createDefaultCertificate', () => { - const tmpDir = join(tmpdir(), `electron-forge-maker-appx-test-${Date.now()}`); - - before(async () => { - await fs.ensureDir(tmpDir); - }); - - after(async () => { - await fs.remove(tmpDir); - }); - - if (process.platform === 'win32') { - it('should create a .pfx file', async () => { - await fs.copy( - join(__dirname, '..', '..', 'fixture', 'bogus-private-key.pvk'), - join(tmpDir, 'dummy.pvk') - ); - const outputCertPath = await createDefaultCertificate('CN=Test', { - certFilePath: tmpDir, - certFileName: 'dummy', - install: false, - }); - - const fileContents = await fs.readFile(outputCertPath); - expect(fileContents).to.be.an.instanceof(Buffer); - expect(fileContents.length).to.be.above(0); - }); - } - }); -}); diff --git a/packages/_old/test/fast/makers/deb_spec.js b/packages/_old/test/fast/makers/deb_spec.js deleted file mode 100644 index c2883caef5..0000000000 --- a/packages/_old/test/fast/makers/deb_spec.js +++ /dev/null @@ -1,64 +0,0 @@ -import chai, { expect } from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import path from 'path'; -import proxyquire from 'proxyquire'; -import { stub } from 'sinon'; - -chai.use(chaiAsPromised); - -describe('deb maker', () => { - let debModule; - let debMaker; - let eidStub; - let ensureFileStub; - let forgeConfig; - - const dir = '/my/test/dir/out'; - const appName = 'My Test App'; - const targetArch = process.arch; - const packageJSON = { version: '1.2.3' }; - - beforeEach(() => { - ensureFileStub = stub().returns(Promise.resolve()); - eidStub = stub().resolves(); - forgeConfig = { electronInstallerDebian: {} }; - - debModule = proxyquire.noPreserveCache().noCallThru().load('../../../src/makers/linux/deb', { - './config-fn': config => config, - '../../util/ensure-output': { ensureFile: ensureFileStub }, - 'electron-installer-debian': eidStub, - }); - debMaker = debModule.default; - }); - - it('should pass through correct defaults', async () => { - await debMaker({ dir, appName, targetArch, forgeConfig, packageJSON }); - const opts = eidStub.firstCall.args[0]; - expect(opts).to.deep.equal({ - arch: debModule.debianArch(process.arch), - options: {}, - src: dir, - dest: path.resolve(dir, '..', 'make'), - }); - }); - - it('should have config cascade correctly', async () => { - forgeConfig.electronInstallerDebian = { - arch: 'overridden', - options: { - productName: 'Debian', - }, - }; - - await debMaker({ dir, appName, targetArch, forgeConfig, packageJSON }); - const opts = eidStub.firstCall.args[0]; - expect(opts).to.deep.equal({ - arch: debModule.debianArch(process.arch), - options: { - productName: 'Debian', - }, - src: dir, - dest: path.resolve(dir, '..', 'make'), - }); - }); -}); diff --git a/packages/_old/test/fast/makers/dmg_spec.js b/packages/_old/test/fast/makers/dmg_spec.js deleted file mode 100644 index 7b4ce02838..0000000000 --- a/packages/_old/test/fast/makers/dmg_spec.js +++ /dev/null @@ -1,64 +0,0 @@ -import chai, { expect } from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import path from 'path'; -import proxyquire from 'proxyquire'; -import { stub } from 'sinon'; - -chai.use(chaiAsPromised); - -describe('dmg maker', () => { - let dmgMaker; - let ensureFileStub; - let eidStub; - let renameStub; - let forgeConfig; - - const dir = '/my/test/dir/out'; - const appName = 'My Test App'; - const targetArch = process.arch; - const packageJSON = { version: '1.2.3' }; - - beforeEach(() => { - ensureFileStub = stub().returns(Promise.resolve()); - eidStub = stub().callsArg(1); - renameStub = stub().returns(Promise.resolve()); - forgeConfig = { electronInstallerDMG: {} }; - - dmgMaker = proxyquire.noPreserveCache().noCallThru().load('../../../src/makers/darwin/dmg', { - '../../util/config-fn': config => config, - '../../util/ensure-output': { ensureFile: ensureFileStub }, - 'electron-installer-dmg': eidStub, - 'fs-extra': { - rename: renameStub, - }, - }).default; - }); - - it('should pass through correct defaults', async () => { - await dmgMaker({ dir, appName, targetArch, forgeConfig, packageJSON }); - const opts = eidStub.firstCall.args[0]; - expect(opts).to.deep.equal({ - overwrite: true, - name: appName, - appPath: path.resolve(`${dir}/My Test App.app`), - out: path.resolve(`${dir.substr(0, dir.length - 4)}/make`), - }); - }); - - it('should attempt to rename the DMG file if no custom name is set', async () => { - await dmgMaker({ dir, appName, targetArch, forgeConfig, packageJSON }); - expect(renameStub.callCount).to.equal(1); - expect(renameStub.firstCall.args[1]).to.include('1.2.3'); - }); - - it('should rename the DMG file to include the version if no custom name is set', async () => { - await dmgMaker({ dir, appName, targetArch, forgeConfig, packageJSON }); - expect(renameStub.firstCall.args[1]).to.include('1.2.3'); - }); - - it('should not attempt to rename the DMG file if a custom name is set', async () => { - forgeConfig.electronInstallerDMG.name = 'foobar'; - await dmgMaker({ dir, appName, targetArch, forgeConfig, packageJSON }); - expect(renameStub.callCount).to.equal(0); - }); -}); diff --git a/packages/_old/test/fast/makers/flatpak_spec.js b/packages/_old/test/fast/makers/flatpak_spec.js deleted file mode 100644 index 5fb1c9b5c4..0000000000 --- a/packages/_old/test/fast/makers/flatpak_spec.js +++ /dev/null @@ -1,65 +0,0 @@ -import chai, { expect } from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import path from 'path'; -import proxyquire from 'proxyquire'; -import { stub } from 'sinon'; - -chai.use(chaiAsPromised); - -describe('flatpak maker', () => { - let flatpakModule; - let flatpakMaker; - let eidStub; - let ensureDirectoryStub; - let forgeConfig; - - const dir = '/my/test/dir/out'; - const appName = 'My Test App'; - const targetArch = process.arch; - const packageJSON = { version: '1.2.3' }; - - beforeEach(() => { - ensureDirectoryStub = stub().returns(Promise.resolve()); - eidStub = stub().callsArg(1); - forgeConfig = { electronInstallerFlatpak: {} }; - - flatpakModule = proxyquire.noPreserveCache().noCallThru().load('../../../src/makers/linux/flatpak', { - 'fs-extra': { readdir: stub().returns(Promise.resolve([])) }, - './config-fn': config => config, - '../../util/ensure-output': { ensureDirectory: ensureDirectoryStub }, - 'electron-installer-flatpak': eidStub, - }); - flatpakMaker = flatpakModule.default; - }); - - it('should pass through correct defaults', async () => { - await flatpakMaker({ dir, appName, targetArch, forgeConfig, packageJSON }); - const opts = eidStub.firstCall.args[0]; - expect(opts).to.deep.equal({ - arch: flatpakModule.flatpakArch(process.arch), - options: {}, - src: dir, - dest: path.resolve(dir, '..', 'make'), - }); - }); - - it('should have config cascade correctly', async () => { - forgeConfig.electronInstallerFlatpak = { - arch: 'overridden', - options: { - productName: 'Flatpak', - }, - }; - - await flatpakMaker({ dir, appName, targetArch, forgeConfig, packageJSON }); - const opts = eidStub.firstCall.args[0]; - expect(opts).to.deep.equal({ - arch: flatpakModule.flatpakArch(process.arch), - options: { - productName: 'Flatpak', - }, - src: dir, - dest: path.resolve(dir, '..', 'make'), - }); - }); -}); diff --git a/packages/_old/test/fast/makers/rpm_spec.js b/packages/_old/test/fast/makers/rpm_spec.js deleted file mode 100644 index 06508bb76d..0000000000 --- a/packages/_old/test/fast/makers/rpm_spec.js +++ /dev/null @@ -1,64 +0,0 @@ -import chai, { expect } from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import path from 'path'; -import proxyquire from 'proxyquire'; -import { stub } from 'sinon'; - -chai.use(chaiAsPromised); - -describe('rpm maker', () => { - let rpmModule; - let rpmMaker; - let eidStub; - let ensureFileStub; - let forgeConfig; - - const dir = '/my/test/dir/out'; - const appName = 'My Test App'; - const targetArch = process.arch; - const packageJSON = { version: '1.2.3' }; - - beforeEach(() => { - ensureFileStub = stub().returns(Promise.resolve()); - eidStub = stub().callsArg(1); - forgeConfig = { electronInstallerRedhat: {} }; - - rpmModule = proxyquire.noPreserveCache().noCallThru().load('../../../src/makers/linux/rpm', { - './config-fn': config => config, - '../../util/ensure-output': { ensureFile: ensureFileStub }, - 'electron-installer-redhat': eidStub, - }); - rpmMaker = rpmModule.default; - }); - - it('should pass through correct defaults', async () => { - await rpmMaker({ dir, appName, targetArch, forgeConfig, packageJSON }); - const opts = eidStub.firstCall.args[0]; - expect(opts).to.deep.equal({ - arch: rpmModule.rpmArch(process.arch), - options: {}, - src: dir, - dest: path.resolve(dir, '..', 'make'), - }); - }); - - it('should have config cascade correctly', async () => { - forgeConfig.electronInstallerRedhat = { - arch: 'overridden', - options: { - productName: 'Redhat', - }, - }; - - await rpmMaker({ dir, appName, targetArch, forgeConfig, packageJSON }); - const opts = eidStub.firstCall.args[0]; - expect(opts).to.deep.equal({ - arch: rpmModule.rpmArch(process.arch), - options: { - productName: 'Redhat', - }, - src: dir, - dest: path.resolve(dir, '..', 'make'), - }); - }); -}); diff --git a/packages/_old/test/fast/makers/snap_spec.js b/packages/_old/test/fast/makers/snap_spec.js deleted file mode 100644 index 51c7627422..0000000000 --- a/packages/_old/test/fast/makers/snap_spec.js +++ /dev/null @@ -1,59 +0,0 @@ -import chai, { expect } from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import path from 'path'; -import proxyquire from 'proxyquire'; -import { stub } from 'sinon'; - -chai.use(chaiAsPromised); - -describe('snap maker', () => { - let snapModule; - let snapMaker; - let eisStub; - let ensureDirectoryStub; - let forgeConfig; - - const dir = '/my/test/dir/out/foo-linux-x64'; - const appName = 'My Test App'; - const targetArch = process.arch; - const packageJSON = { version: '1.2.3' }; - - beforeEach(() => { - ensureDirectoryStub = stub().returns(Promise.resolve()); - eisStub = stub().resolves('/my/test/dir/out/make/foo_0.0.1_amd64.snap'); - forgeConfig = { electronInstallerSnap: {} }; - - snapModule = proxyquire.noPreserveCache().noCallThru().load('../../../src/makers/linux/snap', { - './config-fn': config => config, - '../../util/ensure-output': { ensureDirectory: ensureDirectoryStub }, - 'electron-installer-snap': eisStub, - }); - snapMaker = snapModule.default; - }); - - it('should pass through correct defaults', async () => { - await snapMaker({ dir, appName, targetArch, forgeConfig, packageJSON }); - const opts = eisStub.firstCall.args[0]; - expect(opts).to.deep.equal({ - arch: process.arch, - src: dir, - dest: path.resolve(dir, '..', 'make'), - }); - }); - - it('should have config cascade correctly', async () => { - forgeConfig.electronInstallerSnap = { - arch: 'overridden', - description: 'Snap description', - }; - - await snapMaker({ dir, appName, targetArch, forgeConfig, packageJSON }); - const opts = eisStub.firstCall.args[0]; - expect(opts).to.deep.equal({ - arch: process.arch, - src: dir, - dest: path.resolve(dir, '..', 'make'), - description: 'Snap description', - }); - }); -}); diff --git a/packages/_old/test/fast/makers_spec.js b/packages/_old/test/fast/makers_spec.js deleted file mode 100644 index fdb8279dac..0000000000 --- a/packages/_old/test/fast/makers_spec.js +++ /dev/null @@ -1,24 +0,0 @@ -import { expect } from 'chai'; - -describe('makers', () => { - describe('isSupportedOnCurrentPlatform', () => { - const expected = { - 'darwin/dmg': ['darwin'], - 'generic/zip': ['darwin', 'linux', 'win32'], - 'linux/deb': ['darwin', 'linux'], - 'linux/flatpak': ['darwin', 'linux'], - 'linux/rpm': ['darwin', 'linux'], - 'linux/snap': ['linux'], - 'win32/appx': ['win32'], - 'win32/squirrel': ['darwin', 'linux', 'win32'], - 'win32/wix': ['win32'], - }; - - Object.keys(expected).forEach(async (maker) => { - it(`for ${maker} should be correct`, async () => { - const { isSupportedOnCurrentPlatform } = require(`../../src/makers/${maker}`); - await expect(isSupportedOnCurrentPlatform()).to.eventually.equal(expected[maker].includes(process.platform)); - }); - }); - }); -}); diff --git a/packages/_old/test/fast/ora-handler_spec.js b/packages/_old/test/fast/ora-handler_spec.js deleted file mode 100644 index 5825a0a264..0000000000 --- a/packages/_old/test/fast/ora-handler_spec.js +++ /dev/null @@ -1,115 +0,0 @@ -import { expect } from 'chai'; -import proxyquire from 'proxyquire'; -import sinon from 'sinon'; - -describe('asyncOra', () => { - let asyncOra; - let MockOra; - let currentOra; - - beforeEach(() => { - currentOra = undefined; - MockOra = (text) => { - currentOra = { - start() { - this.started = true; - return currentOra; - }, - succeed() { - this.succeeded = true; - return currentOra; - }, - fail() { - this.failed = true; - return currentOra; - }, - get text() { - return currentOra._text; - }, - set text(newText) { - currentOra._text = newText; - }, - }; - currentOra.succeeded = false; - currentOra.failed = false; - currentOra._text = text; - return currentOra; - }; - asyncOra = proxyquire.noCallThru().load('../../src/util/ora-handler', { - './ora': MockOra, - }).default; - }); - - it('should create an ora with an initial value', () => { - asyncOra('say this first', async () => {}); - expect(currentOra).to.not.equal(undefined); - expect(currentOra.text).to.equal('say this first'); - }); - - it('should not create an ora when in non-interactive mode', () => { - asyncOra.interactive = false; - asyncOra('say this again', async () => {}); - expect(currentOra).to.equal(undefined); - }); - - it('should call the provided async function', async () => { - const spy = sinon.spy(); - await asyncOra('random text', async () => { - spy(); - }); - expect(spy.callCount).to.equal(1); - }); - - it('should succeed the ora if the async fn passes', async () => { - await asyncOra('random text', async () => { - if (2 + 2 === 5) console.error('Big brother is at it again'); // eslint-disable-line - }); - expect(currentOra.succeeded).to.equal(true); - expect(currentOra.failed).to.equal(false); - }); - - it('should fail the ora if the async fn throws', async () => { - await asyncOra('this is gonna end badly', async () => { - throw { message: 'Not an error', stack: 'No Stack - Not an error' }; // eslint-disable-line - }, () => {}); - expect(currentOra.succeeded).to.equal(false); - expect(currentOra.failed).to.equal(true); - }); - - it('should exit the process with status 1 if the async fn throws', async () => { - const processExitSpy = sinon.spy(); - await asyncOra('this is dodge', async () => { - throw 'woops'; // eslint-disable-line - }, processExitSpy); - expect(processExitSpy.callCount).to.equal(1); - expect(processExitSpy.firstCall.args).to.deep.equal([1]); - }); - - it('should exit the process with status 1 if the async fn throws a number', async () => { - const processExitSpy = sinon.spy(); - await asyncOra('this is dodge', async () => { - throw 42; // eslint-disable-line - }, processExitSpy); - expect(processExitSpy.callCount).to.equal(1); - expect(processExitSpy.firstCall.args).to.deep.equal([1]); - }); - - it('should just reject the promise in non-interactive mode if the fn throws', (done) => { - asyncOra.interactive = false; - asyncOra('doo-wop', async () => { - throw new Error('uh oh'); - }).then(() => done(new Error('expected asyncOra to be rejected'))) - .catch(() => done()); - }); - - it('should provide a fully functioning mock ora in non-interactive mode', async () => { - asyncOra.interactive = false; - await asyncOra('ora-magic', async (spinner) => { - expect(spinner).to.have.property('start'); - expect(spinner).to.have.property('stop'); - expect(spinner).to.have.property('succeed'); - expect(spinner).to.have.property('fail'); - expect(spinner.start().stop().fail().succeed()).to.equal(spinner); - }); - }); -}); diff --git a/packages/_old/test/fast/out-dir_spec.js b/packages/_old/test/fast/out-dir_spec.js deleted file mode 100644 index eaf61256ee..0000000000 --- a/packages/_old/test/fast/out-dir_spec.js +++ /dev/null @@ -1,26 +0,0 @@ -import { expect } from 'chai'; -import path from 'path'; - -import getCurrentOutDir from '../../src/util/out-dir'; - -describe('out-dir', () => { - const DIR = __dirname; - - describe('getCurrentOutDir', () => { - it('resolves to the default out directory when nothing extra is declared', () => { - expect(getCurrentOutDir(DIR, {})).to.equal(`${DIR}${path.sep}out`); - }); - - it('resolves to the provided identifier', () => { - expect(getCurrentOutDir(DIR, { - buildIdentifier: 'bar', - })).to.equal(`${DIR}${path.sep}out${path.sep}bar`); - }); - - it('resolves to the return value of provided identifier getter', () => { - expect(getCurrentOutDir(DIR, { - buildIdentifier: () => 'thing', - })).to.equal(`${DIR}${path.sep}out${path.sep}thing`); - }); - }); -}); diff --git a/packages/_old/test/fast/parse-archs_spec.js b/packages/_old/test/fast/parse-archs_spec.js deleted file mode 100644 index 931b7d3fe0..0000000000 --- a/packages/_old/test/fast/parse-archs_spec.js +++ /dev/null @@ -1,21 +0,0 @@ -import { expect } from 'chai'; - -import parseArchs from '../../src/util/parse-archs'; - -describe('parse-archs', () => { - it('should make an Array out of one arch', () => { - expect(parseArchs('linux', 'x64', '1.7.0')).to.deep.equal(['x64']); - }); - - it('should transform comma-separated values into an Array', () => { - expect(parseArchs('linux', 'ia32,x64', '1.7.0')).to.deep.equal(['ia32', 'x64']); - }); - - it('should use the official Electron arch list when arch is "all"', () => { - expect(parseArchs('win32', 'all', '1.7.0')).to.deep.equal(['ia32', 'x64']); - }); - - it('should default to [x64] when the platform is unknown', () => { - expect(parseArchs('nonexistent', 'all', '1.7.0')).to.deep.equal(['x64']); - }); -}); diff --git a/packages/_old/test/fast/publish_spec.js b/packages/_old/test/fast/publish_spec.js deleted file mode 100644 index 67a4f6f3bc..0000000000 --- a/packages/_old/test/fast/publish_spec.js +++ /dev/null @@ -1,234 +0,0 @@ -import chai, { expect } from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import fs from 'fs-extra'; -import os from 'os'; -import path from 'path'; -import proxyquire from 'proxyquire'; -import sinon from 'sinon'; - -chai.use(chaiAsPromised); - -describe('publish', () => { - let publish; - let makeStub; - let requireSearchStub; - let resolveStub; - let publisherSpy; - - beforeEach(() => { - requireSearchStub = sinon.stub(); - resolveStub = sinon.stub(); - makeStub = sinon.stub(); - publisherSpy = sinon.stub(); - - publish = proxyquire.noCallThru().load('../../src/api/publish', { - './make': async (...args) => makeStub(...args), - '../util/resolve-dir': async dir => resolveStub(dir), - '../util/read-package-json': () => Promise.resolve(require('../fixture/dummy_app/package.json')), - '../util/forge-config': () => require('../../src/util/forge-config').default(path.resolve(__dirname, '../fixture/dummy_app')), - '../util/require-search': requireSearchStub, - }).default; - - publisherSpy.returns(Promise.resolve()); - requireSearchStub.returns(publisherSpy); - resolveStub.returns(path.resolve(__dirname, '../fixture/dummy_app')); - makeStub.returns([]); - }); - - it('should should call make with makeOptions', async () => { - await publish({ - dir: __dirname, - interactive: false, - }); - expect(makeStub.callCount).to.equal(1); - }); - - it('should call the resolved publisher with the appropriate args', async () => { - makeStub.returns([{ artifacts: ['artifact1', 'artifact2'] }]); - await publish({ - dir: __dirname, - interactive: false, - authToken: 'my_token', - tag: 'my_special_tag', - }); - expect(publisherSpy.callCount).to.equal(1); - // pluginInterface will be a new instance so we ignore it - delete publisherSpy.firstCall.args[0].forgeConfig.pluginInterface; - const testConfig = await require('../../src/util/forge-config').default(path.resolve(__dirname, '../fixture/dummy_app')); - - delete testConfig.pluginInterface; - expect(publisherSpy.firstCall.args).to.deep.equal([{ - dir: resolveStub(), - artifacts: ['artifact1', 'artifact2'], - packageJSON: require('../fixture/dummy_app/package.json'), - forgeConfig: testConfig, - authToken: 'my_token', - tag: 'my_special_tag', - platform: process.platform, - arch: process.arch, - }]); - }); - - it('should default to publishing to github', async () => { - await publish({ - dir: __dirname, - interactive: false, - }); - expect(requireSearchStub.firstCall.args[1][0]).to.equal('../publishers/github.js'); - }); - - it('should resolve publishers when given a string name', async () => { - await publish({ - dir: __dirname, - interactive: false, - publishTargets: ['void'], - }); - expect(requireSearchStub.firstCall.args[1][0]).to.equal('../publishers/void.js'); - }); - - it('should resolve consecutive publishers when given an array of names', async () => { - await publish({ - dir: __dirname, - interactive: false, - publishTargets: ['void', 'nowhere', 'black_hole', 'everywhere'], - }); - expect(requireSearchStub.getCall(0).args[1][0]).to.equal('../publishers/void.js'); - expect(requireSearchStub.getCall(1).args[1][0]).to.equal('../publishers/nowhere.js'); - expect(requireSearchStub.getCall(2).args[1][0]).to.equal('../publishers/black_hole.js'); - expect(requireSearchStub.getCall(3).args[1][0]).to.equal('../publishers/everywhere.js'); - }); - - describe('dry run', () => { - let dir; - - const fakeMake = (platform) => { - const ret = [ - { artifacts: [ - path.resolve(dir, `out/make/artifact1-${platform}`), - path.resolve(dir, `out/make/artifact2-${platform}`), - ] }, { artifacts: [ - path.resolve(dir, `out/make/artifact3-${platform}`), - ] }, - { artifacts: [ - path.resolve(dir, `out/make/artifact4-${platform}`), - ] }, - ]; - const state = { - platform, - arch: 'x64', - packageJSON: { state: platform === 'darwin' ? 1 : 0 }, - }; - Object.assign(ret[0], state); - Object.assign(ret[1], state); - Object.assign(ret[2], state); - return ret; - }; - - before(async () => { - dir = await fs.mkdtemp(path.resolve(os.tmpdir(), 'electron-forge-test-')); - }); - - describe('when creating a dry run', () => { - beforeEach(async () => { - makeStub.returns(fakeMake('darwin')); - const dryPath = path.resolve(dir, 'out', 'publish-dry-run'); - await fs.mkdirs(dryPath); - await fs.writeFile(path.resolve(dryPath, 'hash.json'), 'test'); - await publish({ - dir, - interactive: false, - target: [], - dryRun: true, - }); - expect(await fs.exists(path.resolve(dryPath, 'hash.json'))).to.equal(false, 'previous hashes should be erased'); - const backupDir = path.resolve(dir, 'out', 'backup'); - await fs.move(dryPath, backupDir); - makeStub.returns(fakeMake('win32')); - await publish({ - dir, - interactive: false, - target: [], - dryRun: true, - }); - for (const backedUp of await fs.readdir(backupDir)) { - await fs.copy(path.resolve(backupDir, backedUp), path.resolve(dryPath, backedUp)); - } - }); - - it('should create dry run hash JSON files', async () => { - expect(makeStub.callCount).to.equal(2); - const dryRunFolder = path.resolve(dir, 'out', 'publish-dry-run'); - expect(await fs.exists(dryRunFolder)).to.equal(true); - - const hashFolders = await fs.readdir(dryRunFolder); - expect(hashFolders).to.have.length(2, 'Should contain two hashes (two publishes)'); - for (const hashFolderName of hashFolders) { - const hashFolder = path.resolve(dryRunFolder, hashFolderName); - const makes = await fs.readdir(hashFolder); - expect(makes).to.have.length(3, 'Should contain the results of three makes'); - for (const makeJson of makes) { - const jsonPath = path.resolve(hashFolder, makeJson); - const contents = await fs.readFile(jsonPath, 'utf8'); - expect(() => JSON.parse(contents), 'Should be valid JSON').to.not.throw(); - const data = JSON.parse(contents); - expect(data).to.have.property('artifacts'); - expect(data).to.have.property('platform'); - expect(data).to.have.property('arch'); - expect(data).to.have.property('packageJSON'); - - // Make the artifacts for later - for (const artifactPath of data.artifacts) { - await fs.mkdirp(path.dirname(path.resolve(dir, artifactPath))); - await fs.writeFile(path.resolve(dir, artifactPath), artifactPath); - } - } - } - }); - }); - - describe('when resuming a dry run', () => { - let publisher; - - beforeEach(async () => { - publisher = sinon.stub(); - publisher.returns(Promise.resolve()); - requireSearchStub.returns(publisher); - await publish({ - dir, - interactive: false, - target: [__filename], - dryRunResume: true, - }); - }); - - it('should successfully restore values and pass them to publisher', () => { - expect(makeStub.callCount).to.equal(0); - expect(publisher.callCount).to.equal(2, 'should call once for each platform (make run)'); - const darwinIndex = publisher.firstCall.args[0].platform === 'darwin' ? 0 : 1; - const win32Index = darwinIndex === 0 ? 1 : 0; - const darwinArgs = publisher.getCall(darwinIndex).args[0]; - expect(darwinArgs.artifacts.sort()).to.deep.equal( - fakeMake('darwin').reduce((accum, val) => accum.concat(val.artifacts), []).sort() - ); - expect(darwinArgs.packageJSON).to.deep.equal({ state: 1 }); - expect(darwinArgs.authToken).to.equal(undefined); - expect(darwinArgs.tag).to.equal(null); - expect(darwinArgs.platform).to.equal('darwin'); - expect(darwinArgs.arch).to.equal('x64'); - const win32Args = publisher.getCall(win32Index).args[0]; - expect(win32Args.artifacts.sort()).to.deep.equal( - fakeMake('win32').reduce((accum, val) => accum.concat(val.artifacts), []).sort() - ); - expect(win32Args.packageJSON).to.deep.equal({ state: 0 }); - expect(win32Args.authToken).to.equal(undefined); - expect(win32Args.tag).to.equal(null); - expect(win32Args.platform).to.equal('win32'); - expect(win32Args.arch).to.equal('x64'); - }); - }); - - after(async () => { - await fs.remove(dir); - }); - }); -}); diff --git a/packages/_old/test/fast/read-package-json_spec.js b/packages/_old/test/fast/read-package-json_spec.js deleted file mode 100644 index 3f1d4ca5d3..0000000000 --- a/packages/_old/test/fast/read-package-json_spec.js +++ /dev/null @@ -1,10 +0,0 @@ -import path from 'path'; -import { expect } from 'chai'; - -import readPackageJSON from '../../src/util/read-package-json'; - -describe('read-package-json', () => { - it('should find a package.json file from the given directory', async () => { - expect(await readPackageJSON(path.resolve(__dirname, '../..'))).to.deep.equal(require('../..//package.json')); - }); -}); diff --git a/packages/_old/test/fast/require-search_spec.js b/packages/_old/test/fast/require-search_spec.js deleted file mode 100644 index 497361d240..0000000000 --- a/packages/_old/test/fast/require-search_spec.js +++ /dev/null @@ -1,16 +0,0 @@ -import { expect } from 'chai'; - -import requireSearch from '../../src/util/require-search'; -import findConfig from '../../src/util/forge-config'; - -describe('require-search', () => { - it('should resolve undefined if no file exists', () => { - const resolved = requireSearch(__dirname, ['../../src/util/wizard-secrets']); - expect(resolved).to.equal(undefined); - }); - - it('should resolve a file if it exists', () => { - const resolved = requireSearch(__dirname, ['../../src/util/forge-config']); - expect(resolved).to.equal(findConfig); - }); -}); diff --git a/packages/_old/test/fast/resolve-dir_spec.js b/packages/_old/test/fast/resolve-dir_spec.js deleted file mode 100644 index 5aee25e799..0000000000 --- a/packages/_old/test/fast/resolve-dir_spec.js +++ /dev/null @@ -1,15 +0,0 @@ -import { expect } from 'chai'; -import path from 'path'; - -import resolveDir from '../../src/util/resolve-dir'; - -describe('resolve-dir', () => { - it('should return null if a valid dir can not be found', async () => { - expect(await resolveDir('/foo/var/fake')).to.be.equal(null); - }); - - it('should return a directory if it finds a node module', async () => { - expect(await resolveDir(path.resolve(__dirname, '../fixture/dummy_app/foo'))).to.not.be.equal(null); - expect(await resolveDir(path.resolve(__dirname, '../fixture/dummy_app/foo'))).to.be.equal(path.resolve(__dirname, '../fixture/dummy_app')); - }); -}); diff --git a/packages/_old/test/fast/start_spec.js b/packages/_old/test/fast/start_spec.js deleted file mode 100644 index c6094bb4e0..0000000000 --- a/packages/_old/test/fast/start_spec.js +++ /dev/null @@ -1,208 +0,0 @@ -import chai, { expect } from 'chai'; -import chaiAsPromised from 'chai-as-promised'; -import path from 'path'; -import proxyquire from 'proxyquire'; -import sinon from 'sinon'; - -chai.use(chaiAsPromised); - -describe('start', () => { - let start; - let packageJSON; - let resolveStub; - let spawnStub; - let shouldOverride; - - beforeEach(() => { - resolveStub = sinon.stub(); - spawnStub = sinon.stub(); - shouldOverride = false; - packageJSON = require('../fixture/dummy_app/package.json'); - - start = proxyquire.noCallThru().load('../../src/api/start', { - '../util/forge-config': async () => ({ - pluginInterface: { - overrideStartLogic: async () => shouldOverride, - triggerHook: async () => false, - }, - }), - '../util/resolve-dir': async dir => resolveStub(dir), - '../util/read-package-json': () => Promise.resolve(packageJSON), - '../util/rebuild': () => Promise.resolve(), - child_process: { - spawn: spawnStub, - }, - }).default; - }); - - it('should spawn electron in the correct dir', async () => { - resolveStub.returnsArg(0); - await start({ - dir: __dirname, - interactive: false, - }); - expect(spawnStub.callCount).to.equal(1); - expect(spawnStub.firstCall.args[0]).to.equal(process.execPath); - expect(spawnStub.firstCall.args[1][0]).to.contain(`electron${path.sep}cli`); - expect(spawnStub.firstCall.args[2]).to.have.property('cwd', __dirname); - expect(spawnStub.firstCall.args[2].env).to.not.have.property('ELECTRON_ENABLE_LOGGING'); - }); - - it('should not spawn if a plugin overrides the start command', async () => { - resolveStub.returnsArg(0); - shouldOverride = true; - await start({ - dir: __dirname, - interactive: false, - }); - expect(spawnStub.callCount).to.equal(0); - }); - - it("should pass electron '.' as the app path if not specified", async () => { - resolveStub.returnsArg(0); - await start({ - dir: __dirname, - }); - expect(spawnStub.callCount).to.equal(1); - expect(spawnStub.firstCall.args[0]).to.equal(process.execPath); - expect(spawnStub.firstCall.args[1][0]).to.contain(`electron${path.sep}cli`); - expect(spawnStub.firstCall.args[1][1]).to.equal('.'); - }); - - it('should pass electron the app path if specified', async () => { - resolveStub.returnsArg(0); - await start({ - dir: __dirname, - appPath: '/path/to/app.js', - }); - expect(spawnStub.callCount).to.equal(1); - expect(spawnStub.firstCall.args[0]).to.equal(process.execPath); - expect(spawnStub.firstCall.args[1][0]).to.contain(`electron${path.sep}cli`); - expect(spawnStub.firstCall.args[1][1]).to.equal('/path/to/app.js'); - }); - - it('should enable electron logging if enableLogging=true', async () => { - resolveStub.returnsArg(0); - await start({ - dir: __dirname, - interactive: false, - enableLogging: true, - }); - expect(spawnStub.callCount).to.equal(1); - expect(spawnStub.firstCall.args[0]).to.equal(process.execPath); - expect(spawnStub.firstCall.args[1][0]).to.contain(`electron${path.sep}cli`); - expect(spawnStub.firstCall.args[2].env).to.have.property('ELECTRON_ENABLE_LOGGING', true); - }); - - it('should enable RUN_AS_NODE if runAsNode=true', async () => { - resolveStub.returnsArg(0); - await start({ - dir: __dirname, - interactive: false, - runAsNode: true, - }); - expect(spawnStub.callCount).to.equal(1); - expect(spawnStub.firstCall.args[2].env).to.have.property('ELECTRON_RUN_AS_NODE', true); - }); - - it('should disable RUN_AS_NODE if runAsNode=false', async () => { - resolveStub.returnsArg(0); - await start({ - dir: __dirname, - interactive: false, - runAsNode: false, - }); - expect(spawnStub.callCount).to.equal(1); - expect(spawnStub.firstCall.args[2].env).to.not.have.property('ELECTRON_RUN_AS_NODE'); - }); - - it('should throw if no dir could be found', async () => { - resolveStub.returns(null); - - await expect(start()).to.eventually.be.rejectedWith( - 'Failed to locate startable Electron application' - ); - }); - - it('should throw if no version is in package.json', async () => { - resolveStub.returnsArg(0); - packageJSON = Object.assign({}, packageJSON); - delete packageJSON.version; - await expect(start({ - dir: __dirname, - interactive: false, - })).to.eventually.be.rejectedWith( - `Please set your application's 'version' in '${__dirname}/package.json'.` - ); - }); - - it('should pass all args through to the spawned Electron instance', async () => { - const args = ['magic_arg', 123, 'thingy']; - resolveStub.returnsArg(0); - spawnStub.returns(0); - await start({ - dir: __dirname, - interactive: false, - args, - }); - expect(spawnStub.callCount).to.equal(1); - expect(spawnStub.firstCall.args[0]).to.equal(process.execPath); - expect(spawnStub.firstCall.args[1].slice(2)).to.deep.equal(args); - }); - - it('should pass --inspect at the start of the args if inspect is set', async () => { - const args = ['magic']; - resolveStub.returnsArg(0); - spawnStub.returns(0); - await start({ - dir: __dirname, - interactive: false, - args, - inspect: true, - }); - expect(spawnStub.callCount).to.equal(1); - expect(spawnStub.firstCall.args[0]).to.equal(process.execPath); - expect(spawnStub.firstCall.args[1].slice(2)).to.deep.equal(['--inspect'].concat(args)); - }); - - it('should resolve with a handle to the spawned instance', async () => { - resolveStub.returnsArg(0); - spawnStub.returns('child'); - - await expect(start({ - dir: __dirname, - interactive: false, - enableLogging: true, - })).to.eventually.equal('child'); - }); - - describe('cli', () => { - let argv; - let childExitCode; - let childStub; - beforeEach(() => { - argv = process.argv; - childExitCode = 0; - childStub = { - on: (event, cb) => cb(childExitCode), - }; - }); - - it('should remove all "~" from args when in VSCode debug mode', (done) => { - process.argv = [argv[0], '--vscode', '--', '--foo', 'bar', 'this arg exists']; - proxyquire.noCallThru().load('../../src/electron-forge-start', { - './api': { - start: (startOptions) => { - expect(startOptions.args).to.deep.equal(['--foo', 'bar', 'this arg exists']); - done(); - return Promise.resolve(childStub); - }, - }, - }); - }); - - afterEach(() => { - process.argv = argv; - }); - }); -}); diff --git a/packages/_old/test/fast/system_spec.js b/packages/_old/test/fast/system_spec.js deleted file mode 100644 index b17ca8c718..0000000000 --- a/packages/_old/test/fast/system_spec.js +++ /dev/null @@ -1,24 +0,0 @@ -import { expect } from 'chai'; - -import checkSystem, { validPackageManagerVersion } from '../../src/util/check-system'; -import { fakeOra } from '../../src/util/ora'; - -describe('check-system', () => { - it('should succeed on valid agents', async () => { - expect(await checkSystem(fakeOra())).to.be.equal(true); - }); - - describe('validPackageManagerVersion', () => { - it('should consider whitelisted versions to be valid', () => { - expect(validPackageManagerVersion('NPM', '3.10.1', '^3.0.0', fakeOra())).to.be.equal(true); - }); - - it('should consider Yarn nightly versions to be invalid', () => { - expect(validPackageManagerVersion('Yarn', '0.23.0-20170311.0515', '0.23.0', fakeOra())).to.be.equal(false); - }); - - it('should consider invalid semver versions to be invalid', () => { - expect(validPackageManagerVersion('Yarn', '0.22', '0.22.0', fakeOra())).to.be.equal(false); - }); - }); -}); diff --git a/packages/_old/test/fast/yarn-or-npm_spec.js b/packages/_old/test/fast/yarn-or-npm_spec.js deleted file mode 100644 index cb05ce0edc..0000000000 --- a/packages/_old/test/fast/yarn-or-npm_spec.js +++ /dev/null @@ -1,39 +0,0 @@ -import { expect } from 'chai'; - -import systemYarnOrNpm from 'yarn-or-npm'; -import yarnOrNpm from '../../src/util/yarn-or-npm'; - -describe('yarn-or-npm', () => { - let nodeInstaller; - - beforeEach(() => { - nodeInstaller = process.env.NODE_INSTALLER; - }); - - afterEach(() => { - if (!nodeInstaller) { - delete process.env.NODE_INSTALLER; - } else { - process.env.NODE_INSTALLER = nodeInstaller; - } - }); - - it('should by default equal the system yarn-or-npm value', () => { - expect(yarnOrNpm()).to.be.equal(systemYarnOrNpm()); - }); - - it('should return yarn if NODE_INSTALLER=yarn', () => { - process.env.NODE_INSTALLER = 'yarn'; - expect(yarnOrNpm()).to.be.equal('yarn'); - }); - - it('should return npm if NODE_INSTALLER=npm', () => { - process.env.NODE_INSTALLER = 'npm'; - expect(yarnOrNpm()).to.be.equal('npm'); - }); - - it('should return system value if NODE_INSTALLER is an unrecognized installer', () => { - process.env.NODE_INSTALLER = 'magical_unicorn'; - expect(yarnOrNpm()).to.be.equal(systemYarnOrNpm()); - }); -}); diff --git a/packages/_old/test/fixture/bogus-private-key.pvk b/packages/_old/test/fixture/bogus-private-key.pvk deleted file mode 100755 index 0563d8d94ab28566fc57f88198e582c4e7abf506..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1196 zcmV;d1XKGS@wKo30000200000000000001#1ONaB0ssI2Bme+XQ$aES2mk;90097f zwK~)y7g0gw!X1_#s-lgcvdUCGPLyP1qC}W!*f^1Qlxw=jlm>Ok&AICR^<^6iiC+vM zx+92@CRCEta0R*BW}o56l^Sz^85eXeVv4A=E^h|?r zCVOZg#;Qf_rUy;Rhaij7jRVf+6edkufn(^4P*jn^op33t;T3-^5r%@)MKB&>gcX&^ zs(Wg?9(Yuz8x1uhK1sIcyeK5Dbbp6LQv9W**1^KTRPKSr)MUbsD6W~M_BG8Rv2_tN z_O5FM48@D6F7@O%FnBL&L?PTsX=FR*!mi~CgZ{-jT4tEi%~Yf34!Ut8)*rH6so^5$ z4u278Y2j$cp(8J;aE6PO8I_F;M_I7;QIv$!oatmSR(yyD8U;rF+Zs8{C`hFQ)4xExw95wh5-vDJA^&4cC^MN7?Jk;CpDps z-hrfB`K(=ZCAttLt*8=CB0v!z3JVRnhuJuQjv?ko>L3HrdBsfnmRgvT>H3kO!JFVS z66ktJm~rORTS$LI93)RnRLa?aWw0nO&(1}Gs3uDc!KTqzbNC3kZuh@0nIQTg`V8W4 z%p;#FS0QQuHea|}AV(A-j~a3sf$Eg|t3b4X@GsWubil|j6Oi(CB-I6T9+3}_R-vv6 zhUQP6w1B&?iji1x?l$;nDwvtKaunbqUu$a6Uv;I+&+uS?%r4A2vy)wu%sY2tTr|^l zno*Z_Aj<;zKndPJST-?b4}jjrn8>h;o#qF#it?J;Eq4p;6XPH1;I7}h0U2e$^m`?f=G->oNSzUS=`w z#=GZsN9X&qVIm9k+OUt-!V=;DQhOHZ%Uy9ft|Ok5bX!Ow(l5<#Z9WskwPMZD*%iI{b8g; zePjqmpd`BH9w>~h)hktQ(tQC3WwAdguGPi#?ASM#N;}Uhg{)t7 zOcxyA84`zQqC;JoyZ|gMqom7VxzIVnc~sqic|KX~37j`si83X2AS*ku-XnDh6|qla z!?~x+n?ir1d-tSoXpjdK&dWU%7jsnDSTF)t9y_s|0LAZTDcX1FalS_1KVbeUXwP~} KDkb}Rv&aXl$ue93 diff --git a/packages/_old/test/fixture/custom_init/index.js b/packages/_old/test/fixture/custom_init/index.js deleted file mode 100644 index 19ef99c50a..0000000000 --- a/packages/_old/test/fixture/custom_init/index.js +++ /dev/null @@ -1,8 +0,0 @@ -const path = require('path'); - -module.exports = { - dependencies: ['react'], - devDependencies: ['react-dom'], - templateDirectory: path.resolve(__dirname, './tmpl'), - postCopy: (initDir, ora, lintStyle) => {}, // eslint-disable-line -}; diff --git a/packages/_old/test/fixture/custom_init/package.json b/packages/_old/test/fixture/custom_init/package.json deleted file mode 100644 index 6c00e3a5ac..0000000000 --- a/packages/_old/test/fixture/custom_init/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "electron-forge-template-dummy", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "electron-forge start" - }, - "keywords": [], - "author": "", - "license": "MIT" -} diff --git a/packages/_old/test/fixture/custom_init/tmpl/_bar b/packages/_old/test/fixture/custom_init/tmpl/_bar deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/_old/test/fixture/custom_init/tmpl/src/foo.js b/packages/_old/test/fixture/custom_init/tmpl/src/foo.js deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/_old/test/fixture/dummy_app/foo/null b/packages/_old/test/fixture/dummy_app/foo/null deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/packages/_old/test/fixture/dummy_app/package.json b/packages/_old/test/fixture/dummy_app/package.json deleted file mode 100644 index 7d60780d49..0000000000 --- a/packages/_old/test/fixture/dummy_app/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "", - "productName": "", - "version": "1.0.0", - "description": "", - "main": "src/index.js", - "scripts": { - "start": "electron-forge start" - }, - "keywords": [], - "author": "", - "license": "MIT", - "config": { - "forge": { - "make_targets": { - "win32": ["squirrel", "appx"], - "darwin": ["zip"], - "linux": ["deb", "rpm"] - }, - "electronPackagerConfig": {}, - "electronInstallerRedhat": {}, - "electronInstallerDebian": {}, - "electronWinstallerConfig": { "windows": "magic" }, - "windowsStoreConfig": { "packageName": "test" }, - "github_repository": { - "owner": "dummy", - "name": "project" - } - } - }, - "devDependencies": { - "electron": "9.9.9" - } -} diff --git a/packages/_old/test/fixture/dummy_js_conf/forge.config.js b/packages/_old/test/fixture/dummy_js_conf/forge.config.js deleted file mode 100644 index e24e909eff..0000000000 --- a/packages/_old/test/fixture/dummy_js_conf/forge.config.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = { - make_targets: { - win32: ['squirrel', 'appx'], - darwin: ['zip'], - linux: ['deb', 'rpm'], - mas: ['zip'], - }, - electronPackagerConfig: { foo: 'bar', baz: {} }, - electronWinstallerConfig: {}, - electronInstallerDebian: {}, - electronInstallerRedhat: {}, - magicFn: () => 'magic result', -}; diff --git a/packages/_old/test/fixture/dummy_js_conf/package.json b/packages/_old/test/fixture/dummy_js_conf/package.json deleted file mode 100644 index ebd70b7b87..0000000000 --- a/packages/_old/test/fixture/dummy_js_conf/package.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "name": "", - "productName": "", - "version": "1.0.0", - "description": "", - "main": "src/index.js", - "scripts": { - "start": "electron-forge start" - }, - "keywords": [], - "author": "", - "license": "MIT", - "config": { - "forge": "./forge.config.js" - }, - "devDependencies": { - "electron-prebuilt": "9.9.9" - } -} diff --git a/packages/_old/test/fixture/maker-incompatible.js b/packages/_old/test/fixture/maker-incompatible.js deleted file mode 100644 index 4a26cae2c7..0000000000 --- a/packages/_old/test/fixture/maker-incompatible.js +++ /dev/null @@ -1 +0,0 @@ -export default async () => 'i don\'t implement isSupportedOnCurrentPlatform()'; diff --git a/packages/_old/test/fixture/maker-unsupported.js b/packages/_old/test/fixture/maker-unsupported.js deleted file mode 100644 index bdef2a4c6b..0000000000 --- a/packages/_old/test/fixture/maker-unsupported.js +++ /dev/null @@ -1,3 +0,0 @@ -export const isSupportedOnCurrentPlatform = async () => false; - -export default async () => 'i don\'t support any platforms'; diff --git a/packages/_old/test/fixture/native_app/package.json b/packages/_old/test/fixture/native_app/package.json deleted file mode 100644 index ac70908278..0000000000 --- a/packages/_old/test/fixture/native_app/package.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "name": "native-app", - "productName": "Native App", - "version": "1.0.0", - "description": "", - "main": "src/index.js", - "scripts": { - "start": "electron-forge start" - }, - "keywords": [], - "author": "", - "license": "MIT", - "config": { - "forge": "./forge.config.js" - }, - "devDependencies": { - "ffi": "2.2.0" - }, - "dependencies": { - "ref": "1.3.3", - "benchr": "3.2.0", - "@newrelic/native-metrics": "2.1.1" - }, - "optionalDependencies": { - "zipfile": "0.5.11" - } -} diff --git a/packages/_old/test/mocha.opts b/packages/_old/test/mocha.opts deleted file mode 100644 index 74f680e91e..0000000000 --- a/packages/_old/test/mocha.opts +++ /dev/null @@ -1,2 +0,0 @@ ---require @babel/register ---timeout 300000 diff --git a/packages/_old/test/slow/api_spec_slow.js b/packages/_old/test/slow/api_spec_slow.js deleted file mode 100644 index 4e742b62a1..0000000000 --- a/packages/_old/test/slow/api_spec_slow.js +++ /dev/null @@ -1,371 +0,0 @@ -import { execSync } from 'child_process'; -import asar from 'asar'; -import fs from 'fs-extra'; -import os from 'os'; -import path from 'path'; - -import { expect } from 'chai'; -import proxyquire from 'proxyquire'; - -import { createDefaultCertificate } from '../../src/makers/win32/appx'; -import installDeps from '../../src/util/install-dependencies'; -import readPackageJSON from '../../src/util/read-package-json'; -import yarnOrNpm from '../../src/util/yarn-or-npm'; - -const nodeInstallerArg = process.argv.find(arg => arg.startsWith('--installer=')) || `--installer=${yarnOrNpm()}`; -const nodeInstaller = nodeInstallerArg.substr(12); -const forge = proxyquire.noCallThru().load('../../src/api', { - './install': async () => {}, -}); - -describe(`electron-forge API (with installer=${nodeInstaller})`, () => { - let dir; - let dirID = Date.now(); - - const ensureTestDirIsNonexistent = async () => { - dir = path.resolve(os.tmpdir(), `electron-forge-test-${dirID}`); - dirID += 1; - await fs.remove(dir); - }; - - const beforeInitTest = (params, beforeInit) => { - before(async () => { - await ensureTestDirIsNonexistent(); - if (beforeInit) { - beforeInit(); - } - await forge.init(Object.assign({}, params, { dir })); - }); - }; - - const expectProjectPathExists = async (subPath, pathType) => { - expect(await fs.pathExists(path.resolve(dir, subPath)), `the ${subPath} ${pathType} should exist`).to.equal(true); - }; - - describe('init', () => { - beforeInitTest(); - - it('should create a new folder with a npm module inside', async () => { - expect(await fs.pathExists(dir), 'the target dir should have been created').to.equal(true); - expectProjectPathExists('package.json', 'file'); - }); - - it('should have initialized a git repository', async () => { - expectProjectPathExists('.git', 'folder'); - }); - - it('should have installed the initial node_modules', async () => { - expectProjectPathExists('node_modules', 'folder'); - expect(await fs.pathExists(path.resolve(dir, 'node_modules/electron')), 'electron should exist').to.equal(true); - expect(await fs.pathExists(path.resolve(dir, 'node_modules/babel-core')), 'babel-core should exist').to.equal(true); - expect(await fs.pathExists(path.resolve(dir, 'node_modules/electron-forge')), 'electron-forge should exist').to.equal(true); - }); - - describe('lint', () => { - it('should initially pass the linting process', () => forge.lint({ dir })); - }); - - after(() => fs.remove(dir)); - }); - - describe('init with CI files enabled', () => { - beforeInitTest({ copyCIFiles: true }); - - it('should copy over the CI config files correctly', async () => { - expect(await fs.pathExists(dir), 'the target dir should have been created').to.equal(true); - expectProjectPathExists('.appveyor.yml', 'file'); - expectProjectPathExists('.travis.yml', 'file'); - }); - }); - - describe('init (with custom templater)', () => { - beforeInitTest({ template: 'dummy' }, () => { - execSync('npm link', { - cwd: path.resolve(__dirname, '../fixture/custom_init'), - }); - }); - - it('should create dot files correctly', async () => { - expect(await fs.pathExists(dir), 'the target dir should have been created').to.equal(true); - expectProjectPathExists('.bar', 'file'); - }); - - it('should create deep files correctly', async () => { - expectProjectPathExists('src/foo.js', 'file'); - }); - - describe('lint', () => { - it('should initially pass the linting process', () => forge.lint({ dir })); - }); - - after(async () => { - await fs.remove(dir); - execSync('npm unlink', { - cwd: path.resolve(__dirname, '../fixture/custom_init'), - }); - }); - }); - - describe('init (with built-in templater)', () => { - before(ensureTestDirIsNonexistent); - - it('should succeed in initializing', async () => { - await forge.init({ - dir, - template: 'react-typescript', - }); - }); - - it('should succeed in initializing an already initialized directory', async () => { - await forge.init({ - dir, - template: 'react-typescript', - }); - }); - - it('should add a dependency on react', async () => { - expect(Object.keys(require(path.resolve(dir, 'package.json')).dependencies)).to.contain('react'); - }); - - after(async () => { - await fs.remove(dir); - }); - }); - - describe('init (with a nonexistent templater)', () => { - before(ensureTestDirIsNonexistent); - - it('should fail in initializing', async () => { - await expect(forge.init({ - dir, - template: 'does-not-exist', - })).to.eventually.be.rejectedWith('Failed to locate custom template'); - }); - - after(async () => { - await fs.remove(dir); - }); - }); - - describe('import', () => { - before(async () => { - await ensureTestDirIsNonexistent(); - await fs.mkdir(dir); - execSync(`${nodeInstaller} init -y`, { - cwd: dir, - }); - }); - - it('creates a forge config', async () => { - const packageJSON = await readPackageJSON(dir); - packageJSON.name = 'Name'; - packageJSON.productName = 'Product Name'; - packageJSON.customProp = 'propVal'; - await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); - - await forge.import({ dir }); - - const { - config: { - forge: { - electronWinstallerConfig: { name: winstallerName }, - windowsStoreConfig: { name: windowsStoreName }, - }, - }, - customProp, - } = await readPackageJSON(dir); - - expect(winstallerName).to.equal('Name'); - expect(windowsStoreName).to.equal('Product Name'); - expect(customProp).to.equal('propVal'); - }); - - it('defaults windowsStoreConfig.name to packageJSON.name', async () => { - const packageJSON = await readPackageJSON(dir); - packageJSON.name = 'Name'; - delete packageJSON.productName; - await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); - - await forge.import({ dir }); - - const { - config: { - forge: { - electronWinstallerConfig: { name: winstallerName }, - windowsStoreConfig: { name: windowsStoreName }, - }, - }, - } = await readPackageJSON(dir); - - expect(winstallerName).to.equal('Name'); - expect(windowsStoreName).to.equal('Name'); - }); - - after(async () => { - await fs.remove(dir); - }); - }); - - describe('after init', () => { - before(async () => { - dir = path.resolve(os.tmpdir(), `electron-forge-test-${dirID}/electron-forge-test`); - dirID += 1; - await forge.init({ dir }); - - const packageJSON = await readPackageJSON(dir); - packageJSON.name = 'testapp'; - packageJSON.productName = 'Test App'; - packageJSON.config.forge.electronPackagerConfig.asar = false; - packageJSON.config.forge.windowsStoreConfig.packageName = 'TestApp'; - if (process.platform === 'win32') { - await fs.copy( - path.join(__dirname, '..', 'fixture', 'bogus-private-key.pvk'), - path.join(dir, 'default.pvk') - ); - packageJSON.config.forge.windowsStoreConfig.devCert = await createDefaultCertificate( - 'CN=Test Author', - { certFilePath: dir } - ); - } - packageJSON.homepage = 'http://www.example.com/'; - packageJSON.author = 'Test Author'; - await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); - }); - - it('can package to outDir without errors', async () => { - const outDir = `${dir}/foo`; - - expect(await fs.pathExists(outDir)).to.equal(false); - - await forge.package({ dir, outDir }); - - expect(await fs.pathExists(outDir)).to.equal(true); - }); - - it('can make from custom outDir without errors', async () => { - const packageJSON = await readPackageJSON(dir); - packageJSON.config.forge.make_targets[process.platform] = ['zip']; - await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); - - await forge.make({ dir, skipPackage: true, outDir: `${dir}/foo` }); - - // Cleanup here to ensure things dont break in the make tests - await fs.remove(path.resolve(dir, 'foo')); - await fs.remove(path.resolve(dir, 'out')); - }); - - it('can package without errors with native pre-gyp deps installed', async () => { - await installDeps(dir, ['ref']); - await forge.package({ dir }); - await fs.remove(path.resolve(dir, 'node_modules/ref')); - }); - - it('can package without errors', async () => { - const packageJSON = await readPackageJSON(dir); - packageJSON.config.forge.electronPackagerConfig.asar = true; - await fs.writeJson(path.resolve(dir, 'package.json'), packageJSON); - - await forge.package({ dir }); - }); - - describe('after package', () => { - let resourcesPath = 'Test App.app/Contents/Resources'; - if (process.platform !== 'darwin') { - resourcesPath = 'resources'; - } - - it('should have deleted the forge config from the packaged app', async () => { - const cleanPackageJSON = JSON.parse(asar.extractFile( - path.resolve(dir, 'out', `Test App-${process.platform}-${process.arch}`, resourcesPath, 'app.asar'), - 'package.json' - )); - expect(cleanPackageJSON).to.not.have.nested.property('config.forge'); - }); - - it('should not affect the actual forge config', async () => { - const normalPackageJSON = await readPackageJSON(dir); - expect(normalPackageJSON).to.have.nested.property('config.forge'); - }); - - function getMakers(platform) { - return fs.readdirSync(path.resolve(__dirname, `../../src/makers/${platform}`)).map(file => path.parse(file).name); - } - - const goodMakers = [...getMakers(process.platform), ...getMakers('generic')]; - const badPlatforms = ['darwin', 'linux', 'win32'].filter(p => p !== process.platform); - const badMakers = []; - badPlatforms.forEach(platform => badMakers.push(...getMakers(platform))); - - const testMakeTarget = function testMakeTarget(target, shouldPass, ...options) { - describe(`make (with target=${target})`, async () => { - before(async () => { - const packageJSON = await readPackageJSON(dir); - packageJSON.config.forge.make_targets[process.platform] = [target]; - await fs.writeFile(path.resolve(dir, 'package.json'), JSON.stringify(packageJSON)); - }); - - for (const optionsFetcher of options) { - if (shouldPass) { - it(`successfully makes for config: ${JSON.stringify(optionsFetcher(), 2)}`, async () => { - const outputs = await forge.make(optionsFetcher()); - for (const outputResult of outputs) { - for (const output of outputResult.artifacts) { - expect(await fs.exists(output)).to.equal(true); - } - } - }); - } else { - it(`fails for config: ${JSON.stringify(optionsFetcher(), 2)}`, async () => { - await expect(forge.make(optionsFetcher())).to.eventually.be.rejected; - }); - } - } - }); - }; - - const targetOptionFetcher = () => ({ dir, skipPackage: true }); - for (const maker of goodMakers) { - testMakeTarget(maker, true, targetOptionFetcher); - } - - for (const maker of badMakers) { - testMakeTarget(maker, false, targetOptionFetcher); - } - - describe('make', () => { - it('throws an error when given an unrecognized platform', async () => { - await expect(forge.make({ dir, platform: 'dos' })).to.eventually.be.rejectedWith(/invalid platform/); - }); - - it('throws an error when the specified maker doesn\'t support the current platform', async () => { - const makerPath = `${process.cwd()}/test/fixture/maker-unsupported`; - await expect(forge.make({ - dir, - overrideTargets: [makerPath], - skipPackage: true, - })).to.eventually.be.rejectedWith(/the maker declared that it cannot run/); - }); - - it('throws an error when the specified maker doesn\'t implement isSupportedOnCurrentPlatform()', async () => { - const makerPath = `${process.cwd()}/test/fixture/maker-incompatible`; - await expect(forge.make({ - dir, - overrideTargets: [makerPath], - skipPackage: true, - })).to.eventually.be.rejectedWith(/incompatible with this version/); - }); - - it('can make for the MAS platform successfully', async () => { - if (process.platform !== 'darwin') return; - await expect(forge.make({ - dir, - overrideTargets: ['zip', 'dmg'], - platform: 'mas', - })).to.eventually.have.length(2); - }); - }); - }); - - after(() => fs.remove(dir)); - }); -}); diff --git a/packages/_old/test/slow/install-dependencies_spec_slow.js b/packages/_old/test/slow/install-dependencies_spec_slow.js deleted file mode 100644 index 7d1d547709..0000000000 --- a/packages/_old/test/slow/install-dependencies_spec_slow.js +++ /dev/null @@ -1,23 +0,0 @@ -import { expect } from 'chai'; -import fs from 'fs-extra'; -import os from 'os'; -import path from 'path'; - -import installDeps from '../../src/util/install-dependencies'; - -if (!(process.platform === 'linux' && process.env.CI)) { - describe('install-dependencies', () => { - const installDir = path.resolve(os.tmpdir(), 'electron-forge-test-install-dependencies'); - - before(async () => { fs.ensureDir(installDir); }); - - it('should install the latest minor version when the dependency has a caret', async () => { - await installDeps(installDir, ['debug@^2.0.0']); - - const packageJSON = require(path.resolve(installDir, 'node_modules', 'debug', 'package.json')); - expect(packageJSON.version).to.not.equal('2.0.0'); - }); - - after(async () => await fs.remove(installDir)); - }); -} diff --git a/packages/_old/test/slow/install_spec_slow.js b/packages/_old/test/slow/install_spec_slow.js deleted file mode 100644 index 18cdee2552..0000000000 --- a/packages/_old/test/slow/install_spec_slow.js +++ /dev/null @@ -1,191 +0,0 @@ -import chai, { expect } from 'chai'; -import fetchMock from 'fetch-mock/es5/server'; -import chaiAsPromised from 'chai-as-promised'; -import proxyquire from 'proxyquire'; -import sinon from 'sinon'; - -chai.use(chaiAsPromised); - -describe('install', () => { - let install; - let nuggetSpy; - let mockInquirer; - let fetch; - const mockInstaller = () => Promise.resolve(); - - beforeEach(() => { - fetch = fetchMock.sandbox(); - nuggetSpy = sinon.stub(); - mockInquirer = { - createPromptModule: sinon.spy(() => sinon.spy(() => Promise.resolve({ assetID: 1 }))), - }; - - install = proxyquire.noCallThru().load('../../src/api/install', { - 'node-fetch': fetch, - nugget: (...args) => { - nuggetSpy(...args); - args[args.length - 1](); - }, - '../installers/darwin/dmg': mockInstaller, - '../installers/darwin/zip': mockInstaller, - '../installers/linux/deb': mockInstaller, - '../installers/linux/rpm': mockInstaller, - '../installers/win32/exe': mockInstaller, - inquirer: mockInquirer, - }).default; - }); - - afterEach(() => { - fetch.restore(); - }); - - it('should throw an error when a repo name is not given', async () => { - await expect(install()).to.eventually.be.rejected; - }); - - it('should throw an error when given an invalid repository name', async () => { - await expect(install({ repo: 'foobar', interactive: false })).to.eventually.be.rejected; - }); - - it('should throw an error if the fetch fails', async () => { - fetch.get('*', { - throws: new Error('it broke'), - }); - await expect(install({ repo: 'a/b', interactive: false })).to.eventually.be.rejectedWith( - 'Failed to find releases for repository "a/b". Please check the name and try again.' - ); - }); - - it('should throw an error if we can\'t find the repo', async () => { - fetch.get('*', { - message: 'Not Found', - }); - await expect(install({ repo: 'b/c', interactive: false })).to.eventually.be.rejectedWith( - 'Failed to find releases for repository "b/c". Please check the name and try again.' - ); - }); - - it('should throw an error if the API does not return a release array', async () => { - fetch.get('*', { - lolz: 'this aint no array', - }); - await expect(install({ repo: 'c/d', interactive: false })).to.eventually.be.rejectedWith( - 'Failed to find releases for repository "c/d". Please check the name and try again.' - ); - }); - - it('should throw an error if the latest release has no assets', async () => { - fetch.get('*', [ - { tag_name: 'v1.0.0' }, - { tag_name: '0.3.0' }, - { tag_name: 'v1.2.0' }, - { tag_name: '0.1.0' }, - ]); - await expect(install({ repo: 'e/f', interactive: false })).to.eventually.be.rejectedWith( - 'Could not find any assets for the latest release' - ); - }); - - it('should throw an error if there are no release compatable with the current platform', async () => { - fetch.get('*', [ - { - tag_name: '1.0.0', - assets: [ - { - name: 'installer.unicorn', - }, - ], - }, - ]); - await expect(install({ repo: 'f/g', interactive: false })).to.eventually.be.rejectedWith( - `Failed to find any installable assets for target platform: ${`${process.platform}`.cyan}` - ); - }); - - // eslint-disable-next-line no-nested-ternary - const compatSuffix = process.platform === 'darwin' ? 'dmg' : (process.platform === 'win32' ? 'exe' : 'deb'); - - it('should download a release if there is a single compatible asset', async () => { - fetch.get('*', [ - { - tag_name: '1.0.0', - assets: [ - { - name: `installer.${compatSuffix}`, - browser_download_url: 'fetch.it', - }, - ], - }, - ]); - expect(nuggetSpy.callCount).to.equal(0); - await install({ repo: 'g/h', interactive: false }); - expect(nuggetSpy.callCount).to.equal(1); - expect(nuggetSpy.firstCall.args[0]).to.equal('fetch.it'); - }); - - it('should throw an error if there is more than compatable asset with no chooseAsset method', async () => { - fetch.get('*', [ - { - tag_name: '1.0.0', - assets: [ - { - name: `installer.${compatSuffix}`, - browser_download_url: 'fetch.it', - }, - { - name: `installer2.${compatSuffix}`, - browser_download_url: 'fetch.it.2', - }, - ], - }, - ]); - await expect(install({ repo: 'h/i', interactive: false })).to.eventually.be.rejectedWith( - 'expected a chooseAsset function to be provided but it was not' - ); - }); - - it('should provide compatable assets to chooseAsset if more than one exists', async () => { - const chooseAsset = sinon.spy(async assets => assets[0]); - fetch.get('*', [ - { - tag_name: '1.0.0', - assets: [ - { - name: `installer.${compatSuffix}`, - browser_download_url: 'fetch.it', - }, - { - name: `installer2.${compatSuffix}`, - browser_download_url: 'fetch.it.2', - }, - ], - }, - ]); - expect(chooseAsset.callCount).to.equal(0); - await install({ repo: 'i/j', interactive: false, chooseAsset }); - expect(chooseAsset.callCount).to.equal(1); - expect(chooseAsset.firstCall.args[0].length).to.equal(2); - }); - - it('should prompt the user to choose an asset if in interactive mode and more than one exists', async () => { - fetch.get('*', [ - { - tag_name: '1.0.0', - assets: [ - { - id: 1, - name: `installer.${compatSuffix}`, - browser_download_url: 'fetch.it', - }, - { - name: `installer2.${compatSuffix}`, - browser_download_url: 'fetch.it.2', - }, - ], - }, - ]); - expect(mockInquirer.createPromptModule.callCount).to.equal(0); - await install({ repo: 'j/k', interactive: true }); - expect(mockInquirer.createPromptModule.callCount).to.equal(1); - }); -}); diff --git a/packages/_old/test/slow/rebuild_spec_slow.js b/packages/_old/test/slow/rebuild_spec_slow.js deleted file mode 100644 index b679af1538..0000000000 --- a/packages/_old/test/slow/rebuild_spec_slow.js +++ /dev/null @@ -1,79 +0,0 @@ -import fs from 'fs-extra'; -import path from 'path'; -import os from 'os'; - -import { expect } from 'chai'; - -import rebuild from '../../src/util/rebuild'; -import { yarnOrNpmSpawn, hasYarn } from '../../src/util/yarn-or-npm'; - -describe('rebuilder', () => { - const testModulePath = path.resolve(os.tmpdir(), 'electron-forge-rebuild-test'); - - async function setupProject() { - await fs.remove(testModulePath); - await fs.mkdirs(testModulePath); - await fs.writeFile(path.resolve(testModulePath, 'package.json'), await fs.readFile(path.resolve(__dirname, '../fixture/native_app/package.json'), 'utf8')); - await yarnOrNpmSpawn(hasYarn() ? [] : ['install'], { - cwd: testModulePath, - stdio: process.platform === 'win32' ? 'inherit' : 'pipe', - }); - } - - async function doRebuild(config) { - await rebuild(testModulePath, '1.4.12', process.platform, process.arch, config); - } - - describe('no config', () => { - before(async () => { - await setupProject(); - await doRebuild(); - }); - - it('should have rebuilt top level prod dependencies', async () => { - const forgeMeta = path.resolve(testModulePath, 'node_modules', 'ref', 'build', 'Release', '.forge-meta'); - expect(await fs.pathExists(forgeMeta), 'ref build meta should exist').to.equal(true); - }); - - it('should have rebuilt children of top level prod dependencies', async () => { - const forgeMeta = path.resolve(testModulePath, 'node_modules', 'microtime', 'build', 'Release', '.forge-meta'); - expect(await fs.pathExists(forgeMeta), 'microtime build meta should exist').to.equal(true); - }); - - it('should have rebuilt children of scoped top level prod dependencies', async () => { - const forgeMeta = path.resolve(testModulePath, 'node_modules', '@newrelic/native-metrics', 'build', 'Release', '.forge-meta'); - expect(await fs.pathExists(forgeMeta), '@newrelic/native-metrics build meta should exist').to.equal(true); - }); - - it('should have rebuilt top level optional dependencies', async () => { - const forgeMeta = path.resolve(testModulePath, 'node_modules', 'zipfile', 'build', 'Release', '.forge-meta'); - expect(await fs.pathExists(forgeMeta), 'zipfile build meta should exist').to.equal(true); - }); - - it('should not have rebuilt top level devDependencies', async () => { - const forgeMeta = path.resolve(testModulePath, 'node_modules', 'ffi', 'build', 'Release', '.forge-meta'); - expect(await fs.pathExists(forgeMeta), 'ffi build meta should not exist').to.equal(false); - }); - }); - - describe('with config', () => { - before(async () => { - await setupProject(); - await doRebuild({ onlyModules: ['ref'] }); - }); - - it('should have rebuilt module in onlyModules', async () => { - const forgeMeta = path.resolve(testModulePath, 'node_modules', 'ref', 'build', 'Release', '.forge-meta'); - expect(await fs.pathExists(forgeMeta), 'ref build meta should exist').to.equal(true); - }); - - it('should not have rebuilt module not in onlyModules', async () => { - const forgeMeta = path.resolve(testModulePath, 'node_modules', 'zipfile', 'build', 'Release', '.forge-meta'); - expect(await fs.pathExists(forgeMeta), 'zipfile build meta should not exist').to.equal(false); - }); - }); - - after(async () => { - await fs.remove(testModulePath); - }); -}); diff --git a/packages/_old/tmpl/_appveyor.yml b/packages/_old/tmpl/_appveyor.yml deleted file mode 100644 index 728114826c..0000000000 --- a/packages/_old/tmpl/_appveyor.yml +++ /dev/null @@ -1,26 +0,0 @@ -platform: -- x64 -environment: - nodejs_version: "6" -cache: -- '%APPDATA%\npm-cache' -- '%USERPROFILE%\.electron' -- node_modules -branches: - only: - - master - - /^v\d+\.\d+\.\d+/ -install: -- ps: Install-Product node $env:nodejs_version $env:platform -- set PATH=%APPDATA%\npm;%PATH% -- npm install -- npm update - -test_script: -- node --version -- npm --version -- npm run lint -- if %APPVEYOR_REPO_TAG% EQU false npm run make - -build_script: -- IF %APPVEYOR_REPO_TAG% EQU true npm run publish diff --git a/packages/_old/tmpl/_gitignore b/packages/_old/tmpl/_gitignore deleted file mode 100644 index 9209ef5bfd..0000000000 --- a/packages/_old/tmpl/_gitignore +++ /dev/null @@ -1,2 +0,0 @@ -node_modules -out diff --git a/packages/_old/tmpl/_travis.yml b/packages/_old/tmpl/_travis.yml deleted file mode 100644 index 02fa627e34..0000000000 --- a/packages/_old/tmpl/_travis.yml +++ /dev/null @@ -1,33 +0,0 @@ -language: node_js -node_js: "6" -os: -- linux -- osx -dist: trusty -osx_image: xcode8.3 -sudo: false - -cache: - directories: - - node_modules - - $HOME/.cache/electron - -addons: - apt: - packages: - - fakeroot - - rpm - -branches: - only: - - master - - /^v\d+\.\d+\.\d+/ - -install: -- npm install -- npm update - -script: -- npm run lint -- if test -z "$TRAVIS_TAG"; then npm run make; fi -after_success: if test -n "$TRAVIS_TAG"; then npm run publish; fi diff --git a/packages/_old/tmpl/index.html b/packages/_old/tmpl/index.html deleted file mode 100644 index e11c582a95..0000000000 --- a/packages/_old/tmpl/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - Well hey there!!! - - diff --git a/packages/_old/tmpl/index.js b/packages/_old/tmpl/index.js deleted file mode 100644 index 94a7e01e31..0000000000 --- a/packages/_old/tmpl/index.js +++ /dev/null @@ -1,57 +0,0 @@ -const { app, BrowserWindow } = require('electron'); - -// Handle creating/removing shortcuts on Windows when installing/uninstalling. -if (require('electron-squirrel-startup')) { // eslint-disable-line global-require - app.quit(); -} - -// Keep a global reference of the window object, if you don't, the window will -// be closed automatically when the JavaScript object is garbage collected. -let mainWindow; - -const createWindow = () => { - // Create the browser window. - mainWindow = new BrowserWindow({ - width: 800, - height: 600, - }); - - // and load the index.html of the app. - mainWindow.loadURL(`file://${__dirname}/index.html`); - - // Open the DevTools. - mainWindow.webContents.openDevTools(); - - // Emitted when the window is closed. - mainWindow.on('closed', () => { - // Dereference the window object, usually you would store windows - // in an array if your app supports multi windows, this is the time - // when you should delete the corresponding element. - mainWindow = null; - }); -}; - -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. -app.on('ready', createWindow); - -// Quit when all windows are closed. -app.on('window-all-closed', () => { - // On OS X it is common for applications and their menu bar - // to stay active until the user quits explicitly with Cmd + Q - if (process.platform !== 'darwin') { - app.quit(); - } -}); - -app.on('activate', () => { - // On OS X it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (mainWindow === null) { - createWindow(); - } -}); - -// In this file you can include the rest of your app's specific main process -// code. You can also put them in separate files and import them here. diff --git a/packages/_old/tmpl/package.json b/packages/_old/tmpl/package.json deleted file mode 100644 index 9ac204578a..0000000000 --- a/packages/_old/tmpl/package.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "", - "productName": "", - "version": "1.0.0", - "description": "My Electron application description", - "main": "src/index.js", - "scripts": { - "start": "electron-forge start", - "package": "electron-forge package", - "make": "electron-forge make", - "publish": "electron-forge publish" - }, - "keywords": [], - "author": "", - "license": "MIT", - "config": { - "forge": { - "make_targets": { - "win32": ["squirrel"], - "darwin": ["zip"], - "linux": ["deb", "rpm"] - }, - "electronPackagerConfig": {}, - "electronWinstallerConfig": { - "name": "" - }, - "electronInstallerDebian": {}, - "electronInstallerRedhat": {}, - "github_repository": { - "owner": "", - "name": "" - }, - "windowsStoreConfig": { - "packageName": "" - } - } - } -} From 935d46b7d62ca501a553e74c4deb65b646203d1c Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 19 Feb 2018 16:47:28 +1100 Subject: [PATCH 08/40] Remove FIXME comments --- packages/api/core/test/slow/api_spec_slow.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/api/core/test/slow/api_spec_slow.js b/packages/api/core/test/slow/api_spec_slow.js index 77ef54706d..7724f99159 100644 --- a/packages/api/core/test/slow/api_spec_slow.js +++ b/packages/api/core/test/slow/api_spec_slow.js @@ -8,7 +8,6 @@ import chai, { expect } from 'chai'; import proxyquire from 'proxyquire'; import chaiAsPromised from 'chai-as-promised'; -// FIXME import { createDefaultCertificate } from '@electron-forge/maker-appx'; import installDeps from '../../src/util/install-dependencies'; import readPackageJSON from '../../src/util/read-package-json'; @@ -305,7 +304,6 @@ describe(`electron-forge API (with installer=${nodeInstaller})`, () => { })); } - // FIXME const goodMakers = getMakers(true); const badMakers = getMakers(false); From 878ef658aa6ca4bb9e7220df79edffc94a053d0e Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 19 Feb 2018 16:49:25 +1100 Subject: [PATCH 09/40] Remove from CI branch whitelist --- .appveyor.yml | 2 -- .travis.yml | 1 - 2 files changed, 3 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 1c37c0766a..0d2e2060ac 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -10,8 +10,6 @@ cache: branches: only: - master - - v6 - - v6-api install: - ps: Install-Product node $env:nodejs_version $env:platform diff --git a/.travis.yml b/.travis.yml index 85ed50c895..2d0ae083af 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,6 @@ env: branches: only: - master - - /^v6.*/ - /^v\d+\.\d+\.\d+/ install: - yarn global add bolt From 36f1cdf2cb8cbe0102baec0b723f7642f4501196 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 19 Feb 2018 16:50:20 +1100 Subject: [PATCH 10/40] Install bolt on docker --- ci/docker.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/ci/docker.sh b/ci/docker.sh index 430c7b18da..a71debbf8f 100755 --- a/ci/docker.sh +++ b/ci/docker.sh @@ -3,6 +3,7 @@ NODE_INSTALLER="$1" npm i -g yarn +npm i -g bolt cd /code From 2721c4772858a2f24ca247bb14481b474319d8f4 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 19 Feb 2018 16:57:39 +1100 Subject: [PATCH 11/40] Add to whitelist --- .appveyor.yml | 2 ++ .travis.yml | 1 + 2 files changed, 3 insertions(+) diff --git a/.appveyor.yml b/.appveyor.yml index 0d2e2060ac..1c37c0766a 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -10,6 +10,8 @@ cache: branches: only: - master + - v6 + - v6-api install: - ps: Install-Product node $env:nodejs_version $env:platform diff --git a/.travis.yml b/.travis.yml index 2d0ae083af..85ed50c895 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,6 +19,7 @@ env: branches: only: - master + - /^v6.*/ - /^v\d+\.\d+\.\d+/ install: - yarn global add bolt From 6c45c53342263b2aaa1f78e334c09e5fa4face9f Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 19 Feb 2018 17:08:30 +1100 Subject: [PATCH 12/40] Fix bolt usage on CI --- .appveyor.yml | 3 ++- .travis.yml | 3 ++- ci/docker.sh | 2 ++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 1c37c0766a..1a974c27d3 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -16,7 +16,8 @@ branches: install: - ps: Install-Product node $env:nodejs_version $env:platform - set PATH=%APPDATA%\npm;%PATH% -- yarn global add bolt +- npm i -g bolt +- ps: Remove-Item -Recurse -Force node_modules - bolt - ps: | $wixToolsetBinPath = ";C:\Program Files (x86)\WiX Toolset v3.11\bin;" diff --git a/.travis.yml b/.travis.yml index 85ed50c895..3357ac40f2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,8 @@ branches: - /^v6.*/ - /^v\d+\.\d+\.\d+/ install: -- yarn global add bolt +- npm i -g bolt +- rm -rf node_modules - bolt script: ci/script.sh after_success: ci/coverage.sh diff --git a/ci/docker.sh b/ci/docker.sh index a71debbf8f..beed1a2108 100755 --- a/ci/docker.sh +++ b/ci/docker.sh @@ -4,6 +4,8 @@ NODE_INSTALLER="$1" npm i -g yarn npm i -g bolt +rm -rf node_modules +bolt cd /code From 406d78d36efb453efad4cb9e7831ba2ebdfc9725 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 19 Feb 2018 17:15:51 +1100 Subject: [PATCH 13/40] Run bolt build on CI --- .appveyor.yml | 1 + .travis.yml | 1 + ci/docker.sh | 6 ++++-- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 1a974c27d3..81ba90b5d5 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -19,6 +19,7 @@ install: - npm i -g bolt - ps: Remove-Item -Recurse -Force node_modules - bolt +- bolt build - ps: | $wixToolsetBinPath = ";C:\Program Files (x86)\WiX Toolset v3.11\bin;" $env:PATH = $env:PATH + $wixToolsetBinPath diff --git a/.travis.yml b/.travis.yml index 3357ac40f2..b84f4e38f0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -25,6 +25,7 @@ install: - npm i -g bolt - rm -rf node_modules - bolt +- bolt build script: ci/script.sh after_success: ci/coverage.sh notifications: diff --git a/ci/docker.sh b/ci/docker.sh index beed1a2108..6534041edf 100755 --- a/ci/docker.sh +++ b/ci/docker.sh @@ -4,9 +4,11 @@ NODE_INSTALLER="$1" npm i -g yarn npm i -g bolt -rm -rf node_modules -bolt cd /code +rm -rf node_modules +bolt +bolt build + CI=true bolt ws test -- --installer=$NODE_INSTALLER From b7ca5c6a30de6ec7baaa59c6b721d9c87617eb6f Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Tue, 20 Feb 2018 09:53:34 +1100 Subject: [PATCH 14/40] Fix tests on CI --- packages/api/core/src/api/install.js | 24 ++++++++++--------- .../api/core/test/fast/yarn-or-npm_spec.js | 1 + .../api/core/test/slow/install_spec_slow.js | 18 +++++++------- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/packages/api/core/src/api/install.js b/packages/api/core/src/api/install.js index dff8b416c1..142f2f08f1 100644 --- a/packages/api/core/src/api/install.js +++ b/packages/api/core/src/api/install.js @@ -8,11 +8,11 @@ import path from 'path'; import pify from 'pify'; import semver from 'semver'; -import darwinDMGInstaller from '@electron-forge/installer-dmg'; -import darwinZipInstaller from '@electron-forge/installer-zip'; -import linuxDebInstaller from '@electron-forge/installer-deb'; -import linuxRPMInstaller from '@electron-forge/installer-rpm'; -import win32ExeInstaller from '@electron-forge/installer-exe'; +import DMGInstaller from '@electron-forge/installer-dmg'; +import ZipInstaller from '@electron-forge/installer-zip'; +import DebInstaller from '@electron-forge/installer-deb'; +import RPMInstaller from '@electron-forge/installer-rpm'; +import ExeInstaller from '@electron-forge/installer-exe'; import asyncOra from '../util/ora-handler'; import { info } from '../util/messages'; @@ -131,19 +131,21 @@ export default async (providedOptions = {}) => { await asyncOra('Installing Application', async (installSpinner) => { const installActions = { win32: { - '.exe': win32ExeInstaller, + '.exe': ExeInstaller, }, darwin: { - '.zip': darwinZipInstaller, - '.dmg': darwinDMGInstaller, + '.zip': ZipInstaller, + '.dmg': DMGInstaller, }, linux: { - '.deb': linuxDebInstaller, - '.rpm': linuxRPMInstaller, + '.deb': DebInstaller, + '.rpm': RPMInstaller, }, }; const suffixFnIdent = Object.keys(installActions[process.platform]).find(suffix => targetAsset.name.endsWith(suffix)); - await installActions[process.platform][suffixFnIdent](fullFilePath, installSpinner); + const InstallerClass = installActions[process.platform][suffixFnIdent]; + const installer = new InstallerClass(); + await installer.install({ filePath: fullFilePath, installSpinner }); }); }; diff --git a/packages/api/core/test/fast/yarn-or-npm_spec.js b/packages/api/core/test/fast/yarn-or-npm_spec.js index cb05ce0edc..f322e206e6 100644 --- a/packages/api/core/test/fast/yarn-or-npm_spec.js +++ b/packages/api/core/test/fast/yarn-or-npm_spec.js @@ -8,6 +8,7 @@ describe('yarn-or-npm', () => { beforeEach(() => { nodeInstaller = process.env.NODE_INSTALLER; + delete process.env.NODE_INSTALLER; }); afterEach(() => { diff --git a/packages/api/core/test/slow/install_spec_slow.js b/packages/api/core/test/slow/install_spec_slow.js index 4f16a19b5e..48550da851 100644 --- a/packages/api/core/test/slow/install_spec_slow.js +++ b/packages/api/core/test/slow/install_spec_slow.js @@ -9,17 +9,15 @@ chai.use(chaiAsPromised); describe('install', () => { let install; let nuggetSpy; - let mockInquirer; let fetch; - const mockInstaller = () => Promise.resolve(); + class MockInstaller { + async install() {} + } const chooseAsset = arr => arr[0]; beforeEach(() => { fetch = fetchMock.sandbox(); nuggetSpy = sinon.stub(); - mockInquirer = { - createPromptModule: sinon.spy(() => sinon.spy(() => Promise.resolve({ assetID: 1 }))), - }; install = proxyquire.noCallThru().load('../../src/api/install', { 'node-fetch': fetch, @@ -27,11 +25,11 @@ describe('install', () => { nuggetSpy(...args); args[args.length - 1](); }, - '@electron-forge/installer-dmg': mockInstaller, - '@electron-forge/installer-zip': mockInstaller, - '.@electron-forge/installer-deb': mockInstaller, - '@electron-forge/installer-rpm': mockInstaller, - '@electron-forge/installer-exe': mockInstaller, + '@electron-forge/installer-dmg': MockInstaller, + '@electron-forge/installer-zip': MockInstaller, + '@electron-forge/installer-deb': MockInstaller, + '@electron-forge/installer-rpm': MockInstaller, + '@electron-forge/installer-exe': MockInstaller, }).default; }); From 34b2c60437a149391d6b07b7c488d53af306c920 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Tue, 20 Feb 2018 09:57:42 +1100 Subject: [PATCH 15/40] Fix linting --- package.json | 2 +- packages/api/cli/src/electron-forge.js | 3 ++- packages/api/cli/test/check-system_spec.js | 3 ++- packages/api/core/src/api/make.js | 2 +- packages/api/core/test/slow/install_spec_slow.js | 4 +++- packages/maker/deb/test/MakerDeb_spec.js | 1 - 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index c18cf2f148..6c914aec97 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "scripts": { "build": "bolt ws exec -- node_modules/.bin/babel src -d dist --quiet", "commit": "git-cz", - "lint": "eslint packages/**/src packages/**/test", + "lint": "bolt ws exec -- node_modules/.bin/eslint src test", "test": "bolt ws run test" }, "dependencies": { diff --git a/packages/api/cli/src/electron-forge.js b/packages/api/cli/src/electron-forge.js index 5d7fbfec0e..910bb1ae69 100644 --- a/packages/api/cli/src/electron-forge.js +++ b/packages/api/cli/src/electron-forge.js @@ -2,10 +2,11 @@ import 'colors'; import program from 'commander'; import tabtab from 'tabtab'; +// FIXME: Deep imports like this are a bad idea +import asyncOra from '@electron-forge/core/dist/util/ora-handler'; import './util/terminate'; -import asyncOra from '@electron-forge/core/dist/util/ora-handler'; import checkSystem from './util/check-system'; const originalSC = program.executeSubCommand.bind(program); diff --git a/packages/api/cli/test/check-system_spec.js b/packages/api/cli/test/check-system_spec.js index fc18b075c0..0393389fbd 100644 --- a/packages/api/cli/test/check-system_spec.js +++ b/packages/api/cli/test/check-system_spec.js @@ -1,7 +1,8 @@ import { expect } from 'chai'; +// FIXME: Deep imports like this are a bad idea +import { fakeOra } from '@electron-forge/core/dist/util/ora'; import checkSystem, { validPackageManagerVersion } from '../src/util/check-system'; -import { fakeOra } from '@electron-forge/core/dist/util/ora'; describe('check-system', () => { it('should succeed on valid agents', async () => { diff --git a/packages/api/core/src/api/make.js b/packages/api/core/src/api/make.js index c98d63dcd3..7b485e8a05 100644 --- a/packages/api/core/src/api/make.js +++ b/packages/api/core/src/api/make.js @@ -82,7 +82,7 @@ export default async (providedOptions = {}) => { maker => maker.platforms ? maker.platforms.indexOf(platform) !== -1 : true - )).map(target => { + )).map((target) => { if (typeof target === 'string') { return { name: target }; } diff --git a/packages/api/core/test/slow/install_spec_slow.js b/packages/api/core/test/slow/install_spec_slow.js index 48550da851..55c1106cb8 100644 --- a/packages/api/core/test/slow/install_spec_slow.js +++ b/packages/api/core/test/slow/install_spec_slow.js @@ -11,7 +11,9 @@ describe('install', () => { let nuggetSpy; let fetch; class MockInstaller { - async install() {} + async install() { + return undefined; + } } const chooseAsset = arr => arr[0]; diff --git a/packages/maker/deb/test/MakerDeb_spec.js b/packages/maker/deb/test/MakerDeb_spec.js index 7cc5dfea8b..e8ebca6bab 100644 --- a/packages/maker/deb/test/MakerDeb_spec.js +++ b/packages/maker/deb/test/MakerDeb_spec.js @@ -1,6 +1,5 @@ import chai, { expect } from 'chai'; import chaiAsPromised from 'chai-as-promised'; -import path from 'path'; import proxyquire from 'proxyquire'; import { stub } from 'sinon'; From 1a3d124f3e3edfc1037e8359051b2151e2bfd650 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Tue, 20 Feb 2018 10:19:41 +1100 Subject: [PATCH 16/40] Fix CI --- .travis.yml | 3 --- ci/docker.sh | 2 +- ci/script.sh | 3 +++ 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index b84f4e38f0..05fe38f8fd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -23,9 +23,6 @@ branches: - /^v\d+\.\d+\.\d+/ install: - npm i -g bolt -- rm -rf node_modules -- bolt -- bolt build script: ci/script.sh after_success: ci/coverage.sh notifications: diff --git a/ci/docker.sh b/ci/docker.sh index 6534041edf..99fbf50950 100755 --- a/ci/docker.sh +++ b/ci/docker.sh @@ -7,8 +7,8 @@ npm i -g bolt cd /code -rm -rf node_modules bolt bolt build +bolt lint CI=true bolt ws test -- --installer=$NODE_INSTALLER diff --git a/ci/script.sh b/ci/script.sh index cd9911f05e..21bd09d131 100755 --- a/ci/script.sh +++ b/ci/script.sh @@ -3,5 +3,8 @@ if [[ "$TRAVIS_OS_NAME" = "linux" ]]; then sudo docker run --privileged --interactive --tty --volume $(pwd):/code malept/electron-forge-container:latest /code/ci/docker.sh $NODE_INSTALLER else + bolt + bolt build + bolt lint bolt ws test fi From 1fef26e7ddf834eeb5ea89499cd387752778310d Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Tue, 20 Feb 2018 14:54:52 +1100 Subject: [PATCH 17/40] Make publishers work and add specs --- package.json | 3 +- packages/api/cli/package.json | 1 + packages/api/cli/src/electron-forge.js | 3 +- packages/api/cli/test/check-system_spec.js | 3 +- packages/api/core/package.json | 3 +- packages/api/core/src/api/import.js | 2 +- .../core/src/api/init-scripts/init-custom.js | 3 +- .../src/api/init-scripts/init-directory.js | 3 +- .../api/core/src/api/init-scripts/init-git.js | 3 +- .../api/core/src/api/init-scripts/init-npm.js | 2 +- .../api/init-scripts/init-starter-files.js | 3 +- packages/api/core/src/api/init.js | 3 +- packages/api/core/src/api/install.js | 2 +- packages/api/core/src/api/lint.js | 2 +- packages/api/core/src/api/make.js | 2 +- packages/api/core/src/api/package.js | 2 +- packages/api/core/src/api/publish.js | 46 ++++--- packages/api/core/src/api/start.js | 2 +- .../api/core/src/util/plugin-interface.js | 3 +- packages/api/core/src/util/rebuild.js | 3 +- packages/api/core/test/fast/publish_spec.js | 62 +++++---- packages/publisher/base/package.json | 19 +++ packages/publisher/base/src/Publisher.js | 35 +++++ .../publisher/base/test/Publisher_spec.js | 15 +++ .../electron-release-server/package.json | 27 ++++ .../src/PublisherERS.js | 120 ++++++++++++++++++ packages/publisher/github/package.json | 27 ++++ .../publisher/github/src/PublisherGithub.js | 80 ++++++++++++ .../github}/src/util/github.js | 0 .../github/test}/github_spec.js | 2 +- packages/publisher/s3/package.json | 25 ++++ packages/publisher/s3/src/PublisherS3.js | 75 +++++++++++ packages/publisher/snapcraft/package.json | 27 ++++ .../snapcraft/src/PublisherSnapcraft.js | 31 +++++ packages/utils/async-ora/package.json | 27 ++++ packages/utils/async-ora/src/index.js | 8 ++ .../async-ora/src}/ora-handler.js | 0 .../src/util => utils/async-ora/src}/ora.js | 2 +- .../async-ora/test}/ora-handler_spec.js | 2 +- 39 files changed, 605 insertions(+), 73 deletions(-) create mode 100644 packages/publisher/base/package.json create mode 100644 packages/publisher/base/src/Publisher.js create mode 100644 packages/publisher/base/test/Publisher_spec.js create mode 100644 packages/publisher/electron-release-server/package.json create mode 100644 packages/publisher/electron-release-server/src/PublisherERS.js create mode 100644 packages/publisher/github/package.json create mode 100644 packages/publisher/github/src/PublisherGithub.js rename packages/{api/core => publisher/github}/src/util/github.js (100%) rename packages/{api/core/test/fast => publisher/github/test}/github_spec.js (97%) create mode 100644 packages/publisher/s3/package.json create mode 100644 packages/publisher/s3/src/PublisherS3.js create mode 100644 packages/publisher/snapcraft/package.json create mode 100644 packages/publisher/snapcraft/src/PublisherSnapcraft.js create mode 100644 packages/utils/async-ora/package.json create mode 100644 packages/utils/async-ora/src/index.js rename packages/{api/core/src/util => utils/async-ora/src}/ora-handler.js (100%) rename packages/{api/core/src/util => utils/async-ora/src}/ora.js (95%) rename packages/{api/core/test/fast => utils/async-ora/test}/ora-handler_spec.js (97%) diff --git a/package.json b/package.json index 6c914aec97..0ef8451014 100644 --- a/package.json +++ b/package.json @@ -4,9 +4,10 @@ "bolt": { "workspaces": [ "packages/api/*", + "packages/installer/*", "packages/maker/*", "packages/publisher/*", - "packages/installer/*" + "packages/utils/*" ] }, "config": { diff --git a/packages/api/cli/package.json b/packages/api/cli/package.json index 106c89871b..174a6ad950 100644 --- a/packages/api/cli/package.json +++ b/packages/api/cli/package.json @@ -19,6 +19,7 @@ "mocha": "^5.0.0" }, "dependencies": { + "@electron-forge/async-ora": "^6.0.0-beta.0", "@electron-forge/core": "^6.0.0-beta.0", "colors": "^1.1.2", "commander": "^2.9.0", diff --git a/packages/api/cli/src/electron-forge.js b/packages/api/cli/src/electron-forge.js index 910bb1ae69..d82ae49ce8 100644 --- a/packages/api/cli/src/electron-forge.js +++ b/packages/api/cli/src/electron-forge.js @@ -1,9 +1,8 @@ #!/usr/bin/env node import 'colors'; +import { asyncOra } from '@electron-forge/async-ora'; import program from 'commander'; import tabtab from 'tabtab'; -// FIXME: Deep imports like this are a bad idea -import asyncOra from '@electron-forge/core/dist/util/ora-handler'; import './util/terminate'; diff --git a/packages/api/cli/test/check-system_spec.js b/packages/api/cli/test/check-system_spec.js index 0393389fbd..46f22cdd36 100644 --- a/packages/api/cli/test/check-system_spec.js +++ b/packages/api/cli/test/check-system_spec.js @@ -1,6 +1,5 @@ +import { fakeOra } from '@electron-forge/async-ora'; import { expect } from 'chai'; -// FIXME: Deep imports like this are a bad idea -import { fakeOra } from '@electron-forge/core/dist/util/ora'; import checkSystem, { validPackageManagerVersion } from '../src/util/check-system'; diff --git a/packages/api/core/package.json b/packages/api/core/package.json index 8c59354ead..33a8ba7298 100644 --- a/packages/api/core/package.json +++ b/packages/api/core/package.json @@ -32,12 +32,12 @@ "sinon": "^4.1.2" }, "dependencies": { + "@electron-forge/async-ora": "^6.0.0-beta.0", "@electron-forge/installer-deb": "^6.0.0-beta.0", "@electron-forge/installer-dmg": "^6.0.0-beta.0", "@electron-forge/installer-exe": "^6.0.0-beta.0", "@electron-forge/installer-rpm": "^6.0.0-beta.0", "@electron-forge/installer-zip": "^6.0.0-beta.0", - "@octokit/rest": "^14.0.4", "colors": "^1.1.2", "cross-spawn-promise": "^0.10.1", "debug": "^3.0.0", @@ -50,7 +50,6 @@ "log-symbols": "^2.0.0", "node-fetch": "^2.0.0", "nugget": "^2.0.1", - "ora": "^1.1.0", "pify": "^3.0.0", "resolve-package": "^1.0.1", "semver": "^5.3.0", diff --git a/packages/api/core/src/api/import.js b/packages/api/core/src/api/import.js index ec576a3c66..f9241f04ce 100644 --- a/packages/api/core/src/api/import.js +++ b/packages/api/core/src/api/import.js @@ -1,3 +1,4 @@ +import { asyncOra } from '@electron-forge/async-ora'; import debug from 'debug'; import fs from 'fs-extra'; import path from 'path'; @@ -6,7 +7,6 @@ import initGit from './init-scripts/init-git'; import { deps, devDeps, exactDevDeps } from './init-scripts/init-npm'; import { setInitialForgeConfig } from '../util/forge-config'; -import asyncOra from '../util/ora-handler'; import { info, warn } from '../util/messages'; import installDepList from '../util/install-dependencies'; import readPackageJSON from '../util/read-package-json'; diff --git a/packages/api/core/src/api/init-scripts/init-custom.js b/packages/api/core/src/api/init-scripts/init-custom.js index 6521ea6f0d..60f4c36635 100644 --- a/packages/api/core/src/api/init-scripts/init-custom.js +++ b/packages/api/core/src/api/init-scripts/init-custom.js @@ -1,3 +1,4 @@ +import { asyncOra, ora } from '@electron-forge/async-ora'; import debug from 'debug'; import fs from 'fs-extra'; import glob from 'glob'; @@ -5,9 +6,7 @@ import resolvePackage from 'resolve-package'; import path from 'path'; import { copy } from './init-starter-files'; -import asyncOra from '../../util/ora-handler'; import installDepList from '../../util/install-dependencies'; -import ora from '../../util/ora'; const d = debug('electron-forge:init:custom'); diff --git a/packages/api/core/src/api/init-scripts/init-directory.js b/packages/api/core/src/api/init-scripts/init-directory.js index 6e4a2e67da..6876d92871 100644 --- a/packages/api/core/src/api/init-scripts/init-directory.js +++ b/packages/api/core/src/api/init-scripts/init-directory.js @@ -1,9 +1,8 @@ +import { asyncOra } from '@electron-forge/async-ora'; import debug from 'debug'; import fs from 'fs-extra'; import logSymbols from 'log-symbols'; -import asyncOra from '../../util/ora-handler'; - const d = debug('electron-forge:init:directory'); export default async (dir) => { diff --git a/packages/api/core/src/api/init-scripts/init-git.js b/packages/api/core/src/api/init-scripts/init-git.js index 472cfa796b..7c6bd83dfb 100644 --- a/packages/api/core/src/api/init-scripts/init-git.js +++ b/packages/api/core/src/api/init-scripts/init-git.js @@ -1,10 +1,9 @@ +import { asyncOra } from '@electron-forge/async-ora'; import { exec } from 'child_process'; import debug from 'debug'; import fs from 'fs-extra'; import path from 'path'; -import asyncOra from '../../util/ora-handler'; - const d = debug('electron-forge:init:git'); export default async (dir) => { diff --git a/packages/api/core/src/api/init-scripts/init-npm.js b/packages/api/core/src/api/init-scripts/init-npm.js index 53fa55b938..5fec4e7984 100644 --- a/packages/api/core/src/api/init-scripts/init-npm.js +++ b/packages/api/core/src/api/init-scripts/init-npm.js @@ -1,3 +1,4 @@ +import { asyncOra } from '@electron-forge/async-ora'; import debug from 'debug'; import fs from 'fs-extra'; import path from 'path'; @@ -6,7 +7,6 @@ import username from 'username'; import { setInitialForgeConfig } from '../../util/forge-config'; import installDepList from '../../util/install-dependencies'; import readPackageJSON from '../../util/read-package-json'; -import asyncOra from '../../util/ora-handler'; const d = debug('electron-forge:init:npm'); diff --git a/packages/api/core/src/api/init-scripts/init-starter-files.js b/packages/api/core/src/api/init-scripts/init-starter-files.js index d19420d86f..1c3317e978 100644 --- a/packages/api/core/src/api/init-scripts/init-starter-files.js +++ b/packages/api/core/src/api/init-scripts/init-starter-files.js @@ -1,9 +1,8 @@ +import { asyncOra } from '@electron-forge/async-ora'; import debug from 'debug'; import fs from 'fs-extra'; import path from 'path'; -import asyncOra from '../../util/ora-handler'; - const d = debug('electron-forge:init:starter-files'); export const copy = async (source, target) => { diff --git a/packages/api/core/src/api/init.js b/packages/api/core/src/api/init.js index e1b5871d21..2b3017691a 100644 --- a/packages/api/core/src/api/init.js +++ b/packages/api/core/src/api/init.js @@ -1,3 +1,4 @@ +import { asyncOra } from '@electron-forge/async-ora'; import debug from 'debug'; import initCustom from './init-scripts/init-custom'; @@ -6,8 +7,6 @@ import initGit from './init-scripts/init-git'; import initNPM from './init-scripts/init-npm'; import initStarter from './init-scripts/init-starter-files'; -import asyncOra from '../util/ora-handler'; - const d = debug('electron-forge:init'); /** diff --git a/packages/api/core/src/api/install.js b/packages/api/core/src/api/install.js index 142f2f08f1..167c8dfaf3 100644 --- a/packages/api/core/src/api/install.js +++ b/packages/api/core/src/api/install.js @@ -1,4 +1,5 @@ import 'colors'; +import { asyncOra } from '@electron-forge/async-ora'; import debug from 'debug'; import fetch from 'node-fetch'; import fs from 'fs-extra'; @@ -14,7 +15,6 @@ import DebInstaller from '@electron-forge/installer-deb'; import RPMInstaller from '@electron-forge/installer-rpm'; import ExeInstaller from '@electron-forge/installer-exe'; -import asyncOra from '../util/ora-handler'; import { info } from '../util/messages'; const d = debug('electron-forge:install'); diff --git a/packages/api/core/src/api/lint.js b/packages/api/core/src/api/lint.js index 8a5486f8e8..c229fdc116 100644 --- a/packages/api/core/src/api/lint.js +++ b/packages/api/core/src/api/lint.js @@ -1,8 +1,8 @@ import 'colors'; +import { asyncOra } from '@electron-forge/async-ora'; import debug from 'debug'; import { yarnOrNpmSpawn } from '../util/yarn-or-npm'; -import asyncOra from '../util/ora-handler'; import resolveDir from '../util/resolve-dir'; const d = debug('electron-forge:lint'); diff --git a/packages/api/core/src/api/make.js b/packages/api/core/src/api/make.js index 7b485e8a05..bea1461ca6 100644 --- a/packages/api/core/src/api/make.js +++ b/packages/api/core/src/api/make.js @@ -1,9 +1,9 @@ import 'colors'; +import { asyncOra } from '@electron-forge/async-ora'; import fs from 'fs-extra'; import path from 'path'; import { hostArch } from 'electron-packager/targets'; -import asyncOra from '../util/ora-handler'; import getForgeConfig from '../util/forge-config'; import runHook from '../util/hook'; import { info, warn } from '../util/messages'; diff --git a/packages/api/core/src/api/package.js b/packages/api/core/src/api/package.js index 172d3f8099..f8aba9abf3 100644 --- a/packages/api/core/src/api/package.js +++ b/packages/api/core/src/api/package.js @@ -1,4 +1,5 @@ import 'colors'; +import { ora as realOra, fakeOra } from '@electron-forge/async-ora'; import debug from 'debug'; import fs from 'fs-extra'; import glob from 'glob'; @@ -10,7 +11,6 @@ import { hostArch } from 'electron-packager/targets'; import getForgeConfig from '../util/forge-config'; import runHook from '../util/hook'; import { warn } from '../util/messages'; -import realOra, { fakeOra } from '../util/ora'; import readPackageJSON from '../util/read-package-json'; import rebuildHook from '../util/rebuild'; import requireSearch from '../util/require-search'; diff --git a/packages/api/core/src/api/publish.js b/packages/api/core/src/api/publish.js index 04d8f09587..7f02c7fc48 100644 --- a/packages/api/core/src/api/publish.js +++ b/packages/api/core/src/api/publish.js @@ -1,12 +1,11 @@ import 'colors'; +import { asyncOra } from '@electron-forge/async-ora'; import debug from 'debug'; import fs from 'fs-extra'; import path from 'path'; -import asyncOra from '../util/ora-handler'; import getForgeConfig from '../util/forge-config'; import readPackageJSON from '../util/read-package-json'; -import requireSearch from '../util/require-search'; import resolveDir from '../util/resolve-dir'; import PublishState from '../util/publish-state'; import getCurrentOutDir from '../util/out-dir'; @@ -15,13 +14,19 @@ import make from './make'; const d = debug('electron-forge:publish'); +/** + * @typedef {Object} PublishTarget + * @property {string} [name] + * @property {Array} [platforms=[process.platform]] + * @property {Object} [config={}] + */ + /** * @typedef {Object} PublishOptions * @property {string} [dir=process.cwd()] The path to the app to be published * @property {boolean} [interactive=false] Whether to use sensible defaults or prompt the user visually - * @property {string} [authToken] An authentication token to use when publishing * @property {string} [tag=packageJSON.version] The string to tag this release with - * @property {Array} [publishTargets=[github]] The publish targets + * @property {Array} [publishTargets=[]] The publish targets * @property {MakeOptions} [makeOptions] Options object to passed through to make() * @property {string} [outDir=`${dir}/out`] The path to the directory containing generated distributables * @property {boolean} [dryRun=false] Whether to generate dry run meta data but not actually publish @@ -120,31 +125,36 @@ const publish = async (providedOptions = {}) => { return accum; }, []); + const testPlatform = makeOptions.platform || process.platform; if (publishTargets === null) { - publishTargets = forgeConfig.publish_targets[makeOptions.platform || process.platform]; + publishTargets = (forgeConfig.publishers || []) + .filter(publisher => publisher.platforms ? publisher.platforms.indexOf(testPlatform !== -1) : true); } + publishTargets = publishTargets.map((target) => { + if (typeof target === 'string') return { name: target }; + return target; + }); for (const publishTarget of publishTargets) { - let publisher; - await asyncOra(`Resolving publish target: ${`${publishTarget}`.cyan}`, async () => { // eslint-disable-line no-loop-func - publisher = requireSearch(__dirname, [ - `../publishers/${publishTarget}.js`, - `electron-forge-publisher-${publishTarget}`, - publishTarget, - path.resolve(dir, publishTarget), - path.resolve(dir, 'node_modules', publishTarget), - ]); - if (!publisher) { - throw `Could not find a publish target with the name: ${publishTarget}`; + let publisherModule; + await asyncOra(`Resolving publish target: ${`${publishTarget.name}`.cyan}`, async () => { // eslint-disable-line no-loop-func + try { + publisherModule = require(publishTarget.name); + } catch (err) { + console.error(err); + throw `Could not find a publish target with the name: ${publishTarget.name}`; } }); - await publisher({ + const PublisherClass = publisherModule.default || publisherModule; + const publisher = new PublisherClass(); + + await publisher.publish({ dir, artifacts, packageJSON, + config: publishTarget.config || {}, forgeConfig, - authToken, tag, platform: makeOptions.platform || process.platform, arch: makeOptions.arch || process.arch, diff --git a/packages/api/core/src/api/start.js b/packages/api/core/src/api/start.js index e30c6c6696..4cb2f3d905 100644 --- a/packages/api/core/src/api/start.js +++ b/packages/api/core/src/api/start.js @@ -1,8 +1,8 @@ import 'colors'; +import { asyncOra } from '@electron-forge/async-ora'; import { spawn } from 'child_process'; import path from 'path'; -import asyncOra from '../util/ora-handler'; import readPackageJSON from '../util/read-package-json'; import rebuild from '../util/rebuild'; import resolveDir from '../util/resolve-dir'; diff --git a/packages/api/core/src/util/plugin-interface.js b/packages/api/core/src/util/plugin-interface.js index 42f19db614..0a738228b5 100644 --- a/packages/api/core/src/util/plugin-interface.js +++ b/packages/api/core/src/util/plugin-interface.js @@ -1,7 +1,6 @@ +import { asyncOra } from '@electron-forge/async-ora'; import debug from 'debug'; -import asyncOra from './ora-handler'; - const d = debug('electron-forge:plugins'); export default class PluginInterface { diff --git a/packages/api/core/src/util/rebuild.js b/packages/api/core/src/util/rebuild.js index 4d8c29f276..c222a99aee 100644 --- a/packages/api/core/src/util/rebuild.js +++ b/packages/api/core/src/util/rebuild.js @@ -1,7 +1,6 @@ +import { asyncOra } from '@electron-forge/async-ora'; import rebuild from 'electron-rebuild'; -import asyncOra from '../util/ora-handler'; - export default async (buildPath, electronVersion, platform, arch, config = {}) => { await asyncOra('Preparing native dependencies', async (rebuildSpinner) => { const rebuilder = rebuild(Object.assign({}, config, { diff --git a/packages/api/core/test/fast/publish_spec.js b/packages/api/core/test/fast/publish_spec.js index 52c0e1e5d5..d078af17bd 100644 --- a/packages/api/core/test/fast/publish_spec.js +++ b/packages/api/core/test/fast/publish_spec.js @@ -8,29 +8,44 @@ import sinon from 'sinon'; chai.use(chaiAsPromised); -describe.skip('publish', () => { +describe('publish', () => { let publish; let makeStub; - let requireSearchStub; let resolveStub; let publisherSpy; + let voidStub; + let nowhereStub; + let publishers; beforeEach(() => { - requireSearchStub = sinon.stub(); resolveStub = sinon.stub(); makeStub = sinon.stub(); publisherSpy = sinon.stub(); + voidStub = sinon.stub(); + nowhereStub = sinon.stub(); + publishers = ['@electron-forge/publisher-test']; + const fakePublisher = stub => class { + constructor() { + this.publish = stub; + } + }; publish = proxyquire.noCallThru().load('../../src/api/publish', { './make': async (...args) => makeStub(...args), '../util/resolve-dir': async dir => resolveStub(dir), '../util/read-package-json': () => Promise.resolve(require('../fixture/dummy_app/package.json')), - '../util/forge-config': () => require('../../src/util/forge-config').default(path.resolve(__dirname, '../fixture/dummy_app')), - '../util/require-search': requireSearchStub, + '../util/forge-config': async () => { + const config = await (require('../../src/util/forge-config').default(path.resolve(__dirname, '../fixture/dummy_app'))); + + config.publishers = publishers; + return config; + }, + '@electron-forge/publisher-test': fakePublisher(publisherSpy), + void: fakePublisher(voidStub), + nowhere: fakePublisher(nowhereStub), }).default; publisherSpy.returns(Promise.resolve()); - requireSearchStub.returns(publisherSpy); resolveStub.returns(path.resolve(__dirname, '../fixture/dummy_app')); makeStub.returns([]); }); @@ -56,46 +71,50 @@ describe.skip('publish', () => { delete publisherSpy.firstCall.args[0].forgeConfig.pluginInterface; const testConfig = await require('../../src/util/forge-config').default(path.resolve(__dirname, '../fixture/dummy_app')); + testConfig.publishers = publishers; + delete testConfig.pluginInterface; expect(publisherSpy.firstCall.args).to.deep.equal([{ dir: resolveStub(), artifacts: ['artifact1', 'artifact2'], packageJSON: require('../fixture/dummy_app/package.json'), forgeConfig: testConfig, - authToken: 'my_token', + config: {}, tag: 'my_special_tag', platform: process.platform, arch: process.arch, }]); }); - it('should default to publishing to github', async () => { + it('should default to publishing nothing', async () => { + publishers = []; await publish({ dir: __dirname, interactive: false, }); - expect(requireSearchStub.firstCall.args[1][0]).to.equal('../publishers/github.js'); + expect(publisherSpy.callCount).to.equal(0); }); it('should resolve publishers when given a string name', async () => { + expect(voidStub.callCount).to.equal(0); await publish({ dir: __dirname, interactive: false, publishTargets: ['void'], }); - expect(requireSearchStub.firstCall.args[1][0]).to.equal('../publishers/void.js'); + expect(voidStub.callCount).to.equal(1); }); it('should resolve consecutive publishers when given an array of names', async () => { + expect(voidStub.callCount).to.equal(0); + expect(nowhereStub.callCount).to.equal(0); await publish({ dir: __dirname, interactive: false, - publishTargets: ['void', 'nowhere', 'black_hole', 'everywhere'], + publishTargets: ['void', 'nowhere'], }); - expect(requireSearchStub.getCall(0).args[1][0]).to.equal('../publishers/void.js'); - expect(requireSearchStub.getCall(1).args[1][0]).to.equal('../publishers/nowhere.js'); - expect(requireSearchStub.getCall(2).args[1][0]).to.equal('../publishers/black_hole.js'); - expect(requireSearchStub.getCall(3).args[1][0]).to.equal('../publishers/everywhere.js'); + expect(voidStub.callCount).to.equal(1); + expect(nowhereStub.callCount).to.equal(1); }); describe('dry run', () => { @@ -187,12 +206,7 @@ describe.skip('publish', () => { }); describe('when resuming a dry run', () => { - let publisher; - beforeEach(async () => { - publisher = sinon.stub(); - publisher.returns(Promise.resolve()); - requireSearchStub.returns(publisher); await publish({ dir, interactive: false, @@ -203,10 +217,10 @@ describe.skip('publish', () => { it('should successfully restore values and pass them to publisher', () => { expect(makeStub.callCount).to.equal(0); - expect(publisher.callCount).to.equal(2, 'should call once for each platform (make run)'); - const darwinIndex = publisher.firstCall.args[0].platform === 'darwin' ? 0 : 1; + expect(publisherSpy.callCount).to.equal(2, 'should call once for each platform (make run)'); + const darwinIndex = publisherSpy.firstCall.args[0].platform === 'darwin' ? 0 : 1; const win32Index = darwinIndex === 0 ? 1 : 0; - const darwinArgs = publisher.getCall(darwinIndex).args[0]; + const darwinArgs = publisherSpy.getCall(darwinIndex).args[0]; expect(darwinArgs.artifacts.sort()).to.deep.equal( fakeMake('darwin').reduce((accum, val) => accum.concat(val.artifacts), []).sort() ); @@ -215,7 +229,7 @@ describe.skip('publish', () => { expect(darwinArgs.tag).to.equal(null); expect(darwinArgs.platform).to.equal('darwin'); expect(darwinArgs.arch).to.equal('x64'); - const win32Args = publisher.getCall(win32Index).args[0]; + const win32Args = publisherSpy.getCall(win32Index).args[0]; expect(win32Args.artifacts.sort()).to.deep.equal( fakeMake('win32').reduce((accum, val) => accum.concat(val.artifacts), []).sort() ); diff --git a/packages/publisher/base/package.json b/packages/publisher/base/package.json new file mode 100644 index 0000000000..586335e5f9 --- /dev/null +++ b/packages/publisher/base/package.json @@ -0,0 +1,19 @@ +{ + "name": "@electron-forge/publisher-base", + "version": "6.0.0-beta.0", + "description": "Base publisher for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/Publisher.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + } +} \ No newline at end of file diff --git a/packages/publisher/base/src/Publisher.js b/packages/publisher/base/src/Publisher.js new file mode 100644 index 0000000000..d1642750e8 --- /dev/null +++ b/packages/publisher/base/src/Publisher.js @@ -0,0 +1,35 @@ +/* eslint-disable no-unused-vars */ + +export default class Publisher { + constructor(name) { + this.name = name; + Object.defineProperty(this, '__isElectronForgePublisher', { + value: true, + enumerable: false, + configurable: false, + }); + } + + /** + * Publishers must implement this method to publish the artifacts returned from + * make calls. If any errors occur you must throw them, failing silently or simply + * logging will not propagate issues up to forge. + * + * Please note for a given version publish will be called multiple times, once + * for each set of "platform" and "arch". This means if you are publishing + * darwin and win32 artifacts to somewhere like GitHub on the first publish call + * you will have to create the version on GitHub and the second call will just + * be appending files to the existing version. + */ + async publish({ + dir, // The base directory of the apps source code + artifacts, // An array of artifact objects, see the MakeResult object definition for details + packageJSON, // The packageJSON of the app + config, // The config that is dedicated for this publisher + forgeConfig, // The raw forgeConfig this app is using, you shouldn't really have to use this + platform, // The platform these artifacts are for + arch, // The arch these artifacts are for + }) { + throw new Error(`Publisher ${this.name} did not implement the publish method`); + } +} diff --git a/packages/publisher/base/test/Publisher_spec.js b/packages/publisher/base/test/Publisher_spec.js new file mode 100644 index 0000000000..fed30c4273 --- /dev/null +++ b/packages/publisher/base/test/Publisher_spec.js @@ -0,0 +1,15 @@ +import { expect } from 'chai'; + +import Publisher from '../src/Publisher'; + +describe('Publisher', () => { + it('should define __isElectronForgePublisher', () => { + const publisher = new Publisher('test'); + expect(publisher).to.have.property('__isElectronForgePublisher', true); + }); + + it('should throw an error when install is called', (done) => { + const publisher = new Publisher('test'); + publisher.publish({}).catch(() => done()); + }); +}); diff --git a/packages/publisher/electron-release-server/package.json b/packages/publisher/electron-release-server/package.json new file mode 100644 index 0000000000..a0ea30c385 --- /dev/null +++ b/packages/publisher/electron-release-server/package.json @@ -0,0 +1,27 @@ +{ + "name": "@electron-forge/publisher-electron-release-server", + "version": "6.0.0-beta.0", + "description": "Electron release server publisher for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/PublisherERS.js", + "scripts": { + "test": "exit 0" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/async-ora": "6.0.0-beta.0", + "@electron-forge/publisher-base": "6.0.0-beta.0", + "debug": "^3.0.0", + "form-data": "^2.1.4", + "fs-extra": "^5.0.0", + "node-fetch": "^2.0.0" + } +} \ No newline at end of file diff --git a/packages/publisher/electron-release-server/src/PublisherERS.js b/packages/publisher/electron-release-server/src/PublisherERS.js new file mode 100644 index 0000000000..06df04355b --- /dev/null +++ b/packages/publisher/electron-release-server/src/PublisherERS.js @@ -0,0 +1,120 @@ +import PublisherBase from '@electron-forge/publisher-base'; +import { asyncOra } from '@electron-forge/async-ora'; + +import debug from 'debug'; +import fetch from 'node-fetch'; +import FormData from 'form-data'; +import fs from 'fs-extra'; +import path from 'path'; + +const d = debug('electron-forge:publish:ers'); + +export const ersPlatform = (platform, arch) => { + switch (platform) { + case 'darwin': + return 'osx_64'; + case 'linux': + return arch === 'ia32' ? 'linux_32' : 'linux_64'; + case 'win32': + return arch === 'ia32' ? 'windows_32' : 'windows_64'; + default: + return platform; + } +}; + +export default class PublisherERS extends PublisherBase { + constructor() { + super('electron-release-server'); + } + + async publish({ artifacts, packageJSON, config, platform, arch }) { + if (!(config.baseUrl && config.username && config.password)) { + throw 'In order to publish to ERS you must set the "electronReleaseServer.baseUrl", "electronReleaseServer.username" and "electronReleaseServer.password" properties in your forge config. See the docs for more info'; // eslint-disable-line + } + + d('attempting to authenticate to ERS'); + + const api = apiPath => `${config.baseUrl}/${apiPath}`; + + const { token } = await (await fetch(api('api/auth/login'), { + method: 'POST', + body: JSON.stringify({ + username: config.username, + password: config.password, + }), + headers: { + 'Content-Type': 'application/json', + }, + })).json(); + + const authFetch = (apiPath, options) => fetch(api(apiPath), Object.assign({}, options || {}, { + headers: Object.assign({}, (options || {}).headers, { Authorization: `Bearer ${token}` }), + })); + + const versions = await (await authFetch('api/version')).json(); + const existingVersion = versions.find(version => version.name === packageJSON.version); + + let channel = 'stable'; + if (packageJSON.version.indexOf('beta') !== -1) { + channel = 'beta'; + } + if (packageJSON.version.indexOf('alpha') !== -1) { + channel = 'alpha'; + } + + if (!existingVersion) { + await authFetch('api/version', { + method: 'POST', + body: JSON.stringify({ + channel: { + name: channel, + }, + name: packageJSON.version, + notes: '', + }), + headers: { + 'Content-Type': 'application/json', + }, + }); + } + + let uploaded = 0; + await asyncOra(`Uploading Artifacts ${uploaded}/${artifacts.length}`, async (uploadSpinner) => { + const updateSpinner = () => { + uploadSpinner.text = `Uploading Artifacts ${uploaded}/${artifacts.length}`; // eslint-disable-line no-param-reassign + }; + + await Promise.all(artifacts.map(artifactPath => + new Promise(async (resolve, reject) => { + if (existingVersion) { + const existingAsset = existingVersion.assets.find(asset => asset.name === path.basename(artifactPath)); + if (existingAsset) { + d('asset at path:', artifactPath, 'already exists on server'); + uploaded += 1; + updateSpinner(); + return; + } + } + try { + d('attempting to upload asset:', artifactPath); + const artifactForm = new FormData(); + artifactForm.append('token', token); + artifactForm.append('version', packageJSON.version); + artifactForm.append('platform', ersPlatform(platform, arch)); + artifactForm.append('file', fs.createReadStream(artifactPath)); + await authFetch('api/asset', { + method: 'POST', + body: artifactForm, + headers: artifactForm.getHeaders(), + }); + d('upload successful for asset:', artifactPath); + uploaded += 1; + updateSpinner(); + } catch (err) { + reject(err); + } + }) + )); + }); + } +} diff --git a/packages/publisher/github/package.json b/packages/publisher/github/package.json new file mode 100644 index 0000000000..b2a0b96bd1 --- /dev/null +++ b/packages/publisher/github/package.json @@ -0,0 +1,27 @@ +{ + "name": "@electron-forge/publisher-github", + "version": "6.0.0-beta.0", + "description": "Github publisher for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/PublisherGithub.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/async-ora": "6.0.0-beta.0", + "@electron-forge/publisher-base": "6.0.0-beta.0", + "@octokit/rest": "^14.0.4", + "fs-extra": "^5.0.0", + "lodash.merge": "^4.6.0", + "mime-types": "^2.1.17" + } +} \ No newline at end of file diff --git a/packages/publisher/github/src/PublisherGithub.js b/packages/publisher/github/src/PublisherGithub.js new file mode 100644 index 0000000000..80515c9f91 --- /dev/null +++ b/packages/publisher/github/src/PublisherGithub.js @@ -0,0 +1,80 @@ +import PublisherBase from '@electron-forge/publisher-base'; +import { asyncOra } from '@electron-forge/async-ora'; + +import fs from 'fs-extra'; +import mime from 'mime-types'; +import path from 'path'; + +import GitHub from './util/github'; + +export default class PublisherGithub extends PublisherBase { + constructor() { + super('github'); + } + + async publish({ artifacts, packageJSON, config, tag }) { + if (!(config.repository && typeof config.repository === 'object' && + config.repository.owner && config.repository.name)) { + throw 'In order to publish to github you must set the "github_repository.owner" and "github_repository.name" properties in your forge config. See the docs for more info'; // eslint-disable-line + } + + const github = new GitHub(config.authToken, true, config.octokitOptions); + + let release; + await asyncOra('Searching for target release', async () => { + try { + release = (await github.getGitHub().repos.getReleases({ + owner: config.repository.owner, + repo: config.repository.name, + per_page: 100, + })).data.find(testRelease => testRelease.tag_name === (tag || `v${packageJSON.version}`)); + if (!release) { + throw { code: 404 }; + } + } catch (err) { + if (err.code === 404) { + // Release does not exist, let's make it + release = (await github.getGitHub().repos.createRelease({ + owner: config.repository.owner, + repo: config.repository.name, + tag_name: tag || `v${packageJSON.version}`, + name: tag || `v${packageJSON.version}`, + draft: config.repository.draft !== false, + prerelease: config.prerelease === true, + })).data; + } else { + // Unknown error + throw err; + } + } + }); + + let uploaded = 0; + await asyncOra(`Uploading Artifacts ${uploaded}/${artifacts.length}`, async (uploadSpinner) => { + const updateSpinner = () => { + uploadSpinner.text = `Uploading Artifacts ${uploaded}/${artifacts.length}`; // eslint-disable-line + }; + + await Promise.all(artifacts.map(artifactPath => + new Promise(async (resolve) => { + const done = () => { + uploaded += 1; + updateSpinner(); + resolve(); + }; + if (release.assets.find(asset => asset.name === path.basename(artifactPath))) { + return done(); + } + await github.getGitHub().repos.uploadAsset({ + url: release.upload_url, + file: fs.createReadStream(artifactPath), + contentType: mime.lookup(artifactPath) || 'application/octet-stream', + contentLength: (await fs.stat(artifactPath)).size, + name: path.basename(artifactPath), + }); + return done(); + }) + )); + }); + } +} diff --git a/packages/api/core/src/util/github.js b/packages/publisher/github/src/util/github.js similarity index 100% rename from packages/api/core/src/util/github.js rename to packages/publisher/github/src/util/github.js diff --git a/packages/api/core/test/fast/github_spec.js b/packages/publisher/github/test/github_spec.js similarity index 97% rename from packages/api/core/test/fast/github_spec.js rename to packages/publisher/github/test/github_spec.js index 71fc80ab32..2db3b24c3f 100644 --- a/packages/api/core/test/fast/github_spec.js +++ b/packages/publisher/github/test/github_spec.js @@ -21,7 +21,7 @@ describe('GitHub', () => { gitHubAuthSpy(); } }; - GitHub = proxyquire.noCallThru().load('../../src/util/github', { + GitHub = proxyquire.noCallThru().load('../src/util/github', { '@octokit/rest': MockGitHub, }).default; }); diff --git a/packages/publisher/s3/package.json b/packages/publisher/s3/package.json new file mode 100644 index 0000000000..0fecebc901 --- /dev/null +++ b/packages/publisher/s3/package.json @@ -0,0 +1,25 @@ +{ + "name": "@electron-forge/publisher-s3", + "version": "6.0.0-beta.0", + "description": "S3 publisher for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/PublisherS3.js", + "scripts": { + "test": "exit 0" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/publisher-base": "6.0.0-beta.0", + "aws-sdk": "^2.9.0", + "debug": "^3.0.0", + "s3": "^4.4.0" + } +} \ No newline at end of file diff --git a/packages/publisher/s3/src/PublisherS3.js b/packages/publisher/s3/src/PublisherS3.js new file mode 100644 index 0000000000..c318cd11b5 --- /dev/null +++ b/packages/publisher/s3/src/PublisherS3.js @@ -0,0 +1,75 @@ +import PublisherBase from '@electron-forge/publisher-base'; +import { asyncOra } from '@electron-forge/async-ora'; + +import AWS from 'aws-sdk'; +import debug from 'debug'; +import path from 'path'; +import s3 from 's3'; + +const d = debug('electron-forge:publish:s3'); + +AWS.util.update(AWS.S3.prototype, { + addExpect100Continue: function addExpect100Continue() { + // Hack around large upload issue: https://github.com/andrewrk/node-s3-client/issues/74 + }, +}); + +export default class PublisherS3 extends PublisherBase { + constructor() { + super('s3'); + } + + async publish({ artifacts, packageJSON, config, tag }) { + const s3Client = new AWS.S3({ + accessKeyId: config.accessKeyId, + secretAccessKey: config.secretAccessKey, + }); + + if (!s3Client.config.credentials || !config.bucket) { + throw 'In order to publish to s3 you must set the "s3.accessKeyId", "process.env.ELECTRON_FORGE_S3_SECRET_ACCESS_KEY" and "s3.bucket" properties in your forge config. See the docs for more info'; // eslint-disable-line + } + + d('creating s3 client with options:', config); + + const client = s3.createClient({ + s3Client, + }); + client.s3.addExpect100Continue = () => {}; + + const folder = config.folder || tag || packageJSON.version; + + let uploaded = 0; + await asyncOra(`Uploading Artifacts ${uploaded}/${artifacts.length}`, async (uploadSpinner) => { + const updateSpinner = () => { + uploadSpinner.text = `Uploading Artifacts ${uploaded}/${artifacts.length}`; // eslint-disable-line + }; + + await Promise.all(artifacts.map(artifactPath => + new Promise(async (resolve, reject) => { + const done = (err) => { + if (err) return reject(err); + uploaded += 1; + updateSpinner(); + resolve(); + }; + + const uploader = client.uploadFile({ + localFile: artifactPath, + s3Params: { + Bucket: config.bucket, + Key: `${folder}/${path.basename(artifactPath)}`, + ACL: config.public ? 'public-read' : 'private', + }, + }); + d('uploading:', artifactPath); + + uploader.on('error', err => done(err)); + uploader.on('progress', () => { + d(`Upload Progress (${path.basename(artifactPath)}) ${Math.round((uploader.progressAmount / uploader.progressTotal) * 100)}%`); + }); + uploader.on('end', () => done()); + }) + )); + }); + } +} diff --git a/packages/publisher/snapcraft/package.json b/packages/publisher/snapcraft/package.json new file mode 100644 index 0000000000..17294483ba --- /dev/null +++ b/packages/publisher/snapcraft/package.json @@ -0,0 +1,27 @@ +{ + "name": "@electron-forge/publisher-snapcraft", + "version": "6.0.0-beta.0", + "description": "Snapcraft publisher for Electron Forge", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/PublisherSnapcraft.js", + "scripts": { + "test": "exit 0" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0" + }, + "engines": { + "node": ">= 6.0" + }, + "dependencies": { + "@electron-forge/async-ora": "^6.0.0-beta.0", + "@electron-forge/publisher-base": "6.0.0-beta.0", + "fs-extra": "^5.0.0" + }, + "optionalDependencies": { + "electron-installer-snap": "^2.0.0" + } +} \ No newline at end of file diff --git a/packages/publisher/snapcraft/src/PublisherSnapcraft.js b/packages/publisher/snapcraft/src/PublisherSnapcraft.js new file mode 100644 index 0000000000..89240623b8 --- /dev/null +++ b/packages/publisher/snapcraft/src/PublisherSnapcraft.js @@ -0,0 +1,31 @@ +import PublisherBase from '@electron-forge/publisher-base'; +import { asyncOra } from '@electron-forge/async-ora'; + +import fs from 'fs-extra'; +import path from 'path'; +import Snapcraft from 'electron-installer-snap/snapcraft'; + +export default class PublisherSnapcraft extends PublisherBase { + constructor() { + super('snapcraft'); + } + + async publish({ dir, artifacts, config }) { + const snapArtifacts = artifacts.filter(artifact => artifact.endsWith('.snap')); + + if (snapArtifacts.length === 0) { + throw 'No snap files to upload. Please ensure that "snap" is listed in the "make_targets" in Forge config.'; + } + + const snapcraftCfgPath = path.join(dir, '.snapcraft', 'snapcraft.cfg'); + + if (!await fs.pathExists(snapcraftCfgPath)) { + throw `Snapcraft credentials not found at "${snapcraftCfgPath}". It can be generated with the command "snapcraft export-login" (snapcraft 2.37 and above).`; + } + + await asyncOra('Pushing snap to the snap store', async () => { + const snapcraft = new Snapcraft(); + await snapcraft.run(dir, 'push', config, snapArtifacts); + }); + } +} diff --git a/packages/utils/async-ora/package.json b/packages/utils/async-ora/package.json new file mode 100644 index 0000000000..fb64d2ea4d --- /dev/null +++ b/packages/utils/async-ora/package.json @@ -0,0 +1,27 @@ +{ + "name": "@electron-forge/async-ora", + "version": "6.0.0-beta.0", + "description": "A helper utility for wrapping async functions in an ora", + "repository": "https://github.com/electron-userland/electron-forge", + "author": "Samuel Attard", + "license": "MIT", + "main": "dist/index.js", + "scripts": { + "test": "mocha test/**/*_spec.js test/**/**/*_spec.js --opts ../../../mocha.opts" + }, + "devDependencies": { + "chai": "^4.0.0", + "mocha": "^5.0.0", + "proxyquire": "^1.7.10", + "sinon": "^4.1.2" + }, + "dependencies": { + "colors": "^1.1.2", + "debug": "^3.0.0", + "log-symbols": "^2.0.0", + "ora": "^1.1.0" + }, + "engines": { + "node": ">= 6.0" + } +} \ No newline at end of file diff --git a/packages/utils/async-ora/src/index.js b/packages/utils/async-ora/src/index.js new file mode 100644 index 0000000000..5070f358a1 --- /dev/null +++ b/packages/utils/async-ora/src/index.js @@ -0,0 +1,8 @@ +import ora, { fakeOra } from './ora'; +import asyncOra from './ora-handler'; + +export { + ora, + fakeOra, + asyncOra, +}; diff --git a/packages/api/core/src/util/ora-handler.js b/packages/utils/async-ora/src/ora-handler.js similarity index 100% rename from packages/api/core/src/util/ora-handler.js rename to packages/utils/async-ora/src/ora-handler.js diff --git a/packages/api/core/src/util/ora.js b/packages/utils/async-ora/src/ora.js similarity index 95% rename from packages/api/core/src/util/ora.js rename to packages/utils/async-ora/src/ora.js index 9c464424b4..4631ae6e00 100644 --- a/packages/api/core/src/util/ora.js +++ b/packages/utils/async-ora/src/ora.js @@ -3,7 +3,7 @@ import debug from 'debug'; import logSymbols from 'log-symbols'; import realOra from 'ora'; -const d = debug('electron-forge:lifecycle'); +const d = debug('electron-forge:async-ora'); const useFakeOra = (process.env.DEBUG && process.env.DEBUG.includes('electron-forge')); diff --git a/packages/api/core/test/fast/ora-handler_spec.js b/packages/utils/async-ora/test/ora-handler_spec.js similarity index 97% rename from packages/api/core/test/fast/ora-handler_spec.js rename to packages/utils/async-ora/test/ora-handler_spec.js index 5825a0a264..67d13f452d 100644 --- a/packages/api/core/test/fast/ora-handler_spec.js +++ b/packages/utils/async-ora/test/ora-handler_spec.js @@ -35,7 +35,7 @@ describe('asyncOra', () => { currentOra._text = text; return currentOra; }; - asyncOra = proxyquire.noCallThru().load('../../src/util/ora-handler', { + asyncOra = proxyquire.noCallThru().load('../src/ora-handler', { './ora': MockOra, }).default; }); From d34efb3f3134664009a0fbdec3cc4c85431a4057 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Wed, 21 Feb 2018 17:07:50 +1100 Subject: [PATCH 18/40] Docs template --- docs/.gitignore | 2 ++ docs/README.md | 2 ++ docs/SUMMARY.md | 6 ++++++ docs/book.json | 11 +++++++++++ docs/styles/website.css | 3 +++ 5 files changed, 24 insertions(+) create mode 100644 docs/.gitignore create mode 100644 docs/README.md create mode 100644 docs/SUMMARY.md create mode 100644 docs/book.json create mode 100644 docs/styles/website.css diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000000..017e4491d4 --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,2 @@ +_book +node_modules diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..3d07efe555 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,2 @@ +# Introduction + diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md new file mode 100644 index 0000000000..b42fd99e54 --- /dev/null +++ b/docs/SUMMARY.md @@ -0,0 +1,6 @@ +# Summary + +* [Introduction](README.md) +* [Core Concepts](concepts.md) +* Makers + * [AppX](packages/maker/appx/README.md) diff --git a/docs/book.json b/docs/book.json new file mode 100644 index 0000000000..360ef3a116 --- /dev/null +++ b/docs/book.json @@ -0,0 +1,11 @@ +{ + "plugins": ["theme-api", "panel"], + "pluginsConfig": { + "theme-api": { + "theme": "dark" + } + }, + "styles": { + "website": "styles/website.css" + } +} \ No newline at end of file diff --git a/docs/styles/website.css b/docs/styles/website.css new file mode 100644 index 0000000000..96a934da10 --- /dev/null +++ b/docs/styles/website.css @@ -0,0 +1,3 @@ +.gitbook-link { + display: none !important; +} \ No newline at end of file From 07dd4ac07a75537485c4f76d91efc362c04e39c6 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Thu, 22 Feb 2018 13:32:59 +1100 Subject: [PATCH 19/40] Initial docs --- docs/README.md | 3 +- docs/SUMMARY.md | 36 +++++- docs/book.json | 2 +- docs/cli.md | 118 ++++++++++++++++++ docs/extend.md | 79 ++++++++++++ docs/styles/website.css | 8 ++ .../api/cli/src/electron-forge-publish.js | 1 - packages/api/core/src/api/publish.js | 1 + 8 files changed, 242 insertions(+), 6 deletions(-) create mode 100644 docs/cli.md create mode 100644 docs/extend.md diff --git a/docs/README.md b/docs/README.md index 3d07efe555..c68013357e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,2 +1 @@ -# Introduction - +# Electron Forge diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index b42fd99e54..b3f384b601 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -1,6 +1,38 @@ # Summary * [Introduction](README.md) -* [Core Concepts](concepts.md) +* [Configuration](config.md) +* [CLI](cli.md) + * [Import](cli.md#import) + * [Init](cli.md#init) + * [Install](cli.md#install) + * [Lint](cli.md#lint) + * [Make](cli.md#make) + * [Package](cli.md#package) + * [Publish](cli.md#publish) + * [Start](cli.md#start) +* [API Docs](https://docs.electronforge.io) +* Plugins + * [Webpack](plugin/webpack.md) + * [Parcel](plugin/parcel.md) + * [Electron Compile](plugin/compile.md) * Makers - * [AppX](packages/maker/appx/README.md) + * [AppX](maker/appx.md) + * [Deb](maker/dev.md) + * [DMG](maker/dmg.md) + * [Flatpak](maker/flatpak.md) + * [RPM](maker/rpm.md) + * [Snapcraft](maker/snap.md) + * [Squirrel.Windows](maker/squirrel.md) + * [Wix MSI](maker/wix.md) + * [Zip](maker/zip.md) +* Publishers + * [Electron Release Server](publisher/ers.md) + * [GitHub](publisher/github.md) + * [S3](publisher/s3.md) + * [Snapcraft](publisher/snap.md) +* [Extending Electron Forge](extend.md) + * [Writing Plugins](extend.md#writing-plugins) + * [Writing Makers](extend.md#writing-makers) + * [Writing Publishers](extend.md#writing-publishers) + diff --git a/docs/book.json b/docs/book.json index 360ef3a116..12988528c1 100644 --- a/docs/book.json +++ b/docs/book.json @@ -1,5 +1,5 @@ { - "plugins": ["theme-api", "panel"], + "plugins": ["theme-api", "panel", "collapsible-menu", "ace"], "pluginsConfig": { "theme-api": { "theme": "dark" diff --git a/docs/cli.md b/docs/cli.md new file mode 100644 index 0000000000..0ede5fde03 --- /dev/null +++ b/docs/cli.md @@ -0,0 +1,118 @@ +# Electron Forge CLI + +{% method %} +## Installation + +Electron forge's CLI is separate from the core module, to install it you will +have to use the `@electron-forge/cli` module from NPM. + +{% sample lang="sh" %} +```sh +# NPM +npm i -g @electron-forge/cli + +# Yarn +yarn global add @electron-forge/cli +``` + +{% endmethod %} + +## Overview + +At a high level the CLI module is just a proxy to the raw +[API](https://docs.electronforge.io) commands. Almost all the configuation +is still done in your [Forge Config](config), the CLI just provides a handy +way to trigger all the core functionality of Electron Forge (and you should +definitely use it). + +## Commands + +Please note these commands are sorted in alphabetical order, the ones you +probably need to care about are [`start`](#start), [`package`](#package), +[`make`](#make) and [`publish`](#publish). + +### Import + +Maps to `electronForge.import`, will attempt to take an existing Electron app +and make it Forge compatible. Normally this is just created a base forge config +and adding the required dependencies. + +> There are no flags for the Import command + +### Init + +Maps to `electronForge.init`, will initialize a new Forge powered application in +the given directory (defaults to `.`). + +Please note if you want to use a template it must be installed globally before +running the `init` command. + +| Flag | Value | Description | +|------|-------|-------------| +| `--template` | Template Name | Name of the template to use to make this new app| +| `--copy-ci-files` | N/A | Set if you want to copy templated CI files for Travis CI and Appveyor | + +### Install + +Maps to `electronForge.install`, will attempt to install the Electron app +that is published at the given GitHub repository. This command is just a helper +for installing other applications quickly. + +### Lint + +Maps to `electronForge.lint`, will run the `lint` command that your package.json +exposes. If the exit code is 0 no output is shown, otherwise the error output +will be displayed. + +> There are no flags for the Lint command + +### Make + +Maps to `electronForge.make`, will make distributables for your application +based on your forge config and the parameters you pass in. + +| Flag | Value | Description | +|------|-------|-------------| +| `--arch` | Architecture E.g. `x64` | Target architecture to make for | +| `--platform` | Platform E.g. `mas` | Target platform to make for, please note you normally can only target platform X from platform X | +| `--targets` | Comma separated list of maker names | Override your make targets for this run | +| `--skip-package` | N/A | Set if you want to skip the packaging step, useful if you are running sequential makes and want to save time | + +### Package + +Maps to `electronForge.package`, will package your application into a platform +specific format and put the result in a folder. Please note that this does not +make a distributable format, to make proper distributables please use the +[`make`](#make) command. + +| Flag | Value | Description | +|------|-------|-------------| +| `--arch` | Architecture E.g. `x64` | Target architecture to package for | +| `--platform` | Platform E.g. `mas` | Target platform to package for | + +### Publish + +Maps to `electronForge.publish`, will attempt to make the forge application +and then publish it to the publish targets defined in your forge config. + +If you want to publish previously created `make` artifacts you will have to use +the `dry-run` options explained below. + +| Flag | Value | Description | +|------|-------|-------------| +| `--tag` | Version | The version to publish these artifacts as | +| `--target` | Comma separated list of publisher names | Override your publish targets for this run | +| `--dry-run` | N/A | Triggers a publish dry run which saves state and doesn't upload anything | +| `--from-dry-run` | N/A | Attempts to publish artifacts from any dry runs saved on disk | + +### Start + +Maps to `electronForge.start`, will launch the Forge powered application in the +given directory (defaults to `.`). + +| Flag | Value | Description | +|------|-------|-------------| +| `--app-path` | Path to your app from CWD | Override the path to the Electron app to launch (defaults to '.') | +| `--enable-logging` | N/A | Enable advanced logging. This will log internal Electron things | +| `--run-as-node` | N/A | Run the Electron app as a Node.JS script | +| `--inspect-electron` | N/A | Triggers inspect mode on Electron to allow debugging the main process | diff --git a/docs/extend.md b/docs/extend.md new file mode 100644 index 0000000000..3525ad4a96 --- /dev/null +++ b/docs/extend.md @@ -0,0 +1,79 @@ +# Extending Electron Forge + +Electron Forge is designed to be easily extendable by third parties with +whatever build logic you need. The build flow for Electron Forge is split into +two main sections `make` and `publish` and you can define custom targets for +each of those commands. For everything else we have a Plugin API which allows +you to hook into pretty much any part of forge's standard build process and do +whatever you want. + +If there is something you want to be able to do with a plugin/maker/publisher +that isn't currently exposed, please don't hesitate to raise a Feature Request +issue on our [GitHub Repository](https://github.com/electron-userland/electron-forge). + +## Writing Plugins + +An Electron Forge Plugin has to export a single class that extends our base +plugin. The base plugin can be depended on by installing +`@electron-forge/plugin-base`. It can implement two methods, neither are +required: + +{% method %} +### `getHook(hookName: string): Function` + +If implemented this method will be called every time a hook fires inside Forge +and you must look at the `hookName` and either return a function to run for that +hook or return a falsey value to indicate you have no hook to run. + +The possible `hookName` values and the parameters passed to the hook function +you return are documented over in the [Configuration](config) section of the +docs. + +{% sample lang="javascript" %} +{%ace edit=false, lang='javascript', check=false, theme="tomorrow_night" %} +export default class MyPlugin extends PluginBase { + getHook(hookName) { + switch (hookName) { + case 'prePackage': + return this.prePackage; + break; + } + } + + prePackage() { + console.log('running prePackage hook); + } +} +{%endace%} + +{% endmethod %} + +{% method %} +### `startLogic(startOpts: StartOptions): Promise` + +If implemented this method will be called every time the user runs +`electron-forge start`, if you return a `ChildProcess` you can override the +built in start logic and Electron Forge will not spawn it's own process rather +watch the one you returned. If you return `null` forge will spawn Electron +itself but you could still run custom logic such as started compilation for +code or downloading certain binaries before start. + +NOTE: `StartOptions` is documented [on our API site](https://docs.electronforge.io/typedef/index.html#static-typedef-StartOptions) + +{% sample lang="javascript" %} +{%ace edit=false, lang='javascript', check=false, theme="tomorrow_night" %} +export default class MyPlugin extends PluginBase { + async startLogic(opts) { + await this.compileMainProcess(); + return null; + } + + compileMainProcess() { ... } +} +{%endace%} + +{% endmethod %} + +## Writing Makers + +## Writing Publishers \ No newline at end of file diff --git a/docs/styles/website.css b/docs/styles/website.css index 96a934da10..cda1993762 100644 --- a/docs/styles/website.css +++ b/docs/styles/website.css @@ -1,3 +1,11 @@ .gitbook-link { display: none !important; +} + +.ace { + border: none !important; +} + +.api-method-code { + margin-top: 2em; } \ No newline at end of file diff --git a/packages/api/cli/src/electron-forge-publish.js b/packages/api/cli/src/electron-forge-publish.js index 6bc14d07c9..ccd47b67ed 100644 --- a/packages/api/cli/src/electron-forge-publish.js +++ b/packages/api/cli/src/electron-forge-publish.js @@ -12,7 +12,6 @@ import { getMakeOptions } from './electron-forge-make'; program .version(require('../package.json').version) .arguments('[cwd]') - .option('--auth-token', 'Authorization token for your publisher target (if required)') .option('--tag', 'The tag to publish to on GitHub') .option('--target [target[,target...]]', 'The comma-separated deployment targets, defaults to "github"') .option('--dry-run', 'Triggers a publish dry run which saves state and doesn\'t upload anything') diff --git a/packages/api/core/src/api/publish.js b/packages/api/core/src/api/publish.js index 7f02c7fc48..53726e31be 100644 --- a/packages/api/core/src/api/publish.js +++ b/packages/api/core/src/api/publish.js @@ -62,6 +62,7 @@ const publish = async (providedOptions = {}) => { } let packageJSON = await readPackageJSON(dir); + if (tag === null ) tag = packageJSON.version; const forgeConfig = await getForgeConfig(dir); const outDir = providedOptions.outDir || getCurrentOutDir(dir, forgeConfig); From bcb37df4ad191729afb185083469f7d27360329e Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Wed, 14 Mar 2018 16:09:07 +0900 Subject: [PATCH 20/40] update plugin interface to support resolving strings --- packages/api/core/src/util/plugin-interface.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/packages/api/core/src/util/plugin-interface.js b/packages/api/core/src/util/plugin-interface.js index 0a738228b5..6501a49987 100644 --- a/packages/api/core/src/util/plugin-interface.js +++ b/packages/api/core/src/util/plugin-interface.js @@ -5,7 +5,21 @@ const d = debug('electron-forge:plugins'); export default class PluginInterface { constructor(dir, forgeConfig) { - this.plugins = forgeConfig.plugins; + this.plugins = forgeConfig.plugins.map((plugin) => { + if (plugin.__isElectronForgePlugin) { + return plugin; + } else if (Array.isArray(plugin)) { + if (typeof plugin[0] !== 'string') { + throw `Expected plugin[0] to be a string but found ${plugin[0]}`; + } + let opts = {}; + if (typeof plugin[1] !== 'undefined') opts = plugin[1] + const pluginModule = require(plugin[0]); + const Plugin = pluginModule.default || pluginModule; + return new Plugin(opts); + } + throw `Expected plugin to either be a plugin instance or [string, object] but found ${plugin}`; // eslint-disable-line + }); Object.defineProperty(this, 'config', { value: forgeConfig, enumerable: false, From 2374803221d74cd5770aa3879739ff6a72f2a2e0 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Wed, 14 Mar 2018 16:09:14 +0900 Subject: [PATCH 21/40] more docs --- docs/SUMMARY.md | 28 +++++------ docs/extend.md | 125 +++++++++++++++++++++++++++++++++++++++++++++++- docs/plugins.md | 53 ++++++++++++++++++++ 3 files changed, 191 insertions(+), 15 deletions(-) create mode 100644 docs/plugins.md diff --git a/docs/SUMMARY.md b/docs/SUMMARY.md index b3f384b601..13ce36f2f7 100644 --- a/docs/SUMMARY.md +++ b/docs/SUMMARY.md @@ -12,20 +12,20 @@ * [Publish](cli.md#publish) * [Start](cli.md#start) * [API Docs](https://docs.electronforge.io) -* Plugins - * [Webpack](plugin/webpack.md) - * [Parcel](plugin/parcel.md) - * [Electron Compile](plugin/compile.md) -* Makers - * [AppX](maker/appx.md) - * [Deb](maker/dev.md) - * [DMG](maker/dmg.md) - * [Flatpak](maker/flatpak.md) - * [RPM](maker/rpm.md) - * [Snapcraft](maker/snap.md) - * [Squirrel.Windows](maker/squirrel.md) - * [Wix MSI](maker/wix.md) - * [Zip](maker/zip.md) +* [Plugins](plugins.md) + * [Webpack](plugins.md#webpack) + * [Electron Compile](plugins.md#electron-compile) + * [Parcel](plugins.md#parcel) +* [Makers](makers.md) + * [AppX](makers.md#appx) + * [Deb](makers.md#deb) + * [DMG](makers.md#dmg) + * [Flatpak](makers.md#flatpak) + * [RPM](makers.md#rpm) + * [Snapcraft](makers.md#snap) + * [Squirrel.Windows](makers.md#squirrel) + * [Wix MSI](makers.md#wix) + * [Zip](makers.md#zip) * Publishers * [Electron Release Server](publisher/ers.md) * [GitHub](publisher/github.md) diff --git a/docs/extend.md b/docs/extend.md index 3525ad4a96..d8bc64f562 100644 --- a/docs/extend.md +++ b/docs/extend.md @@ -7,6 +7,14 @@ each of those commands. For everything else we have a Plugin API which allows you to hook into pretty much any part of forge's standard build process and do whatever you want. +To briefly explain some terms: + * `maker`: A tool that takes a packaged Electron application and outputs a + certain kind of distributable. + * `publisher`: A tool that takes distributables and "publishes" (normally + just uploads) them somewhere. Think GitHub releases. + * `plugin`: A tool that hooks into forge's internals and can inject logic + into your build process. + If there is something you want to be able to do with a plugin/maker/publisher that isn't currently exposed, please don't hesitate to raise a Feature Request issue on our [GitHub Repository](https://github.com/electron-userland/electron-forge). @@ -76,4 +84,119 @@ export default class MyPlugin extends PluginBase { ## Writing Makers -## Writing Publishers \ No newline at end of file +An Electron Forge Maker has to export a single class that extends our base +maker. The base plugin can be depended on by installing +`@electron-forge/maker-base`. + +The `MakerBase` class has some helper methods for your convenience. + +| Method | Description | +|--------|-------------| +| `ensureDirectory(path: string)` | Ensures the directory exists and is forced to be empty.
I.e. If the directory already exists it is deleted and recreated, this is a desctructive operation | +| `ensureFile(path: string)` | Ensures the path to the file exists and the file does not exist
I.e. If the file already exists it is deleted and the path created | +| `isInstalled(moduleName: string)` | Checks if the given module is installed, used for testing if optional dependencies are installed or not | + +Your maker must implement two methods: + +{% method %} +### `isSupportedOnCurrentPlatform(): boolean` + +This method must syncronously return a boolean indicating whether or not this +maker can run on the current platform. Normally this is just a `process.platform` +check but it can be a deeper check for dependencies like fake-root or other +required external build tools. + +If the issue is a missing dependency you should log out a **helpful** error message +telling the developer exactly what is missing and if possible how to get it. + +{% sample lang="javascript" %} +{%ace edit=false, lang='javascript', check=false, theme="tomorrow_night" %} +export default class MyMaker extends MakerBase { + isSupportedOnCurrentPlatform() { + return process.platform === 'linux' && this.isFakeRootInstalled(); + } + + isFakeRootInstalled() { ... } +} +{%endace%} + +{% endmethod %} + +{% method %} +### `make(options): Promise` + +Makers must implement this method and return an array of **absolute** paths to +the artifacts this maker generated. If an error occurs, simply reject the +promise and Electron Forge will stop the make process. + +The options object has the following structure. + +| Key | Value | +|-----|-------| +| `dir` | The directory containing the packaged Electron application | +| `makeDir` | The directory you should put all your artifacts in (potentially in sub folders)
NOTE: this directory is not guarunteed to already exist | +| `appName` | The resolved human friendly name of the project | +| `targetPlatform` | The target platform you should make for | +| `targetArch` | The target architecture you should make for | +| `config` | The configuration object designated for this maker | +| `forgeConfig` | Fully resolved forge configuration, you shouldn't really need this | +| `packageJSON` | The applications package.json file | + +{% sample lang="javascript" %} +{%ace edit=false, lang='javascript', check=false, theme="tomorrow_night" %} +export default class MyMaker extends MakerBase { + async make(opts) { + const pathToMagicInstaller = await makeMagicInstaller(opts.dir); + return [pathToMagicInstaller]; + } +} +{%endace%} + +{% endmethod %} + +## Writing Publishers + +An Electron Forge Publisher has to export a single class that extends our base +maker. The base plugin can be depended on by installing +`@electron-forge/maker-base`. Your maker must implement one method: + +{% method %} +### `publish(options): Promise` + +Publishers must implement this method to publish the artifacts returned from +make calls. If any errors occur you must throw them, failing silently or simply +logging will not propagate issues up to forge. + +Please note for a given version publish will be called multiple times, once +for each set of "platform" and "arch". This means if you are publishing +darwin and win32 artifacts to somewhere like GitHub on the first publish call +you will have to create the version on GitHub and the second call will just +be appending files to the existing version. + +The options object has the following structure. + +| Key | Value | +|-----|-------| +| `dir` | The base directory of the apps source code | +| `artifacts` | An array of artifact objects, see the [MakeResult](https://docs.electronforge.io/typedef/index.html#static-typedef-MakeResult) object definition for details | +| `packageJSON` | The packageJSON of the app | +| `config` | The config that is dedicated for this publisher | +| `forgeConfig` | The raw forgeConfig this app is using, you shouldn't really have to use this | +| `platform` | The platform these artifacts are for | +| `arch` | The arch these artifacts are for | + +{% sample lang="javascript" %} +{%ace edit=false, lang='javascript', check=false, theme="tomorrow_night" %} +export default class MyPublisher extends PublisherBase { + async publish(opts) { + for (const artifact of opts.artifacts) { + await createVersion(artifact.packageJSON.version); + for (const artifactPath of artifact.artifacts) { + await upload(artifact.packageJSON.version, artifactPath); + } + } + } +} +{%endace%} + +{% endmethod %} \ No newline at end of file diff --git a/docs/plugins.md b/docs/plugins.md new file mode 100644 index 0000000000..a4060c5df3 --- /dev/null +++ b/docs/plugins.md @@ -0,0 +1,53 @@ +# Plugins + +Electron Forge has a plugin system which allows easy extensibility of the core +functionality of forge. By default forge takes a vanilla JS application and +packages, makes and publishes it. Through the use of plugins, some of which are +listed below, you can make forge even more powerful. For instance integrating +directly with industry standard build tooling like webpack. + +{% method %} +## Webpack + +The webpack plugin allows you to use standard webpack tooling to compile both +your main process code and your renderer process code with built in support for +Hot Module Reloading in the renderer process and support for multiple renderers. + +{% sample lang="bash" %} +###### Installation +{%ace edit=false, lang='bash', check=false, theme="tomorrow_night" %} +yarn add @electron-forge/plugin-webpack --dev +{%endace%} + +###### Basic Usage +{%ace edit=false, lang='json', check=false, theme="tomorrow_night" %} +{ + "plugins": [ + ["@electron-forge/plugin-webpack", { + "mainConfig": "./webpack.main.config.js", + "renderer": { + "config": "./webpack.renderer.config.js", + "entryPoints": [{ + "html": "./src/renderer/index.html", + "js": "./src/renderer/index.js", + "name": "main" + }] + } + }] + ] +} +{%endace%} + +{% endmethod %} + +## Electron Compile + +### Installation + +### Usage + +## Parcel + +### Installation + +### Usage \ No newline at end of file From 70fb7676ae570a529453ffcaa910c9977e258e5c Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Wed, 14 Mar 2018 16:09:22 +0900 Subject: [PATCH 22/40] add deps and scripts --- package.json | 4 + yarn.lock | 1510 +++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 1426 insertions(+), 88 deletions(-) diff --git a/package.json b/package.json index 0ef8451014..908fd8464d 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,9 @@ "scripts": { "build": "bolt ws exec -- node_modules/.bin/babel src -d dist --quiet", "commit": "git-cz", + "docs:build": "cd docs && gitbook build", + "docs:install": "cd docs && gitbook install", + "docs:serve": "cd docs && gitbook serve", "lint": "bolt ws exec -- node_modules/.bin/eslint src test", "test": "bolt ws run test" }, @@ -40,6 +43,7 @@ "electron-rebuild": "^1.6.0", "form-data": "^2.1.4", "fs-extra": "^5.0.0", + "gitbook-cli": "^2.3.2", "glob": "^7.1.1", "inquirer": "^5.0.0", "lodash.merge": "^4.6.0", diff --git a/yarn.lock b/yarn.lock index 4f14a4cde4..cf25bac465 100644 --- a/yarn.lock +++ b/yarn.lock @@ -490,14 +490,25 @@ dependencies: samsam "1.3.0" +JSONStream@~1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abab@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" -abbrev@1: +abbrev@1, abbrev@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" +abbrev@~1.0.9: + version "1.0.9" + resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + acorn-globals@^1.0.4: version "1.0.9" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-1.0.9.tgz#55bb5e98691507b74579d0513413217c380c54cf" @@ -522,6 +533,18 @@ acorn@^5.4.0: version "5.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.4.1.tgz#fdc58d9d17f4a4e98d102ded826a9b9759125102" +agent-base@4, agent-base@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.0.tgz#9838b5c3392b962bad031e6a4c5e1024abec45ce" + dependencies: + es6-promisify "^5.0.0" + +agentkeepalive@^3.3.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.4.0.tgz#92487926ec1a93100a89a8a46a6b2d82513543ce" + dependencies: + humanize-ms "^1.2.1" + ajv-keywords@^1.0.0: version "1.5.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" @@ -568,14 +591,14 @@ ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" +ansi-regex@*, ansi-regex@^3.0.0, ansi-regex@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" -ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -590,6 +613,14 @@ ansi@^0.3.0, ansi@~0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/ansi/-/ansi-0.3.1.tgz#0c42d4fb17160d5a9af1e484bace1c66922c1b21" +ansicolors@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979" + +ansistyles@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539" + any-promise@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" @@ -630,10 +661,14 @@ append-transform@^0.4.0: dependencies: default-require-extensions "^1.0.0" -aproba@^1.0.3: +aproba@^1.0.3, aproba@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" +aproba@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.2.tgz#45c6629094de4e96f693ef7eab74ae079c240fc1" + archiver@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/archiver/-/archiver-0.11.0.tgz#98177da7a6c0192b7f2798f30cd6eab8abd76690" @@ -647,7 +682,7 @@ archiver@^0.11.0: tar-stream "~0.4.0" zip-stream "~0.4.0" -archy@^1.0.0: +archy@^1.0.0, archy@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -712,6 +747,10 @@ arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" +asap@^2.0.0: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + asar@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/asar/-/asar-0.11.0.tgz#b926e792c315f8c048c43371e325b09c97a76464" @@ -795,11 +834,17 @@ async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async-some@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/async-some/-/async-some-1.0.2.tgz#4d8a81620d5958791b5b98f802d3207776e95509" + dependencies: + dezalgo "^1.0.2" + async@^1.4.0, async@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.0.0, async@^2.1.5: +async@^2.0.0, async@^2.0.1, async@^2.1.5: version "2.6.0" resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" dependencies: @@ -1002,6 +1047,10 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +bash-color@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/bash-color/-/bash-color-0.0.4.tgz#e9be8ce33540cada4881768c59bd63865736e913" + bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" @@ -1029,13 +1078,25 @@ bl@^0.9.0, bl@~0.9.0: dependencies: readable-stream "~1.0.26" -block-stream@*: +bl@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" + dependencies: + readable-stream "^2.0.5" + +bl@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" + dependencies: + readable-stream "~2.0.5" + +block-stream@*, block-stream@0.0.9: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" dependencies: inherits "~2.0.0" -bluebird@^3.0.6, bluebird@^3.1.1, bluebird@^3.3.4, bluebird@^3.5.0: +bluebird@^3.0.6, bluebird@^3.1.1, bluebird@^3.3.4, bluebird@^3.5.0, bluebird@^3.5.1, bluebird@~3.5.0: version "3.5.1" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.1.tgz#d9551f9de98f1fcda1e683d17ee91a0602ee2eb9" @@ -1067,7 +1128,7 @@ boom@5.x.x: dependencies: hoek "4.x.x" -boxen@^1.2.1: +boxen@^1.0.0, boxen@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" dependencies: @@ -1137,6 +1198,10 @@ buffer-from@^0.1.1: dependencies: is-array-buffer-x "^1.0.13" +buffer-shims@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" + buffer@4.9.1: version "4.9.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-4.9.1.tgz#6d1bb601b07a4efced97094132093027c95bc298" @@ -1153,6 +1218,68 @@ builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" +builtins@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-0.0.7.tgz#355219cd6cf18dbe7c01cc7fd2dce765cfdc549a" + +builtins@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" + +cacache@^10.0.0: + version "10.0.4" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" + dependencies: + bluebird "^3.5.1" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^2.0.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.2" + ssri "^5.2.4" + unique-filename "^1.1.0" + y18n "^4.0.0" + +cacache@^9.2.9: + version "9.3.0" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-9.3.0.tgz#9cd58f2dd0b8c8cacf685b7067b416d6d3cf9db1" + dependencies: + bluebird "^3.5.0" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^1.3.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.1" + ssri "^4.1.6" + unique-filename "^1.1.0" + y18n "^3.2.1" + +cacache@~9.2.9: + version "9.2.9" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-9.2.9.tgz#f9d7ffe039851ec94c28290662afa4dd4bb9e8dd" + dependencies: + bluebird "^3.5.0" + chownr "^1.0.1" + glob "^7.1.2" + graceful-fs "^4.1.11" + lru-cache "^4.1.1" + mississippi "^1.3.0" + mkdirp "^0.5.1" + move-concurrently "^1.0.1" + promise-inflight "^1.0.1" + rimraf "^2.6.1" + ssri "^4.1.6" + unique-filename "^1.1.0" + y18n "^3.2.1" + cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -1185,6 +1312,10 @@ caching-transform@^1.0.0: mkdirp "^0.5.1" write-file-atomic "^1.1.4" +call-limit@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/call-limit/-/call-limit-1.1.0.tgz#6fd61b03f3da42a2cd0ec2b60f02bd0e71991fea" + caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -1226,6 +1357,10 @@ capture-stack-trace@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -1282,6 +1417,10 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: escape-string-regexp "^1.0.5" supports-color "^5.2.0" +char-spinner@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/char-spinner/-/char-spinner-1.0.1.tgz#e6ea67bd247e107112983b7ab0479ed362800081" + chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" @@ -1323,6 +1462,10 @@ cheerio@0.22.0: lodash.reject "^4.4.0" lodash.some "^4.4.0" +chmodr@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-1.0.2.tgz#04662b932d0f02ec66deaa2b0ea42811968e3eb9" + chokidar@^1.6.1: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" @@ -1356,6 +1499,10 @@ chokidar@^2.0.2: optionalDependencies: fsevents "^1.0.0" +chownr@^1.0.1, chownr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + chromium-pickle-js@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/chromium-pickle-js/-/chromium-pickle-js-0.1.0.tgz#1d48b107d82126a2f3e211c2ea25f803ba551b21" @@ -1425,6 +1572,17 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" +clone@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" + +cmd-shim@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" + dependencies: + graceful-fs "^4.1.2" + mkdirp "~0.5.0" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -1477,6 +1635,13 @@ colors@~0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/colors/-/colors-0.6.2.tgz#2423fe6678ac0c5dae8852e5d0e5be08c997abcc" +columnify@~1.5.4: + version "1.5.4" + resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" + dependencies: + strip-ansi "^3.0.0" + wcwidth "^1.0.0" + combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" @@ -1553,6 +1718,21 @@ concat-stream@1.6.0, concat-stream@^1.4.7, concat-stream@^1.5.2: readable-stream "^2.2.2" typedarray "^0.0.6" +concat-stream@^1.5.0: + version "1.6.1" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.1.tgz#261b8f518301f1d834e36342b9fea095d2620a26" + dependencies: + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +config-chain@~1.1.10, config-chain@~1.1.11: + version "1.1.11" + resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.11.tgz#aba09747dfbe4c3e70e766a6e41586e1859fc6f2" + dependencies: + ini "^1.3.4" + proto-list "~1.2.1" + configstore@^3.0.0: version "3.1.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.1.tgz#094ee662ab83fad9917678de114faaea8fcdca90" @@ -1580,6 +1760,17 @@ convert-source-map@^1.1.0, convert-source-map@^1.3.0: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" +copy-concurrently@^1.0.0: + version "1.0.5" + resolved "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz#92297398cae34937fcafd6ec8139c18051f0b5e0" + dependencies: + aproba "^1.1.1" + fs-write-stream-atomic "^1.0.8" + iferr "^0.1.5" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.0" + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" @@ -1735,6 +1926,10 @@ cycle@1.0.x: version "1.0.3" resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" +cyclist@~0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/cyclist/-/cyclist-0.2.2.tgz#1b33792e11e914a2fd6d6ed6447464444e5fa640" + cz-conventional-changelog@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/cz-conventional-changelog/-/cz-conventional-changelog-1.2.0.tgz#2bca04964c8919b23f3fd6a89ef5e6008b31b3f8" @@ -1785,6 +1980,10 @@ debug@3.1.0, debug@^3.0.0, debug@^3.0.1, debug@^3.1.0: dependencies: ms "2.0.0" +debuglog@*, debuglog@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" + decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1833,6 +2032,12 @@ default-require-extensions@^1.0.0: dependencies: strip-bom "^2.0.0" +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + dependencies: + clone "^1.0.2" + define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" @@ -1893,10 +2098,21 @@ detect-indent@^3.0.1: minimist "^1.1.0" repeating "^1.1.0" +detect-indent@~5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" + detect-libc@^1.0.2, detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" +dezalgo@^1.0.0, dezalgo@^1.0.1, dezalgo@^1.0.2, dezalgo@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" + dependencies: + asap "^2.0.0" + wrappy "1" + diff@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" @@ -1981,13 +2197,22 @@ duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" +duplexify@^3.4.2, duplexify@^3.5.3: + version "3.5.4" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" dependencies: jsbn "~0.1.0" -editor@1.0.0: +editor@1.0.0, editor@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/editor/-/editor-1.0.0.tgz#60c7f87bd62bcc6a894fa8ccd6afb7823a24f742" @@ -2185,7 +2410,13 @@ electron-wix-msi@^1.3.0: lodash "^4.17.4" uuid "^3.1.0" -end-of-stream@^1.0.0: +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + dependencies: + iconv-lite "~0.4.13" + +end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" dependencies: @@ -2203,6 +2434,16 @@ env-paths@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-1.0.0.tgz#4168133b42bb05c38a35b1ae4397c8298ab369e0" +err-code@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + +"errno@>=0.1.1 <0.2.0-0": + version "0.1.7" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" + dependencies: + prr "~1.0.1" + error-ex@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" @@ -2827,6 +3068,13 @@ flatten-packages@^0.1.4: semver "~2.2.1" wrench "~1.5.4" +flush-write-stream@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.2.tgz#c81b90d8746766f1a609a46809946c45dd8ae417" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.4" + fmix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fmix/-/fmix-0.1.0.tgz#c7bbf124dec42c9d191cfb947d0a9778dd986c0c" @@ -2874,6 +3122,14 @@ form-data@~0.1.0: combined-stream "~0.0.4" mime "~1.2.11" +form-data@~1.0.0-rc4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" + dependencies: + async "^2.0.1" + combined-stream "^1.0.5" + mime-types "^2.1.11" + form-data@~2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" @@ -2888,6 +3144,20 @@ fragment-cache@^0.2.1: dependencies: map-cache "^0.2.2" +from2@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-1.3.0.tgz#88413baaa5f9a597cfde9221d86986cd3c061dfd" + dependencies: + inherits "~2.0.1" + readable-stream "~1.1.10" + +from2@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.0" + from@~0: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" @@ -2914,6 +3184,14 @@ fs-extra@1.0.0, fs-extra@^1.0.0: jsonfile "^2.1.0" klaw "^1.0.0" +fs-extra@3.0.1, fs-extra@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" + dependencies: + graceful-fs "^4.1.2" + jsonfile "^3.0.0" + universalify "^0.1.0" + fs-extra@^0.30.0: version "0.30.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" @@ -2931,14 +3209,6 @@ fs-extra@^2.0.0, fs-extra@^2.1.2: graceful-fs "^4.1.2" jsonfile "^2.1.0" -fs-extra@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^3.0.0" - universalify "^0.1.0" - fs-extra@^4.0.0, fs-extra@^4.0.1, fs-extra@^4.0.2: version "4.0.3" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" @@ -2965,6 +3235,23 @@ fs-temp@^1.0.0: dependencies: random-path "^0.1.0" +fs-vacuum@~1.2.10, fs-vacuum@~1.2.9: + version "1.2.10" + resolved "https://registry.yarnpkg.com/fs-vacuum/-/fs-vacuum-1.2.10.tgz#b7629bec07a4031a2548fdf99f5ecf1cc8b31e36" + dependencies: + graceful-fs "^4.1.2" + path-is-inside "^1.0.1" + rimraf "^2.5.2" + +fs-write-stream-atomic@^1.0.8, fs-write-stream-atomic@~1.0.10, fs-write-stream-atomic@~1.0.8: + version "1.0.10" + resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" + dependencies: + graceful-fs "^4.1.2" + iferr "^0.1.5" + imurmurhash "^0.1.4" + readable-stream "1 || 2" + fs-xattr@^0.1.14: version "0.1.17" resolved "https://registry.yarnpkg.com/fs-xattr/-/fs-xattr-0.1.17.tgz#ee943483c6fe9704a8f0e1476e8145a9886f8b0f" @@ -2983,7 +3270,7 @@ fsevents@^1.0.0: nan "^2.3.0" node-pre-gyp "^0.6.39" -fstream-ignore@^1.0.5: +fstream-ignore@^1.0.0, fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" dependencies: @@ -2991,7 +3278,21 @@ fstream-ignore@^1.0.5: inherits "2" minimatch "^3.0.0" -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: +fstream-npm@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/fstream-npm/-/fstream-npm-1.1.1.tgz#6b9175db6239a83d8209e232426c494dbb29690c" + dependencies: + fstream-ignore "^1.0.0" + inherits "2" + +fstream-npm@~1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/fstream-npm/-/fstream-npm-1.2.1.tgz#08c4a452f789dcbac4c89a4563c902b2c862fd5b" + dependencies: + fstream-ignore "^1.0.0" + inherits "2" + +fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2, fstream@~1.0.10, fstream@~1.0.11: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" dependencies: @@ -3018,6 +3319,20 @@ gauge@~1.2.5: lodash.padend "^4.1.0" lodash.padstart "^4.1.0" +gauge@~2.6.0: + version "2.6.0" + resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.6.0.tgz#d35301ad18e96902b4751dcbbe40f4218b942a46" + dependencies: + aproba "^1.0.3" + console-control-strings "^1.0.0" + has-color "^0.1.7" + has-unicode "^2.0.0" + object-assign "^4.1.0" + signal-exit "^3.0.0" + string-width "^1.0.1" + strip-ansi "^3.0.1" + wide-align "^1.1.0" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -3049,6 +3364,10 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" +genfun@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/genfun/-/genfun-4.0.1.tgz#ed10041f2e4a7f1b0a38466d17a5c3e27df1dfc1" + get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" @@ -3097,10 +3416,34 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +gitbook-cli@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/gitbook-cli/-/gitbook-cli-2.3.2.tgz#5e893582e1f743f6fa920c3c3eb36b62ea4a31a0" + dependencies: + bash-color "0.0.4" + commander "2.11.0" + fs-extra "3.0.1" + lodash "4.17.4" + npm "5.1.0" + npmi "1.0.1" + optimist "0.6.1" + q "1.5.0" + semver "5.3.0" + tmp "0.0.31" + user-home "2.0.0" + github-url-from-git@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" +github-url-from-git@~1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.4.0.tgz#285e6b520819001bde128674704379e4ff03e0de" + +github-url-from-username-repo@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/github-url-from-username-repo/-/github-url-from-username-repo-1.0.2.tgz#7dd79330d2abe69c10c2cef79714c97215791dfa" + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -3136,7 +3479,7 @@ glob@7.1.1: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2: +glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -3164,6 +3507,17 @@ glob@~3.2.6: inherits "2" minimatch "0.3" +glob@~7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.6.tgz#211bafaf49e525b8cd93260d14ab136152b3f57a" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-dirs@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -3239,7 +3593,7 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.11, graceful-fs@~4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -3271,6 +3625,15 @@ har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + har-validator@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" @@ -3291,6 +3654,10 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" +has-color@^0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/has-color/-/has-color-0.1.7.tgz#67144a5260c34fc3cca677d041daf52fe7b78b2f" + has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" @@ -3321,7 +3688,7 @@ has-to-string-tag-x@^1.4.1: dependencies: has-symbol-support-x "^1.4.1" -has-unicode@^2.0.0: +has-unicode@^2.0.0, has-unicode@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" @@ -3411,10 +3778,14 @@ homedir-polyfill@^1.0.0, homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4: +hosted-git-info@^2.1.4, hosted-git-info@^2.1.5, hosted-git-info@^2.4.2, hosted-git-info@~2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" +hosted-git-info@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" + htmlparser2@^3.9.1: version "3.9.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" @@ -3436,6 +3807,17 @@ htmlparser2@~3.8.1: entities "1.0" readable-stream "1.1" +http-cache-semantics@^3.8.0: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + +http-proxy-agent@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + dependencies: + agent-base "4" + debug "3.1.0" + http-signature@~0.10.0: version "0.10.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-0.10.1.tgz#4fbdac132559aa8323121e540779c0a012b27e66" @@ -3460,6 +3842,19 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +https-proxy-agent@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.0.tgz#7fbba856be8cd677986f42ebd3664f6317257887" + dependencies: + agent-base "^4.1.0" + debug "^3.1.0" + +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + dependencies: + ms "^2.0.0" + ice-cap@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" @@ -3467,7 +3862,7 @@ ice-cap@0.0.4: cheerio "0.20.0" color-logger "0.0.3" -iconv-lite@^0.4.17: +iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" @@ -3475,6 +3870,10 @@ ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" +iferr@^0.1.5, iferr@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz#c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501" + ignore-by-default@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" @@ -3495,7 +3894,7 @@ imul@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" -imurmurhash@^0.1.4: +imurmurhash@*, imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -3509,7 +3908,7 @@ infinity-x@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/infinity-x/-/infinity-x-1.0.0.tgz#cea2d75181d820961b0f72d78e7c4e06fdd55a07" -inflight@^1.0.4: +inflight@^1.0.4, inflight@~1.0.4, inflight@~1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" dependencies: @@ -3520,10 +3919,36 @@ inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.1, version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" -ini@^1.3.4, ini@~1.3.0: +ini@^1.3.4, ini@~1.3.0, ini@~1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" +init-package-json@~1.10.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.10.1.tgz#cd873a167796befb99612b28762a0b6393fd8f6a" + dependencies: + glob "^7.1.1" + npm-package-arg "^4.0.0 || ^5.0.0" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "1 || 2" + semver "2.x || 3.x || 4 || 5" + validate-npm-package-license "^3.0.1" + validate-npm-package-name "^3.0.0" + +init-package-json@~1.9.4: + version "1.9.6" + resolved "https://registry.yarnpkg.com/init-package-json/-/init-package-json-1.9.6.tgz#789fc2b74466a4952b9ea77c0575bc78ebd60a61" + dependencies: + glob "^7.1.1" + npm-package-arg "^4.0.0 || ^5.0.0" + promzard "^0.3.0" + read "~1.0.1" + read-package-json "1 || 2" + semver "2.x || 3.x || 4 || 5" + validate-npm-package-license "^3.0.1" + validate-npm-package-name "^3.0.0" + inquirer@1.2.3, inquirer@^1.0.2: version "1.2.3" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.2.3.tgz#4dec6f32f37ef7bb0b2ed3f1d1a5c3f545074918" @@ -3612,6 +4037,10 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +ip@^1.1.4: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" @@ -3799,7 +4228,7 @@ is-my-ip-valid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" -is-my-json-valid@^2.10.0, is-my-json-valid@^2.13.1: +is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4, is-my-json-valid@^2.13.1: version "2.17.2" resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c" dependencies: @@ -4075,6 +4504,10 @@ jsesc@~0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" +json-parse-better-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" + json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" @@ -4119,6 +4552,10 @@ jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + jsonpointer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" @@ -4184,6 +4621,10 @@ lazy-cache@^2.0.2: dependencies: set-getter "^0.1.0" +lazy-property@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazy-property/-/lazy-property-1.0.0.tgz#84ddc4b370679ba8bd4cdcfa4c06b43d57111147" + lazystream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-0.1.0.tgz#1b25d63c772a4c20f0a5ed0a9d77f484b6e16920" @@ -4233,23 +4674,68 @@ locate-path@^2.0.0: p-locate "^2.0.0" path-exists "^3.0.0" -lodash._reinterpolate@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" +lockfile@~1.0.1, lockfile@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79" -lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" +lodash._baseindexof@*: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" -lodash.assignin@^4.0.9: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" +lodash._baseuniq@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" + dependencies: + lodash._createset "~4.0.0" + lodash._root "~3.0.0" -lodash.bind@^4.1.4: - version "4.2.1" - resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" +lodash._bindcallback@*: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" -lodash.cond@^4.3.0: +lodash._cacheindexof@*: + version "3.0.2" + resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" + +lodash._createcache@*: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" + dependencies: + lodash._getnative "^3.0.0" + +lodash._createset@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" + +lodash._getnative@*, lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._root@~3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + +lodash.assignin@^4.0.9: + version "4.2.0" + resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2" + +lodash.bind@^4.1.4: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + +lodash.clonedeep@~4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + +lodash.cond@^4.3.0: version "4.5.2" resolved "https://registry.yarnpkg.com/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" @@ -4337,6 +4823,10 @@ lodash.reject@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" +lodash.restparam@*: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + lodash.some@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" @@ -4358,14 +4848,26 @@ lodash.templatesettings@^4.0.0: dependencies: lodash._reinterpolate "~3.0.0" -lodash.uniq@^4.5.0: +lodash.union@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + +lodash.uniq@^4.5.0, lodash.uniq@~4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" +lodash.without@~4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" + lodash@4.17.2: version "4.17.2" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.2.tgz#34a3055babe04ce42467b607d700072c7ff6bf42" +lodash@4.17.4: + version "4.17.4" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" + lodash@^4.0.0, lodash@^4.1.0, lodash@^4.13.0, lodash@^4.14.0, lodash@^4.16.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" @@ -4415,13 +4917,20 @@ lru-cache@2: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" -lru-cache@^4.0.0, lru-cache@^4.0.1: +lru-cache@^4.0.0, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@~4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@~4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" + dependencies: + pseudomap "^1.0.1" + yallist "^2.0.0" + macos-alias@~0.2.5: version "0.2.11" resolved "https://registry.yarnpkg.com/macos-alias/-/macos-alias-0.2.11.tgz#feeea6c13ba119814a43fc43c470b31e59ef718a" @@ -4434,6 +4943,22 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +make-fetch-happen@^2.4.13: + version "2.6.0" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-2.6.0.tgz#8474aa52198f6b1ae4f3094c04e8370d35ea8a38" + dependencies: + agentkeepalive "^3.3.0" + cacache "^10.0.0" + http-cache-semantics "^3.8.0" + http-proxy-agent "^2.0.0" + https-proxy-agent "^2.1.0" + lru-cache "^4.1.1" + mississippi "^1.2.0" + node-fetch-npm "^2.0.2" + promise-retry "^1.1.1" + socks-proxy-agent "^3.0.1" + ssri "^5.0.0" + map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" @@ -4558,6 +5083,16 @@ mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@^2.1.11: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + mime-types@^2.1.12, mime-types@^2.1.17, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" @@ -4583,7 +5118,7 @@ minimatch@0.3: lru-cache "2" sigmund "~1.0.0" -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.3: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: @@ -4601,6 +5136,36 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" +mississippi@^1.2.0, mississippi@^1.3.0, mississippi@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-1.3.1.tgz#2a8bb465e86550ac8b36a7b6f45599171d78671e" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^1.0.0" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + +mississippi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" + dependencies: + concat-stream "^1.5.0" + duplexify "^3.4.2" + end-of-stream "^1.1.0" + flush-write-stream "^1.0.0" + from2 "^2.1.0" + parallel-transform "^1.1.0" + pump "^2.0.1" + pumpify "^1.3.3" + stream-each "^1.1.0" + through2 "^2.0.0" + mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" @@ -4614,7 +5179,7 @@ mkdirp@0.5.0: dependencies: minimist "0.0.8" -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0, mkdirp@~0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -4651,10 +5216,25 @@ module-not-found-error@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/module-not-found-error/-/module-not-found-error-1.0.1.tgz#cf8b4ff4f29640674d6cdd02b0e3bc523c2bbdc0" +move-concurrently@^1.0.1, move-concurrently@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" + dependencies: + aproba "^1.1.1" + copy-concurrently "^1.0.0" + fs-write-stream-atomic "^1.0.8" + mkdirp "^0.5.1" + rimraf "^2.5.4" + run-queue "^1.0.3" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +ms@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + multiline@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/multiline/-/multiline-1.0.2.tgz#69b1f25ff074d2828904f244ddd06b7d96ef6c93" @@ -4677,7 +5257,7 @@ mute-stream@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.6.tgz#48962b19e169fd1dfc240b3f1e7317627bbc47db" -mute-stream@0.0.7: +mute-stream@0.0.7, mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -4747,11 +5327,19 @@ node-abi@^2.0.0: dependencies: semver "^5.4.1" +node-fetch-npm@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" + dependencies: + encoding "^0.1.11" + json-parse-better-errors "^1.0.0" + safe-buffer "^5.1.1" + node-fetch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.0.0.tgz#982bba43ecd4f2922a29cc186a6bbb0bb73fcba6" -node-gyp@^3.4.0, node-gyp@^3.6.0: +node-gyp@^3.4.0, node-gyp@^3.6.0, node-gyp@~3.6.0, node-gyp@~3.6.2: version "3.6.2" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" dependencies: @@ -4789,7 +5377,7 @@ node-pre-gyp@^0.6.39: tar "^2.2.1" tar-pack "^3.4.0" -node-uuid@~1.4.0: +node-uuid@~1.4.0, node-uuid@~1.4.7: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" @@ -4814,13 +5402,13 @@ nodemon@^1.11.0: undefsafe "^2.0.1" update-notifier "^2.3.0" -"nopt@2 || 3", nopt@^3.0.1: +"nopt@2 || 3", nopt@^3.0.1, nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" dependencies: abbrev "1" -nopt@^4.0.1: +nopt@^4.0.1, nopt@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" dependencies: @@ -4833,7 +5421,11 @@ nopt@~1.0.10: dependencies: abbrev "1" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: +normalize-git-url@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/normalize-git-url/-/normalize-git-url-3.0.2.tgz#8e5f14be0bdaedb73e07200310aa416c27350fc4" + +normalize-package-data@^2.0.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0, "normalize-package-data@~1.0.1 || ^2.0.0", normalize-package-data@~2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" dependencies: @@ -4842,6 +5434,15 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" +normalize-package-data@~2.3.5: + version "2.3.8" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" @@ -4856,6 +5457,86 @@ normalize-space-x@^3.0.0: trim-x "^3.0.0" white-space-x "^3.0.0" +npm-cache-filename@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/npm-cache-filename/-/npm-cache-filename-1.0.2.tgz#ded306c5b0bfc870a9e9faf823bc5f283e05ae11" + +npm-install-checks@~1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-1.0.7.tgz#6d91aeda0ac96801f1ed7aadee116a6c0a086a57" + dependencies: + npmlog "0.1 || 1 || 2" + semver "^2.3.0 || 3.x || 4 || 5" + +npm-install-checks@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/npm-install-checks/-/npm-install-checks-3.0.0.tgz#d4aecdfd51a53e3723b7b2f93b2ee28e307bc0d7" + dependencies: + semver "^2.3.0 || 3.x || 4 || 5" + +"npm-package-arg@^3.0.0 || ^4.0.0", npm-package-arg@^4.1.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.2.1.tgz#593303fdea85f7c422775f17f9eb7670f680e3ec" + dependencies: + hosted-git-info "^2.1.5" + semver "^5.1.0" + +"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0", "npm-package-arg@^4.0.0 || ^5.0.0", npm-package-arg@^5.1.2, npm-package-arg@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-5.1.2.tgz#fb18d17bb61e60900d6312619919bd753755ab37" + dependencies: + hosted-git-info "^2.4.2" + osenv "^0.1.4" + semver "^5.1.0" + validate-npm-package-name "^3.0.0" + +npm-package-arg@~4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-4.1.1.tgz#86d9dca985b4c5e5d59772dfd5de6919998a495a" + dependencies: + hosted-git-info "^2.1.4" + semver "4 || 5" + +npm-pick-manifest@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-1.0.4.tgz#a5ee6510c1fe7221c0bc0414e70924c14045f7e8" + dependencies: + npm-package-arg "^5.1.2" + semver "^5.3.0" + +npm-registry-client@~7.2.1: + version "7.2.1" + resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-7.2.1.tgz#c792266b088cc313f8525e7e35248626c723db75" + dependencies: + concat-stream "^1.5.2" + graceful-fs "^4.1.6" + normalize-package-data "~1.0.1 || ^2.0.0" + npm-package-arg "^3.0.0 || ^4.0.0" + once "^1.3.3" + request "^2.74.0" + retry "^0.10.0" + semver "2 >=2.2.1 || 3.x || 4 || 5" + slide "^1.1.3" + optionalDependencies: + npmlog "~2.0.0 || ~3.1.0" + +npm-registry-client@~8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.4.0.tgz#d52b901685647fc62a4c03eafecb6ceaa5018d4c" + dependencies: + concat-stream "^1.5.2" + graceful-fs "^4.1.6" + normalize-package-data "~1.0.1 || ^2.0.0" + npm-package-arg "^3.0.0 || ^4.0.0 || ^5.0.0" + once "^1.3.3" + request "^2.74.0" + retry "^0.10.0" + semver "2 >=2.2.1 || 3.x || 4 || 5" + slide "^1.1.3" + ssri "^4.1.2" + optionalDependencies: + npmlog "2 || ^3.1.0 || ^4.0.0" + npm-run-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" @@ -4868,7 +5549,187 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.2: +npm-user-validate@~0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-0.1.5.tgz#52465d50c2d20294a57125b996baedbf56c5004b" + +npm-user-validate@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-1.0.0.tgz#8ceca0f5cea04d4e93519ef72d0557a75122e951" + +npm@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/npm/-/npm-5.1.0.tgz#cf8201e044018e9c89532041c90094541982b2c0" + dependencies: + JSONStream "~1.3.1" + abbrev "~1.1.0" + ansi-regex "~3.0.0" + ansicolors "~0.3.2" + ansistyles "~0.1.3" + aproba "~1.1.2" + archy "~1.0.0" + bluebird "~3.5.0" + cacache "~9.2.9" + call-limit "~1.1.0" + chownr "~1.0.1" + cmd-shim "~2.0.2" + columnify "~1.5.4" + config-chain "~1.1.11" + detect-indent "~5.0.0" + dezalgo "~1.0.3" + editor "~1.0.0" + fs-vacuum "~1.2.10" + fs-write-stream-atomic "~1.0.10" + fstream "~1.0.11" + fstream-npm "~1.2.1" + glob "~7.1.2" + graceful-fs "~4.1.11" + has-unicode "~2.0.1" + hosted-git-info "~2.5.0" + iferr "~0.1.5" + inflight "~1.0.6" + inherits "~2.0.3" + ini "~1.3.4" + init-package-json "~1.10.1" + lazy-property "~1.0.0" + lockfile "~1.0.3" + lodash._baseuniq "~4.6.0" + lodash.clonedeep "~4.5.0" + lodash.union "~4.6.0" + lodash.uniq "~4.5.0" + lodash.without "~4.4.0" + lru-cache "~4.1.1" + mississippi "~1.3.0" + mkdirp "~0.5.1" + move-concurrently "~1.0.1" + node-gyp "~3.6.2" + nopt "~4.0.1" + normalize-package-data "~2.4.0" + npm-cache-filename "~1.0.2" + npm-install-checks "~3.0.0" + npm-package-arg "~5.1.2" + npm-registry-client "~8.4.0" + npm-user-validate "~1.0.0" + npmlog "~4.1.2" + once "~1.4.0" + opener "~1.4.3" + osenv "~0.1.4" + pacote "~2.7.38" + path-is-inside "~1.0.2" + promise-inflight "~1.0.1" + read "~1.0.7" + read-cmd-shim "~1.0.1" + read-installed "~4.0.3" + read-package-json "~2.0.9" + read-package-tree "~5.1.6" + readable-stream "~2.3.2" + request "~2.81.0" + retry "~0.10.1" + rimraf "~2.6.1" + safe-buffer "~5.1.1" + semver "~5.3.0" + sha "~2.0.1" + slide "~1.1.6" + sorted-object "~2.0.1" + sorted-union-stream "~2.1.3" + ssri "~4.1.6" + strip-ansi "~4.0.0" + tar "~2.2.1" + text-table "~0.2.0" + uid-number "0.0.6" + umask "~1.1.0" + unique-filename "~1.1.0" + unpipe "~1.0.0" + update-notifier "~2.2.0" + uuid "~3.1.0" + validate-npm-package-name "~3.0.0" + which "~1.2.14" + worker-farm "~1.3.1" + wrappy "~1.0.2" + write-file-atomic "~2.1.0" + +npm@^2.1.12: + version "2.15.12" + resolved "https://registry.yarnpkg.com/npm/-/npm-2.15.12.tgz#df7c3ed5a277c3f9d4b5d819b05311d10a200ae6" + dependencies: + abbrev "~1.0.9" + ansi "~0.3.1" + ansicolors "~0.3.2" + ansistyles "~0.1.3" + archy "~1.0.0" + async-some "~1.0.2" + block-stream "0.0.9" + char-spinner "~1.0.1" + chmodr "~1.0.2" + chownr "~1.0.1" + cmd-shim "~2.0.2" + columnify "~1.5.4" + config-chain "~1.1.10" + dezalgo "~1.0.3" + editor "~1.0.0" + fs-vacuum "~1.2.9" + fs-write-stream-atomic "~1.0.8" + fstream "~1.0.10" + fstream-npm "~1.1.1" + github-url-from-git "~1.4.0" + github-url-from-username-repo "~1.0.2" + glob "~7.0.6" + graceful-fs "~4.1.6" + hosted-git-info "~2.1.5" + inflight "~1.0.4" + inherits "~2.0.3" + ini "~1.3.4" + init-package-json "~1.9.4" + lockfile "~1.0.1" + lru-cache "~4.0.1" + minimatch "~3.0.3" + mkdirp "~0.5.1" + node-gyp "~3.6.0" + nopt "~3.0.6" + normalize-git-url "~3.0.2" + normalize-package-data "~2.3.5" + npm-cache-filename "~1.0.2" + npm-install-checks "~1.0.7" + npm-package-arg "~4.1.0" + npm-registry-client "~7.2.1" + npm-user-validate "~0.1.5" + npmlog "~2.0.4" + once "~1.4.0" + opener "~1.4.1" + osenv "~0.1.3" + path-is-inside "~1.0.0" + read "~1.0.7" + read-installed "~4.0.3" + read-package-json "~2.0.4" + readable-stream "~2.1.5" + realize-package-specifier "~3.0.1" + request "~2.74.0" + retry "~0.10.0" + rimraf "~2.5.4" + semver "~5.1.0" + sha "~2.0.1" + slide "~1.1.6" + sorted-object "~2.0.0" + spdx-license-ids "~1.2.2" + strip-ansi "~3.0.1" + tar "~2.2.1" + text-table "~0.2.0" + uid-number "0.0.6" + umask "~1.1.0" + validate-npm-package-license "~3.0.1" + validate-npm-package-name "~2.2.2" + which "~1.2.11" + wrappy "~1.0.2" + write-file-atomic "~1.1.4" + +npmi@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/npmi/-/npmi-1.0.1.tgz#15d769273547545e6809dcf0ce18aed48b0290e2" + dependencies: + npm "^2.1.12" + semver "^4.1.0" + +"npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.2, npmlog@~4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -4877,7 +5738,7 @@ npm-run-path@^2.0.0: gauge "~2.7.3" set-blocking "~2.0.0" -npmlog@^2.0.3: +"npmlog@0.1 || 1 || 2", npmlog@^2.0.3, npmlog@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" dependencies: @@ -4885,6 +5746,15 @@ npmlog@^2.0.3: are-we-there-yet "~1.1.2" gauge "~1.2.5" +"npmlog@~2.0.0 || ~3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-3.1.2.tgz#2d46fa874337af9498a2f12bb43d8d0be4a36873" + dependencies: + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" + gauge "~2.6.0" + set-blocking "~2.0.0" + nth-check@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.1.tgz#9929acdf628fc2c41098deab82ac580cf149aae4" @@ -5001,7 +5871,7 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -once@^1.3.0, once@^1.3.3, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0, once@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -5017,13 +5887,17 @@ onetime@^2.0.0: dependencies: mimic-fn "^1.0.0" +opener@~1.4.1, opener@~1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.4.3.tgz#5c6da2c5d7e5831e8ffa3964950f8d6674ac90b8" + opn@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" dependencies: is-wsl "^1.1.0" -optimist@^0.6.1: +optimist@0.6.1, optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" dependencies: @@ -5076,7 +5950,7 @@ os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" -osenv@0, osenv@^0.1.4: +osenv@0, osenv@^0.1.4, osenv@~0.1.3, osenv@~0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" dependencies: @@ -5120,12 +5994,46 @@ package-json@^4.0.0: registry-url "^3.0.3" semver "^5.1.0" +pacote@~2.7.38: + version "2.7.38" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-2.7.38.tgz#5091f8774298c26c3eca24606037f1bb73db74c1" + dependencies: + bluebird "^3.5.0" + cacache "^9.2.9" + glob "^7.1.2" + lru-cache "^4.1.1" + make-fetch-happen "^2.4.13" + minimatch "^3.0.4" + mississippi "^1.2.0" + normalize-package-data "^2.4.0" + npm-package-arg "^5.1.2" + npm-pick-manifest "^1.0.4" + osenv "^0.1.4" + promise-inflight "^1.0.1" + promise-retry "^1.1.1" + protoduck "^4.0.0" + safe-buffer "^5.1.1" + semver "^5.3.0" + ssri "^4.1.6" + tar-fs "^1.15.3" + tar-stream "^1.5.4" + unique-filename "^1.1.0" + which "^1.2.12" + pad-right@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/pad-right/-/pad-right-0.2.2.tgz#6fbc924045d244f2a2a244503060d3bfc6009774" dependencies: repeat-string "^1.5.2" +parallel-transform@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.1.0.tgz#d410f065b05da23081fcd10f28854c29bda33b06" + dependencies: + cyclist "~0.2.2" + inherits "^2.0.3" + readable-stream "^2.1.5" + parse-author@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/parse-author/-/parse-author-2.0.0.tgz#d3460bf1ddd0dfaeed42da754242e65fb684a81f" @@ -5192,7 +6100,7 @@ path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" -path-is-inside@^1.0.1: +path-is-inside@^1.0.1, path-is-inside@~1.0.0, path-is-inside@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" @@ -5339,6 +6247,10 @@ private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" +process-nextick-args@~1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" @@ -5354,12 +6266,29 @@ progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" +promise-inflight@^1.0.1, promise-inflight@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" + +promise-retry@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + dependencies: + err-code "^1.0.0" + retry "^0.10.0" + promise@~1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/promise/-/promise-1.3.0.tgz#e5cc9a4c8278e4664ffedc01c7da84842b040175" dependencies: is-promise "~1" +promzard@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" + dependencies: + read "1" + property-is-enumerable-x@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/property-is-enumerable-x/-/property-is-enumerable-x-1.1.0.tgz#7ca48917476cd0914b37809bfd05776a0d942f6f" @@ -5367,6 +6296,16 @@ property-is-enumerable-x@^1.1.0: to-object-x "^1.4.1" to-property-key-x "^2.0.1" +proto-list@~1.2.1: + version "1.2.4" + resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849" + +protoduck@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-4.0.0.tgz#fe4874d8c7913366cfd9ead12453a22cd3657f8e" + dependencies: + genfun "^4.0.1" + proxyquire@^1.7.10: version "1.8.0" resolved "https://registry.yarnpkg.com/proxyquire/-/proxyquire-1.8.0.tgz#02d514a5bed986f04cbb2093af16741535f79edc" @@ -5375,6 +6314,10 @@ proxyquire@^1.7.10: module-not-found-error "^1.0.0" resolve "~1.1.7" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" + pruner@^0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/pruner/-/pruner-0.0.7.tgz#345fbcb3e80701163a1d7adf56bac229a5a1e4c1" @@ -5387,7 +6330,7 @@ ps-tree@^1.1.0: dependencies: event-stream "~3.3.0" -pseudomap@^1.0.2: +pseudomap@^1.0.1, pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -5397,6 +6340,28 @@ pstree.remy@^1.1.0: dependencies: ps-tree "^1.1.0" +pump@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pump@^2.0.0, pump@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: + version "1.4.0" + resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.4.0.tgz#80b7c5df7e24153d03f0e7ac8a05a5d068bd07fb" + dependencies: + duplexify "^3.5.3" + inherits "^2.0.3" + pump "^2.0.0" + punycode@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d" @@ -5405,6 +6370,10 @@ punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" +q@1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" + q@^1.1.2: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -5413,6 +6382,10 @@ qs@~1.2.0: version "1.2.2" resolved "https://registry.yarnpkg.com/qs/-/qs-1.2.2.tgz#19b57ff24dc2a99ce1f8bdf6afcda59f8ef61f88" +qs@~6.2.0: + version "6.2.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" + qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" @@ -5456,6 +6429,46 @@ rcedit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/rcedit/-/rcedit-1.0.0.tgz#43309ecbc8814f3582fca6b751748cfad66a16a2" +read-cmd-shim@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" + dependencies: + graceful-fs "^4.1.2" + +read-installed@~4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/read-installed/-/read-installed-4.0.3.tgz#ff9b8b67f187d1e4c29b9feb31f6b223acd19067" + dependencies: + debuglog "^1.0.1" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + semver "2 || 3 || 4 || 5" + slide "~1.1.3" + util-extend "^1.0.1" + optionalDependencies: + graceful-fs "^4.1.2" + +"read-package-json@1 || 2", read-package-json@^2.0.0, read-package-json@~2.0.4, read-package-json@~2.0.9: + version "2.0.12" + resolved "https://registry.yarnpkg.com/read-package-json/-/read-package-json-2.0.12.tgz#68ea45f98b3741cb6e10ae3bbd42a605026a6951" + dependencies: + glob "^7.1.1" + json-parse-better-errors "^1.0.0" + normalize-package-data "^2.0.0" + slash "^1.0.0" + optionalDependencies: + graceful-fs "^4.1.2" + +read-package-tree@~5.1.6: + version "5.1.6" + resolved "https://registry.yarnpkg.com/read-package-tree/-/read-package-tree-5.1.6.tgz#4f03e83d0486856fb60d97c94882841c2a7b1b7a" + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + once "^1.3.0" + read-package-json "^2.0.0" + readdir-scoped-modules "^1.0.0" + read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" @@ -5486,6 +6499,24 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" +read@1, read@~1.0.1, read@~1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + dependencies: + mute-stream "~0.0.4" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@~2.3.2: + version "2.3.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + readable-stream@1.1: version "1.1.13" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.13.tgz#f6eef764f514c89e2b9e23146a75ba106756d23e" @@ -5495,7 +6526,7 @@ readable-stream@1.1: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^1.0.27-1, readable-stream@^1.1.8, readable-stream@~1.1.9: +readable-stream@^1.0.27-1, readable-stream@^1.1.8, readable-stream@~1.1.10, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" dependencies: @@ -5525,6 +6556,38 @@ readable-stream@~1.0.2, readable-stream@~1.0.24, readable-stream@~1.0.26: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@~2.0.5: + version "2.0.6" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.0.6.tgz#8f90341e68a53ccc928788dacfcd11b36eb9b78e" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readable-stream@~2.1.5: + version "2.1.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.1.5.tgz#66fa8b720e1438b364681f2ad1a63c618448c9d0" + dependencies: + buffer-shims "^1.0.0" + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "~1.0.0" + process-nextick-args "~1.0.6" + string_decoder "~0.10.x" + util-deprecate "~1.0.1" + +readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" + dependencies: + debuglog "^1.0.1" + dezalgo "^1.0.0" + graceful-fs "^4.1.2" + once "^1.3.0" + readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" @@ -5542,6 +6605,13 @@ readline2@^1.0.1: is-fullwidth-code-point "^1.0.0" mute-stream "0.0.5" +realize-package-specifier@~3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/realize-package-specifier/-/realize-package-specifier-3.0.3.tgz#d0def882952b8de3f67eba5e91199661271f41f4" + dependencies: + dezalgo "^1.0.1" + npm-package-arg "^4.1.1" + rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -5652,7 +6722,7 @@ replace-comments-x@^2.0.0: require-coercible-to-string-x "^1.0.0" to-string-x "^1.4.2" -request@2, request@^2.45.0, request@^2.55.0, request@^2.79.0: +request@2, request@^2.45.0, request@^2.55.0, request@^2.74.0, request@^2.79.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" dependencies: @@ -5700,7 +6770,7 @@ request@2.42.0: stringstream "~0.0.4" tough-cookie ">=0.12.0" -request@2.81.0: +request@2.81.0, request@~2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -5727,6 +6797,32 @@ request@2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" +request@~2.74.0: + version "2.74.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + bl "~1.1.2" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~1.0.0-rc4" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + node-uuid "~1.4.7" + oauth-sign "~0.8.1" + qs "~6.2.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + require-coercible-to-string-x@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/require-coercible-to-string-x/-/require-coercible-to-string-x-1.0.0.tgz#367b3e9ca67e00324c411b0b498453a74cd5569e" @@ -5817,6 +6913,10 @@ resumer@~0.0.0: dependencies: through "~2.3.4" +retry@^0.10.0, retry@~0.10.0, retry@~0.10.1: + version "0.10.1" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.10.1.tgz#e76388d217992c252750241d3d3956fed98d8ff4" + right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" @@ -5827,7 +6927,7 @@ right-pad@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/right-pad/-/right-pad-1.0.1.tgz#8ca08c2cbb5b55e74dafa96bf7fd1a27d568c8d0" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@~2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -5837,6 +6937,12 @@ rimraf@~2.2.6, rimraf@~2.2.8: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" +rimraf@~2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" + dependencies: + glob "^7.0.5" + run-async@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" @@ -5849,6 +6955,12 @@ run-async@^2.2.0: dependencies: is-promise "^2.1.0" +run-queue@^1.0.0, run-queue@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz#e848396f057d223f24386924618e25694161ec47" + dependencies: + aproba "^1.1.1" + rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" @@ -5887,7 +6999,7 @@ s3@^4.4.0: rimraf "~2.2.8" streamsink "~1.2.0" -safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -5919,17 +7031,25 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: +"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver@5.3.0, semver@~5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + +semver@^4.1.0: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + semver@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/semver/-/semver-2.2.1.tgz#7941182b3ffcc580bff1c17942acdf7951c0d213" -semver@~5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" +semver@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" @@ -5963,6 +7083,13 @@ set-value@^2.0.0: is-plain-object "^2.0.3" split-string "^3.0.1" +sha@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sha/-/sha-2.0.1.tgz#6030822fbd2c9823949f8f72ed6411ee5cf25aae" + dependencies: + graceful-fs "^4.1.2" + readable-stream "^2.0.2" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -6023,10 +7150,14 @@ slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" -slide@^1.1.5: +slide@^1.1.3, slide@^1.1.5, slide@~1.1.3, slide@~1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" +smart-buffer@^1.0.13: + version "1.1.15" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-1.1.15.tgz#7f114b5b65fab3e2a35aa775bb12f0d1c649bf16" + snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -6072,6 +7203,31 @@ sntp@2.x.x: dependencies: hoek "4.x.x" +socks-proxy-agent@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-3.0.1.tgz#2eae7cf8e2a82d34565761539a7f9718c5617659" + dependencies: + agent-base "^4.1.0" + socks "^1.1.10" + +socks@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/socks/-/socks-1.1.10.tgz#5b8b7fc7c8f341c53ed056e929b7bf4de8ba7b5a" + dependencies: + ip "^1.1.4" + smart-buffer "^1.0.13" + +sorted-object@~2.0.0, sorted-object@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/sorted-object/-/sorted-object-2.0.1.tgz#7d631f4bd3a798a24af1dffcfbfe83337a5df5fc" + +sorted-union-stream@~2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/sorted-union-stream/-/sorted-union-stream-2.1.3.tgz#c7794c7e077880052ff71a8d4a2dbb4a9a638ac7" + dependencies: + from2 "^1.3.0" + stream-iterate "^1.1.0" + source-map-resolve@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" @@ -6132,20 +7288,42 @@ spawn-wrap@^1.4.2: signal-exit "^3.0.2" which "^1.3.0" +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + spdx-correct@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" dependencies: spdx-license-ids "^1.0.2" +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" + +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + spdx-expression-parse@~1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" -spdx-license-ids@^1.0.2: +spdx-license-ids@^1.0.2, spdx-license-ids@~1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +spdx-license-ids@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" + speedometer@~0.1.2: version "0.1.4" resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-0.1.4.tgz#9876dbd2a169d3115402d48e6ea6329c8816a50d" @@ -6186,6 +7364,18 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" +ssri@^4.1.2, ssri@^4.1.6, ssri@~4.1.6: + version "4.1.6" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-4.1.6.tgz#0cb49b6ac84457e7bdd466cb730c3cb623e9a25b" + dependencies: + safe-buffer "^5.1.0" + +ssri@^5.0.0, ssri@^5.2.4: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.2.4.tgz#9985e14041e65fc397af96542be35724ac11da52" + dependencies: + safe-buffer "^5.1.1" + stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" @@ -6207,6 +7397,24 @@ stream-combiner@~0.0.2, stream-combiner@~0.0.4: dependencies: duplexer "~0.1.1" +stream-each@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.2.tgz#8e8c463f91da8991778765873fe4d960d8f616bd" + dependencies: + end-of-stream "^1.1.0" + stream-shift "^1.0.0" + +stream-iterate@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/stream-iterate/-/stream-iterate-1.2.0.tgz#2bd7c77296c1702a46488b8ad41f79865eecd4e1" + dependencies: + readable-stream "^2.1.5" + stream-shift "^1.0.0" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + streamsink@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/streamsink/-/streamsink-1.2.0.tgz#efafee9f1e22d3591ed7de3dcaa95c3f5e79f73c" @@ -6240,13 +7448,13 @@ stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" -strip-ansi@^3.0.0, strip-ansi@^3.0.1: +strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" dependencies: ansi-regex "^2.0.0" -strip-ansi@^4.0.0: +strip-ansi@^4.0.0, strip-ansi@~4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" dependencies: @@ -6357,6 +7565,15 @@ tape@2.3.0: stream-combiner "~0.0.2" through "~2.3.4" +tar-fs@^1.15.3: + version "1.16.0" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.0.tgz#e877a25acbcc51d8c790da1c57c9cf439817b896" + dependencies: + chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" + tar-pack@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" @@ -6370,6 +7587,15 @@ tar-pack@^3.4.0: tar "^2.2.1" uid-number "^0.0.6" +tar-stream@^1.1.2, tar-stream@^1.5.4: + version "1.5.5" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55" + dependencies: + bl "^1.0.0" + end-of-stream "^1.0.0" + readable-stream "^2.0.0" + xtend "^4.0.0" + tar-stream@~0.4.0: version "0.4.7" resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-0.4.7.tgz#1f1d2ce9ebc7b42765243ca0e8f1b7bfda0aadcd" @@ -6379,7 +7605,7 @@ tar-stream@~0.4.0: readable-stream "^1.0.27-1" xtend "^4.0.0" -tar@^2.0.0, tar@^2.2.1: +tar@^2.0.0, tar@^2.2.1, tar@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" dependencies: @@ -6434,6 +7660,13 @@ throttleit@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-0.0.2.tgz#cfedf88e60c00dd9697b61fdd2a8343a9b680eaf" +through2@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + through2@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/through2/-/through2-0.2.3.tgz#eb3284da4ea311b6cc8ace3653748a52abf25a3f" @@ -6441,7 +7674,7 @@ through2@~0.2.3: readable-stream "~1.1.9" xtend "~2.1.1" -through@2, through@^2.3.6, through@~2.3, through@~2.3.1, through@~2.3.4: +through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3, through@~2.3.1, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -6468,6 +7701,12 @@ tmp@0.0.29, tmp@^0.0.29: dependencies: os-tmpdir "~1.0.1" +tmp@0.0.31: + version "0.0.31" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" + dependencies: + os-tmpdir "~1.0.1" + tmp@0.0.33, tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -6650,7 +7889,7 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" -tunnel-agent@~0.4.0: +tunnel-agent@~0.4.0, tunnel-agent@~0.4.1: version "0.4.3" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" @@ -6685,10 +7924,14 @@ uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" -uid-number@^0.0.6: +uid-number@0.0.6, uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" +umask@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" + undefsafe@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.2.tgz#225f6b9e0337663e0d8e7cfd686fc2836ccace76" @@ -6723,6 +7966,18 @@ union-value@^1.0.0: is-extendable "^0.1.1" set-value "^0.4.3" +unique-filename@^1.1.0, unique-filename@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.0.tgz#d05f2fe4032560871f30e93cbe735eea201514f3" + dependencies: + unique-slug "^2.0.0" + +unique-slug@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.0.tgz#db6676e7c7cc0629878ff196097c78855ae9f4ab" + dependencies: + imurmurhash "^0.1.4" + unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -6737,6 +7992,10 @@ unorm@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/unorm/-/unorm-1.4.1.tgz#364200d5f13646ca8bcd44490271335614792300" +unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -6771,6 +8030,19 @@ update-notifier@^2.3.0: semver-diff "^2.0.0" xdg-basedir "^3.0.0" +update-notifier@~2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.2.0.tgz#1b5837cf90c0736d88627732b661c138f86de72f" + dependencies: + boxen "^1.0.0" + chalk "^1.0.0" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" @@ -6806,16 +8078,16 @@ use@^2.0.0: isobject "^3.0.0" lazy-cache "^2.0.2" -user-home@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" - -user-home@^2.0.0: +user-home@2.0.0, user-home@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" dependencies: os-homedir "^1.0.0" +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + username@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/username/-/username-3.0.0.tgz#b3dba982a72b4ce59d52f159fa1aeba266af5fc8" @@ -6831,7 +8103,11 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -uuid@3.1.0: +util-extend@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" + +uuid@3.1.0, uuid@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" @@ -6839,6 +8115,13 @@ uuid@^3.0.0, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" +validate-npm-package-license@*, validate-npm-package-license@~3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" @@ -6846,6 +8129,18 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" +validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" + dependencies: + builtins "^1.0.3" + +validate-npm-package-name@~2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-2.2.2.tgz#f65695b22f7324442019a3c7fa39a6e7fd299085" + dependencies: + builtins "0.0.7" + validate.io-undefined@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/validate.io-undefined/-/validate.io-undefined-1.0.3.tgz#7e27fcbb315b841e78243431897671929e20b7f4" @@ -6858,6 +8153,12 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" +wcwidth@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + dependencies: + defaults "^1.0.3" + webidl-conversions@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" @@ -6882,6 +8183,12 @@ which@1, which@^1.2.12, which@^1.2.14, which@^1.2.8, which@^1.2.9, which@^1.3.0: dependencies: isexe "^2.0.0" +which@~1.2.11, which@~1.2.14: + version "1.2.14" + resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" + dependencies: + isexe "^2.0.0" + white-space-x@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/white-space-x/-/white-space-x-3.0.0.tgz#c8e31ed4fecf4f3feebe6532e6046008a666a3e1" @@ -6934,6 +8241,13 @@ wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" +worker-farm@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.3.1.tgz#4333112bb49b17aa050b87895ca6b2cacf40e5ff" + dependencies: + errno ">=0.1.1 <0.2.0-0" + xtend ">=4.0.0 <4.1.0-0" + wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" @@ -6941,7 +8255,7 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" -wrappy@1: +wrappy@1, wrappy@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -6965,6 +8279,22 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-1.1.4.tgz#b1f52dc2e8dc0e3cb04d187a25f758a38a90ca3b" + dependencies: + graceful-fs "^4.1.2" + imurmurhash "^0.1.4" + slide "^1.1.5" + +write-file-atomic@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" @@ -7010,7 +8340,7 @@ xmldom@0.1.x: version "0.1.27" resolved "https://registry.yarnpkg.com/xmldom/-/xmldom-0.1.27.tgz#d501f97b3bdb403af8ef9ecc20573187aadac0e9" -xtend@^4.0.0: +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -7024,7 +8354,11 @@ y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" -yallist@^2.1.2: +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + +yallist@^2.0.0, yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" From 5b86b64fc448914027e9ceb5d893672cb0d286df Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Wed, 14 Mar 2018 16:15:19 +0900 Subject: [PATCH 23/40] send makeResults instead of flatten artifacts list --- docs/extend.md | 2 +- packages/api/core/src/api/publish.js | 7 +------ packages/publisher/base/src/Publisher.js | 2 +- .../publisher/electron-release-server/src/PublisherERS.js | 7 ++++++- packages/publisher/github/src/PublisherGithub.js | 7 ++++++- packages/publisher/s3/src/PublisherS3.js | 7 ++++++- packages/publisher/snapcraft/src/PublisherSnapcraft.js | 7 ++++++- 7 files changed, 27 insertions(+), 12 deletions(-) diff --git a/docs/extend.md b/docs/extend.md index d8bc64f562..2250c1785a 100644 --- a/docs/extend.md +++ b/docs/extend.md @@ -178,7 +178,7 @@ The options object has the following structure. | Key | Value | |-----|-------| | `dir` | The base directory of the apps source code | -| `artifacts` | An array of artifact objects, see the [MakeResult](https://docs.electronforge.io/typedef/index.html#static-typedef-MakeResult) object definition for details | +| `makeResults` | An array of MakeResult objects, see the [MakeResult](https://docs.electronforge.io/typedef/index.html#static-typedef-MakeResult) object definition for details | | `packageJSON` | The packageJSON of the app | | `config` | The config that is dedicated for this publisher | | `forgeConfig` | The raw forgeConfig this app is using, you shouldn't really have to use this | diff --git a/packages/api/core/src/api/publish.js b/packages/api/core/src/api/publish.js index 53726e31be..daceb88687 100644 --- a/packages/api/core/src/api/publish.js +++ b/packages/api/core/src/api/publish.js @@ -121,11 +121,6 @@ const publish = async (providedOptions = {}) => { throw 'Failed to locate publishable Electron application'; } - const artifacts = makeResults.reduce((accum, makeResult) => { - accum.push(...makeResult.artifacts); - return accum; - }, []); - const testPlatform = makeOptions.platform || process.platform; if (publishTargets === null) { publishTargets = (forgeConfig.publishers || []) @@ -152,7 +147,7 @@ const publish = async (providedOptions = {}) => { await publisher.publish({ dir, - artifacts, + makeResults, packageJSON, config: publishTarget.config || {}, forgeConfig, diff --git a/packages/publisher/base/src/Publisher.js b/packages/publisher/base/src/Publisher.js index d1642750e8..cbd4306691 100644 --- a/packages/publisher/base/src/Publisher.js +++ b/packages/publisher/base/src/Publisher.js @@ -23,7 +23,7 @@ export default class Publisher { */ async publish({ dir, // The base directory of the apps source code - artifacts, // An array of artifact objects, see the MakeResult object definition for details + makeResults, // An array of MakeResult objects, see the MakeResult object definition for details packageJSON, // The packageJSON of the app config, // The config that is dedicated for this publisher forgeConfig, // The raw forgeConfig this app is using, you shouldn't really have to use this diff --git a/packages/publisher/electron-release-server/src/PublisherERS.js b/packages/publisher/electron-release-server/src/PublisherERS.js index 06df04355b..e5b7f8eb2f 100644 --- a/packages/publisher/electron-release-server/src/PublisherERS.js +++ b/packages/publisher/electron-release-server/src/PublisherERS.js @@ -27,7 +27,12 @@ export default class PublisherERS extends PublisherBase { super('electron-release-server'); } - async publish({ artifacts, packageJSON, config, platform, arch }) { + async publish({ makeResults, packageJSON, config, platform, arch }) { + const artifacts = makeResults.reduce((flat, makeResult) => { + flat.push(...makeResult.artifacts); + return flat; + }, []); + if (!(config.baseUrl && config.username && config.password)) { throw 'In order to publish to ERS you must set the "electronReleaseServer.baseUrl", "electronReleaseServer.username" and "electronReleaseServer.password" properties in your forge config. See the docs for more info'; // eslint-disable-line } diff --git a/packages/publisher/github/src/PublisherGithub.js b/packages/publisher/github/src/PublisherGithub.js index 80515c9f91..b6dee8589b 100644 --- a/packages/publisher/github/src/PublisherGithub.js +++ b/packages/publisher/github/src/PublisherGithub.js @@ -12,7 +12,12 @@ export default class PublisherGithub extends PublisherBase { super('github'); } - async publish({ artifacts, packageJSON, config, tag }) { + async publish({ makeResults, packageJSON, config, tag }) { + const artifacts = makeResults.reduce((flat, makeResult) => { + flat.push(...makeResult.artifacts); + return flat; + }, []); + if (!(config.repository && typeof config.repository === 'object' && config.repository.owner && config.repository.name)) { throw 'In order to publish to github you must set the "github_repository.owner" and "github_repository.name" properties in your forge config. See the docs for more info'; // eslint-disable-line diff --git a/packages/publisher/s3/src/PublisherS3.js b/packages/publisher/s3/src/PublisherS3.js index c318cd11b5..3e2a718f70 100644 --- a/packages/publisher/s3/src/PublisherS3.js +++ b/packages/publisher/s3/src/PublisherS3.js @@ -19,7 +19,12 @@ export default class PublisherS3 extends PublisherBase { super('s3'); } - async publish({ artifacts, packageJSON, config, tag }) { + async publish({ makeResults, packageJSON, config, tag }) { + const artifacts = makeResults.reduce((flat, makeResult) => { + flat.push(...makeResult.artifacts); + return flat; + }, []); + const s3Client = new AWS.S3({ accessKeyId: config.accessKeyId, secretAccessKey: config.secretAccessKey, diff --git a/packages/publisher/snapcraft/src/PublisherSnapcraft.js b/packages/publisher/snapcraft/src/PublisherSnapcraft.js index 89240623b8..303a3920e8 100644 --- a/packages/publisher/snapcraft/src/PublisherSnapcraft.js +++ b/packages/publisher/snapcraft/src/PublisherSnapcraft.js @@ -10,7 +10,12 @@ export default class PublisherSnapcraft extends PublisherBase { super('snapcraft'); } - async publish({ dir, artifacts, config }) { + async publish({ dir, makeResults, config }) { + const artifacts = makeResults.reduce((flat, makeResult) => { + flat.push(...makeResult.artifacts); + return flat; + }, []); + const snapArtifacts = artifacts.filter(artifact => artifact.endsWith('.snap')); if (snapArtifacts.length === 0) { From d17d02c83d4274b0f4675b59cc53dd7034d1ce0a Mon Sep 17 00:00:00 2001 From: Thomas Gossmann Date: Sat, 24 Mar 2018 04:55:16 +0100 Subject: [PATCH 24/40] feat(publisher): Allow to configure channel for ERS (#456) --- .../publisher/electron-release-server/src/PublisherERS.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/publisher/electron-release-server/src/PublisherERS.js b/packages/publisher/electron-release-server/src/PublisherERS.js index e5b7f8eb2f..3b5805c426 100644 --- a/packages/publisher/electron-release-server/src/PublisherERS.js +++ b/packages/publisher/electron-release-server/src/PublisherERS.js @@ -60,10 +60,11 @@ export default class PublisherERS extends PublisherBase { const existingVersion = versions.find(version => version.name === packageJSON.version); let channel = 'stable'; - if (packageJSON.version.indexOf('beta') !== -1) { + if (config.channel) { + channel = config.channel; + } else if (packageJSON.version.indexOf('beta') !== -1) { channel = 'beta'; - } - if (packageJSON.version.indexOf('alpha') !== -1) { + } else if (packageJSON.version.indexOf('alpha') !== -1) { channel = 'alpha'; } From 71ca7e54f9db20dff8a79433d4d33537ecb7421a Mon Sep 17 00:00:00 2001 From: Mark Lee Date: Tue, 3 Apr 2018 10:20:25 -0400 Subject: [PATCH 25/40] fix(publisher): call resolve() when electron-release-server publisher succeeds (#465) ISSUES CLOSED: #460 --- packages/publisher/electron-release-server/src/PublisherERS.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/publisher/electron-release-server/src/PublisherERS.js b/packages/publisher/electron-release-server/src/PublisherERS.js index 3b5805c426..1243085e5b 100644 --- a/packages/publisher/electron-release-server/src/PublisherERS.js +++ b/packages/publisher/electron-release-server/src/PublisherERS.js @@ -116,6 +116,7 @@ export default class PublisherERS extends PublisherBase { d('upload successful for asset:', artifactPath); uploaded += 1; updateSpinner(); + resolve(); } catch (err) { reject(err); } From 4644b8577d597382821c8ab3b9e0f3906498fc18 Mon Sep 17 00:00:00 2001 From: Mark Lee Date: Tue, 3 Apr 2018 11:55:07 -0400 Subject: [PATCH 26/40] Fix publisher tests --- packages/api/core/test/fast/publish_spec.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/api/core/test/fast/publish_spec.js b/packages/api/core/test/fast/publish_spec.js index d078af17bd..1c60ff281b 100644 --- a/packages/api/core/test/fast/publish_spec.js +++ b/packages/api/core/test/fast/publish_spec.js @@ -76,7 +76,7 @@ describe('publish', () => { delete testConfig.pluginInterface; expect(publisherSpy.firstCall.args).to.deep.equal([{ dir: resolveStub(), - artifacts: ['artifact1', 'artifact2'], + makeResults: [{ artifacts: ['artifact1', 'artifact2'] }], packageJSON: require('../fixture/dummy_app/package.json'), forgeConfig: testConfig, config: {}, @@ -221,21 +221,30 @@ describe('publish', () => { const darwinIndex = publisherSpy.firstCall.args[0].platform === 'darwin' ? 0 : 1; const win32Index = darwinIndex === 0 ? 1 : 0; const darwinArgs = publisherSpy.getCall(darwinIndex).args[0]; - expect(darwinArgs.artifacts.sort()).to.deep.equal( + const darwinArtifacts = []; + for (const result of darwinArgs.makeResults) { + darwinArtifacts.push(...result.artifacts); + } + expect(darwinArtifacts.sort()).to.deep.equal( fakeMake('darwin').reduce((accum, val) => accum.concat(val.artifacts), []).sort() ); expect(darwinArgs.packageJSON).to.deep.equal({ state: 1 }); expect(darwinArgs.authToken).to.equal(undefined); - expect(darwinArgs.tag).to.equal(null); + console.log(darwinArgs); + expect(darwinArgs.tag).to.equal('1.0.0'); expect(darwinArgs.platform).to.equal('darwin'); expect(darwinArgs.arch).to.equal('x64'); const win32Args = publisherSpy.getCall(win32Index).args[0]; - expect(win32Args.artifacts.sort()).to.deep.equal( + const win32Artifacts = []; + for (const result of win32Args.makeResults) { + win32Artifacts.push(...result.artifacts); + } + expect(win32Artifacts.sort()).to.deep.equal( fakeMake('win32').reduce((accum, val) => accum.concat(val.artifacts), []).sort() ); expect(win32Args.packageJSON).to.deep.equal({ state: 0 }); expect(win32Args.authToken).to.equal(undefined); - expect(win32Args.tag).to.equal(null); + expect(win32Args.tag).to.equal('1.0.0'); expect(win32Args.platform).to.equal('win32'); expect(win32Args.arch).to.equal('x64'); }); From abd9b1a5870c71dc1bc771b2102e8997d93cabb3 Mon Sep 17 00:00:00 2001 From: Mark Lee Date: Tue, 3 Apr 2018 11:56:42 -0400 Subject: [PATCH 27/40] Remove stray console statement --- packages/api/core/test/fast/publish_spec.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/api/core/test/fast/publish_spec.js b/packages/api/core/test/fast/publish_spec.js index 1c60ff281b..35de8c6474 100644 --- a/packages/api/core/test/fast/publish_spec.js +++ b/packages/api/core/test/fast/publish_spec.js @@ -230,7 +230,6 @@ describe('publish', () => { ); expect(darwinArgs.packageJSON).to.deep.equal({ state: 1 }); expect(darwinArgs.authToken).to.equal(undefined); - console.log(darwinArgs); expect(darwinArgs.tag).to.equal('1.0.0'); expect(darwinArgs.platform).to.equal('darwin'); expect(darwinArgs.arch).to.equal('x64'); From 3263f85481dcad64ce60b63895cff3b0ee6536dc Mon Sep 17 00:00:00 2001 From: Mark Lee Date: Tue, 3 Apr 2018 12:03:40 -0400 Subject: [PATCH 28/40] v6-api is a PR now, no need to explicitly add to CI --- .appveyor.yml | 1 - .travis.yml | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 81ba90b5d5..325632ef4c 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -11,7 +11,6 @@ branches: only: - master - v6 - - v6-api install: - ps: Install-Product node $env:nodejs_version $env:platform diff --git a/.travis.yml b/.travis.yml index 05fe38f8fd..16de0b4922 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ env: branches: only: - master - - /^v6.*/ + - v6 - /^v\d+\.\d+\.\d+/ install: - npm i -g bolt From 976b670ca09dc9afb00d2f50811975d90a7359f4 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 9 Apr 2018 00:57:25 +1000 Subject: [PATCH 29/40] Add top level license --- package.json | 1 + yarn.lock | 54 ++++++++++++++-------------------------------------- 2 files changed, 15 insertions(+), 40 deletions(-) diff --git a/package.json b/package.json index 908fd8464d..4f6e3259a2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,7 @@ { "name": "electron-forge", "private": true, + "license": "MIT", "bolt": { "workspaces": [ "packages/api/*", diff --git a/yarn.lock b/yarn.lock index cf25bac465..1559164bd0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -591,14 +591,14 @@ ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" -ansi-regex@*, ansi-regex@^3.0.0, ansi-regex@~3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" +ansi-regex@^3.0.0, ansi-regex@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" @@ -1980,7 +1980,7 @@ debug@3.1.0, debug@^3.0.0, debug@^3.0.1, debug@^3.1.0: dependencies: ms "2.0.0" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -3894,7 +3894,7 @@ imul@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/imul/-/imul-1.0.1.tgz#9d5867161e8b3de96c2c38d5dc7cb102f35e2ac9" -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -4678,10 +4678,6 @@ lockfile@~1.0.1, lockfile@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79" -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - lodash._baseuniq@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8" @@ -4689,28 +4685,10 @@ lodash._baseuniq@~4.6.0: lodash._createset "~4.0.0" lodash._root "~3.0.0" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" -lodash._getnative@*, lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - lodash._reinterpolate@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" @@ -4823,10 +4801,6 @@ lodash.reject@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" -lodash.restparam@*: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - lodash.some@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" @@ -6579,7 +6553,7 @@ readable-stream@~2.1.5: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: +readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" dependencies: @@ -8115,13 +8089,6 @@ uuid@^3.0.0, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" -validate-npm-package-license@*, validate-npm-package-license@~3.0.1: - version "3.0.3" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" @@ -8129,6 +8096,13 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" +validate-npm-package-license@~3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz#5fa912d81eb7d0c74afc140de7317f0ca7df437e" From 75ad202d77d0cde465a0b83f8681b8a194022af4 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 9 Apr 2018 00:59:58 +1000 Subject: [PATCH 30/40] Change Maker/Publisher syntax so that they can be constructed with a config variable --- docs/extend.md | 6 ++-- packages/api/core/src/api/make.js | 34 ++++++++++++------- packages/api/core/src/api/publish.js | 30 +++++++++------- packages/api/core/test/fast/publish_spec.js | 33 +++++++++++++++++- packages/maker/appx/src/MakerAppX.js | 11 +++--- packages/maker/base/src/Maker.js | 5 +-- packages/maker/deb/src/MakerDeb.js | 9 ++--- packages/maker/deb/test/MakerDeb_spec.js | 18 +++++++--- packages/maker/dmg/src/MakerDMG.js | 11 +++--- packages/maker/dmg/test/MakerDMG_spec.js | 17 ++++++---- packages/maker/flatpak/src/MakerFlatpak.js | 7 ++-- .../maker/flatpak/test/MakerFlatpak_spec.js | 15 +++++--- packages/maker/rpm/src/MakerRpm.js | 9 ++--- packages/maker/rpm/test/MakerRpm_spec.js | 16 ++++++--- packages/maker/snap/src/MakerSnap.js | 7 ++-- packages/maker/snap/test/MakerSnap_spec.js | 15 +++++--- packages/maker/squirrel/src/MakerSquirrel.js | 10 +++--- packages/maker/wix/src/MakerWix.js | 7 ++-- packages/maker/zip/src/MakerZIP.js | 4 +-- packages/publisher/base/src/Publisher.js | 5 +-- .../src/PublisherERS.js | 8 ++--- .../publisher/github/src/PublisherGithub.js | 8 ++--- packages/publisher/s3/src/PublisherS3.js | 8 ++--- .../snapcraft/src/PublisherSnapcraft.js | 11 +++--- 24 files changed, 177 insertions(+), 127 deletions(-) diff --git a/docs/extend.md b/docs/extend.md index 2250c1785a..41178ed158 100644 --- a/docs/extend.md +++ b/docs/extend.md @@ -129,6 +129,8 @@ Makers must implement this method and return an array of **absolute** paths to the artifacts this maker generated. If an error occurs, simply reject the promise and Electron Forge will stop the make process. +This `config` for the maker will be available on `this.config`. + The options object has the following structure. | Key | Value | @@ -138,7 +140,6 @@ The options object has the following structure. | `appName` | The resolved human friendly name of the project | | `targetPlatform` | The target platform you should make for | | `targetArch` | The target architecture you should make for | -| `config` | The configuration object designated for this maker | | `forgeConfig` | Fully resolved forge configuration, you shouldn't really need this | | `packageJSON` | The applications package.json file | @@ -173,6 +174,8 @@ darwin and win32 artifacts to somewhere like GitHub on the first publish call you will have to create the version on GitHub and the second call will just be appending files to the existing version. +This `config` for the publisher will be available on `this.config`. + The options object has the following structure. | Key | Value | @@ -180,7 +183,6 @@ The options object has the following structure. | `dir` | The base directory of the apps source code | | `makeResults` | An array of MakeResult objects, see the [MakeResult](https://docs.electronforge.io/typedef/index.html#static-typedef-MakeResult) object definition for details | | `packageJSON` | The packageJSON of the app | -| `config` | The config that is dedicated for this publisher | | `forgeConfig` | The raw forgeConfig this app is using, you shouldn't really have to use this | | `platform` | The platform these artifacts are for | | `arch` | The arch these artifacts are for | diff --git a/packages/api/core/src/api/make.js b/packages/api/core/src/api/make.js index bea1461ca6..98364fe96a 100644 --- a/packages/api/core/src/api/make.js +++ b/packages/api/core/src/api/make.js @@ -18,7 +18,7 @@ import packager from './package'; /** * @typedef {Object} MakeTarget * @property {string} [name] The module name that exports the maker - * @property {Array} [platforms=[]] The platforms this make target should run on + * @property {Array} [platforms=null] The platforms this make target should run on * @property {Object} [config] The arbitrary config to pass to this make target */ @@ -89,18 +89,24 @@ export default async (providedOptions = {}) => { return target; }); + let targetId = 0; for (const target of targets) { - let makerModule; - try { - makerModule = require(target.name); - } catch (err) { - console.error(err); - throw `Could not find module with name: ${target.name}`; + let maker; + if (target.__isElectronForgeMaker) { + maker = target; + } else { + let makerModule; + try { + makerModule = require(target.name); + } catch (err) { + console.error(err); + throw `Could not find module with name: ${target.name}`; + } + + const MakerClass = makerModule.default || makerModule; + maker = new MakerClass(target.config, target.platforms); } - const MakerClass = makerModule.default || makerModule; - const maker = new MakerClass(); - if (!maker.isSupportedOnCurrentPlatform) { throw new Error([ `Maker for target ${maker.name} is incompatible with this version of `, @@ -116,7 +122,8 @@ export default async (providedOptions = {}) => { ].join('')); } - makers[target.name] = maker; + makers[targetId] = maker; + targetId += 1; } if (!skipPackage) { @@ -146,8 +153,10 @@ export default async (providedOptions = {}) => { throw new Error(`Couldn't find packaged app at: ${packageDir}`); } + targetId = 0; for (const target of targets) { - const maker = makers[target.name]; + const maker = makers[targetId]; + targetId += 1; // eslint-disable-next-line no-loop-func await asyncOra(`Making for target: ${maker.name} - On platform: ${actualTargetPlatform.cyan} - For arch: ${targetArch.cyan}`, async () => { @@ -158,7 +167,6 @@ export default async (providedOptions = {}) => { appName, targetPlatform: actualTargetPlatform, targetArch, - config: target.config || {}, forgeConfig, packageJSON, }); diff --git a/packages/api/core/src/api/publish.js b/packages/api/core/src/api/publish.js index daceb88687..6da6c90611 100644 --- a/packages/api/core/src/api/publish.js +++ b/packages/api/core/src/api/publish.js @@ -62,7 +62,7 @@ const publish = async (providedOptions = {}) => { } let packageJSON = await readPackageJSON(dir); - if (tag === null ) tag = packageJSON.version; + if (tag === null) tag = packageJSON.version; const forgeConfig = await getForgeConfig(dir); const outDir = providedOptions.outDir || getCurrentOutDir(dir, forgeConfig); @@ -132,24 +132,28 @@ const publish = async (providedOptions = {}) => { }); for (const publishTarget of publishTargets) { - let publisherModule; - await asyncOra(`Resolving publish target: ${`${publishTarget.name}`.cyan}`, async () => { // eslint-disable-line no-loop-func - try { - publisherModule = require(publishTarget.name); - } catch (err) { - console.error(err); - throw `Could not find a publish target with the name: ${publishTarget.name}`; - } - }); + let publisher; + if (publishTarget.__isElectronForgePublisher) { + publisher = publishTarget; + } else { + let publisherModule; + await asyncOra(`Resolving publish target: ${`${publishTarget.name}`.cyan}`, async () => { // eslint-disable-line no-loop-func + try { + publisherModule = require(publishTarget.name); + } catch (err) { + console.error(err); + throw `Could not find a publish target with the name: ${publishTarget.name}`; + } + }); - const PublisherClass = publisherModule.default || publisherModule; - const publisher = new PublisherClass(); + const PublisherClass = publisherModule.default || publisherModule; + publisher = new PublisherClass(publishTarget.config || {}, publishTarget.platforms); + } await publisher.publish({ dir, makeResults, packageJSON, - config: publishTarget.config || {}, forgeConfig, tag, platform: makeOptions.platform || process.platform, diff --git a/packages/api/core/test/fast/publish_spec.js b/packages/api/core/test/fast/publish_spec.js index 35de8c6474..fb4154a283 100644 --- a/packages/api/core/test/fast/publish_spec.js +++ b/packages/api/core/test/fast/publish_spec.js @@ -79,7 +79,38 @@ describe('publish', () => { makeResults: [{ artifacts: ['artifact1', 'artifact2'] }], packageJSON: require('../fixture/dummy_app/package.json'), forgeConfig: testConfig, - config: {}, + tag: 'my_special_tag', + platform: process.platform, + arch: process.arch, + }]); + }); + + it('should call the provided publisher with the appropriate args', async () => { + makeStub.returns([{ artifacts: ['artifact1', 'artifact2'] }]); + await publish({ + dir: __dirname, + interactive: false, + authToken: 'my_token', + tag: 'my_special_tag', + // Fake instance of a publisher + publishTargets: [{ + __isElectronForgePublisher: true, + publish: publisherSpy, + }], + }); + expect(publisherSpy.callCount).to.equal(1); + // pluginInterface will be a new instance so we ignore it + delete publisherSpy.firstCall.args[0].forgeConfig.pluginInterface; + const testConfig = await require('../../src/util/forge-config').default(path.resolve(__dirname, '../fixture/dummy_app')); + + testConfig.publishers = publishers; + + delete testConfig.pluginInterface; + expect(publisherSpy.firstCall.args).to.deep.equal([{ + dir: resolveStub(), + makeResults: [{ artifacts: ['artifact1', 'artifact2'] }], + packageJSON: require('../fixture/dummy_app/package.json'), + forgeConfig: testConfig, tag: 'my_special_tag', platform: process.platform, arch: process.arch, diff --git a/packages/maker/appx/src/MakerAppX.js b/packages/maker/appx/src/MakerAppX.js index 12c5783fb0..fe1eaba11f 100644 --- a/packages/maker/appx/src/MakerAppX.js +++ b/packages/maker/appx/src/MakerAppX.js @@ -45,9 +45,7 @@ export async function createDefaultCertificate(publisherName, { certFilePath, ce } export default class MakerAppX extends MakerBase { - constructor() { - super('appx'); - } + name = 'appx'; isSupportedOnCurrentPlatform() { return process.platform === 'win32'; @@ -57,7 +55,6 @@ export default class MakerAppX extends MakerBase { dir, makeDir, appName, - config, packageJSON, targetArch, }) { @@ -69,12 +66,12 @@ export default class MakerAppX extends MakerBase { flatten: false, deploy: false, packageVersion: `${packageJSON.version}.0`, - packageName: appName.replace(/-/g, ''), + packageName: packageJSON.name.replace(/-/g, ''), packageDisplayName: appName, packageDescription: packageJSON.description || appName, packageExecutable: `app\\${appName}.exe`, - windowsKit: config.windowsKit || path.dirname(findSdkTool('makeappx.exe')), - }, config, { + windowsKit: this.config.windowsKit || path.dirname(await findSdkTool('makeappx.exe')), + }, this.config, { inputDirectory: dir, outputDirectory: outPath, }); diff --git a/packages/maker/base/src/Maker.js b/packages/maker/base/src/Maker.js index e5394105fe..0f9c359681 100644 --- a/packages/maker/base/src/Maker.js +++ b/packages/maker/base/src/Maker.js @@ -4,8 +4,9 @@ import fs from 'fs-extra'; import path from 'path'; export default class Maker { - constructor(name) { - this.name = name; + constructor(config = {}, platforms = null) { + this.config = config; + this.platforms = platforms; Object.defineProperty(this, '__isElectronForgeMaker', { value: true, enumerable: false, diff --git a/packages/maker/deb/src/MakerDeb.js b/packages/maker/deb/src/MakerDeb.js index 6dca35ac1c..1c2c1c2167 100644 --- a/packages/maker/deb/src/MakerDeb.js +++ b/packages/maker/deb/src/MakerDeb.js @@ -13,9 +13,7 @@ export function debianArch(nodeArch) { } export default class MakerDeb extends MakerBase { - constructor() { - super('dmg'); - } + name = 'deb'; isSupportedOnCurrentPlatform() { return this.isInstalled('electron-installer-debian') && process.platform === 'linux'; @@ -25,13 +23,12 @@ export default class MakerDeb extends MakerBase { dir, makeDir, targetArch, - config, packageJSON, }) { const installer = require('electron-installer-debian'); const arch = debianArch(targetArch); - const name = (config.options || {}).name || packageJSON.name; + const name = (this.config.options || {}).name || packageJSON.name; const versionedName = `${name}_${packageJSON.version}_${arch}`; const outPath = path.resolve(makeDir, `${versionedName}.deb`); @@ -39,7 +36,7 @@ export default class MakerDeb extends MakerBase { await installer(Object.assign({ options: {}, - }, config, { + }, this.config, { src: dir, dest: path.dirname(outPath), arch, diff --git a/packages/maker/deb/test/MakerDeb_spec.js b/packages/maker/deb/test/MakerDeb_spec.js index e8ebca6bab..9efff594c9 100644 --- a/packages/maker/deb/test/MakerDeb_spec.js +++ b/packages/maker/deb/test/MakerDeb_spec.js @@ -1,5 +1,6 @@ import chai, { expect } from 'chai'; import chaiAsPromised from 'chai-as-promised'; +import path from 'path'; import proxyquire from 'proxyquire'; import { stub } from 'sinon'; @@ -11,9 +12,10 @@ describe('MakerDeb', () => { let ensureFileStub; let config; let maker; + let createMaker; const dir = '/my/test/dir/out'; - const makeDir = '/foo/bar/make'; + const makeDir = path.resolve('/foo/bar/make'); const appName = 'My Test App'; const targetArch = process.arch; const packageJSON = { version: '1.2.3' }; @@ -26,12 +28,15 @@ describe('MakerDeb', () => { MakerDeb = proxyquire.noPreserveCache().noCallThru().load('../src/MakerDeb', { 'electron-installer-debian': eidStub, }); - maker = new MakerDeb.default(); // eslint-disable-line - maker.ensureFile = ensureFileStub; + createMaker = () => { + maker = new MakerDeb.default(config); // eslint-disable-line + maker.ensureFile = ensureFileStub; + }; + createMaker(); }); it('should pass through correct defaults', async () => { - await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + await maker.make({ dir, makeDir, appName, targetArch, packageJSON }); const opts = eidStub.firstCall.args[0]; expect(opts).to.deep.equal({ arch: MakerDeb.debianArch(process.arch), @@ -39,6 +44,7 @@ describe('MakerDeb', () => { src: dir, dest: makeDir, }); + expect(maker.config).to.deep.equal(config); }); it('should have config cascade correctly', async () => { @@ -49,7 +55,9 @@ describe('MakerDeb', () => { }, }; - await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + createMaker(); + + await maker.make({ dir, makeDir, appName, targetArch, packageJSON }); const opts = eidStub.firstCall.args[0]; expect(opts).to.deep.equal({ arch: MakerDeb.debianArch(process.arch), diff --git a/packages/maker/dmg/src/MakerDMG.js b/packages/maker/dmg/src/MakerDMG.js index 322de41c8a..2e174c71fc 100644 --- a/packages/maker/dmg/src/MakerDMG.js +++ b/packages/maker/dmg/src/MakerDMG.js @@ -5,9 +5,7 @@ import path from 'path'; import pify from 'pify'; export default class MakerDMG extends MakerBase { - constructor() { - super('dmg'); - } + name = 'dmg'; isSupportedOnCurrentPlatform() { return process.platform === 'darwin'; @@ -17,23 +15,22 @@ export default class MakerDMG extends MakerBase { dir, makeDir, appName, - config, packageJSON, }) { const electronDMG = require('electron-installer-dmg'); - const outPath = path.resolve(makeDir, `${config.name || appName}.dmg`); + const outPath = path.resolve(makeDir, `${this.config.name || appName}.dmg`); const wantedOutPath = path.resolve(makeDir, `${appName}-${packageJSON.version}.dmg`); await this.ensureFile(outPath); const dmgConfig = Object.assign({ overwrite: true, name: appName, - }, config, { + }, this.config, { appPath: path.resolve(dir, `${appName}.app`), out: path.dirname(outPath), }); await pify(electronDMG)(dmgConfig); - if (!config.name) { + if (!this.config.name) { await fs.rename(outPath, wantedOutPath); } return [wantedOutPath]; diff --git a/packages/maker/dmg/test/MakerDMG_spec.js b/packages/maker/dmg/test/MakerDMG_spec.js index e19b14b272..60629333c2 100644 --- a/packages/maker/dmg/test/MakerDMG_spec.js +++ b/packages/maker/dmg/test/MakerDMG_spec.js @@ -13,6 +13,7 @@ describe('MakerDMG', () => { let renameStub; let config; let maker; + let createMaker; const dir = '/my/test/dir/out'; const makeDir = '/my/test/dir/make'; @@ -33,12 +34,15 @@ describe('MakerDMG', () => { rename: renameStub, }, }).default; - maker = new MakerDMG(); - maker.ensureFile = ensureFileStub; + createMaker = () => { + maker = new MakerDMG(config); + maker.ensureFile = ensureFileStub; + }; + createMaker(); }); it('should pass through correct defaults', async () => { - await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + await maker.make({ dir, makeDir, appName, targetArch, packageJSON }); const opts = eidStub.firstCall.args[0]; expect(opts).to.deep.equal({ overwrite: true, @@ -49,19 +53,20 @@ describe('MakerDMG', () => { }); it('should attempt to rename the DMG file if no custom name is set', async () => { - await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + await maker.make({ dir, makeDir, appName, targetArch, packageJSON }); expect(renameStub.callCount).to.equal(1); expect(renameStub.firstCall.args[1]).to.include('1.2.3'); }); it('should rename the DMG file to include the version if no custom name is set', async () => { - await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + await maker.make({ dir, makeDir, appName, targetArch, packageJSON }); expect(renameStub.firstCall.args[1]).to.include('1.2.3'); }); it('should not attempt to rename the DMG file if a custom name is set', async () => { config.name = 'foobar'; - await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + createMaker(); + await maker.make({ dir, makeDir, appName, targetArch, packageJSON }); expect(renameStub.callCount).to.equal(0); }); }); diff --git a/packages/maker/flatpak/src/MakerFlatpak.js b/packages/maker/flatpak/src/MakerFlatpak.js index 794a270bcd..0cb441f5cf 100644 --- a/packages/maker/flatpak/src/MakerFlatpak.js +++ b/packages/maker/flatpak/src/MakerFlatpak.js @@ -15,9 +15,7 @@ export function flatpakArch(nodeArch) { } export default class MakerFlatpak extends MakerBase { - constructor() { - super('flatpak'); - } + name = 'flatpak'; isSupportedOnCurrentPlatform() { return this.isInstalled('electron-installer-flatpak') && process.platform === 'linux'; @@ -27,7 +25,6 @@ export default class MakerFlatpak extends MakerBase { dir, makeDir, targetArch, - config, }) { const installer = require('electron-installer-flatpak'); @@ -35,7 +32,7 @@ export default class MakerFlatpak extends MakerBase { const outDir = path.resolve(makeDir, 'flatpak'); await this.ensureDirectory(outDir); - const flatpakConfig = Object.assign({}, config, { + const flatpakConfig = Object.assign({}, this.config, { arch, src: dir, dest: outDir, diff --git a/packages/maker/flatpak/test/MakerFlatpak_spec.js b/packages/maker/flatpak/test/MakerFlatpak_spec.js index f920009ff5..916cd98827 100644 --- a/packages/maker/flatpak/test/MakerFlatpak_spec.js +++ b/packages/maker/flatpak/test/MakerFlatpak_spec.js @@ -12,9 +12,10 @@ describe('MakerFlatpak', () => { let eidStub; let ensureDirectoryStub; let config; + let createMaker; const dir = '/my/test/dir/out'; - const makeDir = '/make/dir'; + const makeDir = path.resolve('/make/dir'); const appName = 'My Test App'; const targetArch = process.arch; const packageJSON = { version: '1.2.3' }; @@ -28,12 +29,15 @@ describe('MakerFlatpak', () => { 'fs-extra': { readdir: stub().returns(Promise.resolve([])) }, 'electron-installer-flatpak': eidStub, }); - maker = new flatpakModule.default(); // eslint-disable-line - maker.ensureDirectory = ensureDirectoryStub; + createMaker = () => { + maker = new flatpakModule.default(config); // eslint-disable-line + maker.ensureDirectory = ensureDirectoryStub; + }; + createMaker(); }); it('should pass through correct defaults', async () => { - await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + await maker.make({ dir, makeDir, appName, targetArch, packageJSON }); const opts = eidStub.firstCall.args[0]; expect(opts).to.deep.equal({ arch: flatpakModule.flatpakArch(process.arch), @@ -49,8 +53,9 @@ describe('MakerFlatpak', () => { productName: 'Flatpak', }, }; + createMaker(); - await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + await maker.make({ dir, makeDir, appName, targetArch, packageJSON }); const opts = eidStub.firstCall.args[0]; expect(opts).to.deep.equal({ arch: flatpakModule.flatpakArch(process.arch), diff --git a/packages/maker/rpm/src/MakerRpm.js b/packages/maker/rpm/src/MakerRpm.js index 514c74d4bb..dfe699f879 100644 --- a/packages/maker/rpm/src/MakerRpm.js +++ b/packages/maker/rpm/src/MakerRpm.js @@ -14,9 +14,7 @@ export function rpmArch(nodeArch) { } export default class MakerRpm extends MakerBase { - constructor() { - super('rpm'); - } + name = 'rpm'; isSupportedOnCurrentPlatform() { return this.isInstalled('electron-installer-redhat') && process.platform === 'linux'; @@ -26,18 +24,17 @@ export default class MakerRpm extends MakerBase { dir, makeDir, targetArch, - config, packageJSON, }) { const installer = require('electron-installer-redhat'); const arch = rpmArch(targetArch); - const name = (config.options || {}).name || packageJSON.name; + const name = (this.config.options || {}).name || packageJSON.name; const versionedName = `${name}-${packageJSON.version}.${arch}`; const outPath = path.resolve(makeDir, `${versionedName}.rpm`); await this.ensureFile(outPath); - const rpmConfig = Object.assign({}, config, { + const rpmConfig = Object.assign({}, this.config, { arch, src: dir, dest: path.dirname(outPath), diff --git a/packages/maker/rpm/test/MakerRpm_spec.js b/packages/maker/rpm/test/MakerRpm_spec.js index f6e9354786..f319a58761 100644 --- a/packages/maker/rpm/test/MakerRpm_spec.js +++ b/packages/maker/rpm/test/MakerRpm_spec.js @@ -1,5 +1,6 @@ import chai, { expect } from 'chai'; import chaiAsPromised from 'chai-as-promised'; +import path from 'path'; import proxyquire from 'proxyquire'; import { stub } from 'sinon'; @@ -11,9 +12,10 @@ describe('MakerRpm', () => { let eidStub; let ensureFileStub; let config; + let createMaker; const dir = '/my/test/dir/out'; - const makeDir = '/make/dir'; + const makeDir = path.resolve('/make/dir'); const appName = 'My Test App'; const targetArch = process.arch; const packageJSON = { version: '1.2.3' }; @@ -26,12 +28,15 @@ describe('MakerRpm', () => { rpmModule = proxyquire.noPreserveCache().noCallThru().load('../src/MakerRpm', { 'electron-installer-redhat': eidStub, }); - maker = new rpmModule.default(); // eslint-disable-line - maker.ensureFile = ensureFileStub; + createMaker = () => { + maker = new rpmModule.default(config); // eslint-disable-line + maker.ensureFile = ensureFileStub; + }; + createMaker(); }); it('should pass through correct defaults', async () => { - await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + await maker.make({ dir, makeDir, appName, targetArch, packageJSON }); const opts = eidStub.firstCall.args[0]; expect(opts).to.deep.equal({ arch: rpmModule.rpmArch(process.arch), @@ -47,8 +52,9 @@ describe('MakerRpm', () => { productName: 'Redhat', }, }; + createMaker(); - await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + await maker.make({ dir, makeDir, appName, targetArch, packageJSON }); const opts = eidStub.firstCall.args[0]; expect(opts).to.deep.equal({ arch: rpmModule.rpmArch(process.arch), diff --git a/packages/maker/snap/src/MakerSnap.js b/packages/maker/snap/src/MakerSnap.js index 4b51ea1c26..6e0347b70b 100644 --- a/packages/maker/snap/src/MakerSnap.js +++ b/packages/maker/snap/src/MakerSnap.js @@ -3,9 +3,7 @@ import MakerBase from '@electron-forge/maker-base'; import path from 'path'; export default class MakerSnap extends MakerBase { - constructor() { - super('snap'); - } + name = 'snap'; isSupportedOnCurrentPlatform() { return process.platform === 'linux'; @@ -15,7 +13,6 @@ export default class MakerSnap extends MakerBase { dir, makeDir, targetArch, - config, }) { const installer = require('electron-installer-snap'); @@ -28,7 +25,7 @@ export default class MakerSnap extends MakerBase { dest: outPath, src: dir, }; - const snapConfig = Object.assign({}, config, snapDefaults); + const snapConfig = Object.assign({}, this.config, snapDefaults); return [await installer(snapConfig)]; } diff --git a/packages/maker/snap/test/MakerSnap_spec.js b/packages/maker/snap/test/MakerSnap_spec.js index ecccb7ca1c..4ef3b0e6a4 100644 --- a/packages/maker/snap/test/MakerSnap_spec.js +++ b/packages/maker/snap/test/MakerSnap_spec.js @@ -12,9 +12,10 @@ describe('MakerSnap', () => { let eisStub; let ensureDirectoryStub; let config; + let createMaker; const dir = '/my/test/dir/out/foo-linux-x64'; - const makeDir = '/make/dir'; + const makeDir = path.resolve('/make/dir'); const appName = 'My Test App'; const targetArch = process.arch; const packageJSON = { version: '1.2.3' }; @@ -27,12 +28,15 @@ describe('MakerSnap', () => { MakerSnapModule = proxyquire.noPreserveCache().noCallThru().load('../src/MakerSnap', { 'electron-installer-snap': eisStub, }); - maker = new MakerSnapModule.default(); // eslint-disable-line - maker.ensureDirectory = ensureDirectoryStub; + createMaker = () => { + maker = new MakerSnapModule.default(config); // eslint-disable-line + maker.ensureDirectory = ensureDirectoryStub; + }; + createMaker(); }); it('should pass through correct defaults', async () => { - await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + await maker.make({ dir, makeDir, appName, targetArch, packageJSON }); const opts = eisStub.firstCall.args[0]; expect(opts).to.deep.equal({ arch: process.arch, @@ -46,8 +50,9 @@ describe('MakerSnap', () => { arch: 'overridden', description: 'Snap description', }; + createMaker(); - await maker.make({ dir, makeDir, appName, targetArch, config, packageJSON }); + await maker.make({ dir, makeDir, appName, targetArch, packageJSON }); const opts = eisStub.firstCall.args[0]; expect(opts).to.deep.equal({ arch: process.arch, diff --git a/packages/maker/squirrel/src/MakerSquirrel.js b/packages/maker/squirrel/src/MakerSquirrel.js index 17fd708287..3f38a44f6a 100644 --- a/packages/maker/squirrel/src/MakerSquirrel.js +++ b/packages/maker/squirrel/src/MakerSquirrel.js @@ -4,9 +4,7 @@ import fs from 'fs-extra'; import path from 'path'; export default class MakerSquirrel extends MakerBase { - constructor() { - super('squirel'); - } + name = 'squirrel'; isSupportedOnCurrentPlatform() { return this.isInstalled('electron-winstaller') && !process.env.DISABLE_SQUIRREL_TEST; @@ -18,7 +16,6 @@ export default class MakerSquirrel extends MakerBase { targetArch, packageJSON, appName, - config, }) { const { createWindowsInstaller } = require('electron-winstaller'); @@ -26,11 +23,12 @@ export default class MakerSquirrel extends MakerBase { await this.ensureDirectory(outPath); const winstallerConfig = Object.assign({ - name: appName, + name: packageJSON.name, + title: appName, noMsi: true, exe: `${appName}.exe`, setupExe: `${appName}-${packageJSON.version} Setup.exe`, - }, config, { + }, this.config, { appDirectory: dir, outputDirectory: outPath, }); diff --git a/packages/maker/wix/src/MakerWix.js b/packages/maker/wix/src/MakerWix.js index 4ace7ee6ef..22b308841c 100644 --- a/packages/maker/wix/src/MakerWix.js +++ b/packages/maker/wix/src/MakerWix.js @@ -5,9 +5,7 @@ import path from 'path'; import getNameFromAuthor from './util/author-name'; export default class MakerWix extends MakerBase { - constructor() { - super('wix'); - } + name = 'wix'; isSupportedOnCurrentPlatform() { return process.platform === 'win32'; @@ -19,7 +17,6 @@ export default class MakerWix extends MakerBase { targetArch, packageJSON, appName, - config, }) { const { MSICreator } = require('electron-wix-msi'); @@ -32,7 +29,7 @@ export default class MakerWix extends MakerBase { version: packageJSON.version, manufacturer: getNameFromAuthor(packageJSON.author), exe: `${appName}.exe`, - }, config, { + }, this.config, { appDirectory: dir, outputDirectory: outPath, })); diff --git a/packages/maker/zip/src/MakerZIP.js b/packages/maker/zip/src/MakerZIP.js index 51d6374e3a..a07d75b932 100644 --- a/packages/maker/zip/src/MakerZIP.js +++ b/packages/maker/zip/src/MakerZIP.js @@ -5,9 +5,7 @@ import path from 'path'; import pify from 'pify'; export default class MakerZIP extends MakerBase { - constructor() { - super('zip'); - } + name = 'zip'; isSupportedOnCurrentPlatform() { return true; diff --git a/packages/publisher/base/src/Publisher.js b/packages/publisher/base/src/Publisher.js index cbd4306691..71723a87b2 100644 --- a/packages/publisher/base/src/Publisher.js +++ b/packages/publisher/base/src/Publisher.js @@ -1,8 +1,9 @@ /* eslint-disable no-unused-vars */ export default class Publisher { - constructor(name) { - this.name = name; + constructor(config = {}, platforms = null) { + this.config = config; + this.platforms = platforms; Object.defineProperty(this, '__isElectronForgePublisher', { value: true, enumerable: false, diff --git a/packages/publisher/electron-release-server/src/PublisherERS.js b/packages/publisher/electron-release-server/src/PublisherERS.js index 1243085e5b..93bf47e642 100644 --- a/packages/publisher/electron-release-server/src/PublisherERS.js +++ b/packages/publisher/electron-release-server/src/PublisherERS.js @@ -23,11 +23,11 @@ export const ersPlatform = (platform, arch) => { }; export default class PublisherERS extends PublisherBase { - constructor() { - super('electron-release-server'); - } + name = 'electron-release-server'; + + async publish({ makeResults, packageJSON, platform, arch }) { + const { config } = this; - async publish({ makeResults, packageJSON, config, platform, arch }) { const artifacts = makeResults.reduce((flat, makeResult) => { flat.push(...makeResult.artifacts); return flat; diff --git a/packages/publisher/github/src/PublisherGithub.js b/packages/publisher/github/src/PublisherGithub.js index b6dee8589b..52c182fa00 100644 --- a/packages/publisher/github/src/PublisherGithub.js +++ b/packages/publisher/github/src/PublisherGithub.js @@ -8,11 +8,11 @@ import path from 'path'; import GitHub from './util/github'; export default class PublisherGithub extends PublisherBase { - constructor() { - super('github'); - } + name = 'github'; + + async publish({ makeResults, packageJSON, tag }) { + const { config } = this; - async publish({ makeResults, packageJSON, config, tag }) { const artifacts = makeResults.reduce((flat, makeResult) => { flat.push(...makeResult.artifacts); return flat; diff --git a/packages/publisher/s3/src/PublisherS3.js b/packages/publisher/s3/src/PublisherS3.js index 3e2a718f70..1ea693376e 100644 --- a/packages/publisher/s3/src/PublisherS3.js +++ b/packages/publisher/s3/src/PublisherS3.js @@ -15,11 +15,11 @@ AWS.util.update(AWS.S3.prototype, { }); export default class PublisherS3 extends PublisherBase { - constructor() { - super('s3'); - } + name = 's3'; + + async publish({ makeResults, packageJSON, tag }) { + const { config } = this; - async publish({ makeResults, packageJSON, config, tag }) { const artifacts = makeResults.reduce((flat, makeResult) => { flat.push(...makeResult.artifacts); return flat; diff --git a/packages/publisher/snapcraft/src/PublisherSnapcraft.js b/packages/publisher/snapcraft/src/PublisherSnapcraft.js index 303a3920e8..a82caa7600 100644 --- a/packages/publisher/snapcraft/src/PublisherSnapcraft.js +++ b/packages/publisher/snapcraft/src/PublisherSnapcraft.js @@ -6,11 +6,9 @@ import path from 'path'; import Snapcraft from 'electron-installer-snap/snapcraft'; export default class PublisherSnapcraft extends PublisherBase { - constructor() { - super('snapcraft'); - } + name = 'snapcraft'; - async publish({ dir, makeResults, config }) { + async publish({ dir, makeResults }) { const artifacts = makeResults.reduce((flat, makeResult) => { flat.push(...makeResult.artifacts); return flat; @@ -25,12 +23,13 @@ export default class PublisherSnapcraft extends PublisherBase { const snapcraftCfgPath = path.join(dir, '.snapcraft', 'snapcraft.cfg'); if (!await fs.pathExists(snapcraftCfgPath)) { - throw `Snapcraft credentials not found at "${snapcraftCfgPath}". It can be generated with the command "snapcraft export-login" (snapcraft 2.37 and above).`; + throw `Snapcraft credentials not found at "${snapcraftCfgPath}". It can be generated with the command "snapcraft export-login"` + + '(snapcraft 2.37 and above).'; } await asyncOra('Pushing snap to the snap store', async () => { const snapcraft = new Snapcraft(); - await snapcraft.run(dir, 'push', config, snapArtifacts); + await snapcraft.run(dir, 'push', this.config, snapArtifacts); }); } } From 2bb622271a8055baaaed59023f02676e75595d64 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 9 Apr 2018 01:00:08 +1000 Subject: [PATCH 31/40] Fix custom init * Allow absolute paths to custom modules * Update to new @electron-forge/ scope --- .../core/src/api/init-scripts/init-custom.js | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/packages/api/core/src/api/init-scripts/init-custom.js b/packages/api/core/src/api/init-scripts/init-custom.js index 60f4c36635..a15faca30e 100644 --- a/packages/api/core/src/api/init-scripts/init-custom.js +++ b/packages/api/core/src/api/init-scripts/init-custom.js @@ -18,10 +18,25 @@ export default async (dir, template) => { d('using global template'); } catch (err) { try { - templateModulePath = require.resolve(`electron-forge-template-${template}`); - d('using local template'); + templateModulePath = await resolvePackage(`@electron-forge/template-${template}`); + d('using global template'); } catch (err2) { - throw `Failed to locate custom template: "${template}"\n\nTry \`npm install -g electron-forge-template-${template}\``; + try { + templateModulePath = require.resolve(`electron-forge-template-${template}`); + d('using local template'); + } catch (err3) { + try { + templateModulePath = require.resolve(`@electron-forge/template-${template}`); + d('using local template'); + } catch (err4) { + try { + templateModulePath = require.resolve(template); + d('using absolute template'); + } catch (err5) { + throw `Failed to locate custom template: "${template}"\n\nTry \`npm install -g @electron-forge-template-${template}\``; + } + } + } } } }); From 0cf132da93424e8962a4240026fe5564cf44627d Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 9 Apr 2018 01:00:37 +1000 Subject: [PATCH 32/40] Add missing semi --- packages/api/core/src/util/plugin-interface.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/api/core/src/util/plugin-interface.js b/packages/api/core/src/util/plugin-interface.js index 6501a49987..9525003204 100644 --- a/packages/api/core/src/util/plugin-interface.js +++ b/packages/api/core/src/util/plugin-interface.js @@ -13,7 +13,7 @@ export default class PluginInterface { throw `Expected plugin[0] to be a string but found ${plugin[0]}`; } let opts = {}; - if (typeof plugin[1] !== 'undefined') opts = plugin[1] + if (typeof plugin[1] !== 'undefined') opts = plugin[1]; const pluginModule = require(plugin[0]); const Plugin = pluginModule.default || pluginModule; return new Plugin(opts); From f68c3a3e0629d2dd16d383dd4ed2feb6f0482fc0 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 9 Apr 2018 01:00:57 +1000 Subject: [PATCH 33/40] Use absolute path for custom init to avoid runnig npm link on windows --- packages/api/core/test/slow/api_spec_slow.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/api/core/test/slow/api_spec_slow.js b/packages/api/core/test/slow/api_spec_slow.js index 7724f99159..c83b75ee0b 100644 --- a/packages/api/core/test/slow/api_spec_slow.js +++ b/packages/api/core/test/slow/api_spec_slow.js @@ -82,11 +82,7 @@ describe(`electron-forge API (with installer=${nodeInstaller})`, () => { }); describe('init (with custom templater)', () => { - beforeInitTest({ template: 'dummy' }, () => { - execSync('npm link', { - cwd: path.resolve(__dirname, '../fixture/custom_init'), - }); - }); + beforeInitTest({ template: path.resolve(__dirname, '../fixture/custom_init') }); it('should create dot files correctly', async () => { expect(await fs.pathExists(dir), 'the target dir should have been created').to.equal(true); From ac04cf99a24878e73820d13521d748490a77dd1c Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Mon, 9 Apr 2018 01:01:13 +1000 Subject: [PATCH 34/40] Fix appx test reference to fixture key file --- packages/maker/appx/test/MakerAppX_spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/maker/appx/test/MakerAppX_spec.js b/packages/maker/appx/test/MakerAppX_spec.js index 5bdfd73ef7..2191315c2c 100644 --- a/packages/maker/appx/test/MakerAppX_spec.js +++ b/packages/maker/appx/test/MakerAppX_spec.js @@ -24,7 +24,7 @@ describe('MakerApPX', () => { def('should create a .pfx file', async () => { await fs.copy( - join(__dirname, '..', '..', 'fixture', 'bogus-private-key.pvk'), + join(__dirname, '../../../api/core/test/fixture', 'bogus-private-key.pvk'), join(tmpDir, 'dummy.pvk') ); const outputCertPath = await createDefaultCertificate('CN=Test', { From 6c6c79801110f49e9bddc991d589f4287731909a Mon Sep 17 00:00:00 2001 From: Mark Lee Date: Sun, 8 Apr 2018 11:01:22 -0400 Subject: [PATCH 35/40] Remove shell completion support (#447) tabtab is rather buggy and the alternative, commander-completion, needs a custom completion script to be written and maintained. --- package.json | 1 - packages/api/cli/package.json | 5 ++- packages/api/cli/src/electron-forge.js | 44 +++++++------------------- packages/api/core/tabtab-install.js | 21 ------------ yarn.lock | 23 ++------------ 5 files changed, 17 insertions(+), 77 deletions(-) delete mode 100644 packages/api/core/tabtab-install.js diff --git a/package.json b/package.json index 4f6e3259a2..4b06706f26 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,6 @@ "s3": "^4.4.0", "semver": "^5.3.0", "sudo-prompt": "^8.0.0", - "tabtab": "^2.2.1", "username": "^3.0.0", "yarn-or-npm": "^2.0.2", "zip-folder": "^1.0.0" diff --git a/packages/api/cli/package.json b/packages/api/cli/package.json index 174a6ad950..26bdbc0eed 100644 --- a/packages/api/cli/package.json +++ b/packages/api/cli/package.json @@ -25,10 +25,9 @@ "commander": "^2.9.0", "debug": "^3.0.0", "fs-extra": "^5.0.0", - "semver": "^5.3.0", - "tabtab": "^2.2.1" + "semver": "^5.3.0" }, "engines": { "node": ">= 6.0" } -} \ No newline at end of file +} diff --git a/packages/api/cli/src/electron-forge.js b/packages/api/cli/src/electron-forge.js index d82ae49ce8..644a6343ee 100644 --- a/packages/api/cli/src/electron-forge.js +++ b/packages/api/cli/src/electron-forge.js @@ -2,7 +2,6 @@ import 'colors'; import { asyncOra } from '@electron-forge/async-ora'; import program from 'commander'; -import tabtab from 'tabtab'; import './util/terminate'; @@ -37,36 +36,17 @@ program .command('publish', 'Publish the current Electron application to GitHub') .command('install', 'Install an Electron application from GitHub'); -const tab = tabtab({ - name: 'electron-forge', -}); -tab.on('electron-forge', (data, done) => { - if (data.line.split(' ').length <= 2) { - done( - null, - program.commands - .filter(cmd => cmd._name.startsWith(data.lastPartial)) - .map(cmd => `${cmd._name}:${cmd._description}`).sort() - ); - } else { - done(null, []); - } -}); -tab.start(); - -if (process.argv[2] !== 'completion') { - (async () => { - let goodSystem; - await asyncOra('Checking your system', async (ora) => { - goodSystem = await checkSystem(ora); - }); +(async () => { + let goodSystem; + await asyncOra('Checking your system', async (ora) => { + goodSystem = await checkSystem(ora); + }); - if (!goodSystem) { - console.error(('It looks like you are missing some dependencies you need to get Electron running.\n' + - 'Make sure you have git installed and Node.js version 6.0.0+').red); - process.exit(1); - } + if (!goodSystem) { + console.error(('It looks like you are missing some dependencies you need to get Electron running.\n' + + 'Make sure you have git installed and Node.js version 6.0.0+').red); + process.exit(1); + } - program.parse(process.argv); - })(); -} + program.parse(process.argv); +})(); diff --git a/packages/api/core/tabtab-install.js b/packages/api/core/tabtab-install.js deleted file mode 100644 index 4802f2ed25..0000000000 --- a/packages/api/core/tabtab-install.js +++ /dev/null @@ -1,21 +0,0 @@ -try { - const Complete = require('tabtab/src/complete'); - const Installer = require('tabtab/src/installer'); - - const options = { auto: true, name: 'electron-forge' }; - const complete = new Complete(options); - const installer = new Installer(options, complete); - - let shell = process.env.SHELL; - if (shell) shell = shell.split((process.platform !== 'win32') ? '/' : '\\').slice(-1)[0]; - - if (installer[shell]) { - installer.handle(options.name, options) - .catch(e => console.warn(`Failed to install tab completion: ${e}`)); - } else { - console.warn(`User shell ${shell} not supported, skipping completion install`); - } -} catch (err) { - console.log('tabtab install went wrong', err); - process.exit(0); -} diff --git a/yarn.lock b/yarn.lock index 1559164bd0..4892e5ed80 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3949,7 +3949,7 @@ init-package-json@~1.9.4: validate-npm-package-license "^3.0.1" validate-npm-package-name "^3.0.0" -inquirer@1.2.3, inquirer@^1.0.2: +inquirer@1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-1.2.3.tgz#4dec6f32f37ef7bb0b2ed3f1d1a5c3f545074918" dependencies: @@ -4721,10 +4721,6 @@ lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" -lodash.difference@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - lodash.endswith@^4.0.1, lodash.endswith@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" @@ -4826,7 +4822,7 @@ lodash.union@~4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" -lodash.uniq@^4.5.0, lodash.uniq@~4.5.0: +lodash.uniq@~4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" @@ -5712,7 +5708,7 @@ npmi@1.0.1: gauge "~2.7.3" set-blocking "~2.0.0" -"npmlog@0.1 || 1 || 2", npmlog@^2.0.3, npmlog@~2.0.4: +"npmlog@0.1 || 1 || 2", npmlog@~2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" dependencies: @@ -7509,19 +7505,6 @@ table@^3.7.8: slice-ansi "0.0.4" string-width "^2.0.0" -tabtab@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tabtab/-/tabtab-2.2.2.tgz#7a047f143b010b4cbd31f857e82961512cbf4e14" - dependencies: - debug "^2.2.0" - inquirer "^1.0.2" - lodash.difference "^4.5.0" - lodash.uniq "^4.5.0" - minimist "^1.2.0" - mkdirp "^0.5.1" - npmlog "^2.0.3" - object-assign "^4.1.0" - taffydb@2.7.2: version "2.7.2" resolved "https://registry.yarnpkg.com/taffydb/-/taffydb-2.7.2.tgz#7bf8106a5c1a48251b3e3bc0a0e1732489fd0dc8" From 2f614dc9181c406a7d142c32bd2f01e23a989537 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Wed, 11 Apr 2018 13:48:38 +1000 Subject: [PATCH 36/40] install new beta tagged bolt on CI --- .appveyor.yml | 2 +- .travis.yml | 2 +- ci/docker.sh | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.appveyor.yml b/.appveyor.yml index 325632ef4c..866c762d11 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -15,7 +15,7 @@ branches: install: - ps: Install-Product node $env:nodejs_version $env:platform - set PATH=%APPDATA%\npm;%PATH% -- npm i -g bolt +- npm i -g bolt@0.20.1 - ps: Remove-Item -Recurse -Force node_modules - bolt - bolt build diff --git a/.travis.yml b/.travis.yml index 16de0b4922..420eccb5a9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -22,7 +22,7 @@ branches: - v6 - /^v\d+\.\d+\.\d+/ install: -- npm i -g bolt +- npm i -g bolt@0.20.1 script: ci/script.sh after_success: ci/coverage.sh notifications: diff --git a/ci/docker.sh b/ci/docker.sh index 99fbf50950..0612097fbb 100755 --- a/ci/docker.sh +++ b/ci/docker.sh @@ -3,7 +3,7 @@ NODE_INSTALLER="$1" npm i -g yarn -npm i -g bolt +npm i -g bolt@0.20.1 cd /code From 3d27421bd6f445a507748e849948c24f73fecaf4 Mon Sep 17 00:00:00 2001 From: Mark Lee Date: Tue, 10 Apr 2018 21:07:48 -0700 Subject: [PATCH 37/40] Fix testing snap building in Travis --- ci/docker.sh | 2 +- mocha.opts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/docker.sh b/ci/docker.sh index 0612097fbb..cf5fa6a172 100755 --- a/ci/docker.sh +++ b/ci/docker.sh @@ -11,4 +11,4 @@ bolt bolt build bolt lint -CI=true bolt ws test -- --installer=$NODE_INSTALLER +DEBUG=electron-installer-snap:snapcraft CI=true bolt ws test -- --installer=$NODE_INSTALLER diff --git a/mocha.opts b/mocha.opts index 74f680e91e..5096a3f82f 100644 --- a/mocha.opts +++ b/mocha.opts @@ -1,2 +1,2 @@ --require @babel/register ---timeout 300000 +--timeout 800000 From 74e160c26b28face21343e0643a883d1e0fe7737 Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Wed, 11 Apr 2018 14:13:42 +1000 Subject: [PATCH 38/40] fix remove error --- .appveyor.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.appveyor.yml b/.appveyor.yml index 866c762d11..17f25253d8 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -16,7 +16,8 @@ install: - ps: Install-Product node $env:nodejs_version $env:platform - set PATH=%APPDATA%\npm;%PATH% - npm i -g bolt@0.20.1 -- ps: Remove-Item -Recurse -Force node_modules +- if not exist "node_modules" mkdir node_modules +- ps: Remove-Item node_modules -Recurse -Force - bolt - bolt build - ps: | From de2929c8a211ec955cd55896446fe3303823e44d Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Wed, 11 Apr 2018 16:11:09 +1000 Subject: [PATCH 39/40] Fix config passing in tests --- packages/api/core/test/slow/api_spec_slow.js | 6 ++-- packages/maker/appx/src/MakerAppX.js | 35 ++++++++++++++++---- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/packages/api/core/test/slow/api_spec_slow.js b/packages/api/core/test/slow/api_spec_slow.js index c83b75ee0b..36cedc1b3a 100644 --- a/packages/api/core/test/slow/api_spec_slow.js +++ b/packages/api/core/test/slow/api_spec_slow.js @@ -292,7 +292,7 @@ describe(`electron-forge API (with installer=${nodeInstaller})`, () => { const maker = new MakerClass(); return maker.isSupportedOnCurrentPlatform() === good; }) - .map(makerPath => ({ + .map(makerPath => () => ({ name: makerPath, config: { devCert, @@ -304,10 +304,10 @@ describe(`electron-forge API (with installer=${nodeInstaller})`, () => { const badMakers = getMakers(false); const testMakeTarget = function testMakeTarget(target, shouldPass, ...options) { - describe(`make (with target=${path.basename(target.name)})`, async () => { + describe(`make (with target=${path.basename(target().name)})`, async () => { before(async () => { const packageJSON = await readPackageJSON(dir); - packageJSON.config.forge.makers = [target]; + packageJSON.config.forge.makers = [target()]; await fs.writeFile(path.resolve(dir, 'package.json'), JSON.stringify(packageJSON)); }); diff --git a/packages/maker/appx/src/MakerAppX.js b/packages/maker/appx/src/MakerAppX.js index fe1eaba11f..ff9f804708 100644 --- a/packages/maker/appx/src/MakerAppX.js +++ b/packages/maker/appx/src/MakerAppX.js @@ -11,17 +11,38 @@ import getNameFromAuthor from './util/author-name'; // NB: This is not a typo, we require AppXs to be built on 64-bit // but if we're running in a 32-bit node.js process, we're going to // be Wow64 redirected -const windowsSdkPath = process.arch === 'x64' ? - 'C:\\Program Files (x86)\\Windows Kits\\10\\bin\\x64' : - 'C:\\Program Files\\Windows Kits\\10\\bin\\x64'; +const windowsSdkPaths = [ + 'C:\\Program Files (x86)\\Windows Kits\\10\\bin\\x64', + 'C:\\Program Files\\Windows Kits\\10\\bin\\x64' +]; async function findSdkTool(exe) { - let sdkTool = path.join(windowsSdkPath, exe); - if (!await fs.exists(sdkTool)) { - sdkTool = resolveCommand(exe, true); + let sdkTool + for (const testPath of windowsSdkPaths) { + if (await fs.exists(testPath)) { + let testExe = path.resolve(testPath, exe); + if (await fs.exists(testExe)) { + sdkTool = testPath; + break; + } + const topDir = path.dirname(testPath); + for (const subVersion of await fs.readdir(topDir)) { + if (!(await fs.stat(path.resolve(topDir, subVersion))).isDirectory()) continue; + if (subVersion.substr(0, 2) !== '10') continue; + + testExe = path.resolve(topDir, subVersion, 'x64', 'makecert.exe'); + if (await fs.exists(testExe)) { + sdkTool = testExe; + break; + } + } + } + } + if (!sdkTool || !await fs.exists(sdkTool)) { + sdkTool = resolveCommand({ command: exe, options: { cwd: null } }, true); } - if (!await fs.exists(sdkTool)) { + if (!sdkTool || !await fs.exists(sdkTool)) { throw `Can't find ${exe} in PATH. You probably need to install the Windows SDK.`; } From 1b924da050b6e31e533e8f6771f84fcf8aed7a8a Mon Sep 17 00:00:00 2001 From: Samuel Attard Date: Wed, 11 Apr 2018 16:22:07 +1000 Subject: [PATCH 40/40] fix search order --- packages/maker/appx/src/MakerAppX.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/maker/appx/src/MakerAppX.js b/packages/maker/appx/src/MakerAppX.js index ff9f804708..522a440c52 100644 --- a/packages/maker/appx/src/MakerAppX.js +++ b/packages/maker/appx/src/MakerAppX.js @@ -12,23 +12,23 @@ import getNameFromAuthor from './util/author-name'; // but if we're running in a 32-bit node.js process, we're going to // be Wow64 redirected const windowsSdkPaths = [ + 'C:\\Program Files\\Windows Kits\\10\\bin\\x64', 'C:\\Program Files (x86)\\Windows Kits\\10\\bin\\x64', - 'C:\\Program Files\\Windows Kits\\10\\bin\\x64' ]; async function findSdkTool(exe) { - let sdkTool + let sdkTool; for (const testPath of windowsSdkPaths) { if (await fs.exists(testPath)) { let testExe = path.resolve(testPath, exe); if (await fs.exists(testExe)) { - sdkTool = testPath; + sdkTool = testExe; break; } const topDir = path.dirname(testPath); for (const subVersion of await fs.readdir(topDir)) { - if (!(await fs.stat(path.resolve(topDir, subVersion))).isDirectory()) continue; - if (subVersion.substr(0, 2) !== '10') continue; + if (!(await fs.stat(path.resolve(topDir, subVersion))).isDirectory()) continue; // eslint-disable-line no-continue + if (subVersion.substr(0, 2) !== '10') continue; // eslint-disable-line no-continue testExe = path.resolve(topDir, subVersion, 'x64', 'makecert.exe'); if (await fs.exists(testExe)) {