From 61e4b33da4605506c6e5a93e7dfd1c0d19fed530 Mon Sep 17 00:00:00 2001 From: Jorge Antunes Date: Fri, 24 Nov 2017 22:26:52 +0000 Subject: [PATCH] dev-toolkit v6 - The Journey of how version 6 came to be (#39) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The creation of dev-toolkit v6, a long-running PR https://github.com/stoikerty/dev-toolkit/pull/39 - remove all files - blank slate - add simple test and some initial dependencies - add .travis.yml file - customize yml - try env for testing subdirectory - cache yarn - try suggestion from yarn docs https://yarnpkg.com/en/docs/install-ci#travis-tab - specify node v7.8.0 - try a neutrino async project - add reference - Check out react-loadable example - check out next and preact - start creating binary commands for running dev-toolkit, all in new syntax - add minimal starting point - add package lock file - update eslint - use npm's package-lock instead of yarn's lock file - add sinon dependencies for testing - add eslint configuration to support root-relative-imports in test files - remove test-config in favour of setupTests utility - refactor main dev-toolkit comand - add dev-toolkit command tests + sandbox utility - make individual tests smaller - change travis config to node 8 - turn eslint extension rule off - remove yarn from travis config - fix some eslint issues temporarily - add some additional tests - fix test - add editor workspace settings - add a way to test command on starting-point - start working on watch-script, add babel-preset-stage-1 - start adding help utility - improve runCommadWithSpawn - add - change error message - display errors not specific to existance of server-file - various logging improvements - use specific babel-config, better errors - package.lock, change tick for star - serve the layout file for now - get javascript working with assets plugin - manifest does not work as expected, PR in plugin is still WIP - uncomment this line for now as it needs more work - remove console.log - add build-script, refactor - run compiler in correct order to prevent writing build files - small fixes - `log`-improvements - rename folder - remove unused manifest file - remove experimental test projects - use `latest` babel preset - change url to be a regular url - change folder name in script - add babel-runner package to simplify using babel for everything - change underline character - time to clean up & simplify - remove remaining old scripts - start refactoring using babel-runner - use correct syntax, remove console.log's - Add bundle-loader configuration - integrate babel-runner into project - add command, map require.resolve - publish beta versions of both packages - reduce dependencies, publish beta v4 - use correct terminology "preRender", simplify - remove jsx-control-statements from minimal starting point - simplify minimal app further - start figuring out environment vars - simplify server-usage, create dev-toolkit preset - move examples into root, start working on tests - update deps, re-use old babelrc - start using lerna again - get example working again, using lerna & link - fix some errors, add simple server-side Hot Reload - add ability to strip comments from examples, simplify + eslint fixes - update packages, publish - remove yarn lock file - update package.lock, don't use root-relative paths for SSR hot-reload - add contributing docs, use .nvmrc - fix typo - figure out CI bug with missing directory - permission-fix for CI - add script to CI config - add first feature-test for `npm install dev-toolkit` - update travis config - add 2 minutes timeout - ignore test folder - go back to root folder for bootstrapping - add more feature tests, one for `dev-toolkit --version` - reverse order of tests - refactor test-suite for easier addition of future tests - start adding help to command-line utility - make new commands work - put assets manifest in build folder to facilitate alternate usage - fix test - allow extending an app with `dev-toolkit.config.js` - add `babel-plugin-dynamic-import-node` to `babel-preset-dev-toolkit` - Use better settings via `dev-toolkit/settings`, add `serve` command, make use of `sharedEnvs` - add init command help with temporary message - update to `6.0.0-beta-19` - remove typo - add ability to use `dev-toolkit` programmatically - add ability to use `preRender` separately - prevent logging before preRender finished - work on init command, try working without spawn - add enhanced `init` command - remove accidental files - have minimal example in addition to standard example - start adding more examples (serverless) - add some test-scenarios, refactor examples - add more examples - use prettier for the whole project! add eslint to `standard` example - use `--template` in favour of `--example`, change a bunch of forgotten files to use prettier - bump version - make loaders & plugins callbacks, start with simple example config - replace decache with `clear-module`, use nodeHooks - Small tweaks, use `cross-env` and `better-npm-run` - add `with-sass` template - Add clean-commands to root of project, update lock-files - update templates readme - Update lint command in dev-toolkit package - use node v8.6.0 - Add `root-clean` command - bump version to `dev-toolkit@6.0.0-beta-32` - Add `run` command, ability to silence logging from `dev-toolkit` itself - add comments to existing test - add comment - remove unused command - refactor tests to be more extensible - babel-runner: support classic require(โ€ฆ)() callback, use prettier - babel-preset-dev-toolkit: Better comments, use prettier - Refactor tests in preparation for template tests - add initialization tests for all templates - try a timeout of 2 minutes - put timeouts in `it`-block - log output - disable logging - add longer timeout to default template a well - reduce long timeout to 1 minute - update lock-files - Update tests, use shorter timeout for default template only - relax some rules - Update lock files once more - add prettier ignore - Update aslant config in feature-tests - small change in package.json - Refactor clean commands, enhance .travis.yml - try out Travis-Ci's stages feature - make stages leaner, refactor - make stages even leaner - don't forget installing root deps - try running stages in parallel - test naming parallel tasks - does not specifying env work? - put env in script - remove `-` - lint feature tests separately - split into many parallel running pieces - fix travis syntax - remove `-` once more - revert to defining multiple stages - combine packages & templates tasks - add prettier to some packages - add missing stage section - add lint commands, process files - change order of tasks - shorten linting tasks by only installing dev-dependencies - put prettier in dev-dependencies - use regular `npm install` after all - skip some installation steps - skip install globally - use specific command in install step - add ability to run boostrap programmatically - bump version - Fix trailing comma issue, republish - start drafting out a readme - fix `includePaths` - use sub, small typo - add some initial documentation files - add some information concerning choices - Reduce workload by using leaner docs in beginning - readme additions - change titles - simplify title - get packages ready for publishing dev-toolkit v6 - remove unused my_app - bump to `6.0.0-beta-47` - add note to quick start - use project name in generated project `package.json` - renme folder - bump to v6.0.0 and release ๐ŸŽ‰ - bump to 6.0.1 - copy Readme into package - add with-eslint template to Travis config - fix eslint issue on 6.0.2 - add badges to readme --- .gitignore | 2 + .nvmrc | 1 + .prettierignore | 2 + .prettierrc | 5 + .travis.yml | 76 + CODEOWNERS | 1 + CONTRIBUTING.md | 29 +- LICENSE | 15 - README.md | 204 - Readme.md | 85 + documentation (wip)/choices-made.md | 41 + documentation (wip)/commands.md | 5 + documentation (wip)/error-help.md | 13 + documentation (wip)/extending-with-config.md | 2 + documentation (wip)/how-it-works.md | 15 + documentation (wip)/templates.md | 56 + documentation (wip)/under-the-hood.md | 2 + feature-tests/.eslintrc | 11 + feature-tests/.prettierrc | 6 + feature-tests/babel-register.js | 2 + feature-tests/babelrc.js | 15 + feature-tests/package-lock.json | 2515 ++++++++ feature-tests/package.json | 30 + feature-tests/src/index.spec.js | 23 + .../packages/dev-toolkit/commands/index.js | 1 + .../packages/dev-toolkit/commands/version.js | 15 + .../src/packages/dev-toolkit/index.js | 9 + .../dev-toolkit/installation/index.js | 31 + feature-tests/src/templates/all/index.js | 58 + feature-tests/src/templates/index.js | 34 + .../templates/standard/installation/index.js | 13 + feature-tests/src/utils/index.js | 32 + lerna.json | 3 +- package-lock.json | 2807 ++++++++ package.json | 36 +- packages/babel-preset-dev-toolkit/.prettierrc | 6 + packages/babel-preset-dev-toolkit/Readme.md | 3 + packages/babel-preset-dev-toolkit/index.js | 38 + .../package-lock.json | 1158 ++++ .../babel-preset-dev-toolkit/package.json | 37 + packages/babel-runner/.babelrc | 3 + packages/babel-runner/.eslintrc | 12 + packages/babel-runner/.prettierrc | 6 + packages/babel-runner/Readme.md | 17 + packages/babel-runner/package-lock.json | 3918 ++++++++++++ packages/babel-runner/package.json | 48 + packages/babel-runner/src/bin/index.js | 9 + packages/babel-runner/src/index.js | 58 + packages/dev-toolkit/.babelrc | 4 + packages/dev-toolkit/.eslintrc | 27 +- packages/dev-toolkit/.mocha.opts | 3 + packages/dev-toolkit/.npmignore | 6 - packages/dev-toolkit/.prettierrc | 6 + packages/dev-toolkit/Next-Readme-Draft.md | 105 - packages/dev-toolkit/README.md | 185 - packages/dev-toolkit/Readme.md | 79 + packages/dev-toolkit/babelrc.js | 16 - packages/dev-toolkit/bin/dev-toolkit.js | 118 - packages/dev-toolkit/bin/scripts/build.js | 8 - packages/dev-toolkit/bin/scripts/init.js | 52 - packages/dev-toolkit/bin/scripts/serve.js | 6 - .../dev-toolkit/bin/scripts/serveStatic.js | 6 - packages/dev-toolkit/bin/scripts/watch.js | 6 - packages/dev-toolkit/bin/utils/bootstrap.js | 20 - packages/dev-toolkit/bin/utils/debug.js | 12 - packages/dev-toolkit/dev-toolkit-logo.png | Bin 16413 -> 0 bytes packages/dev-toolkit/dev-toolkit.js | 5 + packages/dev-toolkit/package-lock.json | 5663 +++++++++++++++++ packages/dev-toolkit/package.json | 146 +- packages/dev-toolkit/settings.js | 2 +- packages/dev-toolkit/src/_userSettings.js | 111 - packages/dev-toolkit/src/bin/index.js | 125 + packages/dev-toolkit/src/bin/index.spec.js | 109 + packages/dev-toolkit/src/build.js | 47 - .../dev-toolkit/src/commands/bootstrap.js | 23 + packages/dev-toolkit/src/commands/build.js | 49 + packages/dev-toolkit/src/commands/init.js | 90 + .../dev-toolkit/src/commands/preRender.js | 15 + packages/dev-toolkit/src/commands/serve.js | 17 + packages/dev-toolkit/src/commands/version.js | 7 + packages/dev-toolkit/src/commands/watch.js | 70 + .../src/npmExport/dev-toolkit/index.js | 6 + .../src/npmExport/dev-toolkit/settings.js | 37 + .../src/postinstall-prepare/copy-templates.js | 61 + packages/dev-toolkit/src/serve.js | 22 - packages/dev-toolkit/src/serveStatic.js | 43 - packages/dev-toolkit/src/src/settings.js | 14 - .../defineGlobalDevToolkitSettings.js | 5 + .../bootstrap/extractedSharedEnvs.js | 4 + .../utilities/bootstrap/getUserSettings.js | 54 + .../utilities/bootstrap/importServerApp.js | 24 + .../src/utilities/bootstrap/index.js | 16 + .../src/utilities/getWebpackAssets.js | 20 + packages/dev-toolkit/src/utilities/help.js | 21 + packages/dev-toolkit/src/utilities/index.js | 7 + .../dev-toolkit/src/utilities/log/error.js | 8 + .../dev-toolkit/src/utilities/log/index.js | 20 + .../dev-toolkit/src/utilities/log/message.js | 32 + .../dev-toolkit/src/utilities/preRender.js | 23 + .../dev-toolkit/src/utilities/runCommand.js | 28 + packages/dev-toolkit/src/utilities/spinner.js | 48 + .../src/utilities/testHelpers/sandbox.js | 66 + .../src/utilities/testHelpers/setupTests.js | 5 + packages/dev-toolkit/src/utils/debug.js | 3 - .../src/utils/testHelpers/setupClientApp.js | 7 - .../src/utils/testHelpers/setupDOM.js | 7 - .../src/utils/testHelpers/setupTests.js | 11 - packages/dev-toolkit/src/watch.js | 22 - packages/dev-toolkit/src/webpack/config.js | 172 +- .../webpack/config/extensionHooks/cssHook.js | 45 - .../config/extensionHooks/filesHook.js | 20 - .../webpack/config/extensionHooks/index.js | 2 - .../dev-toolkit/src/webpack/config/loaders.js | 68 - .../src/webpack/config/loaders/eslint.js | 26 - .../src/webpack/config/loaders/postcss.js | 13 - .../src/webpack/config/loaders/sass.js | 7 - .../dev-toolkit/src/webpack/config/plugins.js | 117 - .../dev-toolkit/src/webpack/config/resolve.js | 24 - .../src/webpack/config/resolveLoader.js | 14 - .../dev-toolkit/src/webpack/config/stats.js | 19 - .../src/webpack/projectSettings.js | 34 + packages/dev-toolkit/starting-point/.eslintrc | 30 - .../dev-toolkit/starting-point/.gitignore | 13 - .../dev-toolkit/starting-point/package.json | 40 - .../src/client/RouterContainer.jsx | 29 - .../starting-point/src/client/app.jsx | 71 - .../starting-point/src/client/routes.jsx | 24 - .../src/client/style/_config.scss | 51 - .../src/client/style/global.scss | 41 - .../client/style/mixins/_font-settings.scss | 64 - .../src/client/style/mixins/_helpers.scss | 425 -- .../starting-point/src/client/views/Shell.jsx | 26 - .../src/client/views/Shell/_style.scss | 16 - .../src/client/views/features/Home.jsx | 18 - .../client/views/features/Home/_style.scss | 11 - .../starting-point/src/server/app.js | 22 - .../starting-point/src/server/bootstrap.js | 70 - .../src/server/public-files/Favicon.png | Bin 160111 -> 0 bytes .../src/server/public-files/favicon.ico | Bin 15086 -> 0 bytes .../starting-point/src/server/router.jsx | 30 - .../src/server/views/layout.hbs | 46 - .../starting-point/src/settings.js | 4 - packages/dynamic-pages/.eslintignore | 1 - packages/dynamic-pages/.npmignore | 6 - packages/dynamic-pages/Readme.md | 8 - packages/dynamic-pages/package.json | 40 - packages/dynamic-pages/src/dynamicPages.js | 202 - .../src/dynamicPages/generateFiles.js | 296 - .../eslint-config-dev-toolkit/.prettierrc | 6 + packages/eslint-config-dev-toolkit/Readme.md | 3 + packages/eslint-config-dev-toolkit/index.js | 25 + .../package-lock.json | 14 + .../eslint-config-dev-toolkit/package.json | 42 + templates/minimal/.babelrc | 1 + templates/minimal/.gitignore | 7 + templates/minimal/.prettierrc | 6 + templates/minimal/package.json | 25 + templates/minimal/src/client/RootComponent.js | 12 + templates/minimal/src/client/index.js | 23 + templates/minimal/src/client/views/App.js | 4 + templates/minimal/src/server/index.js | 75 + .../minimal/src/server/views/template.hbs | 12 + templates/serverless/.babelrc | 1 + templates/serverless/.gitignore | 7 + templates/serverless/.prettierrc | 6 + templates/serverless/handler.js | 9 + templates/serverless/package.json | 26 + .../serverless/src/client/RootComponent.js | 12 + templates/serverless/src/client/index.js | 23 + templates/serverless/src/client/views/App.js | 4 + templates/serverless/src/server/index.js | 57 + templates/serverless/src/server/preRender.js | 28 + .../serverless/src/server/views/template.hbs | 12 + templates/standard/.babelrc | 1 + templates/standard/.gitignore | 7 + templates/standard/.prettierrc | 6 + templates/standard/dev-toolkit.config.js | 16 + templates/standard/package.json | 48 + .../standard/src/client/RootComponent.js | 17 + templates/standard/src/client/index.js | 23 + templates/standard/src/client/views/App.js | 18 + templates/standard/src/server/index.js | 103 + .../standard/src/server/views/template.hbs | 12 + templates/standard/src/settings.js | 9 + templates/with-eslint/.babelrc | 1 + templates/with-eslint/.eslintrc | 8 + templates/with-eslint/.gitignore | 7 + templates/with-eslint/.prettierrc | 6 + templates/with-eslint/dev-toolkit.config.js | 16 + templates/with-eslint/package.json | 58 + .../with-eslint/src/client/RootComponent.js | 17 + templates/with-eslint/src/client/index.js | 23 + templates/with-eslint/src/client/views/App.js | 18 + templates/with-eslint/src/server/index.js | 103 + .../with-eslint/src/server/views/template.hbs | 12 + templates/with-eslint/src/settings.js | 9 + templates/with-sass/.babelrc | 1 + templates/with-sass/.gitignore | 7 + templates/with-sass/.prettierrc | 6 + templates/with-sass/dev-toolkit.config.js | 57 + templates/with-sass/nodeHooks.js | 27 + templates/with-sass/package.json | 35 + templates/with-sass/postcss.config.js | 3 + .../with-sass/src/client/RootComponent.js | 16 + templates/with-sass/src/client/index.js | 23 + templates/with-sass/src/client/views/App.js | 22 + .../with-sass/src/client/views/style.scss | 102 + templates/with-sass/src/server/index.js | 103 + .../with-sass/src/server/views/template.hbs | 19 + 209 files changed, 19609 insertions(+), 3195 deletions(-) create mode 100644 .nvmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .travis.yml create mode 100644 CODEOWNERS delete mode 100644 LICENSE delete mode 100644 README.md create mode 100644 Readme.md create mode 100644 documentation (wip)/choices-made.md create mode 100644 documentation (wip)/commands.md create mode 100644 documentation (wip)/error-help.md create mode 100644 documentation (wip)/extending-with-config.md create mode 100644 documentation (wip)/how-it-works.md create mode 100644 documentation (wip)/templates.md create mode 100644 documentation (wip)/under-the-hood.md create mode 100644 feature-tests/.eslintrc create mode 100644 feature-tests/.prettierrc create mode 100644 feature-tests/babel-register.js create mode 100644 feature-tests/babelrc.js create mode 100644 feature-tests/package-lock.json create mode 100644 feature-tests/package.json create mode 100644 feature-tests/src/index.spec.js create mode 100644 feature-tests/src/packages/dev-toolkit/commands/index.js create mode 100644 feature-tests/src/packages/dev-toolkit/commands/version.js create mode 100644 feature-tests/src/packages/dev-toolkit/index.js create mode 100644 feature-tests/src/packages/dev-toolkit/installation/index.js create mode 100644 feature-tests/src/templates/all/index.js create mode 100644 feature-tests/src/templates/index.js create mode 100644 feature-tests/src/templates/standard/installation/index.js create mode 100644 feature-tests/src/utils/index.js create mode 100644 package-lock.json create mode 100644 packages/babel-preset-dev-toolkit/.prettierrc create mode 100644 packages/babel-preset-dev-toolkit/Readme.md create mode 100644 packages/babel-preset-dev-toolkit/index.js create mode 100644 packages/babel-preset-dev-toolkit/package-lock.json create mode 100644 packages/babel-preset-dev-toolkit/package.json create mode 100644 packages/babel-runner/.babelrc create mode 100644 packages/babel-runner/.eslintrc create mode 100644 packages/babel-runner/.prettierrc create mode 100644 packages/babel-runner/Readme.md create mode 100644 packages/babel-runner/package-lock.json create mode 100644 packages/babel-runner/package.json create mode 100644 packages/babel-runner/src/bin/index.js create mode 100644 packages/babel-runner/src/index.js create mode 100644 packages/dev-toolkit/.babelrc create mode 100644 packages/dev-toolkit/.mocha.opts delete mode 100644 packages/dev-toolkit/.npmignore create mode 100644 packages/dev-toolkit/.prettierrc delete mode 100644 packages/dev-toolkit/Next-Readme-Draft.md delete mode 100644 packages/dev-toolkit/README.md create mode 100644 packages/dev-toolkit/Readme.md delete mode 100644 packages/dev-toolkit/babelrc.js delete mode 100755 packages/dev-toolkit/bin/dev-toolkit.js delete mode 100644 packages/dev-toolkit/bin/scripts/build.js delete mode 100644 packages/dev-toolkit/bin/scripts/init.js delete mode 100644 packages/dev-toolkit/bin/scripts/serve.js delete mode 100644 packages/dev-toolkit/bin/scripts/serveStatic.js delete mode 100644 packages/dev-toolkit/bin/scripts/watch.js delete mode 100644 packages/dev-toolkit/bin/utils/bootstrap.js delete mode 100644 packages/dev-toolkit/bin/utils/debug.js delete mode 100644 packages/dev-toolkit/dev-toolkit-logo.png create mode 100644 packages/dev-toolkit/dev-toolkit.js create mode 100644 packages/dev-toolkit/package-lock.json delete mode 100644 packages/dev-toolkit/src/_userSettings.js create mode 100644 packages/dev-toolkit/src/bin/index.js create mode 100644 packages/dev-toolkit/src/bin/index.spec.js delete mode 100644 packages/dev-toolkit/src/build.js create mode 100644 packages/dev-toolkit/src/commands/bootstrap.js create mode 100644 packages/dev-toolkit/src/commands/build.js create mode 100644 packages/dev-toolkit/src/commands/init.js create mode 100644 packages/dev-toolkit/src/commands/preRender.js create mode 100644 packages/dev-toolkit/src/commands/serve.js create mode 100644 packages/dev-toolkit/src/commands/version.js create mode 100644 packages/dev-toolkit/src/commands/watch.js create mode 100644 packages/dev-toolkit/src/npmExport/dev-toolkit/index.js create mode 100644 packages/dev-toolkit/src/npmExport/dev-toolkit/settings.js create mode 100644 packages/dev-toolkit/src/postinstall-prepare/copy-templates.js delete mode 100644 packages/dev-toolkit/src/serve.js delete mode 100644 packages/dev-toolkit/src/serveStatic.js delete mode 100644 packages/dev-toolkit/src/src/settings.js create mode 100644 packages/dev-toolkit/src/utilities/bootstrap/defineGlobalDevToolkitSettings.js create mode 100644 packages/dev-toolkit/src/utilities/bootstrap/extractedSharedEnvs.js create mode 100644 packages/dev-toolkit/src/utilities/bootstrap/getUserSettings.js create mode 100644 packages/dev-toolkit/src/utilities/bootstrap/importServerApp.js create mode 100644 packages/dev-toolkit/src/utilities/bootstrap/index.js create mode 100644 packages/dev-toolkit/src/utilities/getWebpackAssets.js create mode 100644 packages/dev-toolkit/src/utilities/help.js create mode 100644 packages/dev-toolkit/src/utilities/index.js create mode 100644 packages/dev-toolkit/src/utilities/log/error.js create mode 100644 packages/dev-toolkit/src/utilities/log/index.js create mode 100644 packages/dev-toolkit/src/utilities/log/message.js create mode 100644 packages/dev-toolkit/src/utilities/preRender.js create mode 100644 packages/dev-toolkit/src/utilities/runCommand.js create mode 100644 packages/dev-toolkit/src/utilities/spinner.js create mode 100644 packages/dev-toolkit/src/utilities/testHelpers/sandbox.js create mode 100644 packages/dev-toolkit/src/utilities/testHelpers/setupTests.js delete mode 100644 packages/dev-toolkit/src/utils/debug.js delete mode 100644 packages/dev-toolkit/src/utils/testHelpers/setupClientApp.js delete mode 100644 packages/dev-toolkit/src/utils/testHelpers/setupDOM.js delete mode 100644 packages/dev-toolkit/src/utils/testHelpers/setupTests.js delete mode 100644 packages/dev-toolkit/src/watch.js delete mode 100644 packages/dev-toolkit/src/webpack/config/extensionHooks/cssHook.js delete mode 100644 packages/dev-toolkit/src/webpack/config/extensionHooks/filesHook.js delete mode 100644 packages/dev-toolkit/src/webpack/config/extensionHooks/index.js delete mode 100644 packages/dev-toolkit/src/webpack/config/loaders.js delete mode 100644 packages/dev-toolkit/src/webpack/config/loaders/eslint.js delete mode 100644 packages/dev-toolkit/src/webpack/config/loaders/postcss.js delete mode 100644 packages/dev-toolkit/src/webpack/config/loaders/sass.js delete mode 100644 packages/dev-toolkit/src/webpack/config/plugins.js delete mode 100644 packages/dev-toolkit/src/webpack/config/resolve.js delete mode 100644 packages/dev-toolkit/src/webpack/config/resolveLoader.js delete mode 100644 packages/dev-toolkit/src/webpack/config/stats.js create mode 100644 packages/dev-toolkit/src/webpack/projectSettings.js delete mode 100644 packages/dev-toolkit/starting-point/.eslintrc delete mode 100644 packages/dev-toolkit/starting-point/.gitignore delete mode 100644 packages/dev-toolkit/starting-point/package.json delete mode 100644 packages/dev-toolkit/starting-point/src/client/RouterContainer.jsx delete mode 100644 packages/dev-toolkit/starting-point/src/client/app.jsx delete mode 100644 packages/dev-toolkit/starting-point/src/client/routes.jsx delete mode 100644 packages/dev-toolkit/starting-point/src/client/style/_config.scss delete mode 100644 packages/dev-toolkit/starting-point/src/client/style/global.scss delete mode 100644 packages/dev-toolkit/starting-point/src/client/style/mixins/_font-settings.scss delete mode 100644 packages/dev-toolkit/starting-point/src/client/style/mixins/_helpers.scss delete mode 100644 packages/dev-toolkit/starting-point/src/client/views/Shell.jsx delete mode 100644 packages/dev-toolkit/starting-point/src/client/views/Shell/_style.scss delete mode 100644 packages/dev-toolkit/starting-point/src/client/views/features/Home.jsx delete mode 100644 packages/dev-toolkit/starting-point/src/client/views/features/Home/_style.scss delete mode 100644 packages/dev-toolkit/starting-point/src/server/app.js delete mode 100644 packages/dev-toolkit/starting-point/src/server/bootstrap.js delete mode 100644 packages/dev-toolkit/starting-point/src/server/public-files/Favicon.png delete mode 100644 packages/dev-toolkit/starting-point/src/server/public-files/favicon.ico delete mode 100644 packages/dev-toolkit/starting-point/src/server/router.jsx delete mode 100644 packages/dev-toolkit/starting-point/src/server/views/layout.hbs delete mode 100644 packages/dev-toolkit/starting-point/src/settings.js delete mode 100644 packages/dynamic-pages/.eslintignore delete mode 100644 packages/dynamic-pages/.npmignore delete mode 100644 packages/dynamic-pages/Readme.md delete mode 100644 packages/dynamic-pages/package.json delete mode 100644 packages/dynamic-pages/src/dynamicPages.js delete mode 100644 packages/dynamic-pages/src/dynamicPages/generateFiles.js create mode 100644 packages/eslint-config-dev-toolkit/.prettierrc create mode 100644 packages/eslint-config-dev-toolkit/Readme.md create mode 100644 packages/eslint-config-dev-toolkit/index.js create mode 100644 packages/eslint-config-dev-toolkit/package-lock.json create mode 100644 packages/eslint-config-dev-toolkit/package.json create mode 100644 templates/minimal/.babelrc create mode 100644 templates/minimal/.gitignore create mode 100644 templates/minimal/.prettierrc create mode 100644 templates/minimal/package.json create mode 100644 templates/minimal/src/client/RootComponent.js create mode 100644 templates/minimal/src/client/index.js create mode 100644 templates/minimal/src/client/views/App.js create mode 100644 templates/minimal/src/server/index.js create mode 100644 templates/minimal/src/server/views/template.hbs create mode 100644 templates/serverless/.babelrc create mode 100644 templates/serverless/.gitignore create mode 100644 templates/serverless/.prettierrc create mode 100644 templates/serverless/handler.js create mode 100644 templates/serverless/package.json create mode 100644 templates/serverless/src/client/RootComponent.js create mode 100644 templates/serverless/src/client/index.js create mode 100644 templates/serverless/src/client/views/App.js create mode 100644 templates/serverless/src/server/index.js create mode 100644 templates/serverless/src/server/preRender.js create mode 100644 templates/serverless/src/server/views/template.hbs create mode 100644 templates/standard/.babelrc create mode 100644 templates/standard/.gitignore create mode 100644 templates/standard/.prettierrc create mode 100644 templates/standard/dev-toolkit.config.js create mode 100644 templates/standard/package.json create mode 100644 templates/standard/src/client/RootComponent.js create mode 100644 templates/standard/src/client/index.js create mode 100644 templates/standard/src/client/views/App.js create mode 100644 templates/standard/src/server/index.js create mode 100644 templates/standard/src/server/views/template.hbs create mode 100644 templates/standard/src/settings.js create mode 100644 templates/with-eslint/.babelrc create mode 100644 templates/with-eslint/.eslintrc create mode 100644 templates/with-eslint/.gitignore create mode 100644 templates/with-eslint/.prettierrc create mode 100644 templates/with-eslint/dev-toolkit.config.js create mode 100644 templates/with-eslint/package.json create mode 100644 templates/with-eslint/src/client/RootComponent.js create mode 100644 templates/with-eslint/src/client/index.js create mode 100644 templates/with-eslint/src/client/views/App.js create mode 100644 templates/with-eslint/src/server/index.js create mode 100644 templates/with-eslint/src/server/views/template.hbs create mode 100644 templates/with-eslint/src/settings.js create mode 100644 templates/with-sass/.babelrc create mode 100644 templates/with-sass/.gitignore create mode 100644 templates/with-sass/.prettierrc create mode 100644 templates/with-sass/dev-toolkit.config.js create mode 100644 templates/with-sass/nodeHooks.js create mode 100644 templates/with-sass/package.json create mode 100644 templates/with-sass/postcss.config.js create mode 100644 templates/with-sass/src/client/RootComponent.js create mode 100644 templates/with-sass/src/client/index.js create mode 100644 templates/with-sass/src/client/views/App.js create mode 100644 templates/with-sass/src/client/views/style.scss create mode 100644 templates/with-sass/src/server/index.js create mode 100644 templates/with-sass/src/server/views/template.hbs diff --git a/.gitignore b/.gitignore index d81e9288..4a0344c0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,9 @@ ## Generated Files ############# +temporary-test-dir/ dist/ +build/ ############# ## Node diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..acd405b1 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +8.6.0 diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..cce02790 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +package.json +package-lock.json diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..789ac2e5 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..f4c66ed6 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,76 @@ +language: node_js +sudo: false +install: + - echo 'skip installation' + +jobs: + include: + - stage: Testing dev-toolkit... + env: Run feature-tests + script: + - cd feature-tests + - npm install + - npm run test + + - stage: Testing dev-toolkit... + env: Test bootstrapping the project + script: + - npm install + - npm run bootstrap + + - stage: Testing dev-toolkit... + env: Lint feature-tests + script: + - cd feature-tests + - npm install + - npm run lint + + - stage: Testing dev-toolkit... + env: Lint packages + script: + - cd packages/babel-preset-dev-toolkit + - npm install + - npm run lint + - cd ../.. + + - cd packages/babel-runner + - npm install + - npm run lint + - cd ../.. + + - cd packages/dev-toolkit + - npm install + - npm run lint + - cd ../.. + + - cd packages/eslint-config-dev-toolkit + - npm install + - npm run lint + + - stage: Testing dev-toolkit... + env: Lint templates + script: + - cd templates/standard + - npm install + - npm run lint + - cd ../.. + + - cd templates/with-eslint + - npm install + - npm run lint + - cd ../.. + + - cd templates/with-sass + - npm install + - npm run lint + - cd ../.. + + - cd templates/minimal + - npm install + - npm run lint + - cd ../.. + + - cd templates/serverless + - npm install + - npm run lint + - cd ../.. diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000..19bd418c --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1 @@ +* @stoikerty diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ea201928..c0209248 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,21 +1,14 @@ -# How to contribute -Thanks for wanting to help improve the toolkit! ๐Ÿ˜ƒ -
Below are some instructions to get you started. +# Installation +```bash +# use the correct node version for this project +nvm use -### Installation -First, let's install and link the `dev-toolkit`. The repo contains multiple packages & [lerna](https://github.com/lerna/lerna) is the tool of choice to handle these. Have a look at the root `package.json`-file for a list of all used `npm run` commands. For the basics, you'll want to: -- git clone [**`dev-toolkit`**](https://github.com/stoikerty/dev-toolkit) repo into a folder (example: `repos/local_modules/dev-toolkit`) -- run `npm install` to install lerna, then run `npm run install` all the dependencies for all packages and cross-link them. You might have to run the second command with elevated privileges (`sudo`) if you encounter any issues. The installation will take a bit of time โ˜•๏ธ
Don't worry it's not stuck, `lerna` just doesn't display the installation output. -- You now have the `dev-toolkit`-command available to you. Try using the command `dev-toolkit -v`. -- If not available, use can either try linking the packages directly by using `npm run link` or retrying the previous step with `sudo`. -- You might also want to link a package to your project specifically by running `npm link dev-toolkit` or `npm link dynamic-pages` inside your project folder. +# clone repo, inside the repo folder run +npm i && npm run boostrap -Preparation done. +# if you encounter permission issues, try this in the repo foler +npm run fix-permissions +``` -### Development -This is very much an iteration phase, you'll encounter mystical errors that you'll have to fix, caching problems and whatnot. Feel free to ask a question in [the dev-toolkit chat](https://gitter.im/stoikerty/dev-toolkit) if you're stuck. Good luck! ๐Ÿ˜Ž -- inside the `dev-toolkit` folder, run `npm run watch` to convert all ES2015+ files into ES5 -- Now you're ready to use the toolkit via the command `dev-toolkit`. -- Follow the instructions in the [Readme](/Readme.md) to create a new project -- make changes to toolkit & document what you did -- make a PR with suggestions? +# Making changes +When you make a change inside `packages` you need to run `npm run boostrap` to install, build & link the packages together. This will also link the packages with all the templates. If you only make changes in the `templates`-folder, it's unlikely you'll have to re-run bootstrap. diff --git a/LICENSE b/LICENSE deleted file mode 100644 index f85c5ed0..00000000 --- a/LICENSE +++ /dev/null @@ -1,15 +0,0 @@ -ISC License - -Copyright (c) 2016, Jorge Antunes - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY -SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR -IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 6a19d9a3..00000000 --- a/README.md +++ /dev/null @@ -1,204 +0,0 @@ -

- universal-dev-toolkit-logo -

-

- Jump-start your react-powered Web App.
- dynamic pages -   sass & css-modules -   server-rendering -   hot-reload -

- -## Try out the latest beta ๐Ÿ˜„ -Version 6 will be less opinionated and useful for more use-cases such as serverless. I'm looking to release v6 before the end of 2017. - -Please try it out and post feedback in https://github.com/stoikerty/dev-toolkit/pull/39 or open an issue. - -Latest beta version: `dev-toolkit@6.0.0-beta-44` -```bash -# Install the latest version -npm install -g dev-toolkit@6.0.0-beta-44 - -# Initialize a project. Optional name, template, comments -dev-toolkit init [my_project] [--template template_name] [--skipComments] -``` - -*Available templates:* -- `minimal` - done & ready -- `standard` - done & ready (default) -- `with-sass` - done but you might encounter bugs -- `serverless` - in progress - ---- - -## Create a new project -```bash -# install & initialize new app -npm install -g dev-toolkit -dev-toolkit --init my_app -cd my_app -``` -``` -# run it via npm scripts -npm run dev -# or run it directly (-w or --watch) -dev-toolkit --watch -``` - -This will give you the following structure to work with: -``` -src -โ”œโ”€โ”€ client -โ”‚ โ”œโ”€โ”€ app.js -โ”‚ โ””โ”€โ”€ ... -โ””โ”€โ”€ server - โ””โ”€โ”€ ... -``` - -## Generate a static build -```bash -# Create `build`-folder with compiled files (-b or --build) -dev-toolkit --build -``` -- removes previous `build`-folder -- automatically uses production-builds of React and Redux -- allows for a [custom vendor-bundle](#define-what-modules-are-bundled-into-vendorjs) -- extracts css from individual modules -- hashes assets, including `jpg`, `png`, `gif` & `svg`-files - -### Verify build -Verify if static build is working correctly. -```bash -# Runs a minimal server that serves the build folder (--static or --serve-static) -dev-toolkit --serve-static -``` - -### Generate a static build with dynamic pages - -To make use of dynamic pages and components for making your app load faster use the extended build command. - -**For advanced users only**, [refer to this gist](https://gist.github.com/stoikerty/40a668e8fd4e2919034fd1eed2252bcb) for information on how to implement it. -```bash -# This will create an index-file for each dynamic route (-d --dynamic or --build --dynamic) -dev-toolkit --build --dynamic -``` -- html is pre-rendered and inserted into the body -- creates multiple js-bundles, one for each dynamic page -- each `index.html` contains a `script`-link to the `app` bundle and the page-bundle -- scripts use `async` and `defer`-attributes as appropriate -- each subsequent page can be pre-cached and loaded on demand - -## Setting up tests -You'll need to import the webpack config for running tests, [refer to this gist](https://gist.github.com/stoikerty/a202280147910b63a20e167dc4778fb8) for the setup. You'll be able to write your tests in ES2015, just like the rest of your app. Single tests can also be run in a watch-mode with the `npm run test-single`-command. - -## Use server with server-side rendering - -You can use your project as an universal/isomorphic server-side-rendered app.
**For advanced users only.** -```bash -# Compile and run `src/server/app` (-s or --serve) -dev-toolkit --serve -``` - -## Misc - -#### Check version -```bash -# Check Version (-v or --version) -dev-toolkit -v -``` - -#### Define what modules are bundled into `vendor.js` -```js -// in your package.json, add `vendor` in `toolkitSettings` section -"toolkitSettings": { - "vendor": [ - "react", - "react-dom", - "react-router" - ] -}, -``` - -#### Define what environment variables are available on client -```js -// In your package.json, add `sharedEnvs` in `toolkitSettings` section. -// The named variables will be available on the client via an exposed global `buildSettings.env` -"toolkitSettings": { - "sharedEnvs": [ - "NODE_ENV", - "API_DOMAIN" - ] -}, -``` - -## Features - -##### Compatibility - -- Multiplatform: Windows, OSX, Linux -- Node.js `last tested version 5.10.1` -- NPM `last tested version 3.8.3` - -##### Javascript Basics - -- [React] -- [ES2015 / ES6] -- [root-relative imports with `src/...`] -- [ESLint] - -##### Developer Convenience - -- [Browsersync] -- [Vanilla HMR, webpack's hot-reload] -- [jsx-control-statements] -- [`transform-class-properties` support] -- automatic asset-hashing during build, custom `vendor.js` -- support for various file-formats:
`css`, `scss`
`js`, `jsx`, `json`
`jpg`, `png`, `gif`, `svg` - -##### Powerful CSS Tools - -- [Autoprefixer] -- [sass / scss] -- [css-modules] - -##### Server-tools for Universal Apps - -- your own server app in `src/server/app` -- [powered by express] -- [react-router] - -[ES2015 / ES6]: https://babeljs.io/docs/learn-es2015/ -[`transform-class-properties` support]: https://babeljs.io/docs/plugins/transform-class-properties/ -[root-relative imports with `src/...`]: http://survivejs.com/webpack/requiring-files/ -[Vanilla HMR, webpack's hot-reload]: https://webpack.github.io/docs/hot-module-replacement-with-webpack.html -[Browsersync]: https://browsersync.io/ -[ESLint]: http://eslint.org/ -[React]: https://facebook.github.io/react/ -[jsx-control-statements]: https://github.com/AlexGilleran/jsx-control-statements -[sass / scss]: http://sass-lang.com/ -[css-modules]: https://github.com/css-modules/css-modules -[Autoprefixer]: https://github.com/postcss/autoprefixer -[powered by express]: http://expressjs.com/ -[react-router]: https://github.com/reactjs/react-router - - -## FAQ -- *I get an NPM warning after `--init` about `eslint-import-resolver`.* - -The package doesn't know that we're using webpack via the dev-toolkit and since webpack is not present in the dependencies, it throws an `UNMET PEER DEPENDENCY`-warning. - -- *The `dev-toolkit`-package is not part of the dependencies of the starting point I created with `--init`.* - -Since you already installed `dev-toolkit` globally, it would be easier to work on multiple projects without reinstalling the `dev-toolkit`-dependencies for each project. This way when you update the toolkit with `npm install -g dev-toolkit@version`, all your projects are updated as well. - -You can of course still pin your project with a specific version of the toolkit by running `npm install --save-dev dev-toolkit` inside your project folder. - ---- - - - -**Questions? Bugs? Suggestions?** Create [a new issue](https://github.com/stoikerty/dev-toolkit/issues/new) or submit a PR!
Check out [the Contributing Guidelines](/CONTRIBUTING.md) for information on how to work on the toolkit itself. - ---- - -kindly supported by BrowserStack. diff --git a/Readme.md b/Readme.md new file mode 100644 index 00000000..d1a9e138 --- /dev/null +++ b/Readme.md @@ -0,0 +1,85 @@ +

dev-toolkit

+

+Jump-start your react-powered Universal App
+Designed for Veterans +

+
+ +`dev-toolkit` provides you with an easy and quick way to get started with a pre-rendered & +server-rendered app. After creating your starting point with the `init` command, you get full +customizeability out of the box. + +[![Travis branch](https://img.shields.io/travis/stoikerty/dev-toolkit/master.svg?style=flat-square)](https://github.com/stoikerty/dev-toolkit) +[![npm](https://img.shields.io/npm/v/dev-toolkit.svg?style=flat-square)](https://www.npmjs.com/package/dev-toolkit) +[![npm](https://img.shields.io/npm/dm/dev-toolkit.svg?style=flat-square)](https://www.npmjs.com/package/dev-toolkit) +[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) +[![Twitter](https://img.shields.io/twitter/url/https/github.com/stoikerty/dev-toolkit.svg?style=social)](https://twitter.com/intent/tweet?text=An%20easy%20and%20quick%20way%20to%20start%20a%20pre-rendered%20and%20server-rendered%20%23react%20app!%20https%3A%2F%2Fgithub.com%2Fstoikerty%2Fdev-toolkit) + +### Quick Start + +```bash +$ npm install -g dev-toolkit +``` + +```bash +# Initialize a project with optional name, template, comments +# The comments explain how the `dev-toolkit` works with the template +$ dev-toolkit init [project_name] [--template template_name] [--skip-comments] +``` + +#### List of available templates + +* `standard` (default) +* `with-eslint` +* `with-sass` + +## Features + +* hot-reload on client by default +* server-rendering +* pre-rendering +* creating a build +* custom webpack config +* use environment variables on client + +### No CSS by default + +With CSS-in-JS solutions on the rise, it would be unwise to include dependencies for css-modules, +sass or less in every project that has `dev-toolkit` as a dependency which would introduce +additional installation time and bloat. The aim of dev-toolkit is to be unopinionated so that it can +be useful in many scenarios. + +## Contributing + +Check out the project locally & create a PR. + +```bash +# Clone down the repo locally +$ git clone git@github.com:stoikerty/dev-toolkit.git + +# Install root lerna dependencies +$ cd dev-toolkit +$ npm install + +# Bootstrap all packages +$ npm run bootstrap +# If you encounter linux/osx permission issues, try this +$ npm run bootstrap-fix + +# Run feature tests +$ cd feature-tests +$ npm install +$ npm run test +``` + +Your workflow will likely be to `cd` into a template of your choice in the `templates` directory +where you can test `dev-toolkit` and in parallel (in a separate terminal) re-run the +`bootstrap`-command in the root of the project after making changes in one of the `packages`. + +### Roadmap + +* Improved docs +* Using your own (external) template - under consideration +* Eject feature - under consideration +* serverless template - in development +* list differences between dev-toolkit, next.js & create-react-app diff --git a/documentation (wip)/choices-made.md b/documentation (wip)/choices-made.md new file mode 100644 index 00000000..ea3c8ce3 --- /dev/null +++ b/documentation (wip)/choices-made.md @@ -0,0 +1,41 @@ +# Choices made in this project + +## Universal Usage +Pre-Rendering & Server-rendering is central to `dev-toolkit`. By default pre-rendering is enabled, because of the massive performance gains that can be achieved using it. If you only use server-rendering on a per-request basis, you can disable pre-rendering entirely [using `dev-toolkit.config.js`](#link-extending). + +Server-rendering itself is a complicated topic since any of the code used on the client can and will also be run on the server. Doing so introduces a great amount of moving parts and in order for any starting point to be truly useful, the essential parts of the server-rendering aspect [are exposed in different ways](#link-how-it-works). + +## Simplicity +Although universal usage... + +## Usefulness + +## Reducing or eliminating lock-in + +## Prescribed by dev-toolkit +- universal usage + +## Prescribed by template starting points +- src/client - all client-related files +- src/server - all server-related files +- src/settings.js - relevant application-wide settings + +## Philosophy +- aim is to be very flexible and customizeable +- allow for many different usages within a company +- pre-rendering is first-class citizen +- rendering of dynamic-pages splittable +- only necessary configuration +- small api-surface +- tested +- css-in-js without removing boilerplate + +## The future +- make it easy to use your own boilerplate +- create typescript template +- template with react-router +- template with redux + +--- + +- mention specific examples for each section to improve usefulness diff --git a/documentation (wip)/commands.md b/documentation (wip)/commands.md new file mode 100644 index 00000000..26a4a226 --- /dev/null +++ b/documentation (wip)/commands.md @@ -0,0 +1,5 @@ +# dev-toolkit Commands + +## Command-line Usage + +## Programmatic Usage diff --git a/documentation (wip)/error-help.md b/documentation (wip)/error-help.md new file mode 100644 index 00000000..44ffe7d0 --- /dev/null +++ b/documentation (wip)/error-help.md @@ -0,0 +1,13 @@ +# Error messages help + - (bootstrap) server app doesn't exit + `File '${file}' doesn't exist.` + + - (watch) 'Your server needs a `start`-method.' + - (watch) 'Your server needs a `this.express` to be set for attaching webpack middleware.' + + - (serve) 'Your server needs a `start`-method.' + + - (importServerApp) 'You need a server app entry point.' + + - (preRender) 'Your server needs a `preRender`-method to create a build.' + - (preRender) "The server `preRender`-method must return a Promise to say it's finished." diff --git a/documentation (wip)/extending-with-config.md b/documentation (wip)/extending-with-config.md new file mode 100644 index 00000000..8be10bdc --- /dev/null +++ b/documentation (wip)/extending-with-config.md @@ -0,0 +1,2 @@ +# Extending your project with custom configuration + diff --git a/documentation (wip)/how-it-works.md b/documentation (wip)/how-it-works.md new file mode 100644 index 00000000..4874c2ec --- /dev/null +++ b/documentation (wip)/how-it-works.md @@ -0,0 +1,15 @@ +# How dev-toolkit works + +`dev-toolkit` is in reality much simpler than many people realize at first sight. + +This project has gone through many iterations, from using gulp and later webpack in the form of a boilerplate, to finally becoming a cli-tool with webpack under the hood. + +## Architecture + +## Server Rendering + +## Hot-Reload on Client & Server + +## Rendering Pipelines + +- explain hydration diff --git a/documentation (wip)/templates.md b/documentation (wip)/templates.md new file mode 100644 index 00000000..9f831447 --- /dev/null +++ b/documentation (wip)/templates.md @@ -0,0 +1,56 @@ +# dev-toolkit Templates +A collection of templates of how dev-toolkit can be used. +Each one of these templates can be initialized from the command-line with: +```bash +dev-toolkit init my_project --template [template-name] +``` + +## Shared Structure +... +- server / client split + +## Available Templates + +### minimal (default) +Stripped out example with pre-render + +### standard (suggested) +If you want to start a project from scratch, this is your best starting point. +This template contains no routing, it will give you out of the box: +- simple client app with + - hot-reload for development + - 1 view called `App.js` +- simple server app for + - rendering the layout on request + - pre-rendering the layout to an html file +- `settings.js`-file to be shared between client & server with + - example usage of `sharedEnvs` via `dev-toolit/settings` +- `dev-toolkit.config.js`-file which contains + - usePreRender set to `false` (default) + - example usage with `MY_CUSTOM_ENV` environment variable +- `handler.js`-file serverless-type mini-example which contains + - example usage of `dev-toolkit` programmatic API usage + +--- + +## WIP Templates + +### with-sass +Example using sass/scss with custom webpack configuration and node-hooks + +### serverless +Example using dev-toolkit programmatically for usage with cloud-functions/lambdas in a serverless scenario. + +--- + +## Planned Templates + +### with-react-router +### with-redux +### with-mocha +### with-jest +### with-glamorous +### with-dynamic-routes +### with-styled-components + +### as exported npm-package? diff --git a/documentation (wip)/under-the-hood.md b/documentation (wip)/under-the-hood.md new file mode 100644 index 00000000..c96be450 --- /dev/null +++ b/documentation (wip)/under-the-hood.md @@ -0,0 +1,2 @@ +- code splitting +- extending diff --git a/feature-tests/.eslintrc b/feature-tests/.eslintrc new file mode 100644 index 00000000..b9f8285a --- /dev/null +++ b/feature-tests/.eslintrc @@ -0,0 +1,11 @@ +{ + "extends": ["airbnb-base", "dev-toolkit", "prettier"], + "plugins": ["prettier"], + "rules": { + "prettier/prettier": "error", + "import/prefer-default-export": ["off", "never"] + }, + "env": { + "mocha": true + } +} diff --git a/feature-tests/.prettierrc b/feature-tests/.prettierrc new file mode 100644 index 00000000..a44463ca --- /dev/null +++ b/feature-tests/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/feature-tests/babel-register.js b/feature-tests/babel-register.js new file mode 100644 index 00000000..6c0e0243 --- /dev/null +++ b/feature-tests/babel-register.js @@ -0,0 +1,2 @@ +// Use babel-runner in favour of babel-register to support javascript via `babelrc.js` +require('babel-runner')(); diff --git a/feature-tests/babelrc.js b/feature-tests/babelrc.js new file mode 100644 index 00000000..a85a7493 --- /dev/null +++ b/feature-tests/babelrc.js @@ -0,0 +1,15 @@ +module.exports = { + presets: [require.resolve('babel-preset-env')], + plugins: [ + // Support dynamic `import()`-statement + require.resolve('babel-plugin-dynamic-import-node'), + // Allow root-relative imports + [ + require.resolve('babel-plugin-module-resolver'), + { + // using `process.cwd` makes it also work with `import()` + root: [process.cwd()], + }, + ], + ], +}; diff --git a/feature-tests/package-lock.json b/feature-tests/package-lock.json new file mode 100644 index 00000000..6d8678ed --- /dev/null +++ b/feature-tests/package-lock.json @@ -0,0 +1,2515 @@ +{ + "name": "dev-toolkit-feature-tests", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "acorn": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", + "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "requires": { + "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.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-eslint": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "requires": { + "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" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + } + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.2.0.tgz", + "integrity": "sha512-yeDwKaLgGdTpXL7RgGt5r6T4LmnTza/hUn5Ul8uZSGGMtEjYo13Nxai7SQaGCTEzUtg9Zq9qJn0EjEr7SeSlTQ==", + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0" + } + }, + "babel-plugin-module-resolver": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-2.7.1.tgz", + "integrity": "sha1-GL48Qt31n3pFbJ4FEs2ROU9uS+E=", + "requires": { + "find-babel-config": "1.1.0", + "glob": "7.1.2", + "resolve": "1.5.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "6.26.0", + "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.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "requires": { + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-preset-env": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", + "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "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.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "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.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "2.9.1", + "invariant": "2.2.2", + "semver": "5.4.1" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runner": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/babel-runner/-/babel-runner-1.0.0.tgz", + "integrity": "sha512-HQbGq/Vp21Y1JGvYiZZh/rqCbKxn5tQwZUgt2AuqdRytm/LkjtucCzNv/SU6rzgk0kNx0gjUNILck2Zd5T5TMQ==", + "requires": { + "babel-register": "6.26.0", + "file-exists": "4.0.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "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": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "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.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bignumber.js": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-2.4.0.tgz", + "integrity": "sha1-g4qZLan51zfg9LLbC+YrsJ3Qxeg=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + }, + "browserslist": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.9.1.tgz", + "integrity": "sha512-3n3nPdbUqn3nWmsy4PeSQthz2ja1ndpoXta+dwFFNhveGjMg6FXpWYe12vsTpNoXJbzx3j7GZXdtoVIdvh3JbA==", + "requires": { + "caniuse-lite": "1.0.30000770", + "electron-to-chromium": "1.3.27" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000770", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000770.tgz", + "integrity": "sha1-vI5/ULBzJzOQ22qzVzeJCaFOm9s=" + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "requires": { + "assertion-error": "1.0.2", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.5" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.35" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "requires": { + "type-detect": "4.0.5" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "2.0.1" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=" + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "electron-to-chromium": { + "version": "1.3.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", + "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=" + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es5-ext": { + "version": "0.10.35", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", + "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", + "dev": true, + "requires": { + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.1", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.9", + "doctrine": "2.0.0", + "escope": "3.6.0", + "espree": "3.5.1", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.5", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.1", + "is-resolvable": "1.0.0", + "js-yaml": "3.10.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + } + }, + "eslint-config-airbnb-base": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.2.tgz", + "integrity": "sha512-/fhjt/VqzBA2SRsx7ErDtv6Ayf+XLw9LIOqmpBuHFCVwyJo2EtzGWMB9fYRFBoWWQLxmNmCpenNiH0RxyeS41w==", + "dev": true, + "requires": { + "eslint-restricted-globals": "0.1.1" + } + }, + "eslint-config-dev-toolkit": { + "version": "1.0.0-beta-2", + "resolved": "https://registry.npmjs.org/eslint-config-dev-toolkit/-/eslint-config-dev-toolkit-1.0.0-beta-2.tgz", + "integrity": "sha512-0p1x6ihuBtcjgmgPzSsB1tQvJWVXPLyFl6fR/q5VZZZAuqgRS6Tz+akMpnPg8/FJ5YjYFoErJWdxwFhCo9ZDyg==", + "dev": true + }, + "eslint-config-prettier": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.6.0.tgz", + "integrity": "sha1-8h2w67Q4rWePuYlGCXxLsZi+/Mw=", + "dev": true, + "requires": { + "get-stdin": "5.0.1" + } + }, + "eslint-import-resolver-babel-module": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-babel-module/-/eslint-import-resolver-babel-module-2.2.1.tgz", + "integrity": "sha1-bELzOm8J85RNjPqeHeRw/Io8LPw=", + "dev": true, + "requires": { + "find-babel-config": "1.1.0", + "resolve": "1.5.0" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", + "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.5.0" + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.7.0.tgz", + "integrity": "sha512-HGYmpU9f/zJaQiKNQOVfHUh2oLWW3STBrCgH0sHTX1xtsxYlH1zjLh8FlQGEIdZSdTbUMaV36WaZ6ImXkenGxQ==", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.1", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + } + } + }, + "eslint-plugin-prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.3.1.tgz", + "integrity": "sha512-AV8shBlGN9tRZffj5v/f4uiQWlP3qiQ+lh+BhTqRLuKSyczx+HRWVkVZaf7dOmguxghAH1wftnou/JUEEChhGg==", + "dev": true, + "requires": { + "fast-diff": "1.1.2", + "jest-docblock": "21.2.0" + } + }, + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", + "dev": true + }, + "espree": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.1.tgz", + "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", + "dev": true, + "requires": { + "acorn": "5.1.2", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.35" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "file-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/file-exists/-/file-exists-4.0.0.tgz", + "integrity": "sha1-EE6s8l0/1rPkYpUa6SNTMZX/tSs=" + }, + "find-babel-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz", + "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=", + "requires": { + "json5": "0.5.1", + "path-exists": "3.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + } + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=" + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=" + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "ignore": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", + "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", + "lodash": "4.17.4", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=" + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-my-json-valid": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "jest-docblock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=" + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prettier": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.7.4.tgz", + "integrity": "sha1-XoYkrpNjyA+V7GRFhOzfVddPk/o=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "requires": { + "resolve": "1.5.0" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "0.5.0" + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "requires": { + "glob": "7.1.2", + "interpret": "1.0.4", + "rechoir": "0.6.2" + } + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "0.5.7" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "to-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/to-time/-/to-time-1.0.2.tgz", + "integrity": "sha1-T4FFoH2F9jVqYuHOoKep5mYXduM=", + "requires": { + "bignumber.js": "2.4.0" + } + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-detect": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", + "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==" + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } +} diff --git a/feature-tests/package.json b/feature-tests/package.json new file mode 100644 index 00000000..7b34f672 --- /dev/null +++ b/feature-tests/package.json @@ -0,0 +1,30 @@ +{ + "name": "dev-toolkit-feature-tests", + "version": "0.0.0", + "scripts": { + "test": "mocha --require babel-register.js 'src/index.spec.js' --timeout 30000", + "lint": "prettier --write './**/*.js' && eslint './**/*.js'" + }, + "dependencies": { + "babel-plugin-dynamic-import-node": "^1.0.2", + "babel-plugin-module-resolver": "^2.7.1", + "babel-preset-env": "^1.6.0", + "babel-runner": "^1.0.0-beta-5", + "chai": "^4.1.2", + "fs-extra": "^4.0.1", + "mocha": "^3.5.0", + "shelljs": "^0.7.8", + "to-time": "^1.0.2" + }, + "devDependencies": { + "babel-eslint": "^7.2.3", + "eslint": "^3.4.0", + "eslint-config-airbnb-base": "^11.3.1", + "eslint-config-dev-toolkit": "^1.0.0-beta-2", + "eslint-config-prettier": "2.6.0", + "eslint-import-resolver-babel-module": "2.2.1", + "eslint-plugin-import": "^2.7.0", + "eslint-plugin-prettier": "2.3.1", + "prettier": "^1.7.4" + } +} diff --git a/feature-tests/src/index.spec.js b/feature-tests/src/index.spec.js new file mode 100644 index 00000000..719c7eaa --- /dev/null +++ b/feature-tests/src/index.spec.js @@ -0,0 +1,23 @@ +import path from 'path'; + +import { rootDir, createCacheDir, cleanCacheDir } from 'src/utils'; +import packageDevToolkit from './packages/dev-toolkit'; +import templates from './templates'; + +const devToolkitDir = path.resolve(rootDir, 'packages/dev-toolkit'); +const pkgPath = path.resolve(devToolkitDir, 'package.json'); + +// Remove cache-directory after running tests +before(done => createCacheDir(done)); +after(done => cleanCacheDir(done)); + +describe('dev-toolkit & template tests', () => { + it('imports package.json & runs all tests', () => { + import(pkgPath).then(pkg => { + // Install dev-toolkit in cache folder + packageDevToolkit({ pkg }); + // Test each template with the dev-toolkit installation from above + templates(); + }); + }); +}); diff --git a/feature-tests/src/packages/dev-toolkit/commands/index.js b/feature-tests/src/packages/dev-toolkit/commands/index.js new file mode 100644 index 00000000..7c4e8237 --- /dev/null +++ b/feature-tests/src/packages/dev-toolkit/commands/index.js @@ -0,0 +1 @@ +export { default as version } from './version'; diff --git a/feature-tests/src/packages/dev-toolkit/commands/version.js b/feature-tests/src/packages/dev-toolkit/commands/version.js new file mode 100644 index 00000000..d56e3e8a --- /dev/null +++ b/feature-tests/src/packages/dev-toolkit/commands/version.js @@ -0,0 +1,15 @@ +import { expect } from 'chai'; + +import { runDevToolkitCli } from 'src/utils'; + +export default ({ pkg }) => { + describe('command: `dev-toolkit version`', () => { + it('runs without failure, outputs version number', done => { + runDevToolkitCli({ command: 'version' }).then(({ exitCode, output }) => { + expect(exitCode, 'Exit code').to.equal(0); + expect(output.indexOf(pkg.version) >= 0).to.equal(true); + done(); + }); + }); + }); +}; diff --git a/feature-tests/src/packages/dev-toolkit/index.js b/feature-tests/src/packages/dev-toolkit/index.js new file mode 100644 index 00000000..c0ededb9 --- /dev/null +++ b/feature-tests/src/packages/dev-toolkit/index.js @@ -0,0 +1,9 @@ +import installation from './installation'; +import { version } from './commands'; + +export default ({ pkg }) => { + describe('`dev-toolkit` npm-package', () => { + installation({ pkg }); + version({ pkg }); + }); +}; diff --git a/feature-tests/src/packages/dev-toolkit/installation/index.js b/feature-tests/src/packages/dev-toolkit/installation/index.js new file mode 100644 index 00000000..572fc116 --- /dev/null +++ b/feature-tests/src/packages/dev-toolkit/installation/index.js @@ -0,0 +1,31 @@ +import { expect } from 'chai'; +import path from 'path'; +import shell from 'shelljs'; +import time from 'to-time'; + +import { cacheDir } from 'src/utils'; + +export default ({ pkg }) => { + describe(`local installation using \`npm install ${pkg.name}@${pkg.version}\``, () => { + it('proceeds sucessfully', done => { + // create a blank npm project for testing installation + shell.exec(`cd ${cacheDir}`, { silent: true }); + shell.exec('npm init -y', { silent: true }); + // install current version + shell.exec(`npm install ${pkg.name}@${pkg.version} --save`, { silent: true }, exitCode => { + expect(exitCode, 'Exit code').to.equal(0); + done(); + }); + // make sure it doesn't take longer than specified time + }).timeout(time('1 minutes').ms()); + + it('puts dev-toolkit in `package.json` dependencies', done => { + import(path.resolve(cacheDir, 'package.json')).then(testPkg => { + expect(testPkg.dependencies).to.not.equal(undefined); + expect(testPkg.dependencies[pkg.name]).to.not.equal(undefined); + expect(testPkg.dependencies[pkg.name]).to.equal(`^${pkg.version}`); + done(); + }); + }); + }); +}; diff --git a/feature-tests/src/templates/all/index.js b/feature-tests/src/templates/all/index.js new file mode 100644 index 00000000..38568523 --- /dev/null +++ b/feature-tests/src/templates/all/index.js @@ -0,0 +1,58 @@ +import { expect } from 'chai'; +import chalk from 'chalk'; +import time from 'to-time'; + +import { runDevToolkitCli } from 'src/utils'; + +const enableOutputLogging = false; +const logOutput = output => { + if (enableOutputLogging) { + console.log(chalk.blue(output)); + } +}; + +export default ({ name, isDefault } = { isDefault: false }) => { + describe('can be used to initialize a new app', () => { + // Optional templates can take up to 2 minutes to install + it(`including comments, with specified template '${name}'`, done => { + runDevToolkitCli({ + command: `init ${name}_app --template ${name}`, + }).then(({ exitCode, output }) => { + expect(exitCode, 'Exit code').to.equal(0); + logOutput(output); + done(); + }); + }).timeout(time('2 minutes').ms()); + it(`skipping comments, with specified template '${name}'"`, done => { + runDevToolkitCli({ + command: `init ${name}_app_no_comment --template ${name} --skipComments`, + }).then(({ exitCode, output }) => { + expect(exitCode, 'Exit code').to.equal(0); + logOutput(output); + done(); + }); + }).timeout(time('2 minutes').ms()); + + if (isDefault) { + // Default template should take max. 1 minutes to install + it('with no specified template, including comments', done => { + runDevToolkitCli({ + command: `init ${name}_default_app --skipComments`, + }).then(({ exitCode, output }) => { + expect(exitCode, 'Exit code').to.equal(0); + logOutput(output); + done(); + }); + }).timeout(time('1 minutes').ms()); + it('with no specified template, skipping comments', done => { + runDevToolkitCli({ + command: `init ${name}_default_app_no_comment --skipComments`, + }).then(({ exitCode, output }) => { + expect(exitCode, 'Exit code').to.equal(0); + logOutput(output); + done(); + }); + }).timeout(time('1 minutes').ms()); + } + }); +}; diff --git a/feature-tests/src/templates/index.js b/feature-tests/src/templates/index.js new file mode 100644 index 00000000..297fbbac --- /dev/null +++ b/feature-tests/src/templates/index.js @@ -0,0 +1,34 @@ +// Add your template to this array for it to be tested +const templates = ['standard', 'minimal', 'with-sass', 'serverless']; +const defaultTemplate = 'standard'; + +export default () => { + describe('templates: ', () => { + templates.forEach(name => { + // Run combined tests making sure certain things work with every template + import('./all') + .then(module => { + const template = module.default; + const isDefault = name === defaultTemplate; + describe(`the ${name}-template${isDefault ? ' (default template)' : ''}:`, () => { + template({ name, isDefault }); + }); + }) + .catch(e => { + console.log("combined template-tests couldn't load:\n", e); + }); + + // Run template-specific tests + // import(`./${name}`) + // .then(module => { + // const template = module.default; + // describe(`the ${name}-template:`, () => { + // template({ name, isDefault: name === defaultTemplate }); + // }); + // }) + // .catch(e => { + // console.log(`template-tests for '${name}' couldn't load:\n`, e); + // }); + }); + }); +}; diff --git a/feature-tests/src/templates/standard/installation/index.js b/feature-tests/src/templates/standard/installation/index.js new file mode 100644 index 00000000..5de7286a --- /dev/null +++ b/feature-tests/src/templates/standard/installation/index.js @@ -0,0 +1,13 @@ +describe('installation', () => { + it('can be generated with `dev-toolkit init my_project`', () => {}); + it('can be generated with `dev-toolkit init my_project --skipComments`', () => {}); +}); + +// describe('standard template - client', () => { +// it('renders on the browser', () => {}); +// it('hot-reloads after making a change in App.js', () => {}); +// }); +// describe('standard template - server', () => { +// it('server-renders app', () => {}); +// it('pre-renders app', () => {}); +// }); diff --git a/feature-tests/src/utils/index.js b/feature-tests/src/utils/index.js new file mode 100644 index 00000000..3bec5761 --- /dev/null +++ b/feature-tests/src/utils/index.js @@ -0,0 +1,32 @@ +import path from 'path'; +import { ensureDirSync, removeSync } from 'fs-extra'; +import shell from 'shelljs'; + +// Create empty cache-directory for running tests +export const rootDir = path.resolve(process.cwd(), '../'); +export const cacheDir = path.resolve(rootDir, 'feature-tests/__temp-cache'); +export const createCacheDir = done => { + ensureDirSync(cacheDir); + shell.cd(cacheDir); + done(); +}; + +export const cleanCacheDir = done => { + removeSync(cacheDir); + done(); +}; + +export const runDevToolkitCli = ({ command, directory } = { directory: cacheDir }) => + new Promise((resolve, reject) => { + try { + shell.exec(`cd ${directory}`, { silent: true }); + shell.exec( + `./node_modules/.bin/dev-toolkit ${command}`, + { silent: true }, + (exitCode, output) => resolve({ exitCode, output }) + ); + } catch (e) { + console.log('Unable to runDevToolkitCli. ', e); + reject(e); + } + }); diff --git a/lerna.json b/lerna.json index dfcc2e9f..ac16fb49 100644 --- a/lerna.json +++ b/lerna.json @@ -1,4 +1,5 @@ { - "lerna": "2.0.0-beta.30", + "lerna": "2.1.2", + "packages": ["packages/*", "templates/*"], "version": "independent" } diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..dbe64ce5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2807 @@ +{ + "name": "dev-toolkit-project", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSONStream": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.1.tgz", + "integrity": "sha1-cH92HgHa6eFvG8+TcDt4xwlmV5o=", + "dev": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "requires": { + "string-width": "2.1.1" + } + }, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "requires": { + "color-convert": "1.9.1" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "boxen": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.2.2.tgz", + "integrity": "sha1-Px1AMsMP/qnUsCwyLq8up0HcvOU=", + "requires": { + "ansi-align": "2.0.0", + "camelcase": "4.1.0", + "chalk": "2.3.0", + "cli-boxes": "1.0.0", + "string-width": "2.1.1", + "term-size": "1.2.0", + "widest-line": "1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "chardet": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.0.tgz", + "integrity": "sha1-C74TVaxE16PtSpJXB8TvcPgZD2w=", + "dev": true + }, + "ci-info": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz", + "integrity": "sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA==", + "dev": true + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=" + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "dev": true + }, + "cmd-shim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", + "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "columnify": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz", + "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=", + "dev": true, + "requires": { + "strip-ansi": "3.0.1", + "wcwidth": "1.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "command-join": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/command-join/-/command-join-2.0.0.tgz", + "integrity": "sha1-Uui5hPSHLZUv8b3IuYOX0nxxRM8=", + "dev": true + }, + "compare-func": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "dev": true, + "requires": { + "array-ify": "1.0.0", + "dot-prop": "3.0.0" + }, + "dependencies": { + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "configstore": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.1.tgz", + "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", + "requires": { + "dot-prop": "4.2.0", + "graceful-fs": "4.1.11", + "make-dir": "1.1.0", + "unique-string": "1.0.0", + "write-file-atomic": "2.3.0", + "xdg-basedir": "3.0.0" + } + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "conventional-changelog": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.7.tgz", + "integrity": "sha1-kVGmKx2O2y2CcR2r9bfPcQQfgrE=", + "dev": true, + "requires": { + "conventional-changelog-angular": "1.5.2", + "conventional-changelog-atom": "0.1.2", + "conventional-changelog-codemirror": "0.2.1", + "conventional-changelog-core": "1.9.3", + "conventional-changelog-ember": "0.2.9", + "conventional-changelog-eslint": "0.2.1", + "conventional-changelog-express": "0.2.1", + "conventional-changelog-jquery": "0.1.0", + "conventional-changelog-jscs": "0.1.0", + "conventional-changelog-jshint": "0.2.1" + } + }, + "conventional-changelog-angular": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.5.2.tgz", + "integrity": "sha1-Kzj2Zf6cWSCvGi+C9Uf0ur5t5Xw=", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "q": "1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.1.2.tgz", + "integrity": "sha1-Ella1SZ6aTfDTPkAKBscZRmKTGM=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-cli": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/conventional-changelog-cli/-/conventional-changelog-cli-1.3.5.tgz", + "integrity": "sha1-RsUUliFrdAZYiIPe+m+sWJ6bsx4=", + "dev": true, + "requires": { + "add-stream": "1.0.0", + "conventional-changelog": "1.1.7", + "lodash": "4.17.4", + "meow": "3.7.0", + "tempfile": "1.1.1" + } + }, + "conventional-changelog-codemirror": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.2.1.tgz", + "integrity": "sha1-KZpPcUe681DmyBWPxUlUopHFzAk=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-core": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-1.9.3.tgz", + "integrity": "sha1-KJn+d5OJoynw7EsnRsNt3vuY2i0=", + "dev": true, + "requires": { + "conventional-changelog-writer": "2.0.2", + "conventional-commits-parser": "2.0.1", + "dateformat": "1.0.12", + "get-pkg-repo": "1.4.0", + "git-raw-commits": "1.3.0", + "git-remote-origin-url": "2.0.0", + "git-semver-tags": "1.2.3", + "lodash": "4.17.4", + "normalize-package-data": "2.4.0", + "q": "1.5.1", + "read-pkg": "1.1.0", + "read-pkg-up": "1.0.1", + "through2": "2.0.3" + } + }, + "conventional-changelog-ember": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.2.9.tgz", + "integrity": "sha1-jsc8wFTjqwZGZ/sf61L+jvGxZDg=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-0.2.1.tgz", + "integrity": "sha1-LCoRvrIW+AZJunKDQYApO2h8BmI=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-express": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.2.1.tgz", + "integrity": "sha1-g42eHmyQmXA7FQucGaoteBdCvWw=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", + "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jscs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", + "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.2.1.tgz", + "integrity": "sha1-hhObs6yZiZ8rF36WF+CbN9mbzzo=", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "q": "1.5.1" + } + }, + "conventional-changelog-writer": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-2.0.2.tgz", + "integrity": "sha1-tYV97RsAHa+aeLnNQJJvRcE0lJs=", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "conventional-commits-filter": "1.1.0", + "dateformat": "1.0.12", + "handlebars": "4.0.11", + "json-stringify-safe": "5.0.1", + "lodash": "4.17.4", + "meow": "3.7.0", + "semver": "5.4.1", + "split": "1.0.1", + "through2": "2.0.3" + } + }, + "conventional-commits-filter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.0.tgz", + "integrity": "sha1-H8Ka8wte2rdvVOIpxBGwxmPQ+es=", + "dev": true, + "requires": { + "is-subset": "0.1.1", + "modify-values": "1.0.0" + } + }, + "conventional-commits-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.0.1.tgz", + "integrity": "sha1-HxXOa4RPfKQUlcgZDAgzwwuLFpM=", + "dev": true, + "requires": { + "JSONStream": "1.3.1", + "is-text-path": "1.0.1", + "lodash": "4.17.4", + "meow": "3.7.0", + "split2": "2.2.0", + "through2": "2.0.3", + "trim-off-newlines": "1.0.1" + } + }, + "conventional-recommended-bump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-1.0.3.tgz", + "integrity": "sha1-RytpsbjwnFxO1A/iikHmPMBL1zY=", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "conventional-commits-filter": "1.1.0", + "conventional-commits-parser": "2.0.1", + "git-raw-commits": "1.3.0", + "git-semver-tags": "1.2.3", + "meow": "3.7.0", + "object-assign": "4.1.1" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "requires": { + "capture-stack-trace": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "requires": { + "array-find-index": "1.0.2" + } + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.3" + } + }, + "del": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", + "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "requires": { + "globby": "6.1.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "p-map": "1.2.0", + "pify": "3.0.0", + "rimraf": "2.6.2" + } + }, + "del-cli": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-1.1.0.tgz", + "integrity": "sha1-J1V9aaC335ncuqHjSgnmrGWR0sQ=", + "requires": { + "del": "3.0.0", + "meow": "3.7.0", + "update-notifier": "2.3.0" + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "detect-indent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz", + "integrity": "sha1-OHHMCmoALow+Wzz38zYmRnXwa50=", + "dev": true + }, + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", + "requires": { + "is-obj": "1.0.1" + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, + "requires": { + "chardet": "0.4.0", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "meow": "3.7.0", + "normalize-package-data": "2.4.0", + "parse-github-repo-url": "1.4.1", + "through2": "2.0.3" + } + }, + "get-port": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", + "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "git-raw-commits": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.0.tgz", + "integrity": "sha1-C8hZbpDV/+c29/VUa9LRL3OrqsY=", + "dev": true, + "requires": { + "dargs": "4.1.0", + "lodash.template": "4.4.0", + "meow": "3.7.0", + "split2": "2.2.0", + "through2": "2.0.3" + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "1.0.0", + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "git-semver-tags": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.2.3.tgz", + "integrity": "sha1-GItFOIK/nXojr9Mbq6U32rc4jV0=", + "dev": true, + "requires": { + "meow": "3.7.0", + "semver": "5.4.1" + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "requires": { + "ini": "1.3.5" + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "requires": { + "array-union": "1.0.2", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "requires": { + "create-error-class": "3.0.2", + "duplexer3": "0.1.4", + "get-stream": "3.0.0", + "is-redirect": "1.0.0", + "is-retry-allowed": "1.1.0", + "is-stream": "1.1.0", + "lowercase-keys": "1.0.0", + "safe-buffer": "5.1.1", + "timed-out": "4.0.1", + "unzip-response": "2.0.1", + "url-parse-lax": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.0", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-ci": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", + "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "dev": true, + "requires": { + "ci-info": "1.1.2" + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", + "requires": { + "global-dirs": "0.1.1", + "is-path-inside": "1.0.0" + } + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=" + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=" + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=" + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "1.7.0" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "requires": { + "package-json": "4.0.1" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "lerna": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/lerna/-/lerna-2.5.1.tgz", + "integrity": "sha512-Qz2fajqCPtZf4SFQQpQ2R/Ml/RvGvTNuIHix/vAMMSAdbtnPe2QTw34vLD24Clfsfy8FEojy+tqsjejWKqkDFw==", + "dev": true, + "requires": { + "async": "1.5.2", + "chalk": "2.3.0", + "cmd-shim": "2.0.2", + "columnify": "1.5.4", + "command-join": "2.0.0", + "conventional-changelog-cli": "1.3.5", + "conventional-recommended-bump": "1.0.3", + "dedent": "0.7.0", + "execa": "0.8.0", + "find-up": "2.1.0", + "fs-extra": "4.0.2", + "get-port": "3.2.0", + "glob": "7.1.2", + "glob-parent": "3.1.0", + "globby": "6.1.0", + "graceful-fs": "4.1.11", + "hosted-git-info": "2.5.0", + "inquirer": "3.3.0", + "is-ci": "1.0.10", + "load-json-file": "3.0.0", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "npmlog": "4.1.2", + "p-finally": "1.0.0", + "package-json": "4.0.1", + "path-exists": "3.0.0", + "read-cmd-shim": "1.0.1", + "read-pkg": "2.0.0", + "rimraf": "2.6.2", + "safe-buffer": "5.1.1", + "semver": "5.4.1", + "signal-exit": "3.0.2", + "strong-log-transformer": "1.0.6", + "temp-write": "3.3.0", + "write-file-atomic": "2.3.0", + "write-json-file": "2.3.0", + "write-pkg": "3.1.0", + "yargs": "8.0.2" + }, + "dependencies": { + "execa": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", + "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "load-json-file": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-3.0.0.tgz", + "integrity": "sha1-frNzXZg6ftImKt5P92mvU2nFxEA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "3.0.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "parse-json": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-3.0.0.tgz", + "integrity": "sha1-+m9HsY4jgm6tMvJj50TQ4ehH+xM=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + }, + "dependencies": { + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + } + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.templatesettings": "4.1.0" + } + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "requires": { + "pify": "3.0.0" + } + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "modify-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.0.tgz", + "integrity": "sha1-4rbN65zhn5kxelNyLz2/XfXqqrI=", + "dev": true + }, + "moment": { + "version": "2.19.2", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.2.tgz", + "integrity": "sha512-Rf6jiHPEfxp9+dlzxPTmRHbvoFXsh2L/U8hOupUMpnuecHQmI6cF6lUbJl3QqKPko1u6ujO+FxtcajLVfLpAtA==", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "2.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.3" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "p-map": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==" + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "requires": { + "got": "6.7.1", + "registry-auth-token": "3.3.1", + "registry-url": "3.1.0", + "semver": "5.4.1" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "1.3.1" + } + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "rc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", + "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.5", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "read-cmd-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz", + "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "registry-auth-token": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "requires": { + "rc": "1.2.2", + "safe-buffer": "5.1.1" + } + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "requires": { + "rc": "1.2.2" + } + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "requires": { + "semver": "5.4.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dev": true, + "requires": { + "is-plain-obj": "1.1.0" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "2.0.3" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" + }, + "strong-log-transformer": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-1.0.6.tgz", + "integrity": "sha1-9/uTdYpppXEUAYEnfuoMLrEwH6M=", + "dev": true, + "requires": { + "byline": "5.0.0", + "duplexer": "0.1.1", + "minimist": "0.1.0", + "moment": "2.19.2", + "through": "2.3.8" + }, + "dependencies": { + "minimist": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.1.0.tgz", + "integrity": "sha1-md9lelJXTCHJBXSX33QnkLK0wN4=", + "dev": true + } + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "2.0.0" + } + }, + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true + }, + "temp-write": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.3.0.tgz", + "integrity": "sha1-walt4rNgYTQuroH0T/ABrsj2Fak=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "is-stream": "1.1.0", + "make-dir": "1.1.0", + "pify": "2.3.0", + "temp-dir": "1.0.0", + "uuid": "3.1.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + } + } + }, + "tempfile": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-1.1.1.tgz", + "integrity": "sha1-W8xOrsxKsscH2LwR2ZzMmiyyh/I=", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2", + "uuid": "2.0.3" + } + }, + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", + "requires": { + "execa": "0.7.0" + } + }, + "text-extensions": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz", + "integrity": "sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg==", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "requires": { + "crypto-random-string": "1.0.0" + } + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=" + }, + "update-notifier": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.3.0.tgz", + "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", + "requires": { + "boxen": "1.2.2", + "chalk": "2.3.0", + "configstore": "3.1.1", + "import-lazy": "2.1.0", + "is-installed-globally": "0.1.0", + "is-npm": "1.0.0", + "latest-version": "3.1.0", + "semver-diff": "2.1.0", + "xdg-basedir": "3.0.0" + } + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "1.0.4" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", + "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "1.0.3" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "widest-line": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "requires": { + "string-width": "1.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "write-json-file": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-json-file/-/write-json-file-2.3.0.tgz", + "integrity": "sha1-K2TIozAE1UuGmMdtWFp3zrYdoy8=", + "dev": true, + "requires": { + "detect-indent": "5.0.0", + "graceful-fs": "4.1.11", + "make-dir": "1.1.0", + "pify": "3.0.0", + "sort-keys": "2.0.0", + "write-file-atomic": "2.3.0" + } + }, + "write-pkg": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/write-pkg/-/write-pkg-3.1.0.tgz", + "integrity": "sha1-AwqZlMyZk9JbTnWp8aGSNgcpHOk=", + "dev": true, + "requires": { + "sort-keys": "2.0.0", + "write-json-file": "2.3.0" + } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json index 9970f7c5..60de072f 100644 --- a/package.json +++ b/package.json @@ -1,27 +1,23 @@ { - "name": "dev-toolkit-monorepo", + "name": "dev-toolkit-project", "version": "0.0.0", - "description": "Monorepo configuration for dev-toolkit", - "main": "index.js", "scripts": { - "install": "lerna bootstrap", - "link": "cd packages/dev-toolkit && npm link && cd ../dynamic-pages && npm link && cd ../..", - "watch": "lerna exec -- npm run watch --concurrency", - "build": "lerna run build", - "publish": "lerna publish", - "clean": "lerna run clean" + "bootstrap": "lerna bootstrap", + "bootstrap-fix": "lerna bootstrap && chmod 777 packages/dev-toolkit/dist/bin/* packages/babel-runner/dist/bin/*", + "lint-all": "lerna exec -- npm install && lerna run lint", + "full-clean": "npm run safe-clean && npm run root-clean", + "root-clean": "del './node_modules'", + "safe-clean": "npm run sc-packages && npm run sc-templates && npm run sc-other", + "sc-packages": "del './packages/**/node_modules' './packages/**/dist' './packages/**/build'", + "sc-templates": "del './templates/**/node_modules' './templates/**/dist' './templates/**/build'", + "sc-other": "del './feature-tests/**/_temp-cache'", + "unsafe-clean": "del './**/package-lock.json'", + "fix-permissions": "chmod 777 packages/dev-toolkit/dist/bin/* packages/babel-runner/dist/bin/*" }, - "repository": { - "type": "git", - "url": "git+https://github.com/stoikerty/dev-toolkit.git" - }, - "author": "Jorge Antunes", - "license": "ISC", - "bugs": { - "url": "https://github.com/stoikerty/dev-toolkit/issues" - }, - "homepage": "https://github.com/stoikerty/dev-toolkit#readme", "devDependencies": { - "lerna": "2.0.0-beta.30" + "lerna": "^2.4.0" + }, + "dependencies": { + "del-cli": "^1.1.0" } } diff --git a/packages/babel-preset-dev-toolkit/.prettierrc b/packages/babel-preset-dev-toolkit/.prettierrc new file mode 100644 index 00000000..a44463ca --- /dev/null +++ b/packages/babel-preset-dev-toolkit/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/packages/babel-preset-dev-toolkit/Readme.md b/packages/babel-preset-dev-toolkit/Readme.md new file mode 100644 index 00000000..1bb02ebc --- /dev/null +++ b/packages/babel-preset-dev-toolkit/Readme.md @@ -0,0 +1,3 @@ +# babel-preset-dev-toolkit + +Babel Preset for [dev-toolkit](https://github.com/stoikerty/dev-toolkit), based on `create-react-app` preset. diff --git a/packages/babel-preset-dev-toolkit/index.js b/packages/babel-preset-dev-toolkit/index.js new file mode 100644 index 00000000..5f124816 --- /dev/null +++ b/packages/babel-preset-dev-toolkit/index.js @@ -0,0 +1,38 @@ +'use strict'; + +// Warn Users to make sure we don't have an invalid `NODE_ENV` +var env = process.env.BABEL_ENV || process.env.NODE_ENV; +if (env !== 'development' && env !== 'test' && env !== 'production') { + throw new Error( + 'Using `babel-preset-dev-toolkit` requires that you specify `NODE_ENV` or ' + + '`BABEL_ENV` environment variables. Valid values are "development", ' + + '"test", and "production". Instead, received: ' + + JSON.stringify(env) + + ".\nNOTE: `babel-preset-dev-toolkit` uses facebook's `babel-preset-react-app`" + + ' under the hood which has the same requirement.\n\n' + ); +} + +// Use require.resolve to prevent issues when using npm link +// see: https://github.com/babel/babel-loader/issues/149 +module.exports = { + presets: [ + require.resolve('babel-preset-env'), + // Use create-react-app default + require.resolve('babel-preset-react-app'), + ], + plugins: [ + // Support dynamic `import()`-statement + require.resolve('babel-plugin-dynamic-import-node'), + // Sane if-statements for React + require.resolve('jsx-control-statements'), + // Allow root-relative imports for client & server + [ + require.resolve('babel-plugin-module-resolver'), + { + // using `process.cwd` makes it also work with `import()` + root: [process.cwd()], + }, + ], + ], +}; diff --git a/packages/babel-preset-dev-toolkit/package-lock.json b/packages/babel-preset-dev-toolkit/package-lock.json new file mode 100644 index 00000000..e267e85d --- /dev/null +++ b/packages/babel-preset-dev-toolkit/package-lock.json @@ -0,0 +1,1158 @@ +{ + "name": "babel-preset-dev-toolkit", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "requires": { + "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.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "requires": { + "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" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + } + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-builder-react-jsx": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-builder-react-jsx/-/babel-helper-builder-react-jsx-6.26.0.tgz", + "integrity": "sha1-Of+DE7dci2Xc7/HzHTg+D/KkCKA=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "esutils": "2.0.2" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.2.0.tgz", + "integrity": "sha512-yeDwKaLgGdTpXL7RgGt5r6T4LmnTza/hUn5Ul8uZSGGMtEjYo13Nxai7SQaGCTEzUtg9Zq9qJn0EjEr7SeSlTQ==", + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0" + } + }, + "babel-plugin-module-resolver": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-2.7.1.tgz", + "integrity": "sha1-GL48Qt31n3pFbJ4FEs2ROU9uS+E=", + "requires": { + "find-babel-config": "1.1.0", + "glob": "7.1.2", + "resolve": "1.5.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + }, + "babel-plugin-syntax-flow": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz", + "integrity": "sha1-TDqyCiryaqIM0lmVw5jE63AxDI0=" + }, + "babel-plugin-syntax-jsx": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz", + "integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY=" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "6.26.0", + "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.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "requires": { + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-flow-strip-types": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz", + "integrity": "sha1-hMtnKTXUNxT9wyvOhFaNh0Qc988=", + "requires": { + "babel-plugin-syntax-flow": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-constant-elements": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-constant-elements/-/babel-plugin-transform-react-constant-elements-6.23.0.tgz", + "integrity": "sha1-LxGb9NLN1F65uqrldAU8YE9hR90=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-display-name": { + "version": "6.25.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-display-name/-/babel-plugin-transform-react-display-name-6.25.0.tgz", + "integrity": "sha1-Z+K/Hx6ck6sI25Z5LgU5K/LMKNE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx/-/babel-plugin-transform-react-jsx-6.24.1.tgz", + "integrity": "sha1-hAoCjn30YN/DotKfDA2R9jduZqM=", + "requires": { + "babel-helper-builder-react-jsx": "6.26.0", + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx-self": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-self/-/babel-plugin-transform-react-jsx-self-6.22.0.tgz", + "integrity": "sha1-322AqdomEqEh5t3XVYvL7PBuY24=", + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-react-jsx-source": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-jsx-source/-/babel-plugin-transform-react-jsx-source-6.22.0.tgz", + "integrity": "sha1-ZqwSFT9c0tF7PBkmj0vwGX9E7NY=", + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-runtime": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", + "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-preset-env": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", + "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "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.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "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.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "2.9.1", + "invariant": "2.2.2", + "semver": "5.4.1" + } + }, + "babel-preset-flow": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz", + "integrity": "sha1-5xIYiHCFrpoktb5Baa/7WZgWxJ0=", + "requires": { + "babel-plugin-transform-flow-strip-types": "6.22.0" + } + }, + "babel-preset-react": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-react/-/babel-preset-react-6.24.1.tgz", + "integrity": "sha1-umnfrqRfw+xjm2pOzqbhdwLJE4A=", + "requires": { + "babel-plugin-syntax-jsx": "6.18.0", + "babel-plugin-transform-react-display-name": "6.25.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-preset-flow": "6.23.0" + } + }, + "babel-preset-react-app": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-3.1.0.tgz", + "integrity": "sha512-jEAeVozxLzftLl0iDZ0d5jrmfbo3yogON/eI4AsEDIs8p6WW+t9mDRUsj5l12bqPOLSiVOElCQ3QyGjMcyBiwA==", + "requires": { + "babel-plugin-dynamic-import-node": "1.1.0", + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.26.0", + "babel-plugin-transform-react-constant-elements": "6.23.0", + "babel-plugin-transform-react-jsx": "6.24.1", + "babel-plugin-transform-react-jsx-self": "6.22.0", + "babel-plugin-transform-react-jsx-source": "6.22.0", + "babel-plugin-transform-regenerator": "6.26.0", + "babel-plugin-transform-runtime": "6.23.0", + "babel-preset-env": "1.6.1", + "babel-preset-react": "6.24.1" + }, + "dependencies": { + "babel-plugin-dynamic-import-node": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.1.0.tgz", + "integrity": "sha512-tTfZbM9Ecwj3GK50mnPrUpinTwA4xXmDiQGCk/aBYbvl1+X8YqldK86wZ1owVJ4u3mrKbRlXMma80J18qwiaTQ==", + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + } + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "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": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "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.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "browserslist": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.9.1.tgz", + "integrity": "sha512-3n3nPdbUqn3nWmsy4PeSQthz2ja1ndpoXta+dwFFNhveGjMg6FXpWYe12vsTpNoXJbzx3j7GZXdtoVIdvh3JbA==", + "requires": { + "caniuse-lite": "1.0.30000770", + "electron-to-chromium": "1.3.27" + } + }, + "caniuse-lite": { + "version": "1.0.30000770", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000770.tgz", + "integrity": "sha1-vI5/ULBzJzOQ22qzVzeJCaFOm9s=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "2.0.1" + } + }, + "electron-to-chromium": { + "version": "1.3.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", + "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "find-babel-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz", + "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=", + "requires": { + "json5": "0.5.1", + "path-exists": "3.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsx-control-statements": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/jsx-control-statements/-/jsx-control-statements-3.2.8.tgz", + "integrity": "sha512-RUHKXNAA4RiBijHIrLuyIiA6E0oLN6tvtCLcOzzzhVAjlcsLHQc0IbVQF0XGtlhsi6a6+HFwvo0duKVzzxuRcg==", + "requires": { + "babel-core": "6.26.0", + "babel-plugin-syntax-jsx": "6.18.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" + }, + "prettier": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.8.2.tgz", + "integrity": "sha512-fHWjCwoRZgjP1rvLP7OGqOznq7xH1sHMQUFLX8qLRO79hI57+6xbc5vB904LxEkCfgFgyr3vv06JkafgCSzoZg==", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "0.5.0" + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "requires": { + "path-parse": "1.0.5" + } + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "0.5.7" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/packages/babel-preset-dev-toolkit/package.json b/packages/babel-preset-dev-toolkit/package.json new file mode 100644 index 00000000..66e47f52 --- /dev/null +++ b/packages/babel-preset-dev-toolkit/package.json @@ -0,0 +1,37 @@ +{ + "name": "babel-preset-dev-toolkit", + "version": "1.0.0", + "description": "Uses create-react-app default, adds sane if-statements & root-relative imports", + "main": "index.js", + "scripts": { + "lint": "prettier --write './**/*.js'", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/stoikerty/dev-toolkit/tree/master/packages/babel-preset-dev-toolkit" + }, + "keywords": [ + "babel", + "babel-preset", + "dev-toolkit", + "universal", + "universal javascript", + "import", + "jsx-control-statements", + "root-relative require", + "root-relative import" + ], + "author": "Jorge Antunes @stoikerty", + "license": "MIT", + "dependencies": { + "babel-plugin-dynamic-import-node": "^1.1.0", + "babel-plugin-module-resolver": "^2.7.1", + "babel-preset-env": "^1.6.0", + "babel-preset-react-app": "^3.0.2", + "jsx-control-statements": "^3.2.6" + }, + "devDependencies": { + "prettier": "^1.7.4" + } +} diff --git a/packages/babel-runner/.babelrc b/packages/babel-runner/.babelrc new file mode 100644 index 00000000..2255e047 --- /dev/null +++ b/packages/babel-runner/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["env", "stage-1"] +} diff --git a/packages/babel-runner/.eslintrc b/packages/babel-runner/.eslintrc new file mode 100644 index 00000000..6c3ab8a6 --- /dev/null +++ b/packages/babel-runner/.eslintrc @@ -0,0 +1,12 @@ +{ + "extends": [ + "airbnb-base" + ], + + "parser": "babel-eslint", + + "rules": { + "global-require": [ "off" ], + "import/no-dynamic-require": [ "off" ] + } +} diff --git a/packages/babel-runner/.prettierrc b/packages/babel-runner/.prettierrc new file mode 100644 index 00000000..a44463ca --- /dev/null +++ b/packages/babel-runner/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/packages/babel-runner/Readme.md b/packages/babel-runner/Readme.md new file mode 100644 index 00000000..83ecece4 --- /dev/null +++ b/packages/babel-runner/Readme.md @@ -0,0 +1,17 @@ +# babel-runner + +A wrapper around `babel-register` to make universal usage of files easier. Automatically imports a `babelrc.js` or `.babelrc`-file as well as a `nodeHooks.js` file at the root of your project. + +## Usage - Command-line +```bash +babel-runner --run myuniversalfile.js +``` + +## Usage - Command-line +```js +const babelRunner = require('babel-runner'); + +babelRunner({ + fileToRun: path.resolve(__dirname, `./myuniversalfile.js`), +}); +``` diff --git a/packages/babel-runner/package-lock.json b/packages/babel-runner/package-lock.json new file mode 100644 index 00000000..4b11f83a --- /dev/null +++ b/packages/babel-runner/package-lock.json @@ -0,0 +1,3918 @@ +{ + "name": "babel-runner", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "acorn": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.4.0.tgz", + "integrity": "sha1-MtHPCNvIDEMvQm8S4QslEfa0ZHQ=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "ansi-escapes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", + "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "optional": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true, + "optional": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true, + "optional": true + }, + "babel-cli": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", + "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-polyfill": "6.26.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "chokidar": "1.7.0", + "commander": "2.12.1", + "convert-source-map": "1.5.1", + "fs-readdir-recursive": "1.1.0", + "glob": "7.1.2", + "lodash": "4.17.4", + "output-file-sync": "1.1.2", + "path-is-absolute": "1.0.1", + "slash": "1.0.0", + "source-map": "0.5.7", + "v8flags": "2.1.1" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "requires": { + "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.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-eslint": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "requires": { + "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-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "dev": true, + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "dev": true, + "requires": { + "babel-helper-bindify-decorators": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "dev": true + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "dev": true + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=", + "dev": true + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "dev": true + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "dev": true + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", + "dev": true + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "dev": true + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", + "dev": true + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-generators": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "dev": true, + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "dev": true, + "requires": { + "babel-plugin-syntax-class-constructor-call": "6.18.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "dev": true, + "requires": { + "babel-helper-explode-class": "6.24.1", + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "6.26.0", + "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.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "dev": true, + "requires": { + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "dev": true, + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "dev": true, + "requires": { + "babel-plugin-syntax-export-extensions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "regenerator-runtime": "0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + } + } + }, + "babel-preset-env": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", + "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "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.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "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.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "2.9.1", + "invariant": "2.2.2", + "semver": "5.4.1" + } + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "dev": true, + "requires": { + "babel-plugin-transform-class-constructor-call": "6.24.1", + "babel-plugin-transform-export-extensions": "6.22.0", + "babel-preset-stage-2": "6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "dev": true, + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-decorators": "6.24.1", + "babel-preset-stage-3": "6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "dev": true, + "requires": { + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-generator-functions": "6.24.1", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "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": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "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.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true, + "optional": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "optional": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browserslist": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.9.1.tgz", + "integrity": "sha512-3n3nPdbUqn3nWmsy4PeSQthz2ja1ndpoXta+dwFFNhveGjMg6FXpWYe12vsTpNoXJbzx3j7GZXdtoVIdvh3JbA==", + "dev": true, + "requires": { + "caniuse-lite": "1.0.30000770", + "electron-to-chromium": "1.3.27" + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30000770", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000770.tgz", + "integrity": "sha1-vI5/ULBzJzOQ22qzVzeJCaFOm9s=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "chardet": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.0.tgz", + "integrity": "sha1-C74TVaxE16PtSpJXB8TvcPgZD2w=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "optional": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "commander": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.1.tgz", + "integrity": "sha512-PCNLExLlI5HiPdaJs4pMXwOTHkSCpNQ1QJH9ykZLKtKEyKu3p9HgmH5l97vM8c0IUz6d54l+xEu2GG9yuYrFzA==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "2.0.1" + } + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "electron-to-chromium": { + "version": "1.3.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", + "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.11.0.tgz", + "integrity": "sha512-UWbhQpaKlm8h5x/VLwm0S1kheMrDj8jPwhnBMjr/Dlo3qqT7MvcN/UfKAR3E1N4lr4YNtOvS4m3hwsrVc/ky7g==", + "dev": true, + "requires": { + "ajv": "5.4.0", + "babel-code-frame": "6.26.0", + "chalk": "2.3.0", + "concat-stream": "1.6.0", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.0.0", + "eslint-scope": "3.7.1", + "espree": "3.5.2", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "3.3.0", + "is-resolvable": "1.0.0", + "js-yaml": "3.10.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.4.1", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.2.tgz", + "integrity": "sha512-/fhjt/VqzBA2SRsx7ErDtv6Ayf+XLw9LIOqmpBuHFCVwyJo2EtzGWMB9fYRFBoWWQLxmNmCpenNiH0RxyeS41w==", + "dev": true, + "requires": { + "eslint-restricted-globals": "0.1.1" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", + "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.5.0" + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + } + }, + "eslint-plugin-import": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", + "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.1", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + } + } + }, + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", + "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "espree": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", + "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "dev": true, + "requires": { + "acorn": "5.2.1", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "optional": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "optional": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "dev": true, + "requires": { + "chardet": "0.4.0", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "file-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/file-exists/-/file-exists-4.0.0.tgz", + "integrity": "sha1-EE6s8l0/1rPkYpUa6SNTMZX/tSs=" + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true, + "optional": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "optional": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true, + "optional": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "optional": true, + "requires": { + "for-in": "1.0.2" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.8.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.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.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "optional": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", + "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", + "dev": true, + "requires": { + "ansi-escapes": "3.0.0", + "chalk": "2.3.0", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.4", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx-lite": "4.0.8", + "rx-lite-aggregates": "4.0.8", + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "through": "2.3.8" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true, + "optional": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "optional": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true, + "optional": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true, + "optional": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true, + "optional": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "dev": true + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "optional": true, + "requires": { + "isarray": "1.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true, + "optional": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "optional": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" + } + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "optional": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true, + "optional": true + }, + "prettier": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.8.2.tgz", + "integrity": "sha512-fHWjCwoRZgjP1rvLP7OGqOznq7xH1sHMQUFLX8qLRO79hI57+6xbc5vB904LxEkCfgFgyr3vv06JkafgCSzoZg==", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "optional": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "optional": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true, + "optional": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "dev": true, + "requires": { + "is-promise": "2.1.0" + } + }, + "rx-lite": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", + "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", + "dev": true + }, + "rx-lite-aggregates": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", + "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", + "dev": true, + "requires": { + "rx-lite": "4.0.8" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true, + "optional": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "0.5.7" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "5.4.0", + "ajv-keywords": "2.1.1", + "chalk": "2.3.0", + "lodash": "4.17.4", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", + "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.5.0" + } + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + } + } +} diff --git a/packages/babel-runner/package.json b/packages/babel-runner/package.json new file mode 100644 index 00000000..47d81bd8 --- /dev/null +++ b/packages/babel-runner/package.json @@ -0,0 +1,48 @@ +{ + "name": "babel-runner", + "version": "1.0.0", + "description": "Helper for integrating babel config & node hooks", + "main": "dist/index.js", + "scripts": { + "prepare": "npm run build", + "publish-beta": "npm publish --tag beta", + "build": "babel src --out-dir dist", + "watch": "babel src --watch --out-dir dist", + "lint": "prettier --write './**/*.js' && eslint --config .eslintrc src", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "bin": { + "babel-runner": "dist/bin/index.js" + }, + "repository": { + "type": "git", + "url": "https://github.com/stoikerty/dev-toolkit/tree/master/packages/babel-runner" + }, + "keywords": [ + "babel", + "node-hooks", + "require-hooks", + "universal", + "universal javascript", + "isomorphic", + "babelrc", + "babel-register", + "dev-toolkit" + ], + "author": "Jorge Antunes @stoikerty", + "license": "MIT", + "devDependencies": { + "babel-cli": "^6.24.1", + "babel-eslint": "^7.2.3", + "babel-preset-env": "^1.6.0", + "babel-preset-stage-1": "^6.24.1", + "eslint": "^4.4.0", + "eslint-config-airbnb-base": "^11.0.1", + "eslint-plugin-import": "^2.2.0", + "prettier": "^1.7.4" + }, + "dependencies": { + "babel-register": "^6.26.0", + "file-exists": "^4.0.0" + } +} diff --git a/packages/babel-runner/src/bin/index.js b/packages/babel-runner/src/bin/index.js new file mode 100644 index 00000000..0e042e60 --- /dev/null +++ b/packages/babel-runner/src/bin/index.js @@ -0,0 +1,9 @@ +#!/usr/bin/env node +import babelRunner from '../index'; + +// Run specified file from second argument when first argument `--run` is given +const options = process.argv.slice(2); +const runCommandGiven = options[0] === '--run' || options[0] === '-r'; +const fileToRun = runCommandGiven && options[1]; + +babelRunner({ fileToRun }); diff --git a/packages/babel-runner/src/index.js b/packages/babel-runner/src/index.js new file mode 100644 index 00000000..4854514b --- /dev/null +++ b/packages/babel-runner/src/index.js @@ -0,0 +1,58 @@ +import path from 'path'; +import { sync as fileExists } from 'file-exists'; + +const projectFolder = process.cwd(); +const packageJsonPath = path.resolve(projectFolder, 'package.json'); +const packageJson = fileExists(packageJsonPath) ? require(packageJsonPath) : {}; +const pkgConfig = packageJson['babel-runner'] || {}; + +// Retrieve Paths for babelrc & node hooks from default locations or from package.json +const nodeHooksPath = (() => { + const filePath = pkgConfig.nodeHooks + ? pkgConfig.nodeHooks + : path.resolve(projectFolder, 'nodeHooks.js'); + return fileExists(filePath) ? filePath : null; +})(); +const babelrc = (() => { + const defaultBabelrcJS = path.resolve(projectFolder, 'babelrc.js'); + const defaultBabelrcJson = path.resolve(projectFolder, '.babelrc'); + + if (fileExists(defaultBabelrcJson)) { + // No need to read the file, we can use babel-register's automatic `.babelrc`-finding "feature" + return {}; + } else if (fileExists(defaultBabelrcJS)) { + // We read a file which expects all presets & plugins to be resolved with `require.resolve` + return require(defaultBabelrcJS); + } else if ( + pkgConfig.babelrc && + pkgConfig.babelrc.match('.js$') && + fileExists(pkgConfig.babelrc) + ) { + // Use the `babelrc.js`-file defined in package.json + return require(pkgConfig.babelrc); + } + + return null; +})(); + +// Run babel and include node-hooks +const babelRunner = ({ fileToRun } = {}) => { + // Teach Node how to import other filetypes, such as .scss .jsx or .png + if (nodeHooksPath) { + require(nodeHooksPath); + } + + // Teach Node how to use babel compilation, using explicitly specified babelrc + if (babelrc) { + require('babel-register')(babelrc); + } + + if (fileToRun) { + // rely on Node error if file doesn't exist + require(path.resolve(process.cwd(), fileToRun)); + } +}; + +module.exports = babelRunner; +module.exports.default = babelRunner; +module.exports.babelrc = babelrc; diff --git a/packages/dev-toolkit/.babelrc b/packages/dev-toolkit/.babelrc new file mode 100644 index 00000000..e9f042f1 --- /dev/null +++ b/packages/dev-toolkit/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["env", "stage-1"], + "plugins": ["dynamic-import-node"] +} diff --git a/packages/dev-toolkit/.eslintrc b/packages/dev-toolkit/.eslintrc index 73cef66b..f359949b 100644 --- a/packages/dev-toolkit/.eslintrc +++ b/packages/dev-toolkit/.eslintrc @@ -1,32 +1,19 @@ { - "plugins": [ - "jsx-control-statements" - ], - "extends": [ - "airbnb", - "plugin:jsx-control-statements/recommended" - ], + "extends": ["airbnb-base", "prettier"], "parser": "babel-eslint", + "plugins": ["prettier"], "rules": { - "no-multiple-empty-lines": [ - "error", - { - "max": 1 - } - ], + "prettier/prettier": "error", + "import/no-extraneous-dependencies": ["off", "never"], "import/no-unresolved": [ "error", { - "ignore": [ "src/" ] + "ignore": ["^dist/"] } - ] + ], + "import/extensions": ["off", "never"] }, - - "globals": [ - "app" - ], "env": { - "browser": true, "mocha": true } } diff --git a/packages/dev-toolkit/.mocha.opts b/packages/dev-toolkit/.mocha.opts new file mode 100644 index 00000000..25bd0c61 --- /dev/null +++ b/packages/dev-toolkit/.mocha.opts @@ -0,0 +1,3 @@ +src/**/*.spec.* --reporter spec +--slow 150 +--compilers js:babel-core/register,js:./dist/utilities/testHelpers/setupTests.js diff --git a/packages/dev-toolkit/.npmignore b/packages/dev-toolkit/.npmignore deleted file mode 100644 index ff634aa3..00000000 --- a/packages/dev-toolkit/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -############# -## Node -############# - -node_modules/ -npm-debug.* diff --git a/packages/dev-toolkit/.prettierrc b/packages/dev-toolkit/.prettierrc new file mode 100644 index 00000000..a44463ca --- /dev/null +++ b/packages/dev-toolkit/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/packages/dev-toolkit/Next-Readme-Draft.md b/packages/dev-toolkit/Next-Readme-Draft.md deleted file mode 100644 index c4d4846c..00000000 --- a/packages/dev-toolkit/Next-Readme-Draft.md +++ /dev/null @@ -1,105 +0,0 @@ -[ Draft Document to replace current Readme.md] - -# dev-toolkit - -Develop your react-powered Web App with minimum distractions. - -![](gif) - -* [Getting Started](#getting-started) โค Installation, folder structure. -* [Using images & files](#using-images--files) โค Import anything or use static files. -* [Making the most of CSS](making-the-most-of-css) โค CSS-modules, Autoprefixer... -* [Linting your files](#linting-your-files) โค With hot-reload & a useful overlay. -* [Build & deploy](#build--deploy) โค Move your app into production. -* [Using a test-framework](#using-a-test-framework) โค Use the default... or not. -* [Extending your app](#extending-your-app) โค You can, but be aware of the risks. - - - - -* [Contributing](#contributing) -* [List of available commands](#list-of-available-commands) -* [Specifications](#specifications) โค Main features, Default packages & compatibility. -* [Changelog](#changelog) - -## Getting Started -### Installation -### Initial project structure - -## Using images & files -### Importing in javascript -### Using the `public-files` folder - -## Linting your files -### Workflow with watch-command -### Editor configuration - -## Build & deploy -### Generating a `build` folder with all files -#### A simple build -#### Dynamic Pages backed by server-rendering -### Using a javascript server - -## Extending your app -### The toolkit config -### Environment Variables -### Extending Webpack & Babel -#### The Risks -#### Custom Webpack Config -#### Custom Babel Config - -## Using a test-framework -### Adding tests to your app -### Replacing the default test-suite - -## Contributing -### Acknowledgements -### Alternatives - -## List of available commands - -## Specifications -### Main features -### Default packages after `dev-toolkit --init` -### Compatiblity - -## Changelog - ---- - -# Notes / TODO - -Goals & Purpose: -- fast to setup -- run multiple apps using the same underlying principles -- as little configuration as necessary -- powerful enough to run production-scale apps -- defer testing and additional setup to app - -Very suitable for; -- Intermediary to advanced users -- Creating a single-page-app from scratch -- Migrating an old server to javascript-backed splash-page(s) - -Not quite suitable for: -- Learning React as a Beginner -- Creating small snippets of code to use in existing app - -TODO: -- add script for build -- add script for watch -- add script for publish? -- move readme for toolkit to root, check urls -- change homepage urls in package.json -- publish both packages - -Additional TODO for better docs with animated clips: -- gif for starting a project -- gif for when one creates a syntax/eslint error -- gif for testing with watch command -- gif for generating dynamic pages - -Necessities: -- install all dependencies for all packages at once -- build & watch all packages at once -- build each package individually on `npm publish` of a package diff --git a/packages/dev-toolkit/README.md b/packages/dev-toolkit/README.md deleted file mode 100644 index 8bcdfb9c..00000000 --- a/packages/dev-toolkit/README.md +++ /dev/null @@ -1,185 +0,0 @@ -

- universal-dev-toolkit-logo -

-

- Jump-start your react-powered Web App.
- dynamic pages -   sass & css-modules -   server-rendering -   hot-reload -

- -## Create a new project -```bash -# install & initialize new app -npm install -g dev-toolkit -dev-toolkit --init my_app -cd my_app -``` -``` -# run it via npm scripts -npm run dev -# or run it directly (-w or --watch) -dev-toolkit --watch -``` - -This will give you the following structure to work with: -``` -src -โ”œโ”€โ”€ client -โ”‚ โ”œโ”€โ”€ app.js -โ”‚ โ””โ”€โ”€ ... -โ””โ”€โ”€ server - โ””โ”€โ”€ ... -``` - -## Generate a static build -```bash -# Create `build`-folder with compiled files (-b or --build) -dev-toolkit --build -``` -- removes previous `build`-folder -- automatically uses production-builds of React and Redux -- allows for a [custom vendor-bundle](#define-what-modules-are-bundled-into-vendorjs) -- extracts css from individual modules -- hashes assets, including `jpg`, `png`, `gif` & `svg`-files - -### Verify build -Verify if static build is working correctly. -```bash -# Runs a minimal server that serves the build folder (--static or --serve-static) -dev-toolkit --serve-static -``` - -### Generate a static build with dynamic pages - -To make use of dynamic pages and components for making your app load faster use the extended build command. - -**For advanced users only**, [refer to this gist](https://gist.github.com/stoikerty/40a668e8fd4e2919034fd1eed2252bcb) for information on how to implement it. -```bash -# This will create an index-file for each dynamic route (-d --dynamic or --build --dynamic) -dev-toolkit --build --dynamic -``` -- html is pre-rendered and inserted into the body -- creates multiple js-bundles, one for each dynamic page -- each `index.html` contains a `script`-link to the `app` bundle and the page-bundle -- scripts use `async` and `defer`-attributes as appropriate -- each subsequent page can be pre-cached and loaded on demand - -## Setting up tests -You'll need to import the webpack config for running tests, [refer to this gist](https://gist.github.com/stoikerty/a202280147910b63a20e167dc4778fb8) for the setup. You'll be able to write your tests in ES2015, just like the rest of your app. Single tests can also be run in a watch-mode with the `npm run test-single`-command. - -## Use server with server-side rendering - -You can use your project as an universal/isomorphic server-side-rendered app.
**For advanced users only.** -```bash -# Compile and run `src/server/app` (-s or --serve) -dev-toolkit --serve -``` - -## Misc - -#### Check version -```bash -# Check Version (-v or --version) -dev-toolkit -v -``` - -#### Define what modules are bundled into `vendor.js` -```js -// in your package.json, add `vendor` in `toolkitSettings` section -"toolkitSettings": { - "vendor": [ - "react", - "react-dom", - "react-router" - ] -}, -``` - -#### Define what environment variables are available on client -```js -// In your package.json, add `sharedEnvs` in `toolkitSettings` section. -// The named variables will be available on the client via an exposed global `buildSettings.env` -"toolkitSettings": { - "sharedEnvs": [ - "NODE_ENV", - "API_DOMAIN" - ] -}, -``` - -## Features - -##### Compatibility - -- Multiplatform: Windows, OSX, Linux -- Node.js `last tested version 5.10.1` -- NPM `last tested version 3.8.3` - -##### Javascript Basics - -- [React] -- [ES2015 / ES6] -- [root-relative imports with `src/...`] -- [ESLint] - -##### Developer Convenience - -- [Browsersync] -- [Vanilla HMR, webpack's hot-reload] -- [jsx-control-statements] -- [`transform-class-properties` support] -- automatic asset-hashing during build, custom `vendor.js` -- support for various file-formats:
`css`, `scss`
`js`, `jsx`, `json`
`jpg`, `png`, `gif`, `svg` - -##### Powerful CSS Tools - -- [Autoprefixer] -- [sass / scss] -- [css-modules] - -##### Server-tools for Universal Apps - -- your own server app in `src/server/app` -- [powered by express] -- [react-router] - -[ES2015 / ES6]: https://babeljs.io/docs/learn-es2015/ -[`transform-class-properties` support]: https://babeljs.io/docs/plugins/transform-class-properties/ -[root-relative imports with `src/...`]: http://survivejs.com/webpack/requiring-files/ -[Vanilla HMR, webpack's hot-reload]: https://webpack.github.io/docs/hot-module-replacement-with-webpack.html -[Browsersync]: https://browsersync.io/ -[ESLint]: http://eslint.org/ -[React]: https://facebook.github.io/react/ -[jsx-control-statements]: https://github.com/AlexGilleran/jsx-control-statements -[sass / scss]: http://sass-lang.com/ -[css-modules]: https://github.com/css-modules/css-modules -[Autoprefixer]: https://github.com/postcss/autoprefixer -[powered by express]: http://expressjs.com/ -[react-router]: https://github.com/reactjs/react-router - - -## FAQ -- *I get an NPM warning after `--init` about `eslint-import-resolver`.* - -The package doesn't know that we're using webpack via the dev-toolkit and since webpack is not present in the dependencies, it throws an `UNMET PEER DEPENDENCY`-warning. - -- *The `dev-toolkit`-package is not part of the dependencies of the starting point I created with `--init`.* - -Since you already installed `dev-toolkit` globally, it would be easier to work on multiple projects without reinstalling the `dev-toolkit`-dependencies for each project. This way when you update the toolkit with `npm install -g dev-toolkit@version`, all your projects are updated as well. - -You can of course still pin your project with a specific version of the toolkit by running `npm install --save-dev dev-toolkit` inside your project folder. - ---- - -[![Codewake](https://www.codewake.com/badges/ask_question.svg)](https://www.codewake.com/p/dev-toolkit) -[![Join the chat at https://gitter.im/stoikerty/dev-toolkit](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/stoikerty/dev-toolkit?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - - - -Fancy working on the toolkit itself? Check out [the Contributing Guidelines](/CONTRIBUTING.md). - ---- - -kindly supported by BrowserStack. diff --git a/packages/dev-toolkit/Readme.md b/packages/dev-toolkit/Readme.md new file mode 100644 index 00000000..1eb5cb16 --- /dev/null +++ b/packages/dev-toolkit/Readme.md @@ -0,0 +1,79 @@ +

dev-toolkit

+

+Jump-start your react-powered Universal App
+Designed for Veterans +

+
+ +`dev-toolkit` provides you with an easy and quick way to get started with a pre-rendered & +server-rendered app. After creating your starting point with the `init` command, you get full +customizeability out of the box. + +### Quick Start + +```bash +$ npm install -g dev-toolkit +``` + +```bash +# Initialize a project with optional name, template, comments +# The comments explain how the `dev-toolkit` works with the template +$ dev-toolkit init [project_name] [--template template_name] [--skip-comments] +``` + +#### List of available templates + +* `standard` (default) +* `with-eslint` +* `with-sass` + +## Features + +* hot-reload on client by default +* server-rendering +* pre-rendering +* creating a build +* custom webpack config +* use environment variables on client + +### No CSS by default + +With CSS-in-JS solutions on the rise, it would be unwise to include dependencies for css-modules, +sass or less in every project that has `dev-toolkit` as a dependency which would introduce +additional installation time and bloat. The aim of dev-toolkit is to be unopinionated so that it can +be useful in many scenarios. + +## Contributing + +Check out the project locally & create a PR. + +```bash +# Clone down the repo locally +$ git clone git@github.com:stoikerty/dev-toolkit.git + +# Install root lerna dependencies +$ cd dev-toolkit +$ npm install + +# Bootstrap all packages +$ npm run bootstrap +# If you encounter linux/osx permission issues, try this +$ npm run bootstrap-fix + +# Run feature tests +$ cd feature-tests +$ npm install +$ npm run test +``` + +Your workflow will likely be to `cd` into a template of your choice in the `templates` directory +where you can test `dev-toolkit` and in parallel (in a separate terminal) re-run the +`bootstrap`-command in the root of the project after making changes in one of the `packages`. + +### Roadmap + +* Improved docs +* Using your own (external) template - under consideration +* Eject feature - under consideration +* serverless template - in development +* list differences between dev-toolkit, next.js & create-react-app diff --git a/packages/dev-toolkit/babelrc.js b/packages/dev-toolkit/babelrc.js deleted file mode 100644 index b28a28c6..00000000 --- a/packages/dev-toolkit/babelrc.js +++ /dev/null @@ -1,16 +0,0 @@ -module.exports = { - babelrc: false, - - presets: [ - require.resolve('babel-preset-es2015'), - require.resolve('babel-preset-stage-1'), - require.resolve('babel-preset-react'), - ], - plugins: [ - require.resolve('jsx-control-statements'), - require.resolve('babel-plugin-transform-class-properties'), - require.resolve('babel-plugin-transform-react-jsx-source'), - ], - - extensions: ['.jsx', '.js'], -}; diff --git a/packages/dev-toolkit/bin/dev-toolkit.js b/packages/dev-toolkit/bin/dev-toolkit.js deleted file mode 100755 index 8c24407f..00000000 --- a/packages/dev-toolkit/bin/dev-toolkit.js +++ /dev/null @@ -1,118 +0,0 @@ -#!/usr/bin/env node -const spawn = require('cross-spawn'); -const chalk = require('chalk'); -const path = require('path'); -const argv = require('yargs') - .alias('w', 'watch') - .alias('b', 'build') - .alias('i', 'init') - .alias('s', 'serve') - .alias('static', 'serve-static') - .alias('d', 'debug').argv; -const pkg = require('../package.json'); - -// Enables debugging messages -if (argv.debug) { - process.env.TOOLKIT_DEBUG = true; - console.log(chalk.magenta('DEBUG MODE')); -} else { - process.env.TOOLKIT_DEBUG = false; -} - -// Outputs current version number from `package.json` -if (argv.v || argv.version) { - console.log('[', chalk.magenta(pkg.name + ' v' + pkg.version), ']'); -} - -const debug = require('./utils/debug'); - -// runs corresponding script inside `./scripts`-folder -function run(options) { - console.log(chalk.magenta('[ ' + options.script + ' ]'), '- ' + options.message + '\n'); - - const isWin = process.platform === 'win32'; - const currentPath = path.resolve(process.cwd()); - const devToolkitPath = path.resolve(__dirname, 'dev-toolkit.js'); - - debug('Toolkit Version', pkg.version); - debug('Platform', process.platform); - debug('NODE_PATH', process.env.NODE_PATH); - debug('currentPath', currentPath); - debug('devToolkitPath', devToolkitPath); - debug('given arguments', argv); - debug(''); - - debug('running Script:', options.script); - var args = [ path.resolve(__dirname, 'scripts/' + options.script + '.js') ]; - - debug('...with options:', options); - debug('...with arguments:', options.args); - args = args.concat(options.args); - - // Add color support for dependency-modules like `chalk` - args.push('--color'); - - debug(chalk.magenta('---')); - - // Forward all environment variables to `spawn` so they can be used within the toolkit - const spawnEnv = process.env; - // Fixes `spawn node ENOENT` error by always transferring PATH - // http://stackoverflow.com/questions/27688804/how-do-i-debug-error-spawn-enoent-on-node-js - spawnEnv.PATH = process.env.PATH; - // Toolkit-related env variables - spawnEnv.NODE_PATH = currentPath; - spawnEnv.TOOLKIT_DEBUG = process.env.TOOLKIT_DEBUG; - - // spawn is required for root-relative imports to work in server-rendering, because webpack's - // alias is not picked up in node. For other solutions, see the following: - // https://gist.github.com/branneman/8048520 - // https://lostechies.com/derickbailey/2014/02/20/how-i-work-around-the-require-problem-in-nodejs/ - spawn( - 'node', - args, - { - env: spawnEnv, - - // OSX will throw error if shell is not set - shell: !isWin, - stdio: 'inherit', - } - ); -} - -if (argv.watch) { - run({ - script: 'watch', - message: 'Watching files for development', - args: [argv.watch], - }); -} -if (argv.serve) { - run({ - script: 'serve', - message: 'Watching files for development', - args: [argv.serve], - }); -} -if (argv['serve-static']) { - console.log(chalk.magenta('NOTE:'), 'This command is not meant for production use.'); - run({ - script: 'serveStatic', - message: 'Serving the /build folder using a minimal server', - args: [argv['serve-static']], - }); -} -if (argv.init) { - run({ - script: 'init', - message: 'Initializing new project', - args: [argv.init], - }); -} -if (argv.build) { - run({ - script: 'build', - message: 'Creating a static build' + (argv.dynamic ? ' with dynamic pages' : ''), - args: [(argv.dynamic ? 'dynamic' : '')], - }); -} diff --git a/packages/dev-toolkit/bin/scripts/build.js b/packages/dev-toolkit/bin/scripts/build.js deleted file mode 100644 index 0475f6e9..00000000 --- a/packages/dev-toolkit/bin/scripts/build.js +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env node -require('../utils/bootstrap'); - -global.toolkitScript = 'build'; -global.scriptOptions = { - dynamic: process.argv[2] === 'dynamic', -}; -require('../../dist/build'); diff --git a/packages/dev-toolkit/bin/scripts/init.js b/packages/dev-toolkit/bin/scripts/init.js deleted file mode 100644 index bcd517a8..00000000 --- a/packages/dev-toolkit/bin/scripts/init.js +++ /dev/null @@ -1,52 +0,0 @@ -#!/usr/bin/env node -const spawn = require('cross-spawn'); -const chalk = require('chalk'); -const path = require('path'); -const fse = require('fs-extra'); -const debug = require('../utils/debug'); -const appName = process.argv[2]; - -// TODO: Use a better method than checking against `true`-string to know if appName is defined -if (appName && appName !== 'true') { - const startingPoint = path.resolve(__dirname, '../../starting-point'); - const appPath = path.resolve(process.cwd(), appName); - - debug('startingPoint', startingPoint); - debug('appPath', appPath); - - fse.copy(startingPoint, appPath, function (err) { - if (err) return console.error(err); - - console.log(chalk.green('->') + ' created files for ' + chalk.magenta(appName)); - console.log(chalk.green('->') + ' installing app dependencies...'); - - const isWin = process.platform === 'win32'; - - spawn.sync( - 'npm', - ['install'], - { - env: isWin ? { - PATH: process.env.PATH, - APPDATA: process.env.APPDATA, - } : { - PATH: process.env.PATH, - }, - - // OSX will throw error if shell is not set - // shell: !isWin, - stdio: 'inherit', - cwd: appPath, - } - ); - - // TODO: #bug #windows - // Not sure why an `undefined`-folder gets created after spawn. - // Current Solution is to delete it again. (Without `spawn`, no folder is created.) - const undefinedFolder = path.resolve(appPath, 'undefined'); - fse.removeSync(undefinedFolder); - }); -} else { - console.log('Please specify a name for your app.'); - console.log(chalk.yellow('dev-toolkit --init my_app')); -} diff --git a/packages/dev-toolkit/bin/scripts/serve.js b/packages/dev-toolkit/bin/scripts/serve.js deleted file mode 100644 index a8359647..00000000 --- a/packages/dev-toolkit/bin/scripts/serve.js +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env node -require('../utils/bootstrap'); - -global.toolkitScript = 'serve'; -global.scriptOptions = {}; -require('../../dist/serve'); diff --git a/packages/dev-toolkit/bin/scripts/serveStatic.js b/packages/dev-toolkit/bin/scripts/serveStatic.js deleted file mode 100644 index 34ac687e..00000000 --- a/packages/dev-toolkit/bin/scripts/serveStatic.js +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env node -require('../utils/bootstrap'); - -global.toolkitScript = 'serveStatic'; -global.scriptOptions = {}; -require('../../dist/serveStatic'); diff --git a/packages/dev-toolkit/bin/scripts/watch.js b/packages/dev-toolkit/bin/scripts/watch.js deleted file mode 100644 index 69e527f1..00000000 --- a/packages/dev-toolkit/bin/scripts/watch.js +++ /dev/null @@ -1,6 +0,0 @@ -#!/usr/bin/env node -require('../utils/bootstrap'); - -global.toolkitScript = 'watch'; -global.scriptOptions = {}; -require('../../dist/watch'); diff --git a/packages/dev-toolkit/bin/utils/bootstrap.js b/packages/dev-toolkit/bin/utils/bootstrap.js deleted file mode 100644 index 550d6cbf..00000000 --- a/packages/dev-toolkit/bin/utils/bootstrap.js +++ /dev/null @@ -1,20 +0,0 @@ -const debug = require('./debug'); -const chalk = require('chalk'); -const path = require('path'); -const jsxHook = require('node-jsx-babel'); - -const babelConfig = require(path.resolve(__dirname, '../../babelrc.js')); - -// Set up server-side rendering for jsx-files -// NOTE: -// This statement is here due to a race-condition. -// It needs to be called before `babel-register`, otherwise it would be in `...config/loaders.js` -jsxHook.install(); - -require('babel-register')(babelConfig); -global.toolkitCli = { - isDev: true, -}; - -debug('NODE_PATH', process.env.NODE_PATH); -debug(chalk.magenta('---')); diff --git a/packages/dev-toolkit/bin/utils/debug.js b/packages/dev-toolkit/bin/utils/debug.js deleted file mode 100644 index 99143bb8..00000000 --- a/packages/dev-toolkit/bin/utils/debug.js +++ /dev/null @@ -1,12 +0,0 @@ -const chalk = require('chalk'); - -module.exports = function debug() { - if (process.env.TOOLKIT_DEBUG === 'true') { - var allArgs = [ - chalk.magenta('|| ') + - chalk.blue(arguments['0']) - ]; - allArgs = allArgs.concat([].splice.call(arguments, 1)); - console.log.apply(console, allArgs); - } -} diff --git a/packages/dev-toolkit/dev-toolkit-logo.png b/packages/dev-toolkit/dev-toolkit-logo.png deleted file mode 100644 index de48c5d4637226ce3ceb04ca06e434d2ac157df8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16413 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 diff --git a/packages/dev-toolkit/dev-toolkit.js b/packages/dev-toolkit/dev-toolkit.js new file mode 100644 index 00000000..06968d04 --- /dev/null +++ b/packages/dev-toolkit/dev-toolkit.js @@ -0,0 +1,5 @@ +const devToolkit = require('./dist/npmExport/dev-toolkit'); + +// Allow importing with `require` and as default with `import` +module.exports = devToolkit.default; +module.exports.default = devToolkit.default; diff --git a/packages/dev-toolkit/package-lock.json b/packages/dev-toolkit/package-lock.json new file mode 100644 index 00000000..c932ba58 --- /dev/null +++ b/packages/dev-toolkit/package-lock.json @@ -0,0 +1,5663 @@ +{ + "name": "dev-toolkit", + "version": "6.0.2", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "acorn": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", + "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==" + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=" + } + } + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.4.0.tgz", + "integrity": "sha1-MtHPCNvIDEMvQm8S4QslEfa0ZHQ=", + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=" + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1.js": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", + "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "requires": { + "util": "0.10.3" + } + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "assets-webpack-plugin": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/assets-webpack-plugin/-/assets-webpack-plugin-3.5.1.tgz", + "integrity": "sha1-kxzg1m1C6I7V5/GNZVIpQ8V6OH0=", + "requires": { + "camelcase": "1.2.1", + "escape-string-regexp": "1.0.5", + "lodash.assign": "3.2.0", + "lodash.merge": "3.3.2", + "mkdirp": "0.5.1" + } + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==" + }, + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "requires": { + "lodash": "4.17.4" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "babel-cli": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-cli/-/babel-cli-6.26.0.tgz", + "integrity": "sha1-UCq1SHTX24itALiHoGODzgPQAvE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-polyfill": "6.26.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "chokidar": "1.7.0", + "commander": "2.12.1", + "convert-source-map": "1.5.1", + "fs-readdir-recursive": "1.1.0", + "glob": "7.1.2", + "lodash": "4.17.4", + "output-file-sync": "1.1.2", + "path-is-absolute": "1.0.1", + "slash": "1.0.0", + "source-map": "0.5.7", + "v8flags": "2.1.1" + } + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "requires": { + "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.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.4", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-eslint": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-7.2.3.tgz", + "integrity": "sha1-sv4tgBJkcPXBlELcdXJTqJdxCCc=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0" + } + }, + "babel-generator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "requires": { + "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" + }, + "dependencies": { + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" + } + } + }, + "babel-helper-bindify-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", + "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-builder-binary-assignment-operator-visitor": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", + "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "requires": { + "babel-helper-explode-assignable-expression": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "requires": { + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", + "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-explode-class": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", + "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "requires": { + "babel-helper-bindify-decorators": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.4" + } + }, + "babel-helper-remap-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", + "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-loader": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", + "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", + "requires": { + "find-cache-dir": "1.0.0", + "loader-utils": "1.1.0", + "mkdirp": "0.5.1" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-1.2.0.tgz", + "integrity": "sha512-yeDwKaLgGdTpXL7RgGt5r6T4LmnTza/hUn5Ul8uZSGGMtEjYo13Nxai7SQaGCTEzUtg9Zq9qJn0EjEr7SeSlTQ==", + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0" + } + }, + "babel-plugin-syntax-async-functions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=" + }, + "babel-plugin-syntax-async-generators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", + "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=" + }, + "babel-plugin-syntax-class-constructor-call": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-constructor-call/-/babel-plugin-syntax-class-constructor-call-6.18.0.tgz", + "integrity": "sha1-nLnTn+Q8hgC+yBRkVt3L1OGnZBY=" + }, + "babel-plugin-syntax-class-properties": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", + "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=" + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=" + }, + "babel-plugin-syntax-dynamic-import": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", + "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=" + }, + "babel-plugin-syntax-exponentiation-operator": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=" + }, + "babel-plugin-syntax-export-extensions": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-export-extensions/-/babel-plugin-syntax-export-extensions-6.13.0.tgz", + "integrity": "sha1-cKFITw+QiaToStRLrDU8lbmxJyE=" + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=" + }, + "babel-plugin-syntax-trailing-function-commas": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", + "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=" + }, + "babel-plugin-transform-async-generator-functions": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", + "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-generators": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-async-to-generator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", + "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "requires": { + "babel-helper-remap-async-to-generator": "6.24.1", + "babel-plugin-syntax-async-functions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-class-constructor-call": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-constructor-call/-/babel-plugin-transform-class-constructor-call-6.24.1.tgz", + "integrity": "sha1-gNwoVQWsBn3LjWxl4vbxGrd2Xvk=", + "requires": { + "babel-plugin-syntax-class-constructor-call": "6.18.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-class-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", + "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-plugin-syntax-class-properties": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-decorators": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", + "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", + "requires": { + "babel-helper-explode-class": "6.24.1", + "babel-plugin-syntax-decorators": "6.13.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "requires": { + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "requires": { + "babel-helper-define-map": "6.26.0", + "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.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "requires": { + "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": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-exponentiation-operator": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", + "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", + "requires": { + "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", + "babel-plugin-syntax-exponentiation-operator": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-export-extensions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-export-extensions/-/babel-plugin-transform-export-extensions-6.22.0.tgz", + "integrity": "sha1-U3OLR+deghhYnuqUbLvTkQm75lM=", + "requires": { + "babel-plugin-syntax-export-extensions": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-object-rest-spread": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", + "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "regenerator-runtime": "0.10.5" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", + "dev": true + } + } + }, + "babel-preset-env": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", + "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-to-generator": "6.24.1", + "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.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "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.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0", + "browserslist": "2.9.1", + "invariant": "2.2.2", + "semver": "5.4.1" + } + }, + "babel-preset-stage-1": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-1/-/babel-preset-stage-1-6.24.1.tgz", + "integrity": "sha1-dpLNfc1oSZB+auSgqFWJz7niv7A=", + "requires": { + "babel-plugin-transform-class-constructor-call": "6.24.1", + "babel-plugin-transform-export-extensions": "6.22.0", + "babel-preset-stage-2": "6.24.1" + } + }, + "babel-preset-stage-2": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", + "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", + "requires": { + "babel-plugin-syntax-dynamic-import": "6.18.0", + "babel-plugin-transform-class-properties": "6.24.1", + "babel-plugin-transform-decorators": "6.24.1", + "babel-preset-stage-3": "6.24.1" + } + }, + "babel-preset-stage-3": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", + "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", + "requires": { + "babel-plugin-syntax-trailing-function-commas": "6.22.0", + "babel-plugin-transform-async-generator-functions": "6.24.1", + "babel-plugin-transform-async-to-generator": "6.24.1", + "babel-plugin-transform-exponentiation-operator": "6.24.1", + "babel-plugin-transform-object-rest-spread": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.1", + "home-or-tmp": "2.0.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-runner": { + "version": "1.0.0-beta-5", + "resolved": "https://registry.npmjs.org/babel-runner/-/babel-runner-1.0.0-beta-5.tgz", + "integrity": "sha512-rUWfh7HVPci4iJRnfrqQurKo/WjL0r30XFH2MlkYD/CT37G4VVltOuhPzmdeSoYGCzHxgETeA5VjnHA4HCHBNA==", + "requires": { + "babel-register": "6.26.0", + "file-exists": "4.0.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.1", + "regenerator-runtime": "0.11.0" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "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": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "requires": { + "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.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.4", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + }, + "better-npm-run": { + "version": "0.0.14", + "resolved": "https://registry.npmjs.org/better-npm-run/-/better-npm-run-0.0.14.tgz", + "integrity": "sha1-agOxoZ22MgUULXgDmV8jx3kHA4k=", + "dev": true, + "requires": { + "dotenv": "2.0.0", + "object-assign": "4.1.1" + } + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==" + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==" + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "browserify-aes": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", + "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "requires": { + "browserify-aes": "1.1.1", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.5" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "requires": { + "pako": "1.0.6" + } + }, + "browserslist": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.9.1.tgz", + "integrity": "sha512-3n3nPdbUqn3nWmsy4PeSQthz2ja1ndpoXta+dwFFNhveGjMg6FXpWYe12vsTpNoXJbzx3j7GZXdtoVIdvh3JbA==", + "requires": { + "caniuse-lite": "1.0.30000770", + "electron-to-chromium": "1.3.27" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=" + }, + "build": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/build/-/build-0.1.4.tgz", + "integrity": "sha1-cH/gJv/O3crL/c3zVur9pk8VEEY=", + "dev": true, + "requires": { + "cssmin": "0.3.2", + "jsmin": "1.0.1", + "jxLoader": "0.1.1", + "moo-server": "1.3.0", + "promised-io": "0.3.5", + "timespan": "2.3.0", + "uglify-js": "1.3.5", + "walker": "1.0.7", + "winston": "2.4.0", + "wrench": "1.3.9" + }, + "dependencies": { + "uglify-js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.3.5.tgz", + "integrity": "sha1-S1v/+Rhu/7qoiOTJ6UvZ/EyUkp0=", + "dev": true + } + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=" + }, + "bundle-loader": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/bundle-loader/-/bundle-loader-0.5.5.tgz", + "integrity": "sha1-Ef17CO34ah1wjvyx7KYspR9sNoo=", + "requires": { + "loader-utils": "1.1.0" + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "caniuse-lite": { + "version": "1.0.30000770", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000770.tgz", + "integrity": "sha1-vI5/ULBzJzOQ22qzVzeJCaFOm9s=" + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chai": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", + "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", + "dev": true, + "requires": { + "assertion-error": "1.0.2", + "deep-eql": "0.1.3", + "type-detect": "1.0.0" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-spinners": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.1.0.tgz", + "integrity": "sha1-8YR7FohE2RemceudFH499JfJDQY=" + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "dev": true + }, + "commander": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.1.tgz", + "integrity": "sha512-PCNLExLlI5HiPdaJs4pMXwOTHkSCpNQ1QJH9ykZLKtKEyKu3p9HgmH5l97vM8c0IUz6d54l+xEu2GG9yuYrFzA==", + "dev": true + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=" + }, + "contains-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", + "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + }, + "core-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.9" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.5", + "randomfill": "1.0.3" + } + }, + "cssmin": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssmin/-/cssmin-0.3.2.tgz", + "integrity": "sha1-3c5MVHtRCuDVlKjx+/iq+OLFwA0=", + "dev": true + }, + "cycle": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", + "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "requires": { + "es5-ext": "0.10.37" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decomment": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/decomment/-/decomment-0.9.1.tgz", + "integrity": "sha512-9vwabbCoArDvgbZnFqWcGPVvSIIvWTNu1yaAc3Tg3q5pOzORo6nANO3TPwBuiKwN7stMDZJgNnR6USU3H6EQrQ==", + "requires": { + "esprima": "4.0.0" + } + }, + "deep-eql": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", + "dev": true, + "requires": { + "type-detect": "0.1.1" + }, + "dependencies": { + "type-detect": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", + "dev": true + } + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "0.1.6" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "requires": { + "repeating": "2.0.1" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.5" + } + }, + "dirty-chai": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/dirty-chai/-/dirty-chai-1.2.2.tgz", + "integrity": "sha1-eEleYZY19/5EIZqkyDeEm/GDFC4=", + "dev": true + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=" + }, + "dotenv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-2.0.0.tgz", + "integrity": "sha1-vXWcNXqqcDZeAclrewvsCKbg2Uk=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.27", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", + "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=" + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=" + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" + } + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "requires": { + "prr": "0.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es5-ext": { + "version": "0.10.37", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", + "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", + "requires": { + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37", + "es6-iterator": "2.0.3", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.9", + "doctrine": "2.0.0", + "escope": "3.6.0", + "espree": "3.5.2", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.1", + "is-resolvable": "1.0.0", + "js-yaml": "3.10.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + }, + "dependencies": { + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-11.3.2.tgz", + "integrity": "sha512-/fhjt/VqzBA2SRsx7ErDtv6Ayf+XLw9LIOqmpBuHFCVwyJo2EtzGWMB9fYRFBoWWQLxmNmCpenNiH0RxyeS41w==", + "dev": true, + "requires": { + "eslint-restricted-globals": "0.1.1" + } + }, + "eslint-config-prettier": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.6.0.tgz", + "integrity": "sha1-8h2w67Q4rWePuYlGCXxLsZi+/Mw=", + "dev": true, + "requires": { + "get-stdin": "5.0.1" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.1.tgz", + "integrity": "sha512-yUtXS15gIcij68NmXmP9Ni77AQuCN0itXbCc/jWd8C6/yKZaSNXicpC8cgvjnxVdmfsosIXrjpzFq7GcDryb6A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "resolve": "1.5.0" + } + }, + "eslint-module-utils": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.1.1.tgz", + "integrity": "sha512-jDI/X5l/6D1rRD/3T43q8Qgbls2nq5km5KSqiwlyUbGo5+04fXhMKdCPhjwbqAa6HXWaMxj8Q4hQDIh7IadJQw==", + "dev": true, + "requires": { + "debug": "2.6.9", + "pkg-dir": "1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "pkg-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "1.1.2" + } + } + } + }, + "eslint-plugin-import": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.8.0.tgz", + "integrity": "sha512-Rf7dfKJxZ16QuTgVv1OYNxkZcsu/hULFnC+e+w0Gzi6jMC3guQoWQgxYxc54IDRinlb6/0v5z/PxxIKmVctN+g==", + "dev": true, + "requires": { + "builtin-modules": "1.1.1", + "contains-path": "0.1.0", + "debug": "2.6.9", + "doctrine": "1.5.0", + "eslint-import-resolver-node": "0.3.1", + "eslint-module-utils": "2.1.1", + "has": "1.0.1", + "lodash.cond": "4.5.2", + "minimatch": "3.0.4", + "read-pkg-up": "2.0.0" + }, + "dependencies": { + "doctrine": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", + "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + } + } + }, + "eslint-plugin-prettier": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.3.1.tgz", + "integrity": "sha512-AV8shBlGN9tRZffj5v/f4uiQWlP3qiQ+lh+BhTqRLuKSyczx+HRWVkVZaf7dOmguxghAH1wftnou/JUEEChhGg==", + "dev": true, + "requires": { + "fast-diff": "1.1.2", + "jest-docblock": "21.2.0" + } + }, + "eslint-restricted-globals": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz", + "integrity": "sha1-NfDVy8ZMLj7WLpO0saevBbp+1Nc=", + "dev": true + }, + "espree": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.2.tgz", + "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", + "dev": true, + "requires": { + "acorn": "5.2.1", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" + }, + "esprima-extract-comments": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/esprima-extract-comments/-/esprima-extract-comments-0.2.1.tgz", + "integrity": "sha1-kBjY3zf/2V3WFQFajF8Ede10NCM=", + "requires": { + "esprima": "2.7.3" + }, + "dependencies": { + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + } + } + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.37" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "2.2.3" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "requires": { + "is-extendable": "0.1.1" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "extract-comments": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/extract-comments/-/extract-comments-0.10.1.tgz", + "integrity": "sha1-i2AxgIovX94c1nv4MXuRggQwRAg=", + "requires": { + "define-property": "0.2.5", + "esprima-extract-comments": "0.2.1", + "extend-shallow": "2.0.1", + "parse-code-context": "0.2.2" + } + }, + "eyes": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", + "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" + }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "file-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/file-exists/-/file-exists-4.0.0.tgz", + "integrity": "sha1-EE6s8l0/1rPkYpUa6SNTMZX/tSs=" + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-cache-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", + "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "requires": { + "commondir": "1.0.1", + "make-dir": "1.1.0", + "pkg-dir": "2.0.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "requires": { + "locate-path": "2.0.0" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "1.0.2" + } + }, + "formatio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, + "fs-extra": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.2.tgz", + "integrity": "sha1-+RcExT0bRh+JNFKwwwfZmXZHq2s=", + "requires": { + "graceful-fs": "4.1.11", + "jsonfile": "4.0.0", + "universalify": "0.1.1" + } + }, + "fs-readdir-recursive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "optional": true, + "requires": { + "nan": "2.8.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "bundled": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.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.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + } + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" + }, + "get-stdin": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", + "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==" + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=" + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", + "lodash": "4.17.4", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + }, + "dependencies": { + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=" + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-my-json-valid": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jest-docblock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=" + }, + "jsmin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/jsmin/-/jsmin-1.0.1.tgz", + "integrity": "sha1-570NzWSWw79IYyNb9GGj2YqjuYw=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==" + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "just-extend": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", + "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", + "dev": true + }, + "jxLoader": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jxLoader/-/jxLoader-0.1.1.tgz", + "integrity": "sha1-ATTqUUTlM7WU/B/yX/GU4jXFPs0=", + "dev": true, + "requires": { + "js-yaml": "0.3.7", + "moo-server": "1.3.0", + "promised-io": "0.3.5", + "walker": "1.0.7" + }, + "dependencies": { + "js-yaml": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-0.3.7.tgz", + "integrity": "sha1-1znY7oZGHlSzVNan19HyrZoWf2I=", + "dev": true + } + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" + }, + "klaw-sync": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-3.0.2.tgz", + "integrity": "sha512-32bw9y2nKrnpX2LsJnDTBO2TSdOKPbXfQAWl7Lupcc3D0iKkzI/sQDEw1GjkOuTqZEhe+bVxKSlhSRLxyeytcw==", + "requires": { + "graceful-fs": "4.1.11" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=" + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + }, + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=" + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=" + }, + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "requires": { + "lodash._bindcallback": "3.0.1", + "lodash._isiterateecall": "3.0.9", + "lodash.restparam": "3.6.1" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash.assign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.2.0.tgz", + "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._createassigner": "3.1.1", + "lodash.keys": "3.1.2" + } + }, + "lodash.cond": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", + "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isplainobject": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz", + "integrity": "sha1-moI4rhayAEMpYM1zRlEtASP79MU=", + "requires": { + "lodash._basefor": "3.0.3", + "lodash.isarguments": "3.1.0", + "lodash.keysin": "3.0.8" + } + }, + "lodash.istypedarray": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz", + "integrity": "sha1-yaR3SYYHUB2OhJTSg7h8OSgc72I=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.keysin": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz", + "integrity": "sha1-IsRJPrvtsUJ5YqVLRFssinZ/tH8=", + "requires": { + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.merge": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-3.3.2.tgz", + "integrity": "sha1-DZDZPtY3sYeEN7s+IWASYNev6ZQ=", + "requires": { + "lodash._arraycopy": "3.0.0", + "lodash._arrayeach": "3.0.0", + "lodash._createassigner": "3.1.1", + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4", + "lodash.isplainobject": "3.2.0", + "lodash.istypedarray": "3.0.6", + "lodash.keys": "3.1.2", + "lodash.keysin": "3.0.8", + "lodash.toplainobject": "3.0.0" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + }, + "lodash.toplainobject": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz", + "integrity": "sha1-KHkK2ULSk9eKpmOgfs9/UsoEGY0=", + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keysin": "3.0.8" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "requires": { + "chalk": "1.1.3" + } + }, + "lolex": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.1.tgz", + "integrity": "sha512-mQuW55GhduF3ppo+ZRUTz1PRjEh1hS5BbqU7d8D0ez2OKxHDod7StPPeAVKisZR5aLkHZjdGWSL42LSONUJsZw==", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "requires": { + "js-tokens": "3.0.2" + } + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-dir": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", + "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "requires": { + "pify": "3.0.0" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.4" + } + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "requires": { + "mimic-fn": "1.1.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "requires": { + "errno": "0.1.4", + "readable-stream": "2.3.3" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.5.0.tgz", + "integrity": "sha512-v/jMDoK/qKptnTuC3YUNbIj8uUYvTCIHzVu9BHldKSWja48wusAtfjlcBlqnFrqClu3yf69ScDxBPrIyFnF51g==" + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=" + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "3.2.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "moo-server": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/moo-server/-/moo-server-1.3.0.tgz", + "integrity": "sha1-XceVaVZaENbv7VQ5SR5p0jkuWPE=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "optional": true + }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "nise": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.0.tgz", + "integrity": "sha512-q9jXh3UNsMV28KeqI43ILz5+c3l+RiNW8mhurEwCKckuHQbL+hTJIKKTiUlCPKlgQ/OukFvSnKB/Jk3+sFbkGA==", + "dev": true, + "requires": { + "formatio": "1.2.0", + "just-extend": "1.1.27", + "lolex": "1.6.0", + "path-to-regexp": "1.7.0", + "text-encoding": "0.6.4" + }, + "dependencies": { + "lolex": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", + "dev": true + } + } + }, + "node-libs-browser": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", + "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.2.0", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.12.0", + "domain-browser": "1.1.7", + "events": "1.1.1", + "https-browserify": "1.0.0", + "os-browserify": "0.3.0", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.3", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "1.0.3", + "timers-browserify": "2.0.4", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.4.1", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "2.0.1" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "1.1.0" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } + } + }, + "ora": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ora/-/ora-1.3.0.tgz", + "integrity": "sha1-gAeN0rkqk0r2ajrXKluRBpTt5Ro=", + "requires": { + "chalk": "1.1.3", + "cli-cursor": "2.1.0", + "cli-spinners": "1.1.0", + "log-symbols": "1.0.2" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=" + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "output-file-sync": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/output-file-sync/-/output-file-sync-1.1.2.tgz", + "integrity": "sha1-0KM+7+YaIF+suQCS6CZZjVJFznY=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "mkdirp": "0.5.1", + "object-assign": "4.1.1" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=" + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "requires": { + "p-limit": "1.1.0" + } + }, + "pako": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", + "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==" + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "requires": { + "asn1.js": "4.9.2", + "browserify-aes": "1.1.1", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-code-context": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/parse-code-context/-/parse-code-context-0.2.2.tgz", + "integrity": "sha1-FEuK+3IZSC1+iMHranZVlvOmrA0=" + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "requires": { + "error-ex": "1.3.1" + } + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "requires": { + "pify": "2.3.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } + } + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "requires": { + "find-up": "2.1.0" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "prettier": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.7.4.tgz", + "integrity": "sha1-XoYkrpNjyA+V7GRFhOzfVddPk/o=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "promised-io": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/promised-io/-/promised-io-0.3.5.tgz", + "integrity": "sha1-StIXuzZYvKrplGsXqGaOzYUeE1Y=", + "dev": true + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.5" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=" + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "randomfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", + "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "requires": { + "randombytes": "2.0.5", + "safe-buffer": "5.1.1" + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.5.0" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==" + }, + "regenerator-runtime": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=" + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "requires": { + "jsesc": "0.5.0" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "requires": { + "is-finite": "1.0.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" + }, + "sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.0.4", + "rechoir": "0.6.2" + } + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sinon": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-3.3.0.tgz", + "integrity": "sha512-/flfGfIxIRXSvZBHJzIf3iAyGYkmMQq6SQjA0cx9SOuVuq+4ZPPO4LJtH1Ce0Lznax1KSG1U6Dad85wIcSW19w==", + "dev": true, + "requires": { + "build": "0.1.4", + "diff": "3.2.0", + "formatio": "1.2.0", + "lodash.get": "4.4.2", + "lolex": "2.3.1", + "native-promise-only": "0.8.1", + "nise": "1.2.0", + "path-to-regexp": "1.7.0", + "samsam": "1.3.0", + "text-encoding": "0.6.4", + "type-detect": "4.0.5" + }, + "dependencies": { + "type-detect": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", + "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", + "dev": true + } + } + }, + "sinon-chai": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", + "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "requires": { + "source-map": "0.5.7" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=" + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", + "dev": true + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "requires": { + "astral-regex": "1.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" + }, + "strip-comments": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-0.4.4.tgz", + "integrity": "sha1-ucqvxP6QX5bAkd+J+achXyqmKcY=", + "requires": { + "extend-shallow": "2.0.1", + "extract-comments": "0.10.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "table": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + } + } + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=" + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "time-stamp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", + "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=" + }, + "timers-browserify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", + "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "requires": { + "setimmediate": "1.0.5" + } + }, + "timespan": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/timespan/-/timespan-2.3.0.tgz", + "integrity": "sha1-SQLOBAvRPYRcj1myfp1ZutbzmSk=", + "dev": true + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=" + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-detect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", + "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.0.2" + } + }, + "universalify": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", + "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + } + } + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=" + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "requires": { + "indexof": "0.0.1" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.11" + } + }, + "watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "requires": { + "async": "2.6.0", + "chokidar": "1.7.0", + "graceful-fs": "4.1.11" + } + }, + "webpack": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", + "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", + "requires": { + "acorn": "5.2.1", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.4.0", + "ajv-keywords": "2.1.1", + "async": "2.6.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.0.4", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.1.0", + "source-map": "0.5.7", + "supports-color": "4.5.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.4.0", + "webpack-sources": "1.0.2", + "yargs": "8.0.2" + }, + "dependencies": { + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "webpack-dev-middleware": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.1.tgz", + "integrity": "sha512-UzyVg/CKBKkymDpqOoQ4mWTs9zQp0DPCY8zbol9K0tPhqoM+JU5knKGXyMQ/Cdrmzb9Cw3eetm67fIsJ7u7ryg==", + "requires": { + "memory-fs": "0.4.1", + "mime": "1.5.0", + "path-is-absolute": "1.0.1", + "range-parser": "1.2.0", + "time-stamp": "2.0.0" + } + }, + "webpack-hot-middleware": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.20.0.tgz", + "integrity": "sha512-AYwVG9DCvMoXbwx8eK16CbJY3Ltwap44lW3T7hFsE0U3zRwtViHMw1DFpY5hMwXNqKsUk3HtNcf3PoV+gIxJeg==", + "requires": { + "ansi-html": "0.0.7", + "html-entities": "1.2.1", + "querystring": "0.2.0", + "strip-ansi": "3.0.1" + } + }, + "webpack-sources": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.2.tgz", + "integrity": "sha512-Y7UddMCv6dGjy81nBv6nuQeFFIt5aalHm7uyDsAsW86nZwfOVPGRr3XMjEQLaT+WKo8rlzhC9qtbJvYKLtAwaw==", + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "winston": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.0.tgz", + "integrity": "sha1-gIBQuT1SZh7Z+2wms/DIJnCLCu4=", + "dev": true, + "requires": { + "async": "1.0.0", + "colors": "1.0.3", + "cycle": "1.0.3", + "eyes": "0.1.8", + "isstream": "0.1.2", + "stack-trace": "0.0.10" + }, + "dependencies": { + "async": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", + "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", + "dev": true + } + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "wrench": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.3.9.tgz", + "integrity": "sha1-bxPsNRRTF+spLKX2UxORskQRFBE=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + } + } + } + } +} diff --git a/packages/dev-toolkit/package.json b/packages/dev-toolkit/package.json index 6cba860f..19314c0d 100644 --- a/packages/dev-toolkit/package.json +++ b/packages/dev-toolkit/package.json @@ -1,31 +1,39 @@ { "name": "dev-toolkit", - "version": "5.6.0", - "description": "Development Toolkit for React Veterans", - "main": "index.js", + "version": "6.0.2", + "description": "Universal Development Toolkit for React Veterans", + "main": "dev-toolkit.js", + "files": [ + "dist", + "dev-toolkit.js", + "settings.js", + "bootstrap.js", + "Readme.md" + ], "scripts": { - "prepublish": "npm run build", - "build": "babel src --presets es2015 --out-dir dist", - "watch": "babel src --presets es2015 --watch --out-dir dist", - "test": "echo \"Error: no test specified\" && exit 1" + "prepare": "npm run copy-readme && npm run build", + "copy-readme": "cp ../../Readme.md ./Readme.md", + "publish-beta": "npm publish --tag beta", + "build": "babel src --out-dir dist && node ./dist/postinstall-prepare/copy-templates", + "watch": "babel src --watch --out-dir dist", + "test": "bnr test", + "lint": "prettier --write './**/*.js' && eslint --config .eslintrc src" + }, + "betterScripts": { + "test": { + "command": "mocha --opts .mocha.opts", + "env": { + "TOOLKIT_TEST": "true", + "NODE_PATH": "." + } + } }, "bin": { - "dev-toolkit": "bin/dev-toolkit.js" + "dev-toolkit": "dist/bin/index.js" }, "repository": { "type": "git", - "url": "git+https://github.com/stoikerty/dev-toolkit.git" - }, - "babel": { - "presets": [ - "es2015", - "stage-1", - "react" - ], - "plugins": [ - "jsx-control-statements", - "transform-class-properties" - ] + "url": "https://github.com/stoikerty/dev-toolkit" }, "keywords": [ "stoikerty", @@ -38,7 +46,8 @@ "middleman", "stk-toolkit", "universal-dev-toolkit", - "dev-toolkit" + "dev-toolkit", + "create-react-app" ], "author": "Jorge Antunes @stoikerty", "license": "ISC", @@ -47,67 +56,40 @@ }, "homepage": "https://github.com/stoikerty/dev-toolkit#readme", "dependencies": { - "autoprefixer": "^6.3.7", - "babel-cli": "^6.16.0", - "babel-core": "^6.10.4", - "babel-eslint": "^6.1.2", - "babel-loader": "^6.2.4", - "babel-plugin-transform-class-properties": "^6.10.2", - "babel-plugin-transform-react-jsx-source": "^6.9.0", - "babel-preset-es2015": "^6.16.0", - "babel-preset-react": "^6.5.0", - "babel-preset-stage-1": "^6.5.0", - "babel-register": "^6.9.0", - "body-parser": "^1.15.2", - "browser-sync": "^2.17.5", - "browser-sync-webpack-plugin": "^1.1.3", - "bundle-loader": "^0.5.4", - "chalk": "^1.1.3", - "compression": "^1.6.2", - "compression-webpack-plugin": "^0.3.1", - "copy-webpack-plugin": "^3.0.1", - "cross-env": "^2.0.0", - "cross-spawn": "^4.0.0", - "css-loader": "^0.23.1", - "css-modules-require-hook": "^4.0.1", - "dynamic-pages": "^0.3.0", - "eazy-logger": "^3.0.2", - "errorhandler": "^1.4.3", + "assets-webpack-plugin": "^3.5.1", + "babel-loader": "^7.1.2", + "babel-plugin-dynamic-import-node": "^1.0.2", + "babel-preset-env": "^1.6.0", + "babel-preset-stage-1": "^6.24.1", + "babel-runner": "1.0.0-beta-5", + "bundle-loader": "^0.5.5", + "cross-spawn": "^5.0.1", + "decomment": "^0.9.0", + "fs-extra": "^4.0.1", + "klaw-sync": "^3.0.0", + "ora": "^1.3.0", + "string-length": "^2.0.0", + "strip-comments": "^0.4.4", + "webpack": "^3.5.5", + "webpack-dev-middleware": "^1.12.0", + "webpack-hot-middleware": "^2.18.2", + "yargs": "^8.0.2" + }, + "devDependencies": { + "babel-cli": "^6.26.0", + "babel-core": "^6.26.0", + "babel-eslint": "^7.2.3", + "better-npm-run": "^0.0.14", + "chai": "^3.5.0", + "dirty-chai": "^1.2.2", "eslint": "^3.4.0", - "eslint-config-airbnb": "^10.0.1", - "eslint-import-resolver-webpack": "^0.5.1", - "eslint-loader": "^1.5.0", - "eslint-plugin-import": "^1.14.0", - "eslint-plugin-jsx-a11y": "^2.2.1", - "eslint-plugin-jsx-control-statements": "^2.1.1", - "eslint-plugin-react": "^6.2.0", - "express": "^4.14.0", - "extract-text-webpack-plugin": "^1.0.1", - "file-exists": "^2.0.0", - "file-loader": "^0.9.0", - "files-require-hook": "^1.0.0", - "find-port": "^2.0.1", - "handlebars": "^4.0.5", - "handlebars-loader": "^1.3.0", - "html-webpack-plugin": "^2.21.0", - "image-webpack-loader": "^1.8.0", - "jsdom": "^9.4.2", - "json-loader": "^0.5.4", - "jsx-control-statements": "^3.1.3", - "manifest-revision-webpack-plugin": "^0.3.0", - "method-override": "^2.3.6", - "ncp": "^2.0.0", - "node-jsx-babel": "^0.14.2", - "node-sass": "^3.10.1", - "postcss-loader": "^0.9.1", - "progress-bar-webpack-plugin": "^1.8.0", - "rimraf": "^2.5.4", - "sass-loader": "^3.2.2", - "script-ext-html-webpack-plugin": "^1.3.0", - "style-loader": "^0.13.1", - "webpack": "^1.13.1", - "webpack-dev-middleware": "^1.6.1", - "webpack-hot-middleware": "^2.10.0", - "yargs": "^4.8.1" + "eslint-config-airbnb-base": "^11.3.1", + "eslint-config-prettier": "2.6.0", + "eslint-plugin-import": "^2.7.0", + "eslint-plugin-prettier": "2.3.1", + "mocha": "^3.5.0", + "prettier": "1.7.4", + "sinon": "^3.2.1", + "sinon-chai": "^2.13.0" } } diff --git a/packages/dev-toolkit/settings.js b/packages/dev-toolkit/settings.js index 8cba88a6..535b44db 100644 --- a/packages/dev-toolkit/settings.js +++ b/packages/dev-toolkit/settings.js @@ -1 +1 @@ -module.exports = require('./dist/src/settings'); +module.exports = require('./dist/npmExport/dev-toolkit/settings'); diff --git a/packages/dev-toolkit/src/_userSettings.js b/packages/dev-toolkit/src/_userSettings.js deleted file mode 100644 index 2f18edec..00000000 --- a/packages/dev-toolkit/src/_userSettings.js +++ /dev/null @@ -1,111 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import fileExists from 'file-exists'; - -import debug from './utils/debug'; - -const requireOrNull = (requirePath) => ( - // eslint-disable-next-line global-require - fileExists(requirePath) ? require(requirePath) : null -); - -export const currentScript = global.toolkitScript; -debug('currentScript', currentScript); - -export const scriptOptions = global.scriptOptions || {}; -debug('scriptOptions', scriptOptions); - -export const rootForProject = './'; -debug('rootForProject', rootForProject); - -export const rootForRequire = process.cwd(); -debug('rootForRequire', rootForRequire); - -export const rootForToolkit = path.resolve(__dirname, '../'); -debug('rootForToolkit', rootForToolkit); - -const pkg = requireOrNull(path.resolve(rootForRequire, 'package.json')) || {}; -export const sharedEnvs = pkg.toolkitSettings && pkg.toolkitSettings.sharedEnvs ? - pkg.toolkitSettings.sharedEnvs : ['NODE_ENV']; -debug('sharedEnvs', sharedEnvs); -export const vendor = pkg.toolkitSettings && pkg.toolkitSettings.vendor ? - pkg.toolkitSettings.vendor : []; -debug('vendor', vendor); - -// NOTE: There's limited support for using these custom config escape hatches. You're on your own! -export const overrideConfig = requireOrNull( - path.resolve( - rootForRequire, - pkg.toolkitSettings.webpackConfigPath ? - pkg.toolkitSettings.webpackConfigPath : 'customWebpackConfig.js' - )); -debug('overrideConfig', overrideConfig); - -// eslint-disable-next-line global-require -const toolkitBabelConfig = requireOrNull(path.resolve(__dirname, '../babelrc.js')) || {}; -debug('toolkitBabelConfig', toolkitBabelConfig); - -// NOTE: There's limited support for using these custom config escape hatches. You're on your own! -const overrideBabelConfig = requireOrNull( - path.resolve( - rootForRequire, - pkg.toolkitSettings.babelConfigPath ? pkg.toolkitSettings.babelConfigPath : 'customBabelrc.js' - )) || {}; -debug('overrideBabelConfig', overrideBabelConfig); -if (overrideBabelConfig.presets) { - toolkitBabelConfig.presets = toolkitBabelConfig.presets.concat(overrideBabelConfig.presets); - delete overrideBabelConfig.presets; -} -if (overrideBabelConfig.plugins) { - toolkitBabelConfig.plugins = toolkitBabelConfig.plugins.concat(overrideBabelConfig.plugins); - delete overrideBabelConfig.plugins; -} - -export const babelConfig = { ...toolkitBabelConfig, ...overrideBabelConfig }; -debug('babelConfig', babelConfig); - -const eslintProjectConfig = path.resolve(rootForProject, '.eslintrc'); -// eslint-disable-next-line global-require -export const eslintConfig = JSON.parse(fs.readFileSync(eslintProjectConfig, 'utf8')); - -// environment variables & defaults -export const env = { - HOST: process.env.HOST || 'localhost', - PORT: process.env.PORT || 2000, - BROWSERSYNC_HOST: process.env.BROWSERSYNC_HOST || 'localhost', - BROWSERSYNC_PORT: process.env.BROWSERSYNC_PORT || 3000, - VERBOSE_LOGGING: process.env.VERBOSE_LOGGING || false, -}; - -const clientRoot = path.resolve(rootForProject, 'src/client'); -const serverRoot = path.resolve(rootForProject, 'src/server'); -const buildFolder = path.resolve(rootForProject, 'build'); - -const clientAppEntryPoint = fileExists(path.resolve(clientRoot, 'app.js')) ? - path.resolve(clientRoot, 'app.js') : path.resolve(clientRoot, 'app.jsx'); -const defaultPublicPath = '/'; -const publicPath = process.env.PUBLIC_PATH || defaultPublicPath; - -export const PATHS = { - publicFilesFolder: path.resolve(serverRoot, 'public-files'), - templateLocation: path.resolve(serverRoot, 'views/layout.hbs'), - dynamicRenderFile: path.resolve(serverRoot, 'dynamicRender.js'), - - manifestRootAssetPath: './src/client', - manifestFile: path.resolve(buildFolder, 'manifest.json'), - eslintProjectConfig, - scssIncludePaths: [clientRoot], - - clientRoot, - serverRoot, - clientAppEntryPoint, - buildFolder, - publicPath: (currentScript === 'watch') ? defaultPublicPath : publicPath, -}; -debug('PATHS: ', PATHS); - -const watchNamingConvention = '[name]'; -export const buildNamingConvention = '[name].[chunkhash]'; -export const namingConvention = - (currentScript === 'watch') ? watchNamingConvention : buildNamingConvention; -export const cssChunkNaming = '[name]__[local]___[hash:base64:5]'; diff --git a/packages/dev-toolkit/src/bin/index.js b/packages/dev-toolkit/src/bin/index.js new file mode 100644 index 00000000..28fd8d94 --- /dev/null +++ b/packages/dev-toolkit/src/bin/index.js @@ -0,0 +1,125 @@ +#!/usr/bin/env node +import yargs from 'yargs'; + +import { runCommand } from '../utilities'; + +const devToolkit = ({ cmdArgs }) => { + // eslint-disable-next-line no-unused-expressions + yargs + .usage('\nUsage: dev-toolkit [options]') + .command({ + command: 'init', + aliases: ['init', 'i'], + desc: 'Initializes a new project', + handler: argv => + runCommand({ + options: { + programmatic: false, + projectName: argv._[1], + template: argv.template || false, + silent: argv.silent || false, + skipComments: argv.skipComments || argv['skip-comments'] || false, + }, + command: 'init', + message: 'Initializing a new project', + }), + }) + .command({ + command: 'build', + aliases: ['build', 'b'], + desc: 'Generates a static build', + handler: argv => + runCommand({ + options: { + programmatic: false, + silent: argv.silent || false, + skipPreRender: + argv.skipPreRender || argv['skip-prerender'] || argv['skip-pre-render'] || false, + }, + command: 'build', + message: 'Generating a static build', + }), + }) + .command({ + command: 'version', + aliases: ['version', 'v', '-v'], + desc: 'Outputs current version number', + handler: () => + runCommand({ + options: { + programmatic: false, + }, + command: 'version', + message: 'Output current version number', + skipPrimaryLog: true, + }), + }) + .command({ + command: 'watch', + aliases: ['watch', 'w'], + desc: 'Watches files for development', + handler: argv => + runCommand({ + options: { + programmatic: false, + silent: argv.silent || false, + }, + command: 'watch', + message: 'Watching files for development', + }), + }) + .command({ + command: 'serve', + aliases: ['serve', 's'], + desc: 'Serves the app', + handler: argv => + runCommand({ + options: { + programmatic: false, + silent: argv.silent || false, + }, + command: 'serve', + message: 'Serving app with `start`-method', + }), + }) + .command({ + command: 'preRender', + aliases: ['preRender', 'prerender', 'pre-render', 'p'], + desc: 'preRender the app', + handler: argv => + runCommand({ + options: { + programmatic: false, + silent: argv.silent || false, + }, + command: 'preRender', + message: 'Pre-rendering app with `preRender`-method', + }), + }) + .command({ + command: 'bootstrap', + aliases: ['bootstrap'], + desc: + 'Bootstraps a file with defined babel & nodeHooks configuration and makes dev-toolkit settings available for import', + handler: argv => + runCommand({ + options: { + programmatic: false, + silent: argv.silent || false, + file: argv.file || '', + }, + command: 'bootstrap', + message: 'Bootstrap with universal configuration & dev-toolkit settings', + }), + }) + .help().argv; + + yargs.parse(cmdArgs); +}; + +// Run toolkit immediately using yargs if we're not testing it +if (!process.env.TOOLKIT_TEST) { + devToolkit({ cmdArgs: process.argv }); +} + +export default devToolkit; diff --git a/packages/dev-toolkit/src/bin/index.spec.js b/packages/dev-toolkit/src/bin/index.spec.js new file mode 100644 index 00000000..0b64f4c2 --- /dev/null +++ b/packages/dev-toolkit/src/bin/index.spec.js @@ -0,0 +1,109 @@ +import { expect } from 'chai'; +import yargs from 'yargs'; + +import sandbox from 'dist/utilities/testHelpers/sandbox'; + +import { devToolkit } from './index'; + +describe('dev-toolkit', () => { + describe('outputs current version', () => { + it('when given `-v` argument', () => { + sandbox.spy(console, 'log'); + devToolkit({ cmdArgs: ['dev-toolkit', '-v'], runCommand: () => {} }); + expect(console.log.calledOnce).to.equal(true); + }); + it('when given `--version` argument', () => { + sandbox.spy(console, 'log'); + devToolkit({ cmdArgs: ['dev-toolkit', '--version'], runCommand: () => {} }); + expect(console.log.calledOnce).to.equal(true); + }); + }); + + describe('runs the watch script', () => { + const processedArgs = yargs.alias('w', 'watch').parse(['dev-toolkit', '-w']); + const expectedOutput = { + script: 'watch', + message: 'Watching files for development', + args: [processedArgs.watch], + }; + + it('when given `-w` argument', () => { + const runCommand = sandbox.spy(); + + devToolkit({ cmdArgs: ['dev-toolkit', '-w'], runCommand }); + expect(runCommand.calledWith(expectedOutput)).to.equal(true); + }); + it('when given `--watch` argument', () => { + const runCommand = sandbox.spy(); + + devToolkit({ cmdArgs: ['dev-toolkit', '--watch'], runCommand }); + expect(runCommand.calledWith(expectedOutput)).to.equal(true); + }); + }); + + describe('runs the serve script', () => { + const processedArgs = yargs.alias('s', 'serve').parse(['dev-toolkit', '-s']); + const expectedOutput = { + script: 'serve', + message: 'Watching files for development', + args: [processedArgs.serve], + }; + + it('when given `-s` argument', () => { + const runCommand = sandbox.spy(); + + devToolkit({ cmdArgs: ['dev-toolkit', '-s'], runCommand }); + expect(runCommand.calledWith(expectedOutput)).to.equal(true); + }); + it('when given `--serve` argument', () => { + const runCommand = sandbox.spy(); + + devToolkit({ cmdArgs: ['dev-toolkit', '--serve'], runCommand }); + expect(runCommand.calledWith(expectedOutput)).to.equal(true); + }); + }); + + describe('runs the serveStatic script', () => { + const processedArgs = yargs.alias('static', 'serve-static').parse(['dev-toolkit', '--static']); + const expectedOutput = { + script: 'serveStatic', + message: 'Serving the /build folder using a minimal server', + args: [processedArgs['serve-static']], + }; + + it('when given `--static` argument', () => { + const runCommand = sandbox.spy(); + + devToolkit({ cmdArgs: ['dev-toolkit', '--static'], runCommand }); + expect(runCommand.calledWith(expectedOutput)).to.equal(true); + }); + it('when given `--serve-static` argument', () => { + const runCommand = sandbox.spy(); + + devToolkit({ cmdArgs: ['dev-toolkit', '--serve-static'], runCommand }); + expect(runCommand.calledWith(expectedOutput)).to.equal(true); + }); + }); + + describe('runs the init script', () => { + const processedArgs = yargs.alias('i', 'init').parse(['dev-toolkit', '-i']); + const expectedOutput = { + script: 'init', + message: 'Initializing new project', + args: [processedArgs.init], + }; + + it('when given `-i` argument', () => { + const runCommand = sandbox.spy(); + + devToolkit({ cmdArgs: ['dev-toolkit', '-i'], runCommand }); + expect(runCommand.calledWith(expectedOutput)).to.equal(true); + }); + it('when given `--init` argument', () => { + const runCommand = sandbox.spy(); + + devToolkit({ cmdArgs: ['dev-toolkit', '--init'], runCommand }); + expect(runCommand.calledWith(expectedOutput)).to.equal(true); + }); + }); +}); diff --git a/packages/dev-toolkit/src/build.js b/packages/dev-toolkit/src/build.js deleted file mode 100644 index e626e13d..00000000 --- a/packages/dev-toolkit/src/build.js +++ /dev/null @@ -1,47 +0,0 @@ -import rimraf from 'rimraf'; -import webpack from 'webpack'; -import fileExists from 'file-exists'; -import DynamicPages from 'dynamic-pages'; - -import debug from './utils/debug'; -import config from './webpack/config'; -import { scriptOptions, PATHS } from './_userSettings'; - -// delete previous build folder & compile all files necessary for serving -rimraf(PATHS.buildFolder, (error) => { - if (error) { - console.log(error); - } - - if (scriptOptions.dynamic) { - // Use similar setup as for a test-environment (but with NODE_ENV set to `production`) - // eslint-disable-next-line global-require - require('./utils/testHelpers/setupDOM'); - - debug('dynamicRender.js exists?', fileExists(PATHS.dynamicRender)); - // The external render file needs to be imported before compilation, in case any stubs exist - DynamicPages.importDynamicRenderFile({ dynamicRenderFile: PATHS.dynamicRenderFile }); - - // eslint-disable-next-line global-require - require('./utils/testHelpers/setupClientApp'); - } - - const compiler = webpack(config); - compiler.run((err) => { - if (err) { - console.log(err); - } - - if (scriptOptions.dynamic) { - // Take index.html file and create an html-file for each route - DynamicPages.generatePages({ - publicPath: PATHS.publicPath, - buildFolder: PATHS.buildFolder, - manifestFile: PATHS.manifestFile, - doneCallback: () => console.log('\n โญ๏ธ Your build with dynamic pages is ready โญ๏ธ'), - }); - } else { - console.log(' โญ๏ธ Your build is ready โญ๏ธ'); - } - }); -}); diff --git a/packages/dev-toolkit/src/commands/bootstrap.js b/packages/dev-toolkit/src/commands/bootstrap.js new file mode 100644 index 00000000..d95fff82 --- /dev/null +++ b/packages/dev-toolkit/src/commands/bootstrap.js @@ -0,0 +1,23 @@ +import path from 'path'; +import { pathExistsSync } from 'fs-extra'; + +import { projectRoot } from '../webpack/projectSettings'; +import { help, log, bootstrap } from '../utilities'; + +bootstrap({ skipServerImport: true }).then(() => { + // eslint-disable-next-line no-underscore-dangle + const file = global.__devToolkitCommandOptions.file || false; + + if (file && typeof file === 'string') { + log({ message: 'Import your fileโ€ฆ\n', useSeparator: true }); + const pathName = path.resolve(projectRoot, file); + + import(pathName).catch(error => { + help({ + displayedWhen: file && !pathExistsSync(pathName), + warning: `File '${file}' doesn't exist.`, + error, + }); + }); + } +}); diff --git a/packages/dev-toolkit/src/commands/build.js b/packages/dev-toolkit/src/commands/build.js new file mode 100644 index 00000000..5f4545db --- /dev/null +++ b/packages/dev-toolkit/src/commands/build.js @@ -0,0 +1,49 @@ +import webpack from 'webpack'; +import { emptyDir } from 'fs-extra'; + +import { buildFolder } from '../webpack/projectSettings'; +import generateConfig from '../webpack/config'; +import { log, bootstrap, preRender } from '../utilities'; + +// eslint-disable-next-line no-underscore-dangle +const skipPreRender = global.__devToolkitCommandOptions.skipPreRender || false; + +bootstrap().then(({ server, userSettings }) => { + const showSuccessMessage = () => + log({ message: '\nโญ๏ธ Your build is ready โญ๏ธ\n', type: 'success' }); + + log({ message: 'Deleting previous build folderโ€ฆ' }); + + // delete previous build folder & compile all files necessary for serving + emptyDir(buildFolder, error => { + log({ error }); + + let webpackAssets = {}; + const config = generateConfig({ + creatingBuild: true, + getWebpackAssets: assets => { + webpackAssets = assets; + return JSON.stringify(assets); + }, + userSettings, + }); + + log({ message: 'Start Webpack & compile assetsโ€ฆ' }); + + // Compile with middleware for hot-reloading + const compiler = webpack(config, webpackError => { + log({ error: webpackError }); + + compiler.run(compilerError => { + log({ error: compilerError }); + log({ message: '\nโœจ Finished compiling Assets.\n', type: 'success' }); + + if (userSettings.devToolkit.usePreRender && !skipPreRender) { + preRender({ server, webpackAssets, buildFolder }).then(showSuccessMessage); + } else { + showSuccessMessage(); + } + }); + }); + }); +}); diff --git a/packages/dev-toolkit/src/commands/init.js b/packages/dev-toolkit/src/commands/init.js new file mode 100644 index 00000000..bd6e43e0 --- /dev/null +++ b/packages/dev-toolkit/src/commands/init.js @@ -0,0 +1,90 @@ +import { statSync, readdirSync } from 'fs'; +import { ensureDirSync, copySync, writeJson } from 'fs-extra'; +import { white } from 'chalk'; +import path from 'path'; +import spawn from 'cross-spawn'; + +import { + generatedTemplates, + generatedTemplatesWithoutComments, + defaultTemplate, +} from '../webpack/projectSettings'; +import { log, spinner } from '../utilities'; + +/* eslint-disable no-underscore-dangle */ +const template = global.__devToolkitCommandOptions.template || ''; +const projectName = global.__devToolkitCommandOptions.projectName || 'my_app'; +const skipComments = global.__devToolkitCommandOptions.skipComments || false; + +const getTemplatesList = ({ folder }) => { + const onlyDirectories = file => statSync(path.join(folder, file)).isDirectory(); + return readdirSync(generatedTemplates).filter(onlyDirectories); +}; +const templatesList = getTemplatesList({ folder: generatedTemplates }); +const templateExists = templatesList.indexOf(template) > -1; +const templateName = templateExists ? template : defaultTemplate; +const isDefaultTemplate = templateName === defaultTemplate; + +if (template && !templateExists) { + log({ type: 'warning', message: `template files for '${template}' don't exist.` }); + log({ message: 'You can use one of the following templates:' }); + templatesList.forEach(name => log({ message: `โ€ข ${name}` })); + log({ + message: `\nProject will be initialized using default template files (${defaultTemplate}).`, + useSeparator: true, + }); +} + +const inputFolder = path.resolve( + skipComments ? generatedTemplatesWithoutComments : generatedTemplates, + templateName +); +const projectFolder = path.resolve(process.cwd(), projectName); + +ensureDirSync(projectFolder); +copySync(inputFolder, projectFolder); + +const pkgPath = path.resolve(projectFolder, 'package.json'); +import(pkgPath).then(pkg => { + // Add name to generated project + writeJson(pkgPath, { ...pkg, name: projectName, description: projectName }, { spaces: 2 }) + .then(() => { + log({ message: `Created project using ${white(templateName)} template in:` }); + log({ message: `${projectFolder}\n` }); + + if (isDefaultTemplate) { + spinner.start({ message: `Installing NPM Dependencies for ${white(projectName)}` }); + } else { + log({ message: `Installing NPM Dependencies for ${white(projectName)}โ€ฆ\n` }); + } + + const spawnOptions = isDefaultTemplate + ? { cwd: projectFolder } + : { + cwd: projectFolder, + detached: true, + stdio: 'inherit', + }; + + spawn('npm', ['install'], spawnOptions).on('close', code => { + if (isDefaultTemplate) { + spinner.stop(); + } else { + log({ message: ' ' }); + } + + if (code === 0) { + log({ type: 'success', message: `Dependencies for ${projectName} have been installed.` }); + log({ + message: `Get started by running \`${white(`cd ${projectName} && npm run dev`)}\``, + useSeparator: true, + }); + } else { + log({ type: 'warning', message: `Failed to install Dependencies for ${projectName}.` }); + } + }); + }) + .catch(error => { + log({ type: 'warning', message: `Failed create project with name ${projectName}.`, error }); + }); +}); diff --git a/packages/dev-toolkit/src/commands/preRender.js b/packages/dev-toolkit/src/commands/preRender.js new file mode 100644 index 00000000..24a00a32 --- /dev/null +++ b/packages/dev-toolkit/src/commands/preRender.js @@ -0,0 +1,15 @@ +import { buildFolder } from '../webpack/projectSettings'; +import { log, bootstrap, getWebpackAssets, preRender } from '../utilities'; + +bootstrap().then(({ server }) => { + log({ message: 'Starting your Server Appโ€ฆ\n', useSeparator: true }); + try { + getWebpackAssets().then(({ assets }) => { + preRender({ server, webpackAssets: assets, buildFolder }).then(() => + log({ message: '\nโญ๏ธ PreRender finished โญ๏ธ\n', type: 'success' }) + ); + }); + } catch (error) { + log({ message: 'Unable to preRender', error }); + } +}); diff --git a/packages/dev-toolkit/src/commands/serve.js b/packages/dev-toolkit/src/commands/serve.js new file mode 100644 index 00000000..77e4d006 --- /dev/null +++ b/packages/dev-toolkit/src/commands/serve.js @@ -0,0 +1,17 @@ +import { buildFolder } from '../webpack/projectSettings'; +import { help, log, bootstrap, getWebpackAssets } from '../utilities'; + +bootstrap().then(({ server }) => { + log({ message: 'Starting your Server Appโ€ฆ\n', useSeparator: true }); + try { + getWebpackAssets().then(({ assets }) => server.start({ assets, buildFolder })); + } catch (error) { + help({ + displayedWhen: server && typeof server.start !== 'function', + warning: 'Your server needs a `start`-method.', + instruction: 'Example: `start({ assets }) { this.express.listen(2000); }`', + link: '/dev-toolkit#custom-server', + error, + }); + } +}); diff --git a/packages/dev-toolkit/src/commands/version.js b/packages/dev-toolkit/src/commands/version.js new file mode 100644 index 00000000..3e0f3b2e --- /dev/null +++ b/packages/dev-toolkit/src/commands/version.js @@ -0,0 +1,7 @@ +import chalk from 'chalk'; + +import pkg from '../../package.json'; +import { log } from '../utilities'; + +// Outputs current version number from `package.json` +log({ message: `You are running ${chalk.green(`${pkg.name} v${pkg.version}`)}\n` }); diff --git a/packages/dev-toolkit/src/commands/watch.js b/packages/dev-toolkit/src/commands/watch.js new file mode 100644 index 00000000..ea902b7f --- /dev/null +++ b/packages/dev-toolkit/src/commands/watch.js @@ -0,0 +1,70 @@ +import webpack from 'webpack'; +import webpackDevMiddleware from 'webpack-dev-middleware'; +import webpackHotMiddleware from 'webpack-hot-middleware'; + +import { buildFolder } from '../webpack/projectSettings'; +import generateConfig from '../webpack/config'; +import { help, log, bootstrap } from '../utilities'; + +bootstrap().then(({ server, userSettings }) => { + let webpackAssets = {}; + const config = generateConfig({ + creatingBuild: false, + getWebpackAssets: assets => { + webpackAssets = assets; + return JSON.stringify(assets); + }, + userSettings, + }); + + log({ message: 'Starting Webpackโ€ฆ' }); + + // Compile with middleware for hot-reloading + const compiler = webpack({ + ...config, + devtool: 'source-map', + entry: { + ...config.entry, + app: ['webpack-hot-middleware/client'].concat(config.entry.app), + }, + }); + + log({ message: 'Compiling initial bundleโ€ฆ\n' }); + + const webpackDevMiddlewareInstance = webpackDevMiddleware(compiler, { + noInfo: true, + publicPath: config.output.publicPath, + }); + const webpackHotMiddlewareInstance = webpackHotMiddleware(compiler); + + webpackDevMiddlewareInstance.waitUntilValid(() => { + log({ message: '\nโœจ Initial compilation has finished.', type: 'success' }); + + log({ message: 'Attaching dev-middleware & hot-middlewareโ€ฆ' }); + try { + server.express.use(webpackDevMiddlewareInstance); + server.express.use(webpackHotMiddlewareInstance); + } catch (error) { + help({ + displayedWhen: server && !server.express, + warning: 'Your server needs a `this.express` to be set for attaching webpack middleware.', + instruction: 'Example: `constructor() { this.express = express(); }`', + link: '/dev-toolkit#custom-server', + error, + }); + } + + log({ message: 'Starting your Server Appโ€ฆ\n', useSeparator: true }); + try { + server.start({ assets: webpackAssets, buildFolder }); + } catch (error) { + help({ + displayedWhen: server && typeof server.start !== 'function', + warning: 'Your server needs a `start`-method.', + instruction: 'Example: `start({ assets }) { this.express.listen(2000); }`', + link: '/dev-toolkit#custom-server', + error, + }); + } + }); +}); diff --git a/packages/dev-toolkit/src/npmExport/dev-toolkit/index.js b/packages/dev-toolkit/src/npmExport/dev-toolkit/index.js new file mode 100644 index 00000000..dcbda2ee --- /dev/null +++ b/packages/dev-toolkit/src/npmExport/dev-toolkit/index.js @@ -0,0 +1,6 @@ +/* eslint-disable no-underscore-dangle */ +import { runCommand } from '../../utilities'; + +export default ({ command, options }) => { + runCommand({ command, options, programmatic: true }); +}; diff --git a/packages/dev-toolkit/src/npmExport/dev-toolkit/settings.js b/packages/dev-toolkit/src/npmExport/dev-toolkit/settings.js new file mode 100644 index 00000000..5e5f3473 --- /dev/null +++ b/packages/dev-toolkit/src/npmExport/dev-toolkit/settings.js @@ -0,0 +1,37 @@ +/* eslint-disable no-undef, no-underscore-dangle */ + +// Shared settings between client and server. +// +// A global handed over by a webpack plugin allows us to retrieve environment variables. +// eslint-disable-next-line no-undef +export const creatingBuild = typeof devToolkitSettings !== typeof undefined; + +// Warn if the initial node-command wasn't spawned via the `dev-toolkit`-cli +if (!creatingBuild && typeof global.__devToolkitSettings === typeof undefined) { + console.log( + '\nโš ๏ธ Could not get shared dev-toolkit settings. Are you using the `dev-toolkit`-cli?\n' + ); +} + +// Get Settings via Node global +const devToolkitSettingsServer = !creatingBuild && global.__devToolkitSettings; + +// If we're not creating a build, we're server-rendering the client app. +// Therefore we'll want to use `process.env` instead of the build settings. +export const sharedEnvs = creatingBuild + ? devToolkitSettings.sharedEnvs + : devToolkitSettingsServer.sharedEnvs; + +// Make usePreRender setting available +export const usePreRender = creatingBuild + ? devToolkitSettings.usePreRender + : devToolkitSettingsServer.usePreRender; + +// Assign booleans for each environment we might be in +export const isProd = sharedEnvs.NODE_ENV === 'production'; +export const isDev = sharedEnvs.NODE_ENV === 'development'; +export const isTest = sharedEnvs.NODE_ENV === 'test'; + +// Detect whether the client-app is being rendered on the client or on the server +export const isServer = !creatingBuild && sharedEnvs.NODE_ENV !== 'test'; +export const isClient = !isServer; diff --git a/packages/dev-toolkit/src/postinstall-prepare/copy-templates.js b/packages/dev-toolkit/src/postinstall-prepare/copy-templates.js new file mode 100644 index 00000000..e440fb8e --- /dev/null +++ b/packages/dev-toolkit/src/postinstall-prepare/copy-templates.js @@ -0,0 +1,61 @@ +import path from 'path'; +import { ensureDirSync, copySync, removeSync, readFile, outputFile } from 'fs-extra'; +import klawSync from 'klaw-sync'; +import decomment from 'decomment'; + +import { + originalTemplates, + generatedTemplates, + generatedTemplatesWithoutComments, +} from '../webpack/projectSettings'; +import { log } from '../utilities'; + +log({ + title: 'prepare', + message: 'Copy templates into dev-toolkit distribution', + useSeparator: true, +}); + +const ignoreDevFolders = item => item.indexOf('node_modules') < 0 && item.indexOf('build') < 0; + +const removeDevFiles = ({ directory }) => { + const devFiles = item => item && item.path && item.path.indexOf('package-lock') >= 0; + const allFiles = klawSync(directory, { nodir: true, filter: devFiles }); + const allFilePaths = Object.keys(allFiles).map(item => allFiles[item].path); + + allFilePaths.forEach(filePath => { + removeSync(filePath); + }); +}; + +const removeCommentsFromJSFiles = ({ directory }) => { + const onlyJSFiles = item => item && item.path && path.extname(item.path) === '.js'; + const allFiles = klawSync(directory, { nodir: true, filter: onlyJSFiles }); + const allFilePaths = Object.keys(allFiles).map(item => allFiles[item].path); + + allFilePaths.forEach(filePath => { + readFile(filePath, 'utf8') + .then(data => { + // Uncomment files as if they were plain text files (avoiding issues with jsx) + outputFile(filePath, decomment.text(data)); + }) + .catch(err => { + console.error(err); + }); + }); +}; + +log({ message: 'Copying templates into dist folder...' }); +removeSync(generatedTemplates); +ensureDirSync(generatedTemplates); +copySync(originalTemplates, generatedTemplates, { filter: ignoreDevFolders }); +removeDevFiles({ directory: generatedTemplates }); + +log({ message: 'Creating an templates-folder in dist that has comments stripped out...' }); +removeSync(generatedTemplatesWithoutComments); +ensureDirSync(generatedTemplatesWithoutComments); +copySync(originalTemplates, generatedTemplatesWithoutComments, { filter: ignoreDevFolders }); +removeDevFiles({ directory: generatedTemplatesWithoutComments }); +removeCommentsFromJSFiles({ directory: generatedTemplatesWithoutComments }); + +log({ message: 'Finished templates task\n', useSeparator: true }); diff --git a/packages/dev-toolkit/src/serve.js b/packages/dev-toolkit/src/serve.js deleted file mode 100644 index 8c64f1ea..00000000 --- a/packages/dev-toolkit/src/serve.js +++ /dev/null @@ -1,22 +0,0 @@ -import webpack from 'webpack'; -import path from 'path'; - -import config from './webpack/config'; -import { rootForRequire } from './_userSettings'; - -// compile all files necessary for serving -const compiler = webpack(config); -compiler.run((err, stats) => { - // output what's happening within webpack - console.log(stats.toString(config.stats)); - const message = '\n\n ๐Ÿฐ Your build files are ready, starting Server ๐Ÿ’ช\n'; - console.log(message); - - // Use the express production server - // eslint-disable-next-line global-require - const ServerApp = require(path.join(rootForRequire, '/src/server/app')).default; - const server = new ServerApp(); - - // start the server - server.start({ serveBuild: true }); -}); diff --git a/packages/dev-toolkit/src/serveStatic.js b/packages/dev-toolkit/src/serveStatic.js deleted file mode 100644 index 065c47ce..00000000 --- a/packages/dev-toolkit/src/serveStatic.js +++ /dev/null @@ -1,43 +0,0 @@ -import path from 'path'; -import express from 'express'; -import compression from 'compression'; -import bodyParser from 'body-parser'; -import errorHandler from 'errorhandler'; -import methodOverride from 'method-override'; - -import { PATHS } from './_userSettings'; - -class ServeStatic { - constructor() { - // server config - this.hostname = process.env.HOST || 'localhost'; - this.port = process.env.PORT || 4000; - this.publicDirectory = PATHS.buildFolder; - - // bind class methods - this.start = this.start.bind(this); - - // Create express server instance & initialize - this.express = express(); - this.start(); - } - - start() { - this.express.get('/', (req, res) => { - res.sendFile(path.join(this.publicDirectory, '/index.html')); - }); - - this.express.use(compression()); - this.express.use(methodOverride()); - this.express.use(bodyParser.json()); - this.express.use(bodyParser.urlencoded({ extended: true })); - this.express.use(express.static(this.publicDirectory)); - this.express.use(errorHandler({ dumpExceptions: true, showStack: true })); - - console.log(`\n==> ๐ŸŒŽ Listening on http://${this.hostname}:${this.port}\n`); - - this.express.listen(this.port, this.hostname); - } -} - -export default new ServeStatic(); diff --git a/packages/dev-toolkit/src/src/settings.js b/packages/dev-toolkit/src/src/settings.js deleted file mode 100644 index 5d87014f..00000000 --- a/packages/dev-toolkit/src/src/settings.js +++ /dev/null @@ -1,14 +0,0 @@ -// Detect whether the app is being rendered on the client or on the server -const creatingBuild = typeof buildSettings !== typeof undefined; // eslint-disable-line no-undef - -export const env = creatingBuild ? buildSettings.env : process.env; // eslint-disable-line no-undef -export const isDev = env.NODE_ENV === 'development'; -export const isServer = !creatingBuild && env.NODE_ENV !== 'test'; -export const isClient = !isServer; - -export default { - env, - isDev, - isServer, - isClient, -}; diff --git a/packages/dev-toolkit/src/utilities/bootstrap/defineGlobalDevToolkitSettings.js b/packages/dev-toolkit/src/utilities/bootstrap/defineGlobalDevToolkitSettings.js new file mode 100644 index 00000000..ea8a9bce --- /dev/null +++ b/packages/dev-toolkit/src/utilities/bootstrap/defineGlobalDevToolkitSettings.js @@ -0,0 +1,5 @@ +// Make sharedEnv's globally available for universal import of `dev-toolkit/settings` to work +export default ({ settings }) => { + // eslint-disable-next-line no-underscore-dangle + global.__devToolkitSettings = settings; +}; diff --git a/packages/dev-toolkit/src/utilities/bootstrap/extractedSharedEnvs.js b/packages/dev-toolkit/src/utilities/bootstrap/extractedSharedEnvs.js new file mode 100644 index 00000000..533c6fc6 --- /dev/null +++ b/packages/dev-toolkit/src/utilities/bootstrap/extractedSharedEnvs.js @@ -0,0 +1,4 @@ +export default ({ withEnvs, fromEnvs }) => + Object.keys(fromEnvs) + .filter(key => withEnvs.indexOf(key) !== -1) + .reduce((obj, key) => ({ [key]: fromEnvs[key], ...obj }), {}); diff --git a/packages/dev-toolkit/src/utilities/bootstrap/getUserSettings.js b/packages/dev-toolkit/src/utilities/bootstrap/getUserSettings.js new file mode 100644 index 00000000..e1d785be --- /dev/null +++ b/packages/dev-toolkit/src/utilities/bootstrap/getUserSettings.js @@ -0,0 +1,54 @@ +import { pathExistsSync } from 'fs-extra'; + +import log from '../log'; +import { userSettingsPath } from '../../webpack/projectSettings'; +import defineGlobalDevToolkitSettings from './defineGlobalDevToolkitSettings'; +import extractedSharedEnvs from './extractedSharedEnvs'; + +export default () => { + // 1) Get User settings from a specified file + // ---- + const settingsExist = pathExistsSync(userSettingsPath); + if (settingsExist) log({ message: 'Using settings from `dev-toolkit.config.js`' }); + // We're expecting a classic Node.js module declared with `module.exports` + // NOTE: Using `require` here is necessary so that using settings with an import like + // `import { sharedEnvs} from 'dev-toolkit/settings'` doesn't become an async dependency + // eslint-disable-next-line import/no-dynamic-require, global-require + const userSettings = settingsExist ? require(userSettingsPath) : {}; + + // 2) Format settings & generate a safe final version for consumption via node and webpack + // ---- + const webpack = userSettings.webpack || {}; + const devToolkit = userSettings.devToolkit || {}; + const sharedEnvs = { + // extract only explicitly declared environment variables from `process.env` + ...extractedSharedEnvs({ + withEnvs: + devToolkit.sharedEnvs && Array.isArray(devToolkit.sharedEnvs) ? devToolkit.sharedEnvs : [], + fromEnvs: process.env, + }), + // make NODE_ENV always available + NODE_ENV: process.env.NODE_ENV, + }; + const finalSettings = { + webpack: { + loaders: + webpack.loaders && typeof webpack.loaders === 'function' ? webpack.loaders : () => [], + plugins: + webpack.plugins && typeof webpack.plugins === 'function' ? webpack.plugins : () => [], + customize: + webpack.customize && typeof webpack.customize === 'function' + ? webpack.customize + : config => config, + }, + devToolkit: { + usePreRender: typeof devToolkit.usePreRender === 'boolean' ? devToolkit.usePreRender : true, + sharedEnvs, + }, + }; + + // 3) Define settings in Node so we can use `dev-toolkit/settings` both on the client & server + // ---- + defineGlobalDevToolkitSettings({ settings: finalSettings.devToolkit }); + return finalSettings; +}; diff --git a/packages/dev-toolkit/src/utilities/bootstrap/importServerApp.js b/packages/dev-toolkit/src/utilities/bootstrap/importServerApp.js new file mode 100644 index 00000000..a6a0a491 --- /dev/null +++ b/packages/dev-toolkit/src/utilities/bootstrap/importServerApp.js @@ -0,0 +1,24 @@ +import { pathExistsSync } from 'fs-extra'; + +import log from '../log'; +import help from '../help'; +import { serverAppEntryPoint } from '../../webpack/projectSettings'; + +export default () => + new Promise(resolve => { + log({ message: 'Importing Server Appโ€ฆ' }); + import(serverAppEntryPoint) + .then(module => { + const server = module.default; + resolve({ server }); + }) + .catch(error => { + help({ + displayedWhen: !pathExistsSync(serverAppEntryPoint), + warning: 'You need a server app entry point.', + instruction: 'Do you have the file `src/server/index.js`?', + link: '/dev-toolkit#custom-server', + error, + }); + }); + }); diff --git a/packages/dev-toolkit/src/utilities/bootstrap/index.js b/packages/dev-toolkit/src/utilities/bootstrap/index.js new file mode 100644 index 00000000..c19448ab --- /dev/null +++ b/packages/dev-toolkit/src/utilities/bootstrap/index.js @@ -0,0 +1,16 @@ +import getUserSettings from './getUserSettings'; +import importServerApp from './importServerApp'; + +export default ({ skipServerImport } = { skipServerImport: false }) => { + const userSettings = getUserSettings(); + + return new Promise((resolve, reject) => { + if (skipServerImport) { + resolve({ userSettings }); + } else { + importServerApp() + .then(({ server }) => resolve({ server, userSettings })) + .catch(reject); + } + }); +}; diff --git a/packages/dev-toolkit/src/utilities/getWebpackAssets.js b/packages/dev-toolkit/src/utilities/getWebpackAssets.js new file mode 100644 index 00000000..edbe82d1 --- /dev/null +++ b/packages/dev-toolkit/src/utilities/getWebpackAssets.js @@ -0,0 +1,20 @@ +import { pathExistsSync } from 'fs-extra'; + +import log from './log'; +import { assetsManifestFile } from '../webpack/projectSettings'; + +export default () => + new Promise(resolve => { + if (pathExistsSync(assetsManifestFile)) { + import(assetsManifestFile) + .then(json => { + resolve({ assets: json }); + }) + .catch(error => { + log({ message: "Couldn't read `assets-manifest.json`", error }); + }); + } else { + log({ message: '`assets-manifest.json` not found. ' }); + resolve({ assets: {} }); + } + }); diff --git a/packages/dev-toolkit/src/utilities/help.js b/packages/dev-toolkit/src/utilities/help.js new file mode 100644 index 00000000..4a6ab2a7 --- /dev/null +++ b/packages/dev-toolkit/src/utilities/help.js @@ -0,0 +1,21 @@ +import log from './log'; + +export default ({ displayedWhen, warning, instruction, link, error }) => { + if (displayedWhen) { + log({ message: warning, type: 'warning' }); + if (instruction) { + log({ message: instruction, type: 'success' }); + } + if (link) { + // TODO: add once there is more documentation + // log({ message: `see: https://github.com/stoikerty${link}\n` }); + } + if (error) { + log({ error }); + } + + process.exit(); + } else { + log({ error }); + } +}; diff --git a/packages/dev-toolkit/src/utilities/index.js b/packages/dev-toolkit/src/utilities/index.js new file mode 100644 index 00000000..ec229bf9 --- /dev/null +++ b/packages/dev-toolkit/src/utilities/index.js @@ -0,0 +1,7 @@ +export { default as runCommand } from './runCommand'; +export { default as log } from './log'; +export { default as help } from './help'; +export { default as bootstrap } from './bootstrap'; +export { default as getWebpackAssets } from './getWebpackAssets'; +export { default as preRender } from './preRender'; +export { default as spinner } from './spinner'; diff --git a/packages/dev-toolkit/src/utilities/log/error.js b/packages/dev-toolkit/src/utilities/log/error.js new file mode 100644 index 00000000..7604a194 --- /dev/null +++ b/packages/dev-toolkit/src/utilities/log/error.js @@ -0,0 +1,8 @@ +import chalk from 'chalk'; + +export default ({ error }) => { + if (error) { + const errorType = /^.*(Error: )/gi; + console.log(`${chalk.red(error.stack.match(errorType))}${error.stack.replace(errorType, '')}`); + } +}; diff --git a/packages/dev-toolkit/src/utilities/log/index.js b/packages/dev-toolkit/src/utilities/log/index.js new file mode 100644 index 00000000..cd7984fc --- /dev/null +++ b/packages/dev-toolkit/src/utilities/log/index.js @@ -0,0 +1,20 @@ +import logMessage from './message'; +import logError from './error'; + +export default ({ message, error, type, title, useSeparator }) => { + /* eslint-disable no-underscore-dangle */ + const silent = + (global.__devToolkitCommandOptions && global.__devToolkitCommandOptions.silent) || false; + + // Silence out any logs if necessary + if (!silent) { + if (message) { + logMessage({ message, type, title, useSeparator }); + } + } + + // Keep logging errors though + if (error) { + logError({ error }); + } +}; diff --git a/packages/dev-toolkit/src/utilities/log/message.js b/packages/dev-toolkit/src/utilities/log/message.js new file mode 100644 index 00000000..b0f0a902 --- /dev/null +++ b/packages/dev-toolkit/src/utilities/log/message.js @@ -0,0 +1,32 @@ +import chalk from 'chalk'; +import stringLength from 'string-length'; + +export default ({ message, type, title, useSeparator }) => { + const hasLinebreakAtEnd = message.lastIndexOf('\n') === message.length - 1; + let outputMessage = hasLinebreakAtEnd ? message.substring(0, message.lastIndexOf('\n')) : message; + + switch (type) { + case 'success': + outputMessage = chalk.green(outputMessage); + break; + case 'warning': + outputMessage = chalk.yellow(`โš ๏ธ ${outputMessage}`); + break; + default: + if (title) { + outputMessage = `${chalk.magenta(`\n[ ${title} ]`)} ${chalk.grey(`- ${outputMessage}`)}`; + } else { + outputMessage = chalk.grey(outputMessage); + } + } + + if (useSeparator) { + console.log(outputMessage); + console.log( + chalk.grey('ยท'.repeat(stringLength(outputMessage) + (hasLinebreakAtEnd ? 1 : 0))), + hasLinebreakAtEnd ? '\n' : '' + ); + } else { + console.log(outputMessage, hasLinebreakAtEnd ? '\n' : ''); + } +}; diff --git a/packages/dev-toolkit/src/utilities/preRender.js b/packages/dev-toolkit/src/utilities/preRender.js new file mode 100644 index 00000000..2b2b3f9d --- /dev/null +++ b/packages/dev-toolkit/src/utilities/preRender.js @@ -0,0 +1,23 @@ +import help from './help'; +import log from './log'; + +export default ({ server, webpackAssets, buildFolder }) => + new Promise(resolve => { + log({ message: 'Rendering html using Server Appโ€ฆ ', useSeparator: true }); + help({ + displayedWhen: server && typeof server.preRender !== 'function', + warning: 'Your server needs a `preRender`-method to create a build.', + instruction: + 'Example: `preRender({ assets, buildFolder }) { return new Promise(() => { ... }); }`', + link: '/dev-toolkit#custom-server', + }); + const renderPromise = server.preRender({ assets: webpackAssets, buildFolder }); + help({ + displayedWhen: typeof renderPromise.then !== 'function', + warning: "The server `preRender`-method must return a Promise to say it's finished.", + instruction: + 'Example: `preRender({ assets, buildFolder }) { return new Promise(() => { ... }); }`', + link: '/dev-toolkit#custom-server', + }); + renderPromise.then(resolve).catch(buildError => log({ error: buildError })); + }); diff --git a/packages/dev-toolkit/src/utilities/runCommand.js b/packages/dev-toolkit/src/utilities/runCommand.js new file mode 100644 index 00000000..55d46c23 --- /dev/null +++ b/packages/dev-toolkit/src/utilities/runCommand.js @@ -0,0 +1,28 @@ +/* eslint-disable no-underscore-dangle */ +import path from 'path'; +import babelRunner from 'babel-runner'; + +import { log } from '../utilities'; + +export default ({ command, message, options, programmatic, skipPrimaryLog }) => { + // Pass options down to specific command + global.__devToolkitCommandOptions = options || {}; + + // Display message to user, making it clear what's going on + log({ + title: programmatic ? 'dev-toolkit' : command, + message: programmatic ? `Running command \`${command}\`` : message, + useSeparator: true, + }); + + if (!skipPrimaryLog) { + log({ message: 'Adding universal configurationโ€ฆ' }); + } + try { + babelRunner({ + fileToRun: path.resolve(__dirname, `../commands/${command}`), + }); + } catch (error) { + log({ error }); + } +}; diff --git a/packages/dev-toolkit/src/utilities/spinner.js b/packages/dev-toolkit/src/utilities/spinner.js new file mode 100644 index 00000000..bc1dc5d9 --- /dev/null +++ b/packages/dev-toolkit/src/utilities/spinner.js @@ -0,0 +1,48 @@ +import ora from 'ora'; +import { grey, blue, magenta, green } from 'chalk'; + +export default new class { + constructor() { + this.spinner = ora({ + text: grey('Loading'), + spinner: { + interval: 130, + frames: [ + grey('ยท') + blue('ยท') + grey(' ') + grey(' '), + grey(' ') + grey('ยท') + blue('ยท') + grey(' '), + grey(' ') + grey(' ') + grey('ยท') + blue('ยท'), + grey(' ') + grey(' ') + grey(' ') + blue('โ€ข'), + grey(' ') + grey(' ') + blue('ยท') + grey('ยท'), + grey(' ') + blue('ยท') + grey('ยท') + grey(' '), + blue('ยท') + grey('ยท') + grey(' ') + grey(' '), + blue('โ€ข') + grey(' ') + grey(' ') + grey(' '), + + grey('ยท') + magenta('ยท') + grey(' ') + grey(' '), + grey(' ') + grey('ยท') + magenta('ยท') + grey(' '), + grey(' ') + grey(' ') + grey('ยท') + magenta('ยท'), + grey(' ') + grey(' ') + grey(' ') + magenta('โ€ข'), + grey(' ') + grey(' ') + magenta('ยท') + grey('ยท'), + grey(' ') + magenta('ยท') + grey('ยท') + grey(' '), + magenta('ยท') + grey('ยท') + grey(' ') + grey(' '), + magenta('โ€ข') + grey(' ') + grey(' ') + grey(' '), + + grey('ยท') + green('ยท') + grey(' ') + grey(' '), + grey(' ') + grey('ยท') + green('ยท') + grey(' '), + grey(' ') + grey(' ') + grey('ยท') + green('ยท'), + grey(' ') + grey(' ') + grey(' ') + green('โ€ข'), + grey(' ') + grey(' ') + green('ยท') + grey('ยท'), + grey(' ') + green('ยท') + grey('ยท') + grey(' '), + green('ยท') + grey('ยท') + grey(' ') + grey(' '), + green('โ€ข') + grey(' ') + grey(' ') + grey(' '), + ], + }, + }); + } + + start({ message }) { + this.spinner.start(grey(message)); + } + stop() { + this.spinner.stop(); + } +}(); diff --git a/packages/dev-toolkit/src/utilities/testHelpers/sandbox.js b/packages/dev-toolkit/src/utilities/testHelpers/sandbox.js new file mode 100644 index 00000000..805dbc47 --- /dev/null +++ b/packages/dev-toolkit/src/utilities/testHelpers/sandbox.js @@ -0,0 +1,66 @@ +import sinon from 'sinon'; + +// This class will serve as our proxy for creating and restoring each sandbox +// We can either use the sandbox globally or only within a specified `describe`-block +class Sandbox { + constructor(options = { global: false }) { + this.instance = null; + this.useSandbox = false; + this.useGlobalSandbox = options.global; + } + + use(beforeCallback, afterCallback) { + beforeCallback(() => { + this.useSandbox = true; + }); + afterCallback(() => { + this.useSandbox = false; + }); + } + create() { + if (this.useGlobalSandbox || this.useSandbox) { + this.instance = sinon.sandbox.create(); + } + } + restore() { + if (this.useGlobalSandbox || this.useSandbox) { + this.instance.restore(); + } + } + + // Replicate sinon's `sandbox` methods + // see: http://sinonjs.org/docs/#sinon-sandbox + spy(...args) { + return this.instance && this.instance.spy(...args); + } + stub(...args) { + return this.instance && this.instance.stub(...args); + } + mock(...args) { + return this.instance && this.instance.mock(...args); + } + useFakeTimers(...args) { + return this.instance && this.instance.useFakeTimers(...args); + } + useFakeXMLHttpRequest(...args) { + return this.instance && this.instance.useFakeXMLHttpRequest(...args); + } + useFakeServer(...args) { + return this.instance && this.instance.useFakeServer(...args); + } +} + +// 1. Instantiate class +const sandbox = new Sandbox({ global: false }); + +// 2. Use sandbox's methods in mocha's "Root-Level Hooks" +// see: https://mochajs.org/#root-level-hooks +beforeEach(() => { + sandbox.create(); +}); +afterEach(() => { + sandbox.restore(); +}); + +// 3. Export class to use as sandbox replacement +export default sandbox; diff --git a/packages/dev-toolkit/src/utilities/testHelpers/setupTests.js b/packages/dev-toolkit/src/utilities/testHelpers/setupTests.js new file mode 100644 index 00000000..f50f86e1 --- /dev/null +++ b/packages/dev-toolkit/src/utilities/testHelpers/setupTests.js @@ -0,0 +1,5 @@ +// Additional tests-configuration +import chai from 'chai'; +import sinonChai from 'sinon-chai'; + +chai.use(sinonChai); diff --git a/packages/dev-toolkit/src/utils/debug.js b/packages/dev-toolkit/src/utils/debug.js deleted file mode 100644 index ed5fb289..00000000 --- a/packages/dev-toolkit/src/utils/debug.js +++ /dev/null @@ -1,3 +0,0 @@ -import debug from '../../bin/utils/debug'; - -export default debug; diff --git a/packages/dev-toolkit/src/utils/testHelpers/setupClientApp.js b/packages/dev-toolkit/src/utils/testHelpers/setupClientApp.js deleted file mode 100644 index 292a8eb2..00000000 --- a/packages/dev-toolkit/src/utils/testHelpers/setupClientApp.js +++ /dev/null @@ -1,7 +0,0 @@ -import path from 'path'; -import { rootForRequire } from '../../_userSettings'; - -// Setup `app`-object globally so it's same as on the client -// eslint-disable-next-line global-require -require(path.join(rootForRequire, '/src/client/app')); -global.app = window.app; diff --git a/packages/dev-toolkit/src/utils/testHelpers/setupDOM.js b/packages/dev-toolkit/src/utils/testHelpers/setupDOM.js deleted file mode 100644 index 0fa35cd7..00000000 --- a/packages/dev-toolkit/src/utils/testHelpers/setupDOM.js +++ /dev/null @@ -1,7 +0,0 @@ -// Setup jsdom to be used all throughout mocha tests -// Using suggested version from: https://github.com/facebook/react/issues/5046 -import { jsdom } from 'jsdom'; - -global.document = jsdom(''); -global.window = document.defaultView; -global.navigator = global.window.navigator; diff --git a/packages/dev-toolkit/src/utils/testHelpers/setupTests.js b/packages/dev-toolkit/src/utils/testHelpers/setupTests.js deleted file mode 100644 index ce7ef717..00000000 --- a/packages/dev-toolkit/src/utils/testHelpers/setupTests.js +++ /dev/null @@ -1,11 +0,0 @@ -// Additional tests-configuration -import chai from 'chai'; -import sinonChai from 'sinon-chai'; -import chaiImmutable from 'chai-immutable'; -import chaiAsPromised from 'chai-as-promised'; -import chaiEnzyme from 'chai-enzyme'; - -chai.use(sinonChai); -chai.use(chaiImmutable); -chai.use(chaiAsPromised); -chai.use(chaiEnzyme()); diff --git a/packages/dev-toolkit/src/watch.js b/packages/dev-toolkit/src/watch.js deleted file mode 100644 index 9c3e5d1c..00000000 --- a/packages/dev-toolkit/src/watch.js +++ /dev/null @@ -1,22 +0,0 @@ -import webpack from 'webpack'; -import path from 'path'; -import webpackDevMiddleware from 'webpack-dev-middleware'; -import webpackHotMiddleware from 'webpack-hot-middleware'; - -import config from './webpack/config'; -import { rootForRequire } from './_userSettings'; - -// Use the express production server -const ServerApp = require(path.join(rootForRequire, '/src/server/app')).default; -const server = new ServerApp(); - -// Compile with webpack & bind middleware for hot-reloading -config.devtool = 'source-map'; -config.entry.app = ['webpack-hot-middleware/client'].concat(config.entry.app); -const compiler = webpack(config); -server.use(webpackDevMiddleware(compiler, { noInfo: true, publicPath: config.output.publicPath })); -server.use(webpackHotMiddleware(compiler)); - -server.start({ - message: '==> Browsersync should be launched soon. Use one of the Access URLs for development.', -}); diff --git a/packages/dev-toolkit/src/webpack/config.js b/packages/dev-toolkit/src/webpack/config.js index 112f8a8a..ec956cc3 100644 --- a/packages/dev-toolkit/src/webpack/config.js +++ b/packages/dev-toolkit/src/webpack/config.js @@ -1,73 +1,109 @@ -import plugins from './config/plugins'; -import { cssHook, filesHook } from './config/extensionHooks'; -import loaders, { sass, postcss, eslint } from './config/loaders'; -import resolve from './config/resolve'; -import resolveLoader from './config/resolveLoader'; -import stats from './config/stats'; +import path from 'path'; +import AssetsPlugin from 'assets-webpack-plugin'; +import { DefinePlugin, HotModuleReplacementPlugin, NoEmitOnErrorsPlugin, optimize } from 'webpack'; +import { babelrc } from 'babel-runner'; import { - PATHS, - env, - currentScript, - vendor, - overrideConfig, - namingConvention, -} from '../_userSettings'; + devToolkitRoot, + projectRoot, + assetsPath, + entryPoint, + publicPath, + assetsManifestFolder, + assetsManifestName, +} from './projectSettings'; -// Set up server-rendering for file-extensions -cssHook(); -filesHook(); +export default ({ getWebpackAssets, creatingBuild, userSettings } = { creatingBuild: true }) => { + const namingConvention = creatingBuild ? '[name].[chunkhash]' : '[name]'; + const customizationOptions = { + projectRoot, + creatingBuild, + namingConvention, + assetsPath, + publicPath, + babelrc, + }; -// This is an escape-hatch for overriding the webpack config with your custom one. -// NOTE: There's limited support for using these custom config escape hatches. You're on your own! -const createConfig = (config) => { - const override = overrideConfig && overrideConfig.default ? - overrideConfig.default : overrideConfig; - return typeof override === 'function' ? - override({ config, paths: PATHS, env, currentScript }) : config; -}; - -// Resulting webpack config -// --- -export default createConfig({ - // The entry and ouput configuration for the bundle(s) - entry: { - app: [PATHS.clientAppEntryPoint], - vendor, - }, - output: { - path: PATHS.buildFolder, - filename: `${namingConvention}.js`, - chunkFilename: `${namingConvention}.js`, - publicPath: PATHS.publicPath, - }, - - // Webpack plugins - plugins, - - // Webpack module-loaders - module: { loaders }, + // Allow completely extending webpack with `webpack.customize` + return userSettings.webpack.customize( + { + entry: { + app: [entryPoint], + }, + output: { + path: assetsPath, + filename: `${namingConvention}.js`, + chunkFilename: `${namingConvention}.js`, + publicPath, + }, + module: { + loaders: [ + { + test: /\.jsx?$/, + loaders: [`babel-loader?${JSON.stringify(babelrc)}`], + exclude: /(node_modules)|\.route.jsx?$|\.dynamic.jsx?$/, + }, + { + test: /\.route.jsx?$|\.dynamic.jsx?$/, + loaders: [ + // `bundle`-loader automatically uses module directly when code is run on the server + 'bundle-loader?lazy&name=[name]', + `babel-loader?${JSON.stringify(babelrc)}`, + ], + exclude: /(node_modules)/, + }, + ].concat( + // Add any user settings from `webpack.loaders` + userSettings.webpack.loaders(customizationOptions) + ), + }, + plugins: [ + new DefinePlugin({ + devToolkitSettings: JSON.stringify(userSettings.devToolkit), + // React & Redux rely on this to be set explicitly + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), + }), + ] + .concat( + getWebpackAssets + ? [ + new AssetsPlugin({ + path: assetsManifestFolder, + filename: assetsManifestName, + processOutput: getWebpackAssets, + }), + ] + : [] + ) + .concat( + creatingBuild + ? [new optimize.UglifyJsPlugin()] + : [new HotModuleReplacementPlugin(), new NoEmitOnErrorsPlugin()] + ) + .concat( + // Add any user settings from `webpack.plugins` + userSettings.webpack.plugins(customizationOptions) + ), + resolve: { + modules: [ + // Resolve dev-toolkit related modules like 'webpack-hot-middleware/client' + path.resolve(devToolkitRoot, 'node_modules'), + // Resolve all other modules from client app + path.resolve(projectRoot, 'node_modules'), + 'node_modules', + ], + }, + resolveLoader: { + modules: [ + // Resolve dev-toolkit related webpack loaders like 'babel-loader' + path.resolve(devToolkitRoot, 'node_modules'), + // Resolve webpack loaders related to project + path.resolve(projectRoot, 'node_modules'), + 'node_modules', + ], + }, + }, - // Specific config for loaders. `sass-loader`, `postcss-loader`, `eslint-loader` - sassLoader: sass, - postcss, - eslint, - - // Manage directories for dependencies with `resolve` & `resolveLoader` - resolve, - resolveLoader, - - // How much information webpack should output - stats, - - // Ignore some node-specific packages on the client - node: { - fs: 'empty', - net: 'empty', - tls: 'empty', - path: 'empty', - chalk: 'empty', - mkdirp: 'empty', - fileExists: 'empty', - }, -}); + customizationOptions + ); +}; diff --git a/packages/dev-toolkit/src/webpack/config/extensionHooks/cssHook.js b/packages/dev-toolkit/src/webpack/config/extensionHooks/cssHook.js deleted file mode 100644 index 56490cd1..00000000 --- a/packages/dev-toolkit/src/webpack/config/extensionHooks/cssHook.js +++ /dev/null @@ -1,45 +0,0 @@ -import path from 'path'; -import cssHook from 'css-modules-require-hook'; -import sass from 'node-sass'; - -import { - PATHS, - cssChunkNaming, -} from '../../../_userSettings'; - -// Set up server-side rendering of scss files -// --- -// Implement a hook in node for `.scss`-imports that uses -// the same settings as the webpack config. -const preprocessCss = (cssFileData, cssFilePath) => { - // Include any paths that are part of the config, - // as well as the current path where css-file resides. - const includePaths = [].concat(PATHS.scssIncludePaths); - includePaths.push(path.dirname(cssFilePath)); - - return sass.renderSync({ - data: cssFileData, - includePaths, - }).css; -}; - -export default () => { - // Allow vanilla css-modules - cssHook({ - extensions: ['.css'], - - // Share naming-convention of `css-loader` - generateScopedName: cssChunkNaming, - }); - - // Separate processing for scss - cssHook({ - extensions: ['.scss'], - - // Share naming-convention of `css-loader` - generateScopedName: cssChunkNaming, - - // Process files with same settings as `sass-loader` and return css. - preprocessCss, - }); -}; diff --git a/packages/dev-toolkit/src/webpack/config/extensionHooks/filesHook.js b/packages/dev-toolkit/src/webpack/config/extensionHooks/filesHook.js deleted file mode 100644 index 071947b3..00000000 --- a/packages/dev-toolkit/src/webpack/config/extensionHooks/filesHook.js +++ /dev/null @@ -1,20 +0,0 @@ -import filesHook from 'files-require-hook'; - -import { - rootForRequire, -} from '../../../_userSettings'; - -// Set up server-side rendering of image files -// --- -// Implement a hook that uses a file-path for node -// NOTE: -// For the build-process it is likely that the files should first -// be copied into the build dir and then referenced from there instead of -// using the original file-path. Similar to `webpack-isomorphic-tools`. -// see: https://github.com/halt-hammerzeit/webpack-isomorphic-tools#getting-down-to-business -export default () => { - filesHook({ - extensions: ['jpg', 'jpeg', 'png', 'gif', 'svg'], - base: rootForRequire, - }); -}; diff --git a/packages/dev-toolkit/src/webpack/config/extensionHooks/index.js b/packages/dev-toolkit/src/webpack/config/extensionHooks/index.js deleted file mode 100644 index 27854d72..00000000 --- a/packages/dev-toolkit/src/webpack/config/extensionHooks/index.js +++ /dev/null @@ -1,2 +0,0 @@ -export cssHook from './cssHook'; -export filesHook from './filesHook'; diff --git a/packages/dev-toolkit/src/webpack/config/loaders.js b/packages/dev-toolkit/src/webpack/config/loaders.js deleted file mode 100644 index a2bff0ad..00000000 --- a/packages/dev-toolkit/src/webpack/config/loaders.js +++ /dev/null @@ -1,68 +0,0 @@ -import ExtractTextPlugin from 'extract-text-webpack-plugin'; - -import { - currentScript, - babelConfig, - eslintConfig, - cssChunkNaming, -} from '../../_userSettings'; - -// Style configuration -// --- -const styleLoaders = [ - `css-loader?modules&importLoaders=1&localIdentName=${cssChunkNaming}`, - 'postcss-loader', -]; -const sassLoaders = styleLoaders.concat(['sass-loader']); - -export eslint from './loaders/eslint'; -export postcss from './loaders/postcss'; -export sass from './loaders/sass'; - -export default [ - { test: /\.hbs$/, loader: 'handlebars-loader' }, - { test: /\.json$/, loader: 'json-loader' }, - { - test: /\.jsx?$/, - loaders: [ - `babel-loader?${JSON.stringify(babelConfig)}`, - `eslint-loader?${JSON.stringify(eslintConfig)}`, - ], - exclude: /(node_modules)|\.route.jsx?$|\.dynamic.jsx?$/, - }, - { - test: /\.route.jsx?$|\.dynamic.jsx?$/, - loaders: [ - // The`bundle`-loader automatically uses module directly when code is run on the server - 'bundle?lazy&name=[name]', - `babel-loader?${JSON.stringify(babelConfig)}`, - `eslint-loader?${JSON.stringify(eslintConfig)}`, - ], - exclude: /(node_modules)/, - }, - { - test: /\.(jpe?g|png|gif|svg)$/i, - loaders: [ - 'file?hash=sha512&digest=hex&name=[hash].[ext]', - 'image-webpack?bypassOnDebug&optimizationLevel=7&interlaced=false', - ], - }, - - // Use separate style-tags for development, - // extract CSS into one file for production. - currentScript === 'watch' ? { - test: /\.css$/, - loaders: ['style-loader'].concat(styleLoaders), - } : { - test: /\.css$/, - loader: ExtractTextPlugin.extract('style-loader', styleLoaders), - }, - // Allow scss to be used as well - currentScript === 'watch' ? { - test: /\.scss$/, - loaders: ['style-loader'].concat(sassLoaders), - } : { - test: /\.scss$/, - loader: ExtractTextPlugin.extract('style-loader', sassLoaders), - }, -]; diff --git a/packages/dev-toolkit/src/webpack/config/loaders/eslint.js b/packages/dev-toolkit/src/webpack/config/loaders/eslint.js deleted file mode 100644 index fcd21acb..00000000 --- a/packages/dev-toolkit/src/webpack/config/loaders/eslint.js +++ /dev/null @@ -1,26 +0,0 @@ -import { - currentScript, -} from '../../../_userSettings'; - -// Ignore custom import temporarily so text-editors work with `eslint-plugin-import` -// see: https://github.com/AtomLinter/linter-eslint/issues/610 -const sharedRules = { - 'import/no-unresolved': [ - 'error', - { - ignore: ['src/'], - }, - ], -}; - -export default { - // Override any settings from the configFile - rules: currentScript === 'watch' ? { - // only warn for debugging statements while developing - 'no-debugger': [ - 'warn', - ], - - ...sharedRules, - } : { ...sharedRules }, -}; diff --git a/packages/dev-toolkit/src/webpack/config/loaders/postcss.js b/packages/dev-toolkit/src/webpack/config/loaders/postcss.js deleted file mode 100644 index 2786daf0..00000000 --- a/packages/dev-toolkit/src/webpack/config/loaders/postcss.js +++ /dev/null @@ -1,13 +0,0 @@ -import autoprefixer from 'autoprefixer'; - -export default [ - // Supported Browsers via `Autoprefixer` - // see: https://github.com/ai/browserslist - autoprefixer({ - browsers: [ - '> 0.8%', - 'last 2 versions', - 'Explorer >= 9', - ], - }), -]; diff --git a/packages/dev-toolkit/src/webpack/config/loaders/sass.js b/packages/dev-toolkit/src/webpack/config/loaders/sass.js deleted file mode 100644 index 87ff3f42..00000000 --- a/packages/dev-toolkit/src/webpack/config/loaders/sass.js +++ /dev/null @@ -1,7 +0,0 @@ -import { - PATHS, -} from '../../../_userSettings'; - -export default { - includePaths: PATHS.scssIncludePaths, -}; diff --git a/packages/dev-toolkit/src/webpack/config/plugins.js b/packages/dev-toolkit/src/webpack/config/plugins.js deleted file mode 100644 index edfe3950..00000000 --- a/packages/dev-toolkit/src/webpack/config/plugins.js +++ /dev/null @@ -1,117 +0,0 @@ -import webpack from 'webpack'; -import CopyWebpackPlugin from 'copy-webpack-plugin'; -import BrowserSyncPlugin from 'browser-sync-webpack-plugin'; -import ExtractTextPlugin from 'extract-text-webpack-plugin'; -import HtmlWebpackPlugin from 'html-webpack-plugin'; -import ScriptExtHtmlWebpackPlugin from 'script-ext-html-webpack-plugin'; -import CompressionPlugin from 'compression-webpack-plugin'; -import ProgressBarPlugin from 'progress-bar-webpack-plugin'; -import ManifestRevisionPlugin from 'manifest-revision-webpack-plugin'; - -import { - PATHS, - env, - sharedEnvs, - currentScript, - scriptOptions, - namingConvention, - buildNamingConvention, -} from '../../_userSettings'; - -const extractedSharedEnvs = Object.keys(process.env) - .filter(key => sharedEnvs.indexOf(key) !== -1) - .reduce((obj, key) => ({ [key]: process.env[key], ...obj }), {}); - -const sharedPlugins = [ - new ProgressBarPlugin({ width: 40 }), - new webpack.optimize.CommonsChunkPlugin('vendor', `${namingConvention}.js`), - new CopyWebpackPlugin([{ from: PATHS.publicFilesFolder }]), - new webpack.DefinePlugin({ - // For redux and react only, force `production` when creating a build or serving files - 'process.env.NODE_ENV': JSON.stringify( - (currentScript === 'build') || (currentScript === 'serve') - ? 'production' - : process.env.NODE_ENV - ), - // All other environment variables are passed through via `buildSettings` if defined in `sharedEnvs` - buildSettings: { - env: JSON.stringify(extractedSharedEnvs), - }, - }), -]; - -const developmentPlugins = [ - // Use hot-reload middleware, browsersync for development - new webpack.optimize.OccurenceOrderPlugin(), - new webpack.HotModuleReplacementPlugin(), - - new BrowserSyncPlugin( - { - // BrowserSync options - see: http://www.browsersync.io/docs/options/ - - // Use http://localhost:3000/ for development, proxy Dev Server. - host: env.BROWSERSYNC_HOST, - port: env.BROWSERSYNC_PORT, - proxy: `http://${env.HOST}:${env.PORT}/`, - // Stop the browser from automatically opening. - open: false, - // Scrolls & Form inputs on any device will be mirrored to all others. - ghostMode: { - clicks: false, - scroll: true, - forms: true, - }, - // Show what browsers are connected. - logConnections: true, - }, - { - // Webpack Plugin options - - // Prevent BrowserSync from reloading the page - // and let Webpack Dev Server take care of this. - reload: false, - } - ), -]; - -const productionPlugins = [ - // Extract css into one file for production, minify javascript - new ExtractTextPlugin(`${buildNamingConvention}.css`, { allChunks: true }), - new webpack.optimize.UglifyJsPlugin({ minimize: true, compress: { warnings: false } }), - new HtmlWebpackPlugin({ - inject: false, - template: PATHS.templateLocation, - - reactHtml: scriptOptions.dynamic ? '' : '', - creatingBuild: true, - env: process.env, - }), - new ScriptExtHtmlWebpackPlugin({ - async: ['app'], - defer: ['app'], - defaultAttribute: 'sync', - }), - new ManifestRevisionPlugin( - PATHS.manifestFile, - { - rootAssetPath: PATHS.manifestRootAssetPath, - ignorePaths: [], - extensionsRegex: /\.(jpe?g|png|gif|svg)$/i, - } - ), -]; - -// TODO: extract out -if (process.env.USE_COMPRESSION_PLUGIN) { - productionPlugins.push( - new CompressionPlugin({ - asset: '[path]', - test: new RegExp(process.env.COMPRESSION_PLUGIN_REGEX), - minRatio: 0, - }) - ); -} - -export default currentScript === 'watch' ? - sharedPlugins.concat(developmentPlugins) - : sharedPlugins.concat(productionPlugins); diff --git a/packages/dev-toolkit/src/webpack/config/resolve.js b/packages/dev-toolkit/src/webpack/config/resolve.js deleted file mode 100644 index ea522e87..00000000 --- a/packages/dev-toolkit/src/webpack/config/resolve.js +++ /dev/null @@ -1,24 +0,0 @@ -import path from 'path'; - -import { - rootForProject, - rootForRequire, - rootForToolkit, -} from '../../_userSettings'; - -// Files in these directories can be imported without a relative path -export default { - extensions: ['', '.js', '.jsx'], - root: path.resolve(__dirname, rootForRequire), - // the alias will allow us to get files relative to the `src`-folder - // exmaple: `import { myUtil } from 'src/client/utils';` - alias: { - src: 'src', - }, - - modulesDirectories: [ - path.resolve(rootForProject, 'node_modules'), - path.resolve(rootForToolkit, 'node_modules'), - 'node_modules', - ], -}; diff --git a/packages/dev-toolkit/src/webpack/config/resolveLoader.js b/packages/dev-toolkit/src/webpack/config/resolveLoader.js deleted file mode 100644 index fea48a66..00000000 --- a/packages/dev-toolkit/src/webpack/config/resolveLoader.js +++ /dev/null @@ -1,14 +0,0 @@ -import path from 'path'; - -import { - rootForProject, - rootForToolkit, -} from '../../_userSettings'; - -export default { - modulesDirectories: [ - path.resolve(rootForProject, 'node_modules'), - path.resolve(rootForToolkit, 'node_modules'), - 'node_modules', - ], -}; diff --git a/packages/dev-toolkit/src/webpack/config/stats.js b/packages/dev-toolkit/src/webpack/config/stats.js deleted file mode 100644 index b17dc96c..00000000 --- a/packages/dev-toolkit/src/webpack/config/stats.js +++ /dev/null @@ -1,19 +0,0 @@ -import { env } from '../../_userSettings'; - -export default { - colors: true, - timings: true, - reasons: true, - - assets: env.VERBOSE_LOGGING, - modules: env.VERBOSE_LOGGING, - source: env.VERBOSE_LOGGING, - errorDetails: env.VERBOSE_LOGGING, - children: env.VERBOSE_LOGGING, - hash: env.VERBOSE_LOGGING, - version: env.VERBOSE_LOGGING, - chunks: env.VERBOSE_LOGGING, - chunkModules: env.VERBOSE_LOGGING, - cached: env.VERBOSE_LOGGING, - cachedAssets: env.VERBOSE_LOGGING, -}; diff --git a/packages/dev-toolkit/src/webpack/projectSettings.js b/packages/dev-toolkit/src/webpack/projectSettings.js new file mode 100644 index 00000000..7a5f107a --- /dev/null +++ b/packages/dev-toolkit/src/webpack/projectSettings.js @@ -0,0 +1,34 @@ +import path from 'path'; + +// dev-toolkit specific Folders +export const devToolkitRoot = path.resolve(__dirname, '../../'); +export const devToolkitDistribution = path.resolve(devToolkitRoot, 'dist'); +export const gitRepoRoot = path.resolve(devToolkitRoot, '../../'); +export const originalTemplates = path.resolve(gitRepoRoot, 'templates'); +export const generatedTemplates = path.resolve( + devToolkitDistribution, + 'generated-templates/original' +); +export const generatedTemplatesWithoutComments = path.resolve( + devToolkitDistribution, + 'generated-templates/skipped-comments' +); +export const defaultTemplate = 'standard'; + +// User Project Related Folders & Settings +export const projectRoot = process.cwd(); +export const buildFolder = path.resolve(projectRoot, 'build'); +export const serverAppEntryPoint = path.resolve(projectRoot, 'src/server/index.js'); +export const userSettingsPath = path.resolve(projectRoot, 'dev-toolkit.config.js'); + +export const assetsManifestFolder = buildFolder; +export const assetsManifestName = 'assets-manifest.json'; +export const assetsManifestFile = path.resolve(assetsManifestFolder, assetsManifestName); + +export const entryPoint = './src/client/index.js'; +// Make sure leading slash & trailing slash is present (otherwise source-map won't work) +export const publicPath = (process.env.ASSETS_PATH || '/assets') + .replace(/^\/?/, '/') + .replace(/\/?$/, '/'); +// Remove leading slash from public path to create correct file-path +export const assetsPath = path.resolve(buildFolder, publicPath.replace(/^\//, '')); diff --git a/packages/dev-toolkit/starting-point/.eslintrc b/packages/dev-toolkit/starting-point/.eslintrc deleted file mode 100644 index bb9aa91a..00000000 --- a/packages/dev-toolkit/starting-point/.eslintrc +++ /dev/null @@ -1,30 +0,0 @@ -{ - "plugins": [ - "jsx-control-statements" - ], - "extends": [ - "airbnb", - "plugin:jsx-control-statements/recommended" - ], - "parser": "babel-eslint", - "rules": { - "no-multiple-empty-lines": [ - "error", - { - "max": 1 - } - ], - "import/no-extraneous-dependencies": 0, - "import/no-unresolved": [ - "error", - { - "ignore": [ "src/" ] - } - ] - }, - - "env": { - "browser": true, - "mocha": true - } -} diff --git a/packages/dev-toolkit/starting-point/.gitignore b/packages/dev-toolkit/starting-point/.gitignore deleted file mode 100644 index c8d61631..00000000 --- a/packages/dev-toolkit/starting-point/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -############# -## Generated Files -############# - -build/ -dist/ - -############# -## Node -############# - -node_modules/ -npm-debug.log diff --git a/packages/dev-toolkit/starting-point/package.json b/packages/dev-toolkit/starting-point/package.json deleted file mode 100644 index a0466bd1..00000000 --- a/packages/dev-toolkit/starting-point/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "dev-toolkit-starter", - "version": "1.0.0", - "description": "dev-toolkit starting point", - "main": "index.js", - "scripts": { - "dev": "dev-toolkit --watch", - "build": "dev-toolkit --build" - }, - "author": "", - "license": "ISC", - "toolkitSettings": { - "vendor": [ - "react", - "react-dom", - "react-router" - ] - }, - "dependencies": { - "compression": "^1.6.2", - "domready": "^1.0.8", - "express": "^4.14.0", - "express-handlebars": "^3.0.0", - "react": "^15.1.0", - "react-dom": "^15.1.0", - "react-router": "^2.4.1", - "redbox-react": "^1.2.8", - "serve-static": "^1.11.1" - }, - "devDependencies": { - "babel-eslint": "^6.1.2", - "eslint": "^3.4.0", - "eslint-config-airbnb": "^10.0.1", - "eslint-import-resolver-webpack": "^0.5.1", - "eslint-plugin-import": "^1.14.0", - "eslint-plugin-jsx-a11y": "^2.2.1", - "eslint-plugin-jsx-control-statements": "^2.1.1", - "eslint-plugin-react": "^6.2.0" - } -} diff --git a/packages/dev-toolkit/starting-point/src/client/RouterContainer.jsx b/packages/dev-toolkit/starting-point/src/client/RouterContainer.jsx deleted file mode 100644 index b7af7b56..00000000 --- a/packages/dev-toolkit/starting-point/src/client/RouterContainer.jsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react'; -import { Router, browserHistory, RouterContext } from 'react-router'; - -import routes from './routes'; - -// `RouterContainer.js` -// -------------------- -// The root-container of our App that manages the configured routes. If you use -// Redux, the component should wrap the below. Note how -// this file uses capitalized camel-case to denote that it is a React-component. - -export default class RouterContainer extends React.Component { - constructor(props) { - super(props); - this.displayName = 'RouterContainer'; - - this.state = {}; - } - - render() { - return ( - } - /> - ); - } -} diff --git a/packages/dev-toolkit/starting-point/src/client/app.jsx b/packages/dev-toolkit/starting-point/src/client/app.jsx deleted file mode 100644 index 3fabd747..00000000 --- a/packages/dev-toolkit/starting-point/src/client/app.jsx +++ /dev/null @@ -1,71 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom'; -import domready from 'domready'; -import RedBox from 'redbox-react'; - -// Note: `RouterContainer`-module is required inline - -// `app.js` -// -------- -// This file is responsible mainly for handling hot-reloading. It reloads the main root container -// (RouterContainer) whenever one of the files that gets imported by that container change. -// An error is displayed if something goes wrong or a syntax-error occurs. - -// Create a Client-App with hot-reloading capabilities -class App { - constructor() { - this.renderApp = this.renderApp.bind(this); - this.hotReRender = this.hotReRender.bind(this); - this.renderError = this.renderError.bind(this); - this.rootElement = null; - - // Only proceed with rendering if we're not using a test-framework - if (document.body.id !== 'mock-dom') { - // When browser has finished loading, retrieve app-body element and render - domready(() => { - this.rootElement = document.querySelector('[data-jshook~="app-body"]'); - this.renderApp(); - - // Support hot reloading of components by rerendering via vanilla webpack - // HMR (Hot-Module-Replacement) & setTimeout - if (module.hot) { - module.hot.accept('./RouterContainer', () => { - setTimeout(this.hotReRender); - }); - } - }); - } - } - - // Render App with fresh version of required Routing module - renderApp() { - // eslint-disable-next-line global-require - const RootComponent = require('./RouterContainer').default; - - ReactDOM.render( - , - this.rootElement - ); - } - - // Re-render after hot-reloading a module, - // display error if something during the compilation goes wrong. - hotReRender() { - try { - this.renderApp(); - } catch (error) { - this.renderError(error); - } - } - - // Risplay an overlay for runtime errors - renderError(error) { - ReactDOM.render( - , - this.rootElement - ); - } -} - -// start up the app immediately -window.app = new App(); diff --git a/packages/dev-toolkit/starting-point/src/client/routes.jsx b/packages/dev-toolkit/starting-point/src/client/routes.jsx deleted file mode 100644 index f911aeb2..00000000 --- a/packages/dev-toolkit/starting-point/src/client/routes.jsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; -import { Route, IndexRoute } from 'react-router'; - -import Shell from './views/Shell'; -import Home from './views/features/Home'; - -// `routes.js` -// ----------- -// This looks like a component but is in effect just a routing definition. -// These routes are rendered both on the client and on the server, therefore -// they are imported in `RouterContainer` and in `server/router.js`. - -// NOTE: Even if you think you "don't need" server-rendering, you probably will do -// if you have any intention of statically rendering your markup and using -// react-router's dynamic routing. - -// Use Shell as surrounding container for all routes -export default ( - - - {/* A view for the home page */} - - -); diff --git a/packages/dev-toolkit/starting-point/src/client/style/_config.scss b/packages/dev-toolkit/starting-point/src/client/style/_config.scss deleted file mode 100644 index 8391fc93..00000000 --- a/packages/dev-toolkit/starting-point/src/client/style/_config.scss +++ /dev/null @@ -1,51 +0,0 @@ -// --- -// Caution! these have an effect on a lot of elements -// -- - -// use pixels for breakpoints -$use-em-breakpoints : false; - -// Define repsonsive breakpoints for application -$breakpoint-phone : 0px; -$breakpoint-smart : 300px; -$breakpoint-tablet7 : 440px; -$breakpoint-tablet10 : 768px; -$breakpoint-pcsmall : 992px; -$breakpoint-pclarge : 1200px; - -// Share these variables in javascript -:export { - breakpointPhone: $breakpoint-phone; - breakpointSmart: $breakpoint-smart; - breakpointTablet7: $breakpoint-tablet7; - breakpointTablet10: $breakpoint-tablet10; - breakpointPcsmall: $breakpoint-pcsmall; - breakpointPclarge: $breakpoint-pclarge; -} - -// useful helper mixins -@import 'mixins/_helpers.scss'; - -// font-settings for app (get passed through mixin as defaults) -$text-color-default : #333; -$font-xxxlarge : 37px; -$font-xxlarge : 26px; -$font-xlarge : 21px; -$font-large : 18px; -$font-medium : 16px; -$font-small : 14px; -$font-xsmall : 12px; - -$header-font-family : 'Source Serif Pro', 'Times New Roman', Times, 'Georgia', serif; -$body-font-family : 'Source Sans Pro', Verdana, Arial, sans-serif; -@import 'mixins/_font-settings.scss'; - -// a common variable for use throughout the app as simple grid-system -$grid : 8px; - -// New brand colors (Use your own or inherit from mixins/_helpers) -$brand-green : $green; -$brand-red : $red; -$brand-blue : $blue; -$brand-orange : $orange; -$brand-yellow : $yellow; diff --git a/packages/dev-toolkit/starting-point/src/client/style/global.scss b/packages/dev-toolkit/starting-point/src/client/style/global.scss deleted file mode 100644 index 045fb373..00000000 --- a/packages/dev-toolkit/starting-point/src/client/style/global.scss +++ /dev/null @@ -1,41 +0,0 @@ -// retrieve configuration -@import './config.scss'; - -// Global-style defaults specific to the application -// NOTE: -// Please consult with the team before you make changes in here. These are -// defaults and can potentially break a lot of things or have side-effects!! -:global body{ - // Remove margin & make sure body is not transparent - margin : 0; - background-color : white; - // Use 'Open Sans' font, with native font as fallback (Wordpress Default) - // see: https://bitsofco.de/the-new-system-font-stack/ - font-family: 'Open Sans', - -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, - Ubuntu, Cantarell, "Helvetica Neue", sans-serif; - - // Use border-box & make sure images don't overflow. - *{ box-sizing : border-box; } - img{ max-width : 100%; } - - // Remove 300ms click-delay for IE11+ - a[href], button, .btn, .button { touch-action: manipulation; } - - // use standard font - font-family : $body-font-family; - @include font(medium, $text-color-default, normal); - line-height : 1.4em; - - // Prevent iOS Safari from freely adjusting font-size (Ex: on rotation) - -webkit-text-size-adjust: 100%; - - // make fonts look nicer - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} - -:global(#__bs_notify__){ - opacity : 0.2!important; - pointer-events: none!important; -} diff --git a/packages/dev-toolkit/starting-point/src/client/style/mixins/_font-settings.scss b/packages/dev-toolkit/starting-point/src/client/style/mixins/_font-settings.scss deleted file mode 100644 index e45ddcc5..00000000 --- a/packages/dev-toolkit/starting-point/src/client/style/mixins/_font-settings.scss +++ /dev/null @@ -1,64 +0,0 @@ -// Defaults for font-sizes -// don't change these, override them via style/_config -$text-color-default : #333 !default; -$font-xxxlarge : 37px !default; -$font-xxlarge : 26px !default; -$font-xlarge : 21px !default; -$font-large : 18px !default; -$font-medium : 16px !default; -$font-small : 14px !default; -$font-xsmall : 12px !default; - -// use mixin for font-sizes throughout app -@mixin font($font-size: auto, $color: auto, $font-weight: auto){ - @if $font-size != auto { - @if $font-size == default { font-size : $font-medium; } - @else if $font-size == xxxlarge { font-size : $font-xxxlarge; } - @else if $font-size == xxlarge { font-size : $font-xxlarge; } - @else if $font-size == xlarge { font-size : $font-xlarge; } - @else if $font-size == large { font-size : $font-large; } - @else if $font-size == medium { font-size : $font-medium; } - @else if $font-size == small { font-size : $font-small; } - @else if $font-size == xsmall { font-size : $font-xsmall; } - @else { font-size : $font-size; } - } - @if $color != auto { - @if $color == default { color : $text-color-default; } - @else { color : $color; } - } - @if $font-weight != auto { - font-weight: $font-weight; - } -} - -@mixin importFont( - $family, - $path, - $filename, - $hash: 'v1', - $font-weight: normal, - $font-style: normal, - $include-woff2 : false -){ - @font-face{ - font-family : $family; - // NOTE: - // don't hash on eot-files, prevents `OTS parsing error: invalid version tag` - @if $include-woff2 == true { - src : url($path + "/" + $filename + ".eot"), - url($path + "/" + $filename + ".eot?" + $hash + "#iefix") format("embedded-opentype"), - url($path + "/" + $filename + ".woff2?" + $hash) format("woff2"), - url($path + "/" + $filename + ".woff?" + $hash) format("woff"), - url($path + "/" + $filename + ".ttf?" + $hash) format("truetype"), - url($path + "/" + $filename + ".svg?" + $hash + "#" + $filename) format("svg"); - } @else { - src : url($path + "/" + $filename + ".eot"), - url($path + "/" + $filename + ".eot?" + $hash + "#iefix") format("embedded-opentype"), - url($path + "/" + $filename + ".woff?" + $hash) format("woff"), - url($path + "/" + $filename + ".ttf?" + $hash) format("truetype"), - url($path + "/" + $filename + ".svg?" + $hash + "#" + $filename) format("svg"); - } - font-weight : $font-weight; - font-style : $font-style; - } -} diff --git a/packages/dev-toolkit/starting-point/src/client/style/mixins/_helpers.scss b/packages/dev-toolkit/starting-point/src/client/style/mixins/_helpers.scss deleted file mode 100644 index ca6febc9..00000000 --- a/packages/dev-toolkit/starting-point/src/client/style/mixins/_helpers.scss +++ /dev/null @@ -1,425 +0,0 @@ -// These are helper-mixins, -variables etc -// --- - -@mixin resetList{ - // remove the list style - list-style : none; - // margin-reset is optional -} -// mixin for crisp image-rednering -@mixin crisp-image{ - image-rendering : optimizeSpeed; // Fallback - -ms-interpolation-mode : nearest-neighbor; // IE8+ - image-rendering : -o-crisp-edges; // Opera - image-rendering : -moz-crisp-edges; // Firefox - image-rendering : -webkit-optimize-contrast; // Chrome (and eventually Safari) - image-rendering : optimize-contrast; // CSS3 Proposed -} - -// Micro Clearfix by Nicolas Gallagher -// http://nicolasgallagher.com/micro-clearfix-hack/ -@mixin micro-clearfix{ - &:before, - &:after { - content : ""; - display : table; - } - &:after { - clear : both; - } - - zoom : 1; // For IE 6/7 (trigger hasLayout) -} - -// A tiny clearfix from CSS-Tricks -// https://css-tricks.com/snippets/css/clear-fix/ -@mixin clearfix{ - &:after{ - content: ""; - display: table; - clear: both; - } -} - -// create a positioned Element, crossbrowser -@mixin position($position: relative, $display: auto, $width: "", $height: ""){ - position : $position; - - @if $display != auto { display : $display; } - @if $width != "" { width : $width; } - @if $height != "" { height : $height; } -} - -// Definition for animated elements -@mixin isAnimated{ - // CAUTION: - // This breaks `position: fixed;`-elements and will make them - // behave like `absolute`-elements! (won't fix them to the viewport) - transform : translate3d(0,0,0); - perspective : 1000; - - // Setting the origin for transformations of an element: - // transform-origin: 50% 50%; -} - -// remove chrome jagged edges for pngs -// http://stackoverflow.com/questions/6492027/css-transform-jagged-edges-in-chrome -@mixin removeJaggedEdges{ - outline: 1px solid transparent; - backface-visibility: hidden; - transform-style: preserve-3d; -} - -@mixin disableContextMenu{ - user-select : none; - -webkit-user-select : none; // disable selection/Copy of UIWebView - -webkit-user-callout : none; // disable the IOS popup when long-press on a link - -webkit-touch-callout : none; // disable the IOS popup when long-press on a link -} - -// Definition for button elements -@mixin isButton{ - // change the cursor to a hand - cursor : pointer; - // set text defaults - text-decoration : none; - vertical-align : middle; - // disable user selection and webkit highlight on tap - user-select : none; - -ms-user-select : none; - -webkit-user-select : none; - -webkit-tap-highlight-color : transparent; - - // Fix for the Firefox padding issue on focus - &::-moz-focus-inner{ - padding : 0 !important; - margin : -1px !important; - } -} - -// Prototype mixins for debuggind elements -$proto-enabled : true; - -// color an element -@mixin proto($id: 1, $opacity : 1){ - $enabled : $proto-enabled; - - @if $enabled { - @if (($id == 0 ) or ($id == 'blue')) { background-color : rgba($blue, $opacity); } - @elseif (($id == 1 ) or ($id == 'blue-light')) { background-color : rgba($blue-light, $opacity); } - @elseif (($id == 2 ) or ($id == 'yellow')) { background-color : rgba($yellow-light, $opacity); } - @elseif (($id == 3 ) or ($id == 'green-light')) { background-color : rgba($green-light, $opacity); } - @elseif (($id == 4 ) or ($id == 'orange')) { background-color : rgba($orange-light, $opacity); } - @elseif (($id == 5 ) or ($id == 'red-light')) { background-color : rgba($red-light, $opacity); } - @elseif (($id == 6 ) or ($id == 'blue-dark')) { background-color : rgba($blue-dark, $opacity); } - @elseif (($id == 7 ) or ($id == 'yellow-light')) { background-color : rgba($yellow-light, $opacity); } - @elseif (($id == 8 ) or ($id == 'green')) { background-color : rgba($green-dark, $opacity); } - @elseif (($id == 9 ) or ($id == 'orange-light')) { background-color : rgba($orange-light, $opacity); } - @elseif (($id == 10) or ($id == 'red')) { background-color : rgba($red-dark, $opacity); } - @else{ - //background-color : rgba($nr, 0.8); - @include background-image(linear-gradient(left, rgba($id, 1), rgba($id, 0.9))); - } - } -} - -// make sure element has a height (don't collapse), even if it has no content -@mixin emptyHeight($height : 1.4em){ - line-height : $height; - min-height : $height; -} - -// make text fade out -@mixin fontFading($color : #fff, $size : 20px, $distance : 0, $disabled : false, $position : right, $wrapper : after){ - $fading-container : ''; - - // create pseudo-element, or an element using a classname - @if ($wrapper == after) or ($wrapper == before) { - $fading-container : '&:' + $wrapper; - } @else { - $fading-container : $wrapper; - } - - @if $disabled == false { - #{$fading-container}{ - @include position(absolute, block); - @if ($wrapper == after) or ($wrapper == before) { - content : ' '; - pointer-events : none; - } - - @if $position == top { - width : 100%; - height : $size; - top : $distance; - right : initial; - bottom : initial; - left : 0; - @include background-image(linear-gradient(top, rgba($color, 1), rgba($color, 0) 95%)); - } - @if $position == right { - width : $size; - height : 100%; - top : 0; - right : $distance; - bottom : initial; - left : initial; - @include background-image(linear-gradient(right, rgba($color, 1), rgba($color, 0) 95%)); - } - @if $position == bottom { - width : 100%; - height : $size; - top : initial; - right : initial; - bottom : $distance; - left : 0; - @include background-image(linear-gradient(bottom, rgba($color, 1), rgba($color, 0) 95%)); - } - @if $position == left { - width : $size; - height : 100%; - top : 0; - right : initial; - bottom : initial; - left : $distance; - @include background-image(linear-gradient(left, rgba($color, 1), rgba($color, 0) 95%)); - } - } - } @else { - #{$fading-container}{ display : none; } - } -} - -// easing definitions -$ease-in : ease-in; -$ease-out : ease-out; -$ease-in-out : ease-in-out; - -$ease-in-quart : cubic-bezier(0.895, 0.030, 0.685, 0.220); -$ease-out-quart : cubic-bezier(0.165, 0.840, 0.440, 1.000); -$ease-in-out-quart : cubic-bezier(0.770, 0.000, 0.175, 1.000); - -$ease-in-quint : cubic-bezier(0.755, 0.050, 0.855, 0.060); -$ease-out-quint : cubic-bezier(0.230, 1.000, 0.320, 1.000); -$ease-in-out-quint : cubic-bezier(0.860, 0.000, 0.070, 1.000); - -$ease-in-expo : cubic-bezier(0.950, 0.050, 0.795, 0.035); -$ease-out-expo : cubic-bezier(0.190, 1.000, 0.220, 1.000); -$ease-in-out-expo : cubic-bezier(1.000, 0.000, 0.000, 1.000); - -$ease-in-back : cubic-bezier(0.600, -0.280, 0.735, 0.045); -$ease-out-back : cubic-bezier(0.175, 0.885, 0.320, 1.275); -$ease-in-out-back : cubic-bezier(0.680, -0.550, 0.265, 1.550); - -//// Predefined Colors //// -$white-5 : lighten(#000, 5%); // #0d0d0d -$white-10 : lighten(#000, 10%); // #1a1a1a -$white-15 : lighten(#000, 15%); // #262626 -$white-20 : lighten(#000, 20%); // #333333 -$white-25 : lighten(#000, 25%); // #404040 -$white-30 : lighten(#000, 30%); // #4d4d4d -$white-35 : lighten(#000, 35%); // #595959 -$white-40 : lighten(#000, 40%); // #666666 -$white-45 : lighten(#000, 45%); // #737373 -$white-50 : lighten(#000, 50%); // #808080 -$white-55 : lighten(#000, 55%); // #8c8c8c -$white-60 : lighten(#000, 60%); // #999999 -$white-65 : lighten(#000, 65%); // #a6a6a6 -$white-70 : lighten(#000, 70%); // #b3b3b3 -$white-75 : lighten(#000, 75%); // #bfbfbf -$white-80 : lighten(#000, 80%); // #cccccc -$white-85 : lighten(#000, 85%); // #d9d9d9 -// more subtle shades for near-white -$white-90 : lighten(#000, 90%); // #e6e6e6 -$white-91 : lighten(#000, 91%); // #e8e8e8 -$white-92 : lighten(#000, 92%); // #ebebeb -$white-93 : lighten(#000, 93%); // #ededed -$white-94 : lighten(#000, 94%); // #f0f0f0 -$white-95 : lighten(#000, 95%); // #f2f2f2 -$white-96 : lighten(#000, 96%); // #f5f5f5 -$white-97 : lighten(#000, 97%); // #f7f7f7 -$white-98 : lighten(#000, 98%); // #fafafa -$white-99 : lighten(#000, 99%); // #fcfcfc - -$blue-light : #268ce6; -$blue : #1177db; -$blue-dark : #0c68c3; - -$dark_blue-light : shade($blue-light, 16%); -$dark_blue : shade($blue, 16%); -$dark_blue-dark : shade($blue-dark, 16%); - -$light_blue-light : #50b4dc; -$light_blue : #3fa9d2; -$light_blue-dark : #2b92b9; - -$yellow-light : #fed829; -$yellow : #fecf06; -$yellow-dark : #eebd01; - -$orange-light : #fd9b3e; -$orange : #fc8c1f; -$orange-dark : #ea7e0f; - -$green-light : #56c35d; -$green : #40b547; -$green-dark : #38a03e; - -$red-light : #e5584d; -$red : #d83d30; -$red-dark : #bc2d20; - -$red_orange-light : tint(mix($red-light, $orange-light, 26%), 2%); -$red_orange : tint(mix($red, $orange, 26%), 2%); -$red_orange-dark : tint(mix($red-dark, $orange-dark, 26%), 2%); - -$pink-light : #fb6abe; -$pink : #f254b1; -$pink-dark : #d8479e; - - -// RWD - Responsive Web Design Additions -// -- -// em's will be used instead of pixels -// http://blog.cloudfour.com/the-ems-have-it-proportional-media-queries-ftw/ - -// !default allows breakpoint to be set beforehand -// see: http://sass-lang.com/documentation/file.SASS_REFERENCE.html#variable_defaults_ -$use-em-breakpoints : true !default; -$body-px : 16px !default; - -// The breakpoints to use -$breakpoint-phone : 220px !default; // 240 -$breakpoint-smart : 300px !default; // 320 -$breakpoint-tablet7 : 460px !default; // 480 -$breakpoint-tablet10 : 750px !default; // 768 -$breakpoint-pcsmall : 960px !default; // 1024 -$breakpoint-pclarge : 1260px !default; // 1280 - -// remove units from a number -@function stripUnits($number) { - @return $number / ($number * 0 + 1); -} - -// Convert pixels to em -@function toEm($px){ - $basepx : $body-px; - - @if $use-em-breakpoints { @return stripUnits($px)/stripUnits($basepx) + 0em; } - @else { @return $px; } -} - -// convert to em's for better compatibility -// see: http://blog.cloudfour.com/the-ems-have-it-proportional-media-queries-ftw/ -$phone : toEm($breakpoint-phone); -$smart : toEm($breakpoint-smart); -$tablet7 : toEm($breakpoint-tablet7); -$tablet10 : toEm($breakpoint-tablet10); -$pcsmall : toEm($breakpoint-pcsmall); -$pclarge : toEm($breakpoint-pclarge); - -// Breakpoint functionality -// media-devices can be given in random order -@mixin breakpoint($media) { - // define minimum and maximum width for each device - $phone-min : $phone; - $phone-max : $smart; - - $smart-min : $smart; - $smart-max : $tablet7; - - $tablet7-min : $tablet7; - $tablet7-max : $tablet10; - - $tablet10-min : $tablet10; - $tablet10-max : $pcsmall; - - $pcsmall-min : $pcsmall; - $pcsmall-max : $pclarge; - - $pclarge-min : $pclarge; - $pclarge-max : "none"; - - $min-width : toEm($pclarge); // start with the largest value for reducing later - $max-width : toEm($phone); // start with the smallest value for increasing later - - // scan all the devices given, use the smallest min-width and largest max-width - @for $i from 1 through length($media) { - $device : nth($media, $i); - - // Display the css for the default device (any) - @if $device == "default" { - @content; - } @else { - // Or display the css for each given device using media Breakbpoints - - @if ($device == "phone") { - @if ($min-width > $phone-min) { $min-width : $phone-min; } - @if ($max-width < $phone-max) { $max-width : $phone-max; } - } - - @else if ($device == "smart") { - @if ($min-width > $smart-min) { $min-width : $smart-min; } - @if ($max-width < $smart-max) { $max-width : $smart-max; } - } - - @else if ($device == "tablet7") { - @if ($min-width > $tablet7-min) { $min-width : $tablet7-min; } - @if ($max-width < $tablet7-max) { $max-width : $tablet7-max; } - } - - @else if ($device == "tablet10") { - @if ($min-width > $tablet10-min) { $min-width : $tablet10-min; } - @if ($max-width < $tablet10-max) { $max-width : $tablet10-max; } - } - - @else if ($device == "pcsmall") { - @if ($min-width > $pcsmall-min) { $min-width : $pcsmall-min; } - @if ($max-width < $pcsmall-max) { $max-width : $pcsmall-max; } - } - - @else if ($device == "pclarge") { - @if ($min-width > $pclarge-min) { $min-width : $pclarge-min; } - $max-width : $pclarge-max; - // does not have a max-width - } - } - } - - // Use this for seeing the results of media query in console - // @debug $media; - // @debug min $min-width max $max-width; - - // create a single media query - @if ($max-width == $pclarge-max) { - // don't set a max width if highest-resolution device is targeted - @media (min-width: $min-width) { @content; } - } @else { - @media (min-width: $min-width) and (max-width: $max-width) { @content; } - } -} - -@mixin checkerPattern{ - $light-color : transparent; - $dark-color : rgba(gray, 0.14); - $size : $grid * 2; - - background-color: $light-color; - background-image: - linear-gradient(45deg, $dark-color 25%, transparent 25%, transparent 75%, $dark-color 75%, $dark-color), - linear-gradient(45deg, $dark-color 25%, transparent 25%, transparent 75%, $dark-color 75%, $dark-color), - ; - background-size: $size $size; - background-position: 0 0, ($size / 2) ($size / 2); -} - -// Misc Documentation -// -// - min-height doesn't work on tables -// height is the equivalent -// see: http://stackoverflow.com/questions/7790222/css-display-table-min-height-not-working -// -// - -// ----------------------------------------------------------------- -// > @stoikerty https://github.com/stoikerty/universal-dev-toolkit diff --git a/packages/dev-toolkit/starting-point/src/client/views/Shell.jsx b/packages/dev-toolkit/starting-point/src/client/views/Shell.jsx deleted file mode 100644 index d9facadd..00000000 --- a/packages/dev-toolkit/starting-point/src/client/views/Shell.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import React, { PropTypes } from 'react'; - -import s from './Shell/_style.scss'; - -// `Shell.js` -// -------------------- -// Having a Shell is perfect if you want to transition between different features of your app or -// managing scroll-state and navigation. - -const displayName = 'Shell'; -const defaultProps = {}; -const propTypes = { - children: PropTypes.node, -}; - -const component = (props) => ( -
- {'Shell'} - {props.children} -
-); - -component.displayName = displayName; -component.defaultProps = defaultProps; -component.propTypes = propTypes; -export default component; diff --git a/packages/dev-toolkit/starting-point/src/client/views/Shell/_style.scss b/packages/dev-toolkit/starting-point/src/client/views/Shell/_style.scss deleted file mode 100644 index e2737c6b..00000000 --- a/packages/dev-toolkit/starting-point/src/client/views/Shell/_style.scss +++ /dev/null @@ -1,16 +0,0 @@ -// Import global config in every file -@import 'style/config'; - -// Import global style once -@import 'style/global'; - -.shell{ - // Positioning mixin. Better have a positioned element than regretting it later... - @include position(relative, block, 100%); - float : left; - padding : $grid; - - // Use proto to design prototype component with random background-color & opacity - // you will see this as yellow - @include proto(2, 0.2); -} diff --git a/packages/dev-toolkit/starting-point/src/client/views/features/Home.jsx b/packages/dev-toolkit/starting-point/src/client/views/features/Home.jsx deleted file mode 100644 index 6fdb59e9..00000000 --- a/packages/dev-toolkit/starting-point/src/client/views/features/Home.jsx +++ /dev/null @@ -1,18 +0,0 @@ -import React from 'react'; - -import s from './Home/_style.scss'; - -const displayName = 'Home'; -const defaultProps = {}; -const propTypes = {}; - -const component = () => ( -
- {'Home Feature'} -
-); - -component.displayName = displayName; -component.defaultProps = defaultProps; -component.propTypes = propTypes; -export default component; diff --git a/packages/dev-toolkit/starting-point/src/client/views/features/Home/_style.scss b/packages/dev-toolkit/starting-point/src/client/views/features/Home/_style.scss deleted file mode 100644 index 0f440ec2..00000000 --- a/packages/dev-toolkit/starting-point/src/client/views/features/Home/_style.scss +++ /dev/null @@ -1,11 +0,0 @@ -@import 'style/config'; - -.home{ - @include position(relative, block, 100%); - float : left; - margin : $grid 0 0; - padding : $grid; - - // you will see this as transparent-blue - @include proto(1, 0.3); -} diff --git a/packages/dev-toolkit/starting-point/src/server/app.js b/packages/dev-toolkit/starting-point/src/server/app.js deleted file mode 100644 index 32319b20..00000000 --- a/packages/dev-toolkit/starting-point/src/server/app.js +++ /dev/null @@ -1,22 +0,0 @@ -// The application constructor is separate -import App from './bootstrap'; - -// NOTE: -// The toolkit expects the `start` an `use`-methods below to be available. -// It will use the methods for the development middleware, for running -// the server and for generating static-rendered builds. - -// Launch server later with webpack using an exported class -// The class needs `start` & `use`-methods -export default class { - // Use this to start the server - start(options = { message: null }) { - App.start({ message: options.message }); - } - - // Bind the express middleware for webpack, this method should - // redirect to & act in the same way as the express `use`-method. - use(...middlewareOptions) { - App.use(...middlewareOptions); - } -} diff --git a/packages/dev-toolkit/starting-point/src/server/bootstrap.js b/packages/dev-toolkit/starting-point/src/server/bootstrap.js deleted file mode 100644 index 9a83665f..00000000 --- a/packages/dev-toolkit/starting-point/src/server/bootstrap.js +++ /dev/null @@ -1,70 +0,0 @@ -import express from 'express'; -import compression from 'compression'; -import serveStatic from 'serve-static'; -import hbs from 'express-handlebars'; -import router from './router'; - -export default new class App { - constructor() { - // server config - this.hostname = process.env.HOST || 'localhost'; - this.port = process.env.PORT || 2000; - - // bind class methods - this.init = this.init.bind(this); - this.start = this.start.bind(this); - this.use = this.use.bind(this); - - // Create express server instance & initialize - this.express = express(); - this.init(); - - // Create application logging functionality. - // A neat console wrapper that keeps the correct line number. - // http://stackoverflow.com/questions/13815640/a-proper-wrapper-for-console-log-with-correct-line-number - /* eslint-disable no-console */ - this.log = (function log() { - return console.log.bind(console); - }()); - /* eslint-enable no-console */ - } - - init() { - this.express.engine('hbs', hbs({ extname: 'hbs' })); - this.express.set('views', `${process.cwd()}/src/server/views`); - this.express.set('view engine', 'hbs'); - this.express.locals.settings['x-powered-by'] = false; - this.express.disable('x-powered-by'); - } - - // Launch express server with react-router - start(options = { message: null, serveBuild: false }) { - // use gzip compression - this.express.use(compression()); - - if (options.serveBuild) { - // serve build folder - this.express.use(serveStatic('build')); - } - - // Listen on specified port - this.express.listen(this.port, (error) => { - if (error) { - this.express.error(error); - } else { - this.log(`\n==> ๐ŸŒŽ Listening on http://${this.hostname}:${this.port}\n`); - if (options.message) { - this.log(options.message); - } - } - }); - - // start react-router - this.express.use(router); - } - - // bind express middleware - use(...middlewareOptions) { - this.express.use(...middlewareOptions); - } -}; diff --git a/packages/dev-toolkit/starting-point/src/server/public-files/Favicon.png b/packages/dev-toolkit/starting-point/src/server/public-files/Favicon.png deleted file mode 100644 index fd76d825dc70be4d42e137d9624f512167b76972..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160111 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 z 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 RJIReaK1HUyD$mOM{{TPuk5d2u diff --git a/packages/dev-toolkit/starting-point/src/server/router.jsx b/packages/dev-toolkit/starting-point/src/server/router.jsx deleted file mode 100644 index 1378d67a..00000000 --- a/packages/dev-toolkit/starting-point/src/server/router.jsx +++ /dev/null @@ -1,30 +0,0 @@ -import React from 'react'; -import ReactDOM from 'react-dom/server'; -import { match, RouterContext } from 'react-router'; - -import { useServerRendering } from 'src/settings'; -import routes from '../client/routes'; - -// React Router Boilerplate -// Note: -// Adapted from server-rendering example: https://github.com/rackt/react-router/blob/latest/docs/guides/advanced/ServerRendering.md -export default (req, res) => { - match({ routes, location: req.url }, (error, redirectLocation, renderProps) => { - if (error) { - res.status(500).send(error.message); - } else if (redirectLocation) { - res.redirect(302, redirectLocation.pathname + redirectLocation.search); - } else if (renderProps) { - const reactHtml = useServerRendering ? - ReactDOM.renderToString() : ''; - - // Render `layout`-template using Handlebars - res.status(200).render('layout', { - reactHtml, - isDev: global.isDev, - }); - } else { - res.status(404).send('Not found'); - } - }); -}; diff --git a/packages/dev-toolkit/starting-point/src/server/views/layout.hbs b/packages/dev-toolkit/starting-point/src/server/views/layout.hbs deleted file mode 100644 index 38584324..00000000 --- a/packages/dev-toolkit/starting-point/src/server/views/layout.hbs +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - Universal App - - - - - - - - - - - - - - -{{#if htmlWebpackPlugin.options.creatingBuild}} - - {{#each htmlWebpackPlugin.files.css}} - - {{/each}} -{{/if}} - - - - -
{{{reactHtml}}}
- - -{{#if htmlWebpackPlugin.options.creatingBuild}} - {{#each htmlWebpackPlugin.files.chunks}} - - {{/each}} -{{else}} - - -{{/if}} - - diff --git a/packages/dev-toolkit/starting-point/src/settings.js b/packages/dev-toolkit/starting-point/src/settings.js deleted file mode 100644 index 5fb0f17d..00000000 --- a/packages/dev-toolkit/starting-point/src/settings.js +++ /dev/null @@ -1,4 +0,0 @@ -// Shared settings between client and server - -export const useServerRendering = false; -export const removeMe = true; diff --git a/packages/dynamic-pages/.eslintignore b/packages/dynamic-pages/.eslintignore deleted file mode 100644 index 5e3db2aa..00000000 --- a/packages/dynamic-pages/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -**/dist/*.js diff --git a/packages/dynamic-pages/.npmignore b/packages/dynamic-pages/.npmignore deleted file mode 100644 index 3bbdd9bb..00000000 --- a/packages/dynamic-pages/.npmignore +++ /dev/null @@ -1,6 +0,0 @@ -############# -## Node -############# - -node_modules/ -npm-debug.log diff --git a/packages/dynamic-pages/Readme.md b/packages/dynamic-pages/Readme.md deleted file mode 100644 index 9f3b36c9..00000000 --- a/packages/dynamic-pages/Readme.md +++ /dev/null @@ -1,8 +0,0 @@ -#### Dynamic Pages -Dynamic page-loading utilities for react-router.
-See [this gist](https://gist.github.com/stoikerty/40a668e8fd4e2919034fd1eed2252bcb) for how to implement. - -Similar to [PRPL](https://www.polymer-project.org/1.0/toolbox/server)
-PRPL = Push critical resources for the initial route, Render initial route, Pre-cache remaining routes, Lazy-load and create remaining routes on demand. - -*see related project: [stoikerty/dev-toolkit](https://github.com/stoikerty/dev-toolkit)* diff --git a/packages/dynamic-pages/package.json b/packages/dynamic-pages/package.json deleted file mode 100644 index 9b630c16..00000000 --- a/packages/dynamic-pages/package.json +++ /dev/null @@ -1,40 +0,0 @@ -{ - "name": "dynamic-pages", - "version": "0.3.0", - "description": "Dynamic page-loading utilities for react-router", - "main": "dist/dynamicPages.js", - "scripts": { - "prepublish": "npm run build", - "build": "babel src --presets es2015 --out-dir dist", - "watch": "babel src --presets es2015 --watch --out-dir dist", - "test": "echo \"Error: no test specified\" && exit 1" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/stoikerty/dev-toolkit.git" - }, - "keywords": [ - "react", - "isomorphic", - "react-router", - "dev-toolkit", - "universal", - "javascript" - ], - "author": "Jorge Antunes @stoikerty", - "license": "ISC", - "bugs": { - "url": "https://github.com/stoikerty/dev-toolkit/issues" - }, - "homepage": "https://github.com/stoikerty/dev-toolkit#readme", - "dependencies": { - "chalk": "^1.1.3", - "file-exists": "^2.0.0", - "lodash.foreach": "^4.5.0", - "mkdirp": "^0.5.1" - }, - "devDependencies": { - "babel-cli": "^6.16.0", - "babel-preset-es2015": "^6.16.0" - } -} diff --git a/packages/dynamic-pages/src/dynamicPages.js b/packages/dynamic-pages/src/dynamicPages.js deleted file mode 100644 index 68b5f527..00000000 --- a/packages/dynamic-pages/src/dynamicPages.js +++ /dev/null @@ -1,202 +0,0 @@ -import each from 'lodash.foreach'; -import GenerateFiles from './dynamicPages/generateFiles'; - -// TODO: -// # getComponents -// - handle any amount of components, not just `header` & `content` -// # generateScripts -// - what about unique scripts, modules that use the same filename & displayname -// - what about images that are not lazily loaded? -// Possible solution could be to use `images-require-hook` instead of filesHook -// see: https://github.com/ptshih/images-require-hook -// # find a way to separate server-only packages inside `generateFiles` from being bundled on client - -export default new class DynamicPages { - constructor() { - this.isClient = false; - this.prefetchComponents = []; - this.definedRoutes = []; - } - - init({ isClient }) { - // Is the utility running on the client or the server? - this.isClient = isClient || this.isClient; - } - - // Utility for retrieving displayName of component - getComponentName(component) { - return component.WrappedComponent ? - component.WrappedComponent.displayName : component.displayName; - } - - // Utility for checking if a given path has parameters - hasPathParameters(renderPath) { - return renderPath.indexOf('/:') !== -1; - } - - // Build an array of components to be prefetched - addToPrefetch({ components }) { - this.prefetchComponents.push(...components); - } - - // Fetch all components previously added to the `prefetchComponents`-array - runPrefetch({ logActivity }) { - if (this.isClient) { - // eslint-disable-next-line no-console - const log = console && console.info ? console.info : console.log; - - // Fetch all components into browser cache, using callback - this.prefetchComponents.forEach((component) => { - if (typeof component === 'object') { - const multipleComponents = component; - - each(multipleComponents, (value, key) => { - multipleComponents[key]((module) => { - const name = this.getComponentName(module.default); - if (logActivity) { - log(`Cached dynamic component "${name}"`); - } - }); - }); - } else { - component((module) => { - const name = this.getComponentName(module.default); - if (logActivity) { - // eslint-disable-next-line no-console - log(`Cached dynamic component "${name}"`); - } - }); - } - }); - } else { - // Components are already loaded, no prefetching is needed - } - } - - // Save the route and returns needed props to react-router - defineRoute({ renderPath, components, dynamicData }) { - this.definedRoutes.push({ renderPath, components, dynamicData }); - - // Make it work with react-router by returning necessary props - // see: https://github.com/ReactTraining/react-router/blob/master/docs/guides/DynamicRouting.md - return this.isClient - // React-Router's `getComponents` fetches the components asynchronously when on the client. - ? { getComponents: this.getComponents(components) } - // On the Server, React-Router only forwards components to the parent view when `components` - // is set, otherwise it is unable to forward individual component variables. - : { components }; - } - - // - getComponents(components) { - return (location, cb) => { - if (typeof components === 'object') { - if (this.isClient) { - // see: https://github.com/reactjs/react-router/blob/master/docs/API.md#getcomponentnextstate-callback - const fetchedComponents = {}; - - each(components, (value, key) => { - components[key]((component) => { - fetchedComponents[key] = component.default; - const fetchedLastComponent = - Object.keys(fetchedComponents).length === Object.keys(components).length; - - // use callback only if all components have been fetched - if (fetchedLastComponent) { - cb(null, fetchedComponents); - } - }); - }); - - // TODO: This `if` is a hack, needs to handle any amount of components, not hardcoded ones - if (components && components.header) { - components.header(header => { - components.content(content => { - cb(null, { header: header.default, content: content.default }); - }); - }); - } else { - const singleComponent = components; - singleComponent.content(content => { - cb(null, { content: content.default }); - }); - } - } else { - // component modules can be used directly - each(components, (value, key) => { - cb(null, components[key]); - }); - } - } else { - if (this.isClient) { - // component module is fetched first, via callback - components((module) => { - cb(null, module.default); - }); - } else { - const singleComponent = components; - // component module can be used directly - cb(null, singleComponent); - } - } - }; - } - - // Create scripts for each component to insert into html - // NOTE: Server-usage only - generateScripts({ renderPath }) { - let scripts = ''; - - if (!this.isClient) { - const currentRoute = this.definedRoutes.find(route => { - let isCurrentRoute = false; - - // Does the current route have any parameters? Parameters start with `/:` - if (this.hasPathParameters(route.renderPath)) { - // Let's strip the parameter part out of the route - const routePath = - route.renderPath.substring(0, route.renderPath.indexOf('/:')).toLowerCase(); - // check whether the given `renderPath` begins with the defined `routePath` - if (renderPath.toLowerCase().lastIndexOf(routePath, 0) === 0) { - isCurrentRoute = true; - } - } else if (route.renderPath.toLowerCase() === renderPath.toLowerCase()) { - isCurrentRoute = true; - } - - return isCurrentRoute; - }); - - if (currentRoute) { - each(currentRoute.components, (component) => { - // Support ES2015-style modules - const currentComponent = component.default ? component.default : component; - // support wrapped components / HOC (Higher Order Components) - const name = this.getComponentName(currentComponent); - scripts = `${scripts}\n`; - }); - } - } - - return scripts; - } - - // The Dynamic Page Generator - // NOTE: Server-usage only - importDynamicRenderFile({ dynamicRenderFile }) { - GenerateFiles.setupDynamicRenderFile({ dynamicRenderFile }); - } - generatePages({ publicPath, buildFolder, manifestFile, doneCallback }) { - if (!this.isClient) { - GenerateFiles.startRendering({ - publicPath, - buildFolder, - manifestFile, - definedRoutes: this.definedRoutes, - getComponentName: this.getComponentName, - hasPathParameters: this.hasPathParameters, - doneCallback, - }); - } - } -}; diff --git a/packages/dynamic-pages/src/dynamicPages/generateFiles.js b/packages/dynamic-pages/src/dynamicPages/generateFiles.js deleted file mode 100644 index 34962da6..00000000 --- a/packages/dynamic-pages/src/dynamicPages/generateFiles.js +++ /dev/null @@ -1,296 +0,0 @@ -/* eslint-disable-file no-console, global-require */ - -import fs from 'fs'; -import path from 'path'; -import each from 'lodash.foreach'; -import mkdirp from 'mkdirp'; -import chalk from 'chalk'; -import fileExists from 'file-exists'; - -// TODO: -// - cover case of `renderedRoutes` without dynamic component(s) -// - cover case of multiple dynamic components (add all script urls to html) -// - - -// Compile all files necessary for serving -export default new class GenerateFiles { - constructor() { - this.readManifestFile = this.readManifestFile.bind(this); - this.readIndexHtml = this.readIndexHtml.bind(this); - this.createPagesFromCompiledData = this.createPagesFromCompiledData.bind(this); - this.createPage = this.createPage.bind(this); - this.renderRoute = this.renderRoute.bind(this); - this.writeFile = this.writeFile.bind(this); - } - - setupDynamicRenderFile({ dynamicRenderFile }) { - this.dynamicRender = null; - - if (!fileExists(dynamicRenderFile)) { - console.log( - chalk.yellow('To make use of dynamic pages, add the `dynamicRender.js`-file'), - chalk.yellow('\nsee:'), - chalk.yellow.underline('https://github.com/stoikerty/dev-toolkit/wiki/dynamic-pages'), - '\nCreating a regular static build.'); - } else { - try { - // The expression `'' + ` is a webpack hack to avoid an error when compiling for the client. - // "the request of a dependency is an expression" - // see: https://github.com/webpack/webpack/issues/196 - // https://github.com/webpack/webpack/issues/198 - this.dynamicRender = require('' + dynamicRenderFile).default; - this.onRouteRender = require('' + dynamicRenderFile).onRouteRender; - this.beforeRender = require('' + dynamicRenderFile).beforeRender; - this.afterRender = require('' + dynamicRenderFile).afterRender; - this.beforeRouteRender = require('' + dynamicRenderFile).beforeRouteRender; - this.afterRouteRender = require('' + dynamicRenderFile).afterRouteRender; - } catch (e) { - if (e) { - console.log(e); - } - } - } - } - - startRendering({ - publicPath, - buildFolder, - manifestFile, - definedRoutes, - getComponentName, - hasPathParameters, - doneCallback, - }) { - // save given options for later - this.publicPath = publicPath; - this.buildFolder = buildFolder; - this.manifestFile = manifestFile; - this.definedRoutes = definedRoutes; - this.getComponentName = getComponentName; - this.hasPathParameters = hasPathParameters; - this.doneCallback = doneCallback; - - if (this.beforeRender) { - console.log(chalk.blue('โ†ฉ'), ` beforeRender`); - this.beforeRender({ definedRoutes }).then(() => this.renderRoutes()); - } else { - this.renderRoutes(); - } - } - - renderRoutes(){ - if (this.dynamicRender || this.onRouteRender) { - try { - console.log('Generating', chalk.magenta('index.html'), 'for each route...'); - - this.readManifestFile() - .then(this.readIndexHtml) - .then(this.createPagesFromCompiledData) - .then(() => { - if (this.afterRender) { - console.log(chalk.blue('โ†ช'), ` afterRender`); - this.afterRender({ definedRoutes: this.definedRoutes }); - } else { - if (this.doneCallback) { - this.doneCallback(); - } - } - }); - } catch (e) { - if (e) { - console.log(e); - } - } - } - } - - readManifestFile() { - return new Promise((resolve) => { - fs.readFile(this.manifestFile, 'utf8', (error, manifestData) => { - if (error) throw error; - resolve({ manifestData }); - }); - }); - } - - readIndexHtml({ manifestData }) { - return new Promise((resolve) => { - fs.readFile(path.resolve(this.buildFolder, 'index.html'), 'utf8', (error, indexData) => { - if (error) throw error; - resolve({ manifestData, indexData }); - }); - }); - } - - createPagesFromCompiledData({ manifestData, indexData }) { - return new Promise((resolve) => { - const promises = this.definedRoutes.map(({ renderPath, components, dynamicData }) => - this.createPage({ renderPath, components, dynamicData, manifestData, indexData })); - - Promise.all(promises).then(resolve); - }); - } - - createPage({ renderPath, components, dynamicData, manifestData, indexData }) { - return new Promise((resolve) => { - const afterRouteRender = ({ routePath }) => { - if (this.afterRouteRender) { - console.log(chalk.gray('โ†ฆ'), ` afterRouteRender (${chalk.blue(renderPath)})`); - this.afterRouteRender({ - renderPath, - components, - dynamicData, - manifestData, - indexData, - routePath, - }).then(resolve); - } else { - resolve(); - } - }; - - // Only render routes that have no parameters - if (!this.hasPathParameters(renderPath)) { - if (this.beforeRouteRender) { - console.log(chalk.gray('โ‡ฅ'), ` beforeRouteRender (${chalk.blue(renderPath)})`); - this.beforeRouteRender({ - renderPath, - components, - dynamicData, - manifestData, - indexData, - }).then(() => - this.renderRoute({ renderPath, components, dynamicData, manifestData, indexData }) - .then(afterRouteRender) - ); - } else { - this.renderRoute({ renderPath, components, dynamicData, manifestData, indexData }) - .then(afterRouteRender); - } - } else { - resolve(); - } - }) - } - - renderRoute({ renderPath, components, dynamicData, manifestData, indexData }) { - return new Promise((resolve) => { - const routePath = path.resolve(this.buildFolder, renderPath.substring(1)); - const names = (() => { - let componentNames = ''; - each(components, (component, index) => { - componentNames += chalk.magenta(this.getComponentName(component)) + ', '; - }); - return componentNames.slice(0, -2); - })(); - - mkdirp(routePath, (mkdirError) => { - if (mkdirError) { - console.error(mkdirError); - } else { - const renderAndResolve = ({ reactHtml, additionalData }) => { - if (reactHtml) { - const htmlWithAssets = this.convertAssetPaths(manifestData, reactHtml); - const componentPaths = this.extractComponentPaths({ manifestData, components }); - const completeHtml = this.injectMarkupIntoTemplate({ - indexData, - htmlWithAssets, - componentPaths, - additionalData, - }); - this.writeFile({ routePath, completeHtml }).then(() => resolve({ routePath })) - } else { - console.log( - `Route "${renderPath}" doesn't exist, rendering resulted in \`null\`.`, - 'No HTML was rendered.' - ); - resolve({ routePath }); - } - }; - - if (this.dynamicRender) { - // synchronous rendering - console.log( - chalk.blue('>'), `Rendering route ${chalk.magenta(renderPath)} with: ${names}`); - const { reactHtml, additionalData } = this.dynamicRender(renderPath, dynamicData); - renderAndResolve({ reactHtml, additionalData }); - } else if (this.onRouteRender) { - // asynchronous rendering, expects a promise - console.log( - chalk.blue('โคณ'), ` onRouteRender ${chalk.magenta(renderPath)} with: ${names}`); - this.onRouteRender({ renderPath, components, dynamicData, manifestData, indexData }) - .then(renderAndResolve); - } - } - }); - }); - } - - writeFile({ routePath, completeHtml }) { - return new Promise((resolve) => { - fs.writeFile(path.resolve(routePath, 'index.html'), completeHtml, (writeError) => { - if (writeError) { - throw writeError; - } - resolve(); - }); - }); - } - - convertAssetPaths(manifestData, html) { - let result = html; - const data = JSON.parse(manifestData); - const assets = data.assets; - const isWin = process && process.platform === 'win32'; - - each(assets, (value, key) => { - // TODO: use rootAssetPath? - const path = `src/client/${key}`; - const normalizedPath = isWin ? path.replace(/\//g, '\\') : path; - // TODO: check for publicPath? - result = result.replace(normalizedPath, `/${value}`); - }); - - return result; - }; - - extractComponentPaths({ manifestData, components }) { - const extractedPaths = []; - const data = JSON.parse(manifestData); - const assets = data.assets; - - each(components, (component) => { - each(assets, (value, key) => { - const componentName = this.getComponentName(component); - if (key.startsWith(componentName)) { - extractedPaths.push(value); - } - }); - }); - - return extractedPaths; - } - - injectMarkupIntoTemplate({ indexData, htmlWithAssets, componentPaths, additionalData }) { - const dynamicComponents = componentPaths.map(dynamicComponentPath => ( - `` - )).join('\n\t\t'); - - let formattedData = indexData.replace( - '', - htmlWithAssets - ).replace( - '', - dynamicComponents, - ); - - each(additionalData, (value, key) => { - formattedData = formattedData.replace( - ``, - value, - ); - }); - - return formattedData; - }; -} diff --git a/packages/eslint-config-dev-toolkit/.prettierrc b/packages/eslint-config-dev-toolkit/.prettierrc new file mode 100644 index 00000000..a44463ca --- /dev/null +++ b/packages/eslint-config-dev-toolkit/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/packages/eslint-config-dev-toolkit/Readme.md b/packages/eslint-config-dev-toolkit/Readme.md new file mode 100644 index 00000000..5549e884 --- /dev/null +++ b/packages/eslint-config-dev-toolkit/Readme.md @@ -0,0 +1,3 @@ +# eslint-config-dev-toolkit + +eslint preset for [dev-toolkit](https://github.com/stoikerty/dev-toolkit) diff --git a/packages/eslint-config-dev-toolkit/index.js b/packages/eslint-config-dev-toolkit/index.js new file mode 100644 index 00000000..99e188f4 --- /dev/null +++ b/packages/eslint-config-dev-toolkit/index.js @@ -0,0 +1,25 @@ +'use strict'; + +// Use require.resolve to prevent issues when using npm link +// see: https://github.com/babel/babel-loader/issues/149 + +module.exports = { + rules: { + 'react/jsx-filename-extension': 0, + 'import/no-unresolved': [ + 'error', + { + ignore: ['src/'], + }, + ], + 'import/no-extraneous-dependencies': ['off'], + 'import/extensions': ['off', 'never'], + }, + parser: 'babel-eslint', + settings: { + 'import/resolver': { + 'babel-module': {}, + }, + }, + env: { browser: true }, +}; diff --git a/packages/eslint-config-dev-toolkit/package-lock.json b/packages/eslint-config-dev-toolkit/package-lock.json new file mode 100644 index 00000000..389cd3e2 --- /dev/null +++ b/packages/eslint-config-dev-toolkit/package-lock.json @@ -0,0 +1,14 @@ +{ + "name": "eslint-config-dev-toolkit", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "prettier": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.8.2.tgz", + "integrity": "sha512-fHWjCwoRZgjP1rvLP7OGqOznq7xH1sHMQUFLX8qLRO79hI57+6xbc5vB904LxEkCfgFgyr3vv06JkafgCSzoZg==", + "dev": true + } + } +} diff --git a/packages/eslint-config-dev-toolkit/package.json b/packages/eslint-config-dev-toolkit/package.json new file mode 100644 index 00000000..82532f6e --- /dev/null +++ b/packages/eslint-config-dev-toolkit/package.json @@ -0,0 +1,42 @@ +{ + "name": "eslint-config-dev-toolkit", + "version": "1.0.0", + "description": "essential eslint config for dev-toolkit", + "main": "index.js", + "scripts": { + "lint": "prettier --write './**/*.js'", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "repository": { + "type": "git", + "url": "https://github.com/stoikerty/dev-toolkit/tree/master/packages/eslint-config-dev-toolkit" + }, + "keywords": [ + "eslint", + "eslintconfig", + "babel", + "babel-preset", + "dev-toolkit", + "universal", + "universal javascript", + "import", + "root-relative require", + "root-relative import" + ], + "author": "Jorge Antunes @stoikerty", + "license": "MIT", + "dependencies": {}, + "peerDependencies": { + "babel-eslint": ">= 8", + "eslint": ">= 4", + "eslint-import-resolver-babel-module": ">= 2", + "eslint-plugin-import": ">= 2.7", + "eslint-plugin-react": ">= 7" + }, + "engines": { + "node": ">= 4" + }, + "devDependencies": { + "prettier": "^1.7.4" + } +} diff --git a/templates/minimal/.babelrc b/templates/minimal/.babelrc new file mode 100644 index 00000000..adb9e998 --- /dev/null +++ b/templates/minimal/.babelrc @@ -0,0 +1 @@ +{ "presets": ["dev-toolkit"] } diff --git a/templates/minimal/.gitignore b/templates/minimal/.gitignore new file mode 100644 index 00000000..fb8e5e34 --- /dev/null +++ b/templates/minimal/.gitignore @@ -0,0 +1,7 @@ +# Generated Files +build/ +dist/ + +# Node +node_modules/ +npm-debug.log diff --git a/templates/minimal/.prettierrc b/templates/minimal/.prettierrc new file mode 100644 index 00000000..a44463ca --- /dev/null +++ b/templates/minimal/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/templates/minimal/package.json b/templates/minimal/package.json new file mode 100644 index 00000000..d55305a4 --- /dev/null +++ b/templates/minimal/package.json @@ -0,0 +1,25 @@ +{ + "name": "dev-toolkit-minimal-template", + "version": "1.0.0", + "description": "universal app", + "author": "", + "scripts": { + "start": "npm run build && npm run serve", + "dev": "cross-env NODE_ENV=development dev-toolkit watch", + "build": "cross-env NODE_ENV=production dev-toolkit build", + "serve": "cross-env NODE_ENV=production SERVER_PORT=8080 dev-toolkit serve", + "lint": "prettier --write './**/*.js'" + }, + "dependencies": { + "babel-preset-dev-toolkit": "1.0.0", + "cross-env": "^5.0.5", + "dev-toolkit": "6.0.2", + "express": "^4.15.5", + "express-handlebars": "^3.0.0", + "react": "^16.0.0", + "react-dom": "^16.0.0" + }, + "devDependencies": { + "prettier": "1.7.4" + } +} diff --git a/templates/minimal/src/client/RootComponent.js b/templates/minimal/src/client/RootComponent.js new file mode 100644 index 00000000..3e7aaa56 --- /dev/null +++ b/templates/minimal/src/client/RootComponent.js @@ -0,0 +1,12 @@ +// This is the main component that both the client & the server touch first. +// +// It's likely that this component will stay mostly empty since it sits at the root. +// It might contain your chosen routing solution or redux-provider. +import React from 'react'; +import App from './views/App'; + +const displayName = 'RootComponent'; +const component = () => ; + +component.displayName = displayName; +export default component; diff --git a/templates/minimal/src/client/index.js b/templates/minimal/src/client/index.js new file mode 100644 index 00000000..e48ccaf2 --- /dev/null +++ b/templates/minimal/src/client/index.js @@ -0,0 +1,23 @@ +// NOTE: This File is only run on the client only. +// The server imports `RootComponent` directly. +import React from 'react'; +import ReactDOM from 'react-dom'; + +const hotReRender = () => { + // Dynamically require module inline for hot-reloading + import('./RootComponent').then(module => { + const RootComponent = module.default; + // Render the newly required module to the DOM + ReactDOM.hydrate(, document.querySelector('[data-jshook~="app-body"]')); + }); +}; + +// Start the app by rendering it for the first time +hotReRender(); + +// Support hot-reloading of components by rerendering using webpack's included HMR. +// HMR stands for "Hot-Module-Replacement", sometimes referred as "vanilla HMR" +if (module.hot) { + // After accepting the new module from webpack, we rerender on the next tick + module.hot.accept('./RootComponent', () => setTimeout(hotReRender)); +} diff --git a/templates/minimal/src/client/views/App.js b/templates/minimal/src/client/views/App.js new file mode 100644 index 00000000..194c0212 --- /dev/null +++ b/templates/minimal/src/client/views/App.js @@ -0,0 +1,4 @@ +import React from 'react'; + +// Use this as the entry-point for your app. +export default () =>
{'Minimal App'}
; diff --git a/templates/minimal/src/server/index.js b/templates/minimal/src/server/index.js new file mode 100644 index 00000000..6bef0392 --- /dev/null +++ b/templates/minimal/src/server/index.js @@ -0,0 +1,75 @@ +import express from 'express'; +import expressHandlebars from 'express-handlebars'; +import path from 'path'; +import fs from 'fs'; +import React from 'react'; +import { renderToString } from 'react-dom/server'; +import { isDev } from 'dev-toolkit/settings'; + +// Unlike the client app, the server app can only ever be run in Node.js +// we therefore have direct access to Node-specific things like `process` +const serverPort = process.env.SERVER_PORT || 3000; +const serverViews = path.resolve(process.cwd(), 'src/server/views'); +const rootComponentPath = path.resolve(process.cwd(), 'src/client/RootComponent'); + +export default new class { + constructor() { + // Let dev-toolkit know about express by setting `this.express`, + // this allows dev-toolkit to attach the dev-server middleware to webpack + this.express = express(); + + // Handlebars is used for server-rendering the html template in `src/server/views` + this.handlebarsInstance = expressHandlebars.create(); + + // Use Handlebars as the view engine in express + this.express.engine('hbs', this.handlebarsInstance.engine); + this.express.set('views', serverViews).set('view engine', 'hbs'); + } + + // Ability to launch server later (allows dev-toolkit to bind webpack-middleware before start) + start({ assets, buildFolder }) { + // Provide a simple health-check endpoint to see if the server is alive + this.express.get('/health', (req, res) => res.send('OK')); + + if (isDev) { + // Render template with no prerendered html in development mode + this.express.use((req, res) => + res.status(200).render('template', { assets, renderedHtml: '' }) + ); + } else { + // Make assets in build folder available to the client. + this.express.use(express.static(buildFolder)); + } + + // Run the express server by listening on the specified port + this.serverInstance = this.express.listen(serverPort, () => { + // eslint-disable-next-line no-console + console.log(`Server is listening on port ${serverPort}`); + }); + } + + // Rendering of the html on build happens through this preRender-method + preRender({ assets, buildFolder }) { + // return a Promise to dev-toolkit + return new Promise((resolve, reject) => { + // Load Client App via RootComponent + import(rootComponentPath).then(module => { + const RootComponent = module.default; + // Here handlebars is used to generate the html without express and without webpack + this.handlebarsInstance + .render(path.join(serverViews, 'template.hbs'), { + assets, + renderedHtml: renderToString(), + }) + .then(html => { + // Generated html is written to html file in build folder + fs.writeFile( + path.join(buildFolder, 'index.html'), + html, + error => (error ? reject(error) : resolve()) + ); + }); + }); + }); + } +}(); diff --git a/templates/minimal/src/server/views/template.hbs b/templates/minimal/src/server/views/template.hbs new file mode 100644 index 00000000..9ba6fd79 --- /dev/null +++ b/templates/minimal/src/server/views/template.hbs @@ -0,0 +1,12 @@ + + + + + +
{{{ renderedHtml }}}
+ + + + + + diff --git a/templates/serverless/.babelrc b/templates/serverless/.babelrc new file mode 100644 index 00000000..adb9e998 --- /dev/null +++ b/templates/serverless/.babelrc @@ -0,0 +1 @@ +{ "presets": ["dev-toolkit"] } diff --git a/templates/serverless/.gitignore b/templates/serverless/.gitignore new file mode 100644 index 00000000..fb8e5e34 --- /dev/null +++ b/templates/serverless/.gitignore @@ -0,0 +1,7 @@ +# Generated Files +build/ +dist/ + +# Node +node_modules/ +npm-debug.log diff --git a/templates/serverless/.prettierrc b/templates/serverless/.prettierrc new file mode 100644 index 00000000..a44463ca --- /dev/null +++ b/templates/serverless/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/templates/serverless/handler.js b/templates/serverless/handler.js new file mode 100644 index 00000000..c4ea3fff --- /dev/null +++ b/templates/serverless/handler.js @@ -0,0 +1,9 @@ +const path = require('path'); + +// Example of programmatic usage of dev-toolkit with a serverless-type application +require('dev-toolkit').default({ + command: 'preRender', + options: { + entryPoint: path.resolve(process.cwd(), 'src/server/preRender'), + }, +}); diff --git a/templates/serverless/package.json b/templates/serverless/package.json new file mode 100644 index 00000000..14594be8 --- /dev/null +++ b/templates/serverless/package.json @@ -0,0 +1,26 @@ +{ + "name": "dev-toolkit-serverless-template", + "version": "1.0.0", + "description": "universal app", + "author": "", + "scripts": { + "start": "npm run build && npm run serve", + "dev": "cross-env NODE_ENV=development dev-toolkit watch", + "build": "cross-env NODE_ENV=production dev-toolkit build", + "serve": "cross-env NODE_ENV=production SERVER_PORT=8080 dev-toolkit serve", + "lint": "prettier --write './**/*.js'" + }, + "dependencies": { + "babel-preset-dev-toolkit": "1.0.0", + "clear-module": "^2.1.0", + "cross-env": "^5.0.5", + "dev-toolkit": "6.0.2", + "express": "^4.15.5", + "express-handlebars": "^3.0.0", + "react": "^16.0.0", + "react-dom": "^16.0.0" + }, + "devDependencies": { + "prettier": "1.7.4" + } +} diff --git a/templates/serverless/src/client/RootComponent.js b/templates/serverless/src/client/RootComponent.js new file mode 100644 index 00000000..3e7aaa56 --- /dev/null +++ b/templates/serverless/src/client/RootComponent.js @@ -0,0 +1,12 @@ +// This is the main component that both the client & the server touch first. +// +// It's likely that this component will stay mostly empty since it sits at the root. +// It might contain your chosen routing solution or redux-provider. +import React from 'react'; +import App from './views/App'; + +const displayName = 'RootComponent'; +const component = () => ; + +component.displayName = displayName; +export default component; diff --git a/templates/serverless/src/client/index.js b/templates/serverless/src/client/index.js new file mode 100644 index 00000000..e48ccaf2 --- /dev/null +++ b/templates/serverless/src/client/index.js @@ -0,0 +1,23 @@ +// NOTE: This File is only run on the client only. +// The server imports `RootComponent` directly. +import React from 'react'; +import ReactDOM from 'react-dom'; + +const hotReRender = () => { + // Dynamically require module inline for hot-reloading + import('./RootComponent').then(module => { + const RootComponent = module.default; + // Render the newly required module to the DOM + ReactDOM.hydrate(, document.querySelector('[data-jshook~="app-body"]')); + }); +}; + +// Start the app by rendering it for the first time +hotReRender(); + +// Support hot-reloading of components by rerendering using webpack's included HMR. +// HMR stands for "Hot-Module-Replacement", sometimes referred as "vanilla HMR" +if (module.hot) { + // After accepting the new module from webpack, we rerender on the next tick + module.hot.accept('./RootComponent', () => setTimeout(hotReRender)); +} diff --git a/templates/serverless/src/client/views/App.js b/templates/serverless/src/client/views/App.js new file mode 100644 index 00000000..ae39813e --- /dev/null +++ b/templates/serverless/src/client/views/App.js @@ -0,0 +1,4 @@ +import React from 'react'; + +// Use this as the entry-point for your app. +export default () =>
{'Serverless App'}
; diff --git a/templates/serverless/src/server/index.js b/templates/serverless/src/server/index.js new file mode 100644 index 00000000..1d29d145 --- /dev/null +++ b/templates/serverless/src/server/index.js @@ -0,0 +1,57 @@ +import express from 'express'; +import expressHandlebars from 'express-handlebars'; +import path from 'path'; +import fs from 'fs'; +import React from 'react'; +import { renderToString } from 'react-dom/server'; +import clearModule from 'clear-module'; +import { isDev } from 'dev-toolkit/settings'; + +// Unlike the client app, the server app can only ever be run in Node.js +// we therefore have direct access to Node-specific things like `process` +const serverPort = process.env.SERVER_PORT || 3000; +const serverViews = path.resolve(process.cwd(), 'src/server/views'); +const rootComponentPath = path.resolve(process.cwd(), 'src/client/RootComponent'); + +export default new class { + constructor() { + // Let dev-toolkit know about express by setting `this.express`, + // this allows dev-toolkit to attach the dev-server middleware to webpack + this.express = express(); + + // Use Handlebars as the view engine in express + this.express.engine('hbs', expressHandlebars.create().engine); + this.express.set('views', serverViews).set('view engine', 'hbs'); + } + + // Ability to launch server later (allows dev-toolkit to bind webpack-middleware before start) + start({ assets, buildFolder }) { + // Only server-render during development + if (isDev) { + // Render the template-file on any incoming requests + this.express.use((req, res) => { + // Remove Client App from cache (cheap server-side Hot-Reload) + if (isDev) { + clearModule(rootComponentPath); + } + // Load newest version of Client App via RootComponent + import(rootComponentPath).then(module => { + const RootComponent = module.default; + res.status(200).render('template', { + assets, + renderedHtml: renderToString(), + }); + }); + }); + } else { + // Make assets in build folder available to the client. + this.express.use(express.static(buildFolder)); + } + + // Run the express server by listening on the specified port + this.serverInstance = this.express.listen(serverPort, () => { + // eslint-disable-next-line no-console + console.log(`Server is listening on port ${serverPort}`); + }); + } +}(); diff --git a/templates/serverless/src/server/preRender.js b/templates/serverless/src/server/preRender.js new file mode 100644 index 00000000..db7f3786 --- /dev/null +++ b/templates/serverless/src/server/preRender.js @@ -0,0 +1,28 @@ +import React from 'react'; +import path from 'path'; +import { renderToString } from 'react-dom/server'; + +const serverViews = path.resolve(process.cwd(), 'src/server/views'); +const rootComponentPath = path.resolve(process.cwd(), 'src/client/RootComponent'); +const handlebarsInstance = expressHandlebars.create().engine; + +// This file is called individually via programmatic usage in `handler.js` +export default ({ assets, buildFolder }) => { + // return a Promise to dev-toolkit + return new Promise((resolve, reject) => { + // Load Client App via RootComponent + import(rootComponentPath).then(module => { + const RootComponent = module.default; + // Here handlebars is used to generate the html without express and without webpack + this.handlebarsInstance + .render(path.join(serverViews, 'template.hbs'), { + assets, + renderedHtml: renderToString(), + }) + .then(html => { + // Generated html is written to html file in build folder + console.log('html: ', html); + }); + }); + }); +}; diff --git a/templates/serverless/src/server/views/template.hbs b/templates/serverless/src/server/views/template.hbs new file mode 100644 index 00000000..9ba6fd79 --- /dev/null +++ b/templates/serverless/src/server/views/template.hbs @@ -0,0 +1,12 @@ + + + + + +
{{{ renderedHtml }}}
+ + + + + + diff --git a/templates/standard/.babelrc b/templates/standard/.babelrc new file mode 100644 index 00000000..adb9e998 --- /dev/null +++ b/templates/standard/.babelrc @@ -0,0 +1 @@ +{ "presets": ["dev-toolkit"] } diff --git a/templates/standard/.gitignore b/templates/standard/.gitignore new file mode 100644 index 00000000..fb8e5e34 --- /dev/null +++ b/templates/standard/.gitignore @@ -0,0 +1,7 @@ +# Generated Files +build/ +dist/ + +# Node +node_modules/ +npm-debug.log diff --git a/templates/standard/.prettierrc b/templates/standard/.prettierrc new file mode 100644 index 00000000..a44463ca --- /dev/null +++ b/templates/standard/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/templates/standard/dev-toolkit.config.js b/templates/standard/dev-toolkit.config.js new file mode 100644 index 00000000..9bdc5e7f --- /dev/null +++ b/templates/standard/dev-toolkit.config.js @@ -0,0 +1,16 @@ +module.exports = { + devToolkit: { + usePreRender: true, + sharedEnvs: ['MY_CUSTOM_ENV'], + }, + + // Use custom webpack configuration here + webpack: { + loaders: function(options) { + return []; + }, + plugins: function(options) { + return []; + }, + }, +}; diff --git a/templates/standard/package.json b/templates/standard/package.json new file mode 100644 index 00000000..a9ff77a5 --- /dev/null +++ b/templates/standard/package.json @@ -0,0 +1,48 @@ +{ + "name": "dev-toolkit-standard-template", + "version": "1.0.0", + "description": "universal app", + "author": "", + "scripts": { + "start": "npm run build && npm run serve", + "dev": "better-npm-run development", + "build": "better-npm-run create-build", + "serve": "better-npm-run run-server", + "lint": "prettier --write './**/*.js'" + }, + "betterScripts": { + "development": { + "command": "dev-toolkit watch", + "env": { + "NODE_ENV": "development", + "MY_CUSTOM_ENV": "foo" + } + }, + "create-build": { + "command": "dev-toolkit build", + "env": { + "NODE_ENV": "production" + } + }, + "run-server": { + "command": "dev-toolkit serve", + "env": { + "NODE_ENV": "production", + "SERVER_PORT": "8080" + } + } + }, + "dependencies": { + "babel-preset-dev-toolkit": "1.0.0", + "better-npm-run": "^0.1.0", + "clear-module": "^2.1.0", + "dev-toolkit": "6.0.2", + "express": "^4.15.5", + "express-handlebars": "^3.0.0", + "react": "^16.0.0", + "react-dom": "^16.0.0" + }, + "devDependencies": { + "prettier": "1.7.4" + } +} diff --git a/templates/standard/src/client/RootComponent.js b/templates/standard/src/client/RootComponent.js new file mode 100644 index 00000000..8fad13e9 --- /dev/null +++ b/templates/standard/src/client/RootComponent.js @@ -0,0 +1,17 @@ +// This is the main component that both the client & the server touch first. +// +// It's likely that this component will stay mostly empty since it sits at the root. +// It might contain your chosen routing solution or redux-provider. +import React from 'react'; + +import { isClient } from 'dev-toolkit/settings'; +import App from './views/App'; + +// This should log both on the client and the server, remove once you understand how it works. +console.log(`Client App has run on ${isClient ? 'Client' : 'Server'}... (remove-me)`); + +const displayName = 'RootComponent'; +const component = () => ; + +component.displayName = displayName; +export default component; diff --git a/templates/standard/src/client/index.js b/templates/standard/src/client/index.js new file mode 100644 index 00000000..e48ccaf2 --- /dev/null +++ b/templates/standard/src/client/index.js @@ -0,0 +1,23 @@ +// NOTE: This File is only run on the client only. +// The server imports `RootComponent` directly. +import React from 'react'; +import ReactDOM from 'react-dom'; + +const hotReRender = () => { + // Dynamically require module inline for hot-reloading + import('./RootComponent').then(module => { + const RootComponent = module.default; + // Render the newly required module to the DOM + ReactDOM.hydrate(, document.querySelector('[data-jshook~="app-body"]')); + }); +}; + +// Start the app by rendering it for the first time +hotReRender(); + +// Support hot-reloading of components by rerendering using webpack's included HMR. +// HMR stands for "Hot-Module-Replacement", sometimes referred as "vanilla HMR" +if (module.hot) { + // After accepting the new module from webpack, we rerender on the next tick + module.hot.accept('./RootComponent', () => setTimeout(hotReRender)); +} diff --git a/templates/standard/src/client/views/App.js b/templates/standard/src/client/views/App.js new file mode 100644 index 00000000..bd16f975 --- /dev/null +++ b/templates/standard/src/client/views/App.js @@ -0,0 +1,18 @@ +import React from 'react'; + +import { isProd, isDev } from 'dev-toolkit/settings'; +import { customEnvContent } from 'src/settings'; + +// Use this as the entry-point for your app. +export default () => ( +
+ {'App View running in:'} + {`Production? ${isProd}`} +
+ {`Development? ${isDev}`} +
+
+ {`customEnvContent: ${customEnvContent}`} +
+
+); diff --git a/templates/standard/src/server/index.js b/templates/standard/src/server/index.js new file mode 100644 index 00000000..171e511e --- /dev/null +++ b/templates/standard/src/server/index.js @@ -0,0 +1,103 @@ +import express from 'express'; +import expressHandlebars from 'express-handlebars'; +import path from 'path'; +import fs from 'fs'; +import React from 'react'; +import { renderToString } from 'react-dom/server'; +import clearModule from 'clear-module'; +import { isDev, isProd, usePreRender } from 'dev-toolkit/settings'; + +// Unlike the client app, the server app can only ever be run in Node.js +// we therefore have direct access to Node-specific things like `process` +const serverPort = process.env.SERVER_PORT || 3000; +const projectDirectory = process.cwd(); +const clientFolder = path.resolve(projectDirectory, 'src/client'); +const serverViews = path.resolve(projectDirectory, 'src/server/views'); +const rootComponentPath = path.resolve(clientFolder, 'RootComponent'); + +export default new class { + constructor() { + // Let dev-toolkit know about express by setting `this.express`, + // this allows dev-toolkit to attach the dev-server middleware to webpack + this.express = express(); + + // Handlebars is used for server-rendering the html template in `src/server/views` + this.handlebarsInstance = expressHandlebars.create(); + + // Use Handlebars as the view engine in express + this.express.engine('hbs', this.handlebarsInstance.engine); + this.express.set('views', serverViews).set('view engine', 'hbs'); + + // Prevent express from sending powered-by header + this.express.disable('x-powered-by'); + } + + // Ability to launch server later (allows dev-toolkit to bind webpack-middleware before start) + start({ assets, buildFolder }) { + // Provide a simple health-check endpoint to see if the server is alive + this.express.get('/health', (req, res) => res.send('OK')); + + // Make assets in build folder available to the client. + // In development, the `webpack-dev-middleware` used by dev-toolkit takes care of this. + if (!isDev) { + this.express.use(express.static(buildFolder)); + } + + // By default, dev-toolkit serves the build folder with pre-rendered files. + if (isDev || (isProd && !usePreRender)) { + // Render the template-file on any incoming requests + this.express.use((req, res) => { + // Remove Client App from cache (cheap server-side Hot-Reload) + if (isDev) { + // NOTE: We need to explicitly clear all the modules in the client directory. + // It's a nice to have. Not guaranteed to always work, take it with a grain of salt. + clearModule.match(new RegExp(`^${clientFolder}`, 'i')); + } + // Load newest version of Client App via RootComponent + import(rootComponentPath).then(module => { + const RootComponent = module.default; + res.status(200).render('template', { + assets, + renderedHtml: renderToString(), + }); + }); + }); + } + + // Run the express server by listening on the specified port + this.serverInstance = this.express.listen(serverPort, () => { + // eslint-disable-next-line no-console + console.log(`Server is listening on port ${serverPort}`); + }); + } + + // A way to stop and shut-down the server, you might need this for things like e2e-tests + stop() { + this.serverInstance.close(); + } + + // Rendering of the html on build happens through this preRender-method + preRender({ assets, buildFolder }) { + // return a Promise to dev-toolkit + return new Promise((resolve, reject) => { + // Load Client App via RootComponent + import(rootComponentPath).then(module => { + const RootComponent = module.default; + // Here handlebars is used to generate the html without express and without webpack + this.handlebarsInstance + .render(path.join(serverViews, 'template.hbs'), { + assets, + renderedHtml: renderToString(), + }) + .then(html => { + // Generated html is written to html file in build folder + fs.writeFile( + path.join(buildFolder, 'index.html'), + html, + error => (error ? reject(error) : resolve()) + ); + }); + }); + }); + } +}(); diff --git a/templates/standard/src/server/views/template.hbs b/templates/standard/src/server/views/template.hbs new file mode 100644 index 00000000..9ba6fd79 --- /dev/null +++ b/templates/standard/src/server/views/template.hbs @@ -0,0 +1,12 @@ + + + + + +
{{{ renderedHtml }}}
+ + + + + + diff --git a/templates/standard/src/settings.js b/templates/standard/src/settings.js new file mode 100644 index 00000000..df7d308d --- /dev/null +++ b/templates/standard/src/settings.js @@ -0,0 +1,9 @@ +// Get environment variables shared between the client & server +// NOTE: `NODE_ENV` is available by default but for security reasons, all other +// environment variables must be declared explicitly in `dev-toolkit.config.js`. +import { sharedEnvs } from 'dev-toolkit/settings'; + +// Example of explicitly declared env which will be bundled into client-bundle. +// Make sure you understand how these envs flow through the app & into the client. +// Hint: Try running `npm run dev` and compare output with `npm run start` +export const customEnvContent = sharedEnvs.MY_CUSTOM_ENV; diff --git a/templates/with-eslint/.babelrc b/templates/with-eslint/.babelrc new file mode 100644 index 00000000..adb9e998 --- /dev/null +++ b/templates/with-eslint/.babelrc @@ -0,0 +1 @@ +{ "presets": ["dev-toolkit"] } diff --git a/templates/with-eslint/.eslintrc b/templates/with-eslint/.eslintrc new file mode 100644 index 00000000..9c9beec4 --- /dev/null +++ b/templates/with-eslint/.eslintrc @@ -0,0 +1,8 @@ +{ + "extends": ["airbnb", "dev-toolkit", "prettier"], + "plugins": ["prettier"], + "rules": { + "prettier/prettier": "error", + "import/prefer-default-export": "off" + } +} diff --git a/templates/with-eslint/.gitignore b/templates/with-eslint/.gitignore new file mode 100644 index 00000000..fb8e5e34 --- /dev/null +++ b/templates/with-eslint/.gitignore @@ -0,0 +1,7 @@ +# Generated Files +build/ +dist/ + +# Node +node_modules/ +npm-debug.log diff --git a/templates/with-eslint/.prettierrc b/templates/with-eslint/.prettierrc new file mode 100644 index 00000000..a44463ca --- /dev/null +++ b/templates/with-eslint/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/templates/with-eslint/dev-toolkit.config.js b/templates/with-eslint/dev-toolkit.config.js new file mode 100644 index 00000000..9bdc5e7f --- /dev/null +++ b/templates/with-eslint/dev-toolkit.config.js @@ -0,0 +1,16 @@ +module.exports = { + devToolkit: { + usePreRender: true, + sharedEnvs: ['MY_CUSTOM_ENV'], + }, + + // Use custom webpack configuration here + webpack: { + loaders: function(options) { + return []; + }, + plugins: function(options) { + return []; + }, + }, +}; diff --git a/templates/with-eslint/package.json b/templates/with-eslint/package.json new file mode 100644 index 00000000..b435e1c6 --- /dev/null +++ b/templates/with-eslint/package.json @@ -0,0 +1,58 @@ +{ + "name": "dev-toolkit-with-eslint-template", + "version": "1.0.0", + "description": "universal app", + "author": "", + "scripts": { + "start": "npm run build && npm run serve", + "dev": "better-npm-run development", + "build": "better-npm-run create-build", + "serve": "better-npm-run run-server", + "lint": "prettier --write './**/*.js' && eslint 'src/**/*.js'" + }, + "betterScripts": { + "development": { + "command": "dev-toolkit watch", + "env": { + "NODE_ENV": "development", + "MY_CUSTOM_ENV": "foo" + } + }, + "create-build": { + "command": "dev-toolkit build", + "env": { + "NODE_ENV": "production" + } + }, + "run-server": { + "command": "dev-toolkit serve", + "env": { + "NODE_ENV": "production", + "SERVER_PORT": "8080" + } + } + }, + "dependencies": { + "babel-preset-dev-toolkit": "1.0.0", + "better-npm-run": "^0.1.0", + "clear-module": "^2.1.0", + "dev-toolkit": "6.0.2", + "express": "^4.15.5", + "express-handlebars": "^3.0.0", + "react": "^16.0.0", + "react-dom": "^16.0.0" + }, + "devDependencies": { + "babel-eslint": "8.0.1", + "eslint": "^4.8.0", + "eslint-config-airbnb": "^16.0.0", + "eslint-config-dev-toolkit": "1.0.0", + "eslint-config-prettier": "2.6.0", + "eslint-import-resolver-babel-module": "2.2.1", + "eslint-plugin-import": "^2.7.0", + "eslint-plugin-jsx-a11y": "^6.0.2", + "eslint-plugin-prettier": "2.3.1", + "eslint-plugin-react": "^7.4.0", + "prettier": "1.7.4" + } +} diff --git a/templates/with-eslint/src/client/RootComponent.js b/templates/with-eslint/src/client/RootComponent.js new file mode 100644 index 00000000..8fad13e9 --- /dev/null +++ b/templates/with-eslint/src/client/RootComponent.js @@ -0,0 +1,17 @@ +// This is the main component that both the client & the server touch first. +// +// It's likely that this component will stay mostly empty since it sits at the root. +// It might contain your chosen routing solution or redux-provider. +import React from 'react'; + +import { isClient } from 'dev-toolkit/settings'; +import App from './views/App'; + +// This should log both on the client and the server, remove once you understand how it works. +console.log(`Client App has run on ${isClient ? 'Client' : 'Server'}... (remove-me)`); + +const displayName = 'RootComponent'; +const component = () => ; + +component.displayName = displayName; +export default component; diff --git a/templates/with-eslint/src/client/index.js b/templates/with-eslint/src/client/index.js new file mode 100644 index 00000000..e48ccaf2 --- /dev/null +++ b/templates/with-eslint/src/client/index.js @@ -0,0 +1,23 @@ +// NOTE: This File is only run on the client only. +// The server imports `RootComponent` directly. +import React from 'react'; +import ReactDOM from 'react-dom'; + +const hotReRender = () => { + // Dynamically require module inline for hot-reloading + import('./RootComponent').then(module => { + const RootComponent = module.default; + // Render the newly required module to the DOM + ReactDOM.hydrate(, document.querySelector('[data-jshook~="app-body"]')); + }); +}; + +// Start the app by rendering it for the first time +hotReRender(); + +// Support hot-reloading of components by rerendering using webpack's included HMR. +// HMR stands for "Hot-Module-Replacement", sometimes referred as "vanilla HMR" +if (module.hot) { + // After accepting the new module from webpack, we rerender on the next tick + module.hot.accept('./RootComponent', () => setTimeout(hotReRender)); +} diff --git a/templates/with-eslint/src/client/views/App.js b/templates/with-eslint/src/client/views/App.js new file mode 100644 index 00000000..bd16f975 --- /dev/null +++ b/templates/with-eslint/src/client/views/App.js @@ -0,0 +1,18 @@ +import React from 'react'; + +import { isProd, isDev } from 'dev-toolkit/settings'; +import { customEnvContent } from 'src/settings'; + +// Use this as the entry-point for your app. +export default () => ( +
+ {'App View running in:'} + {`Production? ${isProd}`} +
+ {`Development? ${isDev}`} +
+
+ {`customEnvContent: ${customEnvContent}`} +
+
+); diff --git a/templates/with-eslint/src/server/index.js b/templates/with-eslint/src/server/index.js new file mode 100644 index 00000000..171e511e --- /dev/null +++ b/templates/with-eslint/src/server/index.js @@ -0,0 +1,103 @@ +import express from 'express'; +import expressHandlebars from 'express-handlebars'; +import path from 'path'; +import fs from 'fs'; +import React from 'react'; +import { renderToString } from 'react-dom/server'; +import clearModule from 'clear-module'; +import { isDev, isProd, usePreRender } from 'dev-toolkit/settings'; + +// Unlike the client app, the server app can only ever be run in Node.js +// we therefore have direct access to Node-specific things like `process` +const serverPort = process.env.SERVER_PORT || 3000; +const projectDirectory = process.cwd(); +const clientFolder = path.resolve(projectDirectory, 'src/client'); +const serverViews = path.resolve(projectDirectory, 'src/server/views'); +const rootComponentPath = path.resolve(clientFolder, 'RootComponent'); + +export default new class { + constructor() { + // Let dev-toolkit know about express by setting `this.express`, + // this allows dev-toolkit to attach the dev-server middleware to webpack + this.express = express(); + + // Handlebars is used for server-rendering the html template in `src/server/views` + this.handlebarsInstance = expressHandlebars.create(); + + // Use Handlebars as the view engine in express + this.express.engine('hbs', this.handlebarsInstance.engine); + this.express.set('views', serverViews).set('view engine', 'hbs'); + + // Prevent express from sending powered-by header + this.express.disable('x-powered-by'); + } + + // Ability to launch server later (allows dev-toolkit to bind webpack-middleware before start) + start({ assets, buildFolder }) { + // Provide a simple health-check endpoint to see if the server is alive + this.express.get('/health', (req, res) => res.send('OK')); + + // Make assets in build folder available to the client. + // In development, the `webpack-dev-middleware` used by dev-toolkit takes care of this. + if (!isDev) { + this.express.use(express.static(buildFolder)); + } + + // By default, dev-toolkit serves the build folder with pre-rendered files. + if (isDev || (isProd && !usePreRender)) { + // Render the template-file on any incoming requests + this.express.use((req, res) => { + // Remove Client App from cache (cheap server-side Hot-Reload) + if (isDev) { + // NOTE: We need to explicitly clear all the modules in the client directory. + // It's a nice to have. Not guaranteed to always work, take it with a grain of salt. + clearModule.match(new RegExp(`^${clientFolder}`, 'i')); + } + // Load newest version of Client App via RootComponent + import(rootComponentPath).then(module => { + const RootComponent = module.default; + res.status(200).render('template', { + assets, + renderedHtml: renderToString(), + }); + }); + }); + } + + // Run the express server by listening on the specified port + this.serverInstance = this.express.listen(serverPort, () => { + // eslint-disable-next-line no-console + console.log(`Server is listening on port ${serverPort}`); + }); + } + + // A way to stop and shut-down the server, you might need this for things like e2e-tests + stop() { + this.serverInstance.close(); + } + + // Rendering of the html on build happens through this preRender-method + preRender({ assets, buildFolder }) { + // return a Promise to dev-toolkit + return new Promise((resolve, reject) => { + // Load Client App via RootComponent + import(rootComponentPath).then(module => { + const RootComponent = module.default; + // Here handlebars is used to generate the html without express and without webpack + this.handlebarsInstance + .render(path.join(serverViews, 'template.hbs'), { + assets, + renderedHtml: renderToString(), + }) + .then(html => { + // Generated html is written to html file in build folder + fs.writeFile( + path.join(buildFolder, 'index.html'), + html, + error => (error ? reject(error) : resolve()) + ); + }); + }); + }); + } +}(); diff --git a/templates/with-eslint/src/server/views/template.hbs b/templates/with-eslint/src/server/views/template.hbs new file mode 100644 index 00000000..9ba6fd79 --- /dev/null +++ b/templates/with-eslint/src/server/views/template.hbs @@ -0,0 +1,12 @@ + + + + + +
{{{ renderedHtml }}}
+ + + + + + diff --git a/templates/with-eslint/src/settings.js b/templates/with-eslint/src/settings.js new file mode 100644 index 00000000..df7d308d --- /dev/null +++ b/templates/with-eslint/src/settings.js @@ -0,0 +1,9 @@ +// Get environment variables shared between the client & server +// NOTE: `NODE_ENV` is available by default but for security reasons, all other +// environment variables must be declared explicitly in `dev-toolkit.config.js`. +import { sharedEnvs } from 'dev-toolkit/settings'; + +// Example of explicitly declared env which will be bundled into client-bundle. +// Make sure you understand how these envs flow through the app & into the client. +// Hint: Try running `npm run dev` and compare output with `npm run start` +export const customEnvContent = sharedEnvs.MY_CUSTOM_ENV; diff --git a/templates/with-sass/.babelrc b/templates/with-sass/.babelrc new file mode 100644 index 00000000..adb9e998 --- /dev/null +++ b/templates/with-sass/.babelrc @@ -0,0 +1 @@ +{ "presets": ["dev-toolkit"] } diff --git a/templates/with-sass/.gitignore b/templates/with-sass/.gitignore new file mode 100644 index 00000000..fb8e5e34 --- /dev/null +++ b/templates/with-sass/.gitignore @@ -0,0 +1,7 @@ +# Generated Files +build/ +dist/ + +# Node +node_modules/ +npm-debug.log diff --git a/templates/with-sass/.prettierrc b/templates/with-sass/.prettierrc new file mode 100644 index 00000000..a44463ca --- /dev/null +++ b/templates/with-sass/.prettierrc @@ -0,0 +1,6 @@ +{ + "semi": true, + "printWidth": 100, + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/templates/with-sass/dev-toolkit.config.js b/templates/with-sass/dev-toolkit.config.js new file mode 100644 index 00000000..484a12dc --- /dev/null +++ b/templates/with-sass/dev-toolkit.config.js @@ -0,0 +1,57 @@ +const ExtractTextPlugin = require('extract-text-webpack-plugin'); +const path = require('path'); + +// The hashing-convention for generated css-classes +const cssChunkNaming = '[name]__[local]___[hash:base64:5]'; + +// We need to define where the sass-files will be located +const projectDirectory = process.cwd(); +const clientFolder = path.resolve(projectDirectory, 'src/client'); +const includePaths = [clientFolder]; + +// Configuration needed both, for development and for generating a build +const sassLoaders = [ + `css-loader?modules&importLoaders=1&localIdentName=${cssChunkNaming}`, + 'postcss-loader', + { + loader: 'sass-loader', + // Include any paths that the loader needs to know about + options: { includePaths: includePaths }, + }, +]; + +module.exports = { + // Exports that are shared between this file and `nodeHooks.js` + cssChunkNaming: cssChunkNaming, + includePaths: includePaths, + + // Exports for dev-toolkit to pick up + webpack: { + loaders: function(options) { + return [ + { + test: /\.scss$/, + use: options.creatingBuild + ? // Extract styles from all files found during compilation + // Try `npm start` and then loading up your browser without javascript + ExtractTextPlugin.extract({ + fallback: 'style-loader', + use: sassLoaders, + }) + : // In development, we can use loaders directly + // NOTE: This means that on the client, the first render in the browser + // (before javascript is loaded) will not have styles available. + [{ loader: 'style-loader' }].concat(sassLoaders), + }, + ]; + }, + + // Generate a single css-file on build from all extracted files + plugins: function(options) { + const cssFileToGenerate = options.namingConvention + '.css'; + return options.creatingBuild + ? [new ExtractTextPlugin({ filename: cssFileToGenerate, allChunks: true })] + : []; + }, + }, +}; diff --git a/templates/with-sass/nodeHooks.js b/templates/with-sass/nodeHooks.js new file mode 100644 index 00000000..430acdbd --- /dev/null +++ b/templates/with-sass/nodeHooks.js @@ -0,0 +1,27 @@ +// This file runs before `babel-register`, before node knows about `.babelrc`, +// therefore it needs to be written in ES5. +const cssHook = require('css-modules-require-hook'); +const path = require('path'); +const sass = require('node-sass'); + +// Retrieve settings that are shared between node-hooks and webpack +const includePaths = require('./dev-toolkit.config').includePaths; +const cssChunkNaming = require('./dev-toolkit.config').cssChunkNaming; + +// Make node understand sass-files by hooking into the file extension +cssHook({ + extensions: ['.scss'], + + // Share the same naming-convention of `css-loader` + generateScopedName: cssChunkNaming, + + // Process files with same settings as `sass-loader` and return css. + preprocessCss: (cssFileData, cssFilePath) => { + return sass.renderSync({ + data: cssFileData, + // Include any paths that are part of the config, + // as well as the current path where css-file resides. + includePaths: [].concat(includePaths).concat([path.dirname(cssFilePath)]), + }).css; + }, +}); diff --git a/templates/with-sass/package.json b/templates/with-sass/package.json new file mode 100644 index 00000000..1d4f7861 --- /dev/null +++ b/templates/with-sass/package.json @@ -0,0 +1,35 @@ +{ + "name": "dev-toolkit-with-sass-template", + "version": "1.0.0", + "description": "universal app", + "author": "", + "scripts": { + "start": "npm run build && npm run serve", + "dev": "cross-env NODE_ENV=development dev-toolkit watch", + "build": "cross-env NODE_ENV=production dev-toolkit build", + "serve": "cross-env NODE_ENV=production SERVER_PORT=8080 dev-toolkit serve", + "lint": "prettier --write './**/*.js' './**/*.scss'" + }, + "dependencies": { + "autoprefixer": "^7.1.5", + "babel-preset-dev-toolkit": "1.0.0", + "clear-module": "^2.1.0", + "cross-env": "^5.0.5", + "css-loader": "^0.28.7", + "css-modules-require-hook": "^4.2.2", + "dev-toolkit": "6.0.2", + "express": "^4.15.5", + "express-handlebars": "^3.0.0", + "extract-text-webpack-plugin": "^3.0.1", + "node-sass": "^4.5.3", + "postcss-loader": "^2.0.7", + "react": "^16.0.0", + "react-dom": "^16.0.0", + "sass-loader": "^6.0.6", + "style-loader": "^0.19.0", + "webpack": "^3.7.1" + }, + "devDependencies": { + "prettier": "1.7.4" + } +} diff --git a/templates/with-sass/postcss.config.js b/templates/with-sass/postcss.config.js new file mode 100644 index 00000000..a0fa32b9 --- /dev/null +++ b/templates/with-sass/postcss.config.js @@ -0,0 +1,3 @@ +module.exports = { + plugins: [require('autoprefixer')], +}; diff --git a/templates/with-sass/src/client/RootComponent.js b/templates/with-sass/src/client/RootComponent.js new file mode 100644 index 00000000..cfe5d386 --- /dev/null +++ b/templates/with-sass/src/client/RootComponent.js @@ -0,0 +1,16 @@ +// This is the main component that both the client & the server touch first. +// +// It's likely that this component will stay mostly empty since it sits at the root. +// It might contain your chosen routing solution or redux-provider. +import React from 'react'; +import { isClient } from 'dev-toolkit/settings'; +import App from './views/App'; + +// This should log both on the client and the server, remove once you understand how it works. +console.log(`Client App has run on ${isClient ? 'Client' : 'Server'}... (remove-me)`); + +const displayName = 'RootComponent'; +const component = () => ; + +component.displayName = displayName; +export default component; diff --git a/templates/with-sass/src/client/index.js b/templates/with-sass/src/client/index.js new file mode 100644 index 00000000..e48ccaf2 --- /dev/null +++ b/templates/with-sass/src/client/index.js @@ -0,0 +1,23 @@ +// NOTE: This File is only run on the client only. +// The server imports `RootComponent` directly. +import React from 'react'; +import ReactDOM from 'react-dom'; + +const hotReRender = () => { + // Dynamically require module inline for hot-reloading + import('./RootComponent').then(module => { + const RootComponent = module.default; + // Render the newly required module to the DOM + ReactDOM.hydrate(, document.querySelector('[data-jshook~="app-body"]')); + }); +}; + +// Start the app by rendering it for the first time +hotReRender(); + +// Support hot-reloading of components by rerendering using webpack's included HMR. +// HMR stands for "Hot-Module-Replacement", sometimes referred as "vanilla HMR" +if (module.hot) { + // After accepting the new module from webpack, we rerender on the next tick + module.hot.accept('./RootComponent', () => setTimeout(hotReRender)); +} diff --git a/templates/with-sass/src/client/views/App.js b/templates/with-sass/src/client/views/App.js new file mode 100644 index 00000000..786c262e --- /dev/null +++ b/templates/with-sass/src/client/views/App.js @@ -0,0 +1,22 @@ +import React from 'react'; + +import s from './style.scss'; + +// Use this as the entry-point for your app. +export default () => ( +
+ {'App with Sass'} +
+
+ {'so '} + {'colorful '} + {'! '} +
+ {'and '} + {'with other cool things'} + {' like '} + {'animations'} + + {'!'} +
+); diff --git a/templates/with-sass/src/client/views/style.scss b/templates/with-sass/src/client/views/style.scss new file mode 100644 index 00000000..4e0e3ece --- /dev/null +++ b/templates/with-sass/src/client/views/style.scss @@ -0,0 +1,102 @@ +// Some example styles written in sass +// (remove-me) + +@keyframes wiggle-up-down { + 0% { + transform: translateY(0px); + } + 20% { + transform: translateY(-7px) rotate(-6deg) scale(0.8); + } + 40% { + transform: translateY(-7px) rotate(8deg) scale(1); + } + 70% { + transform: translateY(-7px) rotate(-5deg) scale(1.05); + } + 80% { + transform: translateY(0px); + } + 100% { + transform: translateY(0px); + } +} +@keyframes wiggle-left-right { + 0% { + transform: translateX(0px); + } + 20% { + opacity: 0.7; + transform: translateY(1px) scale(0.99); + } + 30% { + opacity: 0.9; + transform: translateX(-2px) scale(1.01); + } + 70% { + opacity: 0.7; + transform: translateX(1px) scale(0.98); + } + 80% { + opacity: 1; + transform: translateY(-2px) scale(1.02); + } + 100% { + transform: translateX(0px); + } +} +@keyframes wiggle-rotate { + 0% { + transform: rotate(0deg); + } + 60% { + transform: rotate(8deg) scale(2.4); + } + 100% { + transform: rotate(0deg); + } +} + +.app { + .color1 { + color: #2980b9; + } + .color2 { + color: #f39c12; + } + .color3 { + color: #95a5a6; + } + .color4 { + color: #e74c3c; + } + .color5 { + color: #3498db; + } + .color6 { + color: #9b59b6; + } + + .wiggleLeftRight { + display: inline-block; + color: rgba(#27ae60, 0.8); + + animation: wiggle-left-right 0.7s ease-out; + animation-iteration-count: infinite; + } + .wiggleUpDown { + display: inline-block; + color: #d35400; + + animation: wiggle-up-down 1.6s ease-in-out; + animation-iteration-count: infinite; + } + .wiggleRotate { + display: inline-block; + color: #27ae60; + + transform-origin: 50% 100%; + animation: wiggle-rotate 1.6s ease-in-out; + animation-iteration-count: infinite; + } +} diff --git a/templates/with-sass/src/server/index.js b/templates/with-sass/src/server/index.js new file mode 100644 index 00000000..171e511e --- /dev/null +++ b/templates/with-sass/src/server/index.js @@ -0,0 +1,103 @@ +import express from 'express'; +import expressHandlebars from 'express-handlebars'; +import path from 'path'; +import fs from 'fs'; +import React from 'react'; +import { renderToString } from 'react-dom/server'; +import clearModule from 'clear-module'; +import { isDev, isProd, usePreRender } from 'dev-toolkit/settings'; + +// Unlike the client app, the server app can only ever be run in Node.js +// we therefore have direct access to Node-specific things like `process` +const serverPort = process.env.SERVER_PORT || 3000; +const projectDirectory = process.cwd(); +const clientFolder = path.resolve(projectDirectory, 'src/client'); +const serverViews = path.resolve(projectDirectory, 'src/server/views'); +const rootComponentPath = path.resolve(clientFolder, 'RootComponent'); + +export default new class { + constructor() { + // Let dev-toolkit know about express by setting `this.express`, + // this allows dev-toolkit to attach the dev-server middleware to webpack + this.express = express(); + + // Handlebars is used for server-rendering the html template in `src/server/views` + this.handlebarsInstance = expressHandlebars.create(); + + // Use Handlebars as the view engine in express + this.express.engine('hbs', this.handlebarsInstance.engine); + this.express.set('views', serverViews).set('view engine', 'hbs'); + + // Prevent express from sending powered-by header + this.express.disable('x-powered-by'); + } + + // Ability to launch server later (allows dev-toolkit to bind webpack-middleware before start) + start({ assets, buildFolder }) { + // Provide a simple health-check endpoint to see if the server is alive + this.express.get('/health', (req, res) => res.send('OK')); + + // Make assets in build folder available to the client. + // In development, the `webpack-dev-middleware` used by dev-toolkit takes care of this. + if (!isDev) { + this.express.use(express.static(buildFolder)); + } + + // By default, dev-toolkit serves the build folder with pre-rendered files. + if (isDev || (isProd && !usePreRender)) { + // Render the template-file on any incoming requests + this.express.use((req, res) => { + // Remove Client App from cache (cheap server-side Hot-Reload) + if (isDev) { + // NOTE: We need to explicitly clear all the modules in the client directory. + // It's a nice to have. Not guaranteed to always work, take it with a grain of salt. + clearModule.match(new RegExp(`^${clientFolder}`, 'i')); + } + // Load newest version of Client App via RootComponent + import(rootComponentPath).then(module => { + const RootComponent = module.default; + res.status(200).render('template', { + assets, + renderedHtml: renderToString(), + }); + }); + }); + } + + // Run the express server by listening on the specified port + this.serverInstance = this.express.listen(serverPort, () => { + // eslint-disable-next-line no-console + console.log(`Server is listening on port ${serverPort}`); + }); + } + + // A way to stop and shut-down the server, you might need this for things like e2e-tests + stop() { + this.serverInstance.close(); + } + + // Rendering of the html on build happens through this preRender-method + preRender({ assets, buildFolder }) { + // return a Promise to dev-toolkit + return new Promise((resolve, reject) => { + // Load Client App via RootComponent + import(rootComponentPath).then(module => { + const RootComponent = module.default; + // Here handlebars is used to generate the html without express and without webpack + this.handlebarsInstance + .render(path.join(serverViews, 'template.hbs'), { + assets, + renderedHtml: renderToString(), + }) + .then(html => { + // Generated html is written to html file in build folder + fs.writeFile( + path.join(buildFolder, 'index.html'), + html, + error => (error ? reject(error) : resolve()) + ); + }); + }); + }); + } +}(); diff --git a/templates/with-sass/src/server/views/template.hbs b/templates/with-sass/src/server/views/template.hbs new file mode 100644 index 00000000..b1810647 --- /dev/null +++ b/templates/with-sass/src/server/views/template.hbs @@ -0,0 +1,19 @@ + + + + + + {{#if assets.app.css}} + + {{/if}} + + + + +
{{{ renderedHtml }}}
+ + + + + +