├── .editorconfig ├── .eslintignore ├── .eslintrc ├── .flowconfig ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── circle.yml ├── flow └── definitions │ ├── create-js-app-scripts.js │ └── path-exists.js ├── lerna.json ├── package.json ├── packages ├── babel-preset-js-app │ ├── README.md │ ├── client.js │ ├── index.js │ ├── package.json │ └── server.js ├── create-js-app-scripts │ ├── .babelrc │ ├── .gitignore │ ├── README.md │ ├── bin │ │ └── create-js-app-scripts.js │ ├── package.json │ └── src │ │ ├── build.js │ │ ├── environment.js │ │ ├── jest │ │ ├── css.stub.js │ │ ├── file.stub.js │ │ └── transform.js │ │ ├── logGroup.js │ │ ├── logger.js │ │ ├── plugins │ │ └── watchConfiguration.js │ │ ├── start.js │ │ ├── test.js │ │ └── utils │ │ └── loadConfiguration.js ├── create-js-app │ ├── README.md │ ├── commands │ │ └── create.js │ ├── index.js │ └── package.json ├── eslint-config-js-app │ ├── README.md │ ├── index.js │ └── package.json ├── js-app-plugin-universal-webpack │ ├── .babelrc │ ├── .gitignore │ ├── README.md │ ├── package.json │ └── src │ │ ├── config │ │ ├── client │ │ │ ├── development.js │ │ │ ├── polyfills.js │ │ │ └── production.js │ │ ├── defineVariables.js │ │ └── server │ │ │ ├── development.js │ │ │ ├── polyfills.js │ │ │ └── production.js │ │ ├── index.js │ │ └── webpack │ │ ├── AssetsPlugin.js │ │ ├── LoggerPlugin.js │ │ └── ServerListenerPlugin.js └── js-app-template-universal │ ├── .app.js │ ├── .eslintrc │ ├── .flowconfig │ ├── README.md │ ├── flow │ ├── definitions │ │ └── .gitkeep │ └── stubs │ │ ├── WebpackAsset.css.flow │ │ └── WebpackAsset.js.flow │ ├── gitignore │ ├── package.json │ ├── postcss.config.js │ ├── public │ └── favicon.ico │ └── src │ ├── client │ └── index.js │ ├── server │ ├── assets.js │ ├── config.js │ ├── index.js │ └── renderHtml.js │ └── shared │ ├── App.css │ ├── App.js │ ├── App.spec.js │ └── __snapshots__ │ └── App.spec.js.snap ├── tasks ├── replace-package.sh ├── resolve-package.sh └── test.sh └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_line = lf 5 | insert_final_newline = true 6 | trim_trailing_whitespace = true 7 | 8 | [**.{js,json}] 9 | charset = utf-8 10 | indent_style = space 11 | indent_size = 2 12 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | logs 3 | *.log 4 | npm-debug.log* 5 | pids 6 | *.pid 7 | *.seed 8 | lib-cov 9 | coverage 10 | .nyc_output 11 | .grunt 12 | .lock-wscript 13 | build/Release 14 | node_modules 15 | jspm_packages 16 | .npm 17 | .node_repl_history 18 | flow 19 | build 20 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "js-app" 3 | } 4 | -------------------------------------------------------------------------------- /.flowconfig: -------------------------------------------------------------------------------- 1 | [include] 2 | 3 | [ignore] 4 | 5 | # Including these files causes issues. 6 | .*/node_modules/fbjs/.* 7 | .*/node_modules/create-js-app-scripts/.* 8 | .*/packages/js-app-template-universal/.* 9 | .*/node_modules/conventional-changelog-core/test/.* 10 | 11 | [libs] 12 | 13 | flow/definitions/ 14 | 15 | [options] 16 | esproposal.class_static_fields=enable 17 | esproposal.class_instance_fields=enable 18 | module.ignore_non_literal_requires=true 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | .idea_modules/ 3 | atlassian-ide-plugin.xml 4 | com_crashlytics_export_strings.xml 5 | crashlytics.properties 6 | crashlytics-build.properties 7 | fabric.properties 8 | *.DS_Store 9 | .AppleDouble 10 | .LSOverride 11 | Icon 12 | ._* 13 | .DocumentRevisions-V100 14 | .fseventsd 15 | .Spotlight-V100 16 | .TemporaryItems 17 | .Trashes 18 | .VolumeIcon.icns 19 | .com.apple.timemachine.donotpresent 20 | .AppleDB 21 | .AppleDesktop 22 | Network Trash Folder 23 | Temporary Items 24 | .apdisk 25 | node_modules 26 | npm-debug.log 27 | lerna-debug.log 28 | example 29 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | .idea 3 | .idea/workspace.xml 4 | .idea/tasks.xml 5 | .idea/dictionaries 6 | .idea/vcs.xml 7 | .idea/jsLibraryMappings.xml 8 | .idea/dataSources.ids 9 | .idea/dataSources.xml 10 | .idea/dataSources.local.xml 11 | .idea/sqlDataSources.xml 12 | .idea/dynamic.xml 13 | .idea/uiDesigner.xml 14 | .idea/gradle.xml 15 | .idea/libraries 16 | .idea/mongoSettings.xml 17 | *.iws 18 | /out/ 19 | .idea_modules/ 20 | atlassian-ide-plugin.xml 21 | com_crashlytics_export_strings.xml 22 | crashlytics.properties 23 | crashlytics-build.properties 24 | fabric.properties 25 | *.DS_Store 26 | .AppleDouble 27 | .LSOverride 28 | Icon 29 | ._* 30 | .DocumentRevisions-V100 31 | .fseventsd 32 | .Spotlight-V100 33 | .TemporaryItems 34 | .Trashes 35 | .VolumeIcon.icns 36 | .com.apple.timemachine.donotpresent 37 | .AppleDB 38 | .AppleDesktop 39 | Network Trash Folder 40 | Temporary Items 41 | .apdisk 42 | flow 43 | global-cli 44 | example 45 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | Copyright (c) 2016 Michal Kvasničák 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 5 | 6 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 7 | 8 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Create JS App [![CircleCI](https://circleci.com/gh/michalkvasnicak/create-js-app/tree/master.svg?style=svg&circle-token=ea51ecdfaed48e61f96b998f9731896b9ffe4776)](https://circleci.com/gh/michalkvasnicak/create-js-app/tree/master) 2 | 3 | **This project is not longer maintained. There is a replacement tool [spust](https://github.com/michalkvasnicak/spust) which is maintained and easier to use** 4 | 5 | Create any javascript application with no build configuration using 6 | your own or predefined project templates and build plugins. 7 | 8 | This project is highly influenced by the [Create React App](https://github.com/facebookincubator/create-react-app). I thank its authors. 9 | 10 | ## TL;DR 11 | 12 | ``` 13 | npm install -g create-js-app 14 | 15 | create-js-app create my-app 16 | cd my-app/ 17 | npm start 18 | ``` 19 | This will open your application in a browser (or you can navigate to [http://localhost:3000](http://localhost:3000]). 20 | 21 | When you’re ready to deploy to production, create a minified bundle with `npm run build`. 22 | 23 | ## Disclaimer 24 | 25 | This project is currently under occassional development. This means that if I encounter a bug, or if a new simple feature comes to mind, I will be continuing to work on it. 26 | 27 | **I am using this project at my work actively with features that are currently available (and these features are all I need for now).** 28 | 29 | **You can create your own plugins or templates easily if there is something you miss.** 30 | 31 | ## Installation 32 | 33 | ``` 34 | # using npm 35 | npm install -g create-js-app 36 | 37 | # using yarn 38 | yarn global add create-js-app 39 | ``` 40 | 41 | This command will install `create-js-app` globally. 42 | 43 | **You will need to have Node >= 6.0 on you machine** 44 | 45 | ## Getting started 46 | 47 | You have two options of how to create an application. The first one is creating an application using [default project template](https://github.com/michalkvasnicak/create-js-app/tree/master/packages/js-app-template-universal) (which is using [js-app-plugin-universal-webpack](https://github.com/michalkvasnicak/create-js-app/tree/master/packages/js-app-plugin-universal-webpack) under the hood) and the second is creating an application using a template of your own choosing. 48 | 49 | ### 1. Creating an application 50 | 51 | #### Create a new project with default template** 52 | 53 | ``` 54 | create-js-app create 55 | ``` 56 | 57 | This will create a project with default template `js-app-template-universal` which is suitable for creating universal React application. 58 | 59 | ##### Example 60 | 61 | ``` 62 | create-js-app create my-app 63 | cd my-app/ 64 | ``` 65 | 66 | #### Create a new project with custom template 67 | 68 | ``` 69 | create-js-app create --template 70 | ``` 71 | 72 | This will create a project with a template of your own choosing. 73 | 74 | ##### Example 75 | 76 | ``` 77 | create-js-app create my-app --template js-app-plugin-universal-webpack 78 | cd my-app/ 79 | ``` 80 | 81 | ### 2. Develop and test the application 82 | 83 | There are only two commands you need during the development: `npm run start` and `npm run test`. 84 | 85 | #### Development mode 86 | 87 | First you need to develop your application. To start the development mode you need to run following command in a project directory. 88 | 89 | ``` 90 | npm start 91 | ``` 92 | 93 | This will start your application. If you are using default project template then it opens the application in your browser. 94 | 95 | #### Test mode 96 | 97 | During development you may need to test your application. In this case use the following command. 98 | 99 | ``` 100 | npm test 101 | ``` 102 | 103 | This command will start the jest test runner in watch mode (any change detected in source files will trigger tests). 104 | 105 | #### For advanced users 106 | 107 | ##### Running in CI 108 | 109 | Test command will detect if `process.env.CI` is set, if it is so then it runs tests only once. 110 | 111 | ##### Tests environment (`node|jsdom`) 112 | 113 | By default `test` command runs tests in `jsdom` environment. If you want to change it to node please use it with the `--node` argument like this `npm run test -- --node`. 114 | 115 | ### 3. Deploy to production 116 | 117 | When you are done with development or you have reached a feature set that can be deployed. Just run the following command to get a minified build of your application. 118 | 119 | ``` 120 | npm run build 121 | ``` 122 | 123 | This will generate a `build` directory which contains everything you need to run your application. 124 | 125 | **If you are using a custom template and not the `js-app-template-universal` please make sure that the build destination is the same. This destination can differ if the template is using some custom plugin.** 126 | 127 | ### 4. Profit 128 | 129 | Congratulations. You are now ready to create your first javascript application. 130 | 131 | ## Advanced topics 132 | 133 | * Creating your own plugin [TODO] 134 | 135 | ## Alternatives 136 | 137 | If this project does not fulfill your needs, you might want to explore 138 | alternatives. Some of the more popular ones are: 139 | 140 | * [insin/nwb](https://github.com/insin/nwb) 141 | * [mozilla-neutrino/neutrino-dev](https://github.com/mozilla-neutrino/neutrino-dev) 142 | * [NYTimes/kyt](https://github.com/NYTimes/kyt) 143 | * [zeit/next.js](https://github.com/zeit/next.js) 144 | * [gatsbyjs/gatsby](https://github.com/gatsbyjs/gatsby) 145 | * [enclave](https://github.com/eanplatter/enclave) 146 | * [motion](https://github.com/motion/motion) 147 | * [quik](https://github.com/satya164/quik) 148 | * [sagui](https://github.com/saguijs/sagui) 149 | * [roc](https://github.com/rocjs/roc) 150 | * [aik](https://github.com/d4rkr00t/aik) 151 | * [react-app](https://github.com/kriasoft/react-app) 152 | * [dev-toolkit](https://github.com/stoikerty/dev-toolkit) 153 | * [tarec](https://github.com/geowarin/tarec) 154 | -------------------------------------------------------------------------------- /circle.yml: -------------------------------------------------------------------------------- 1 | machine: 2 | node: 3 | version: 6.9.1 4 | environment: 5 | YARN_VERSION: 0.19.1 6 | PATH: "${PATH}:${HOME}/.yarn/bin" 7 | 8 | dependencies: 9 | cache_directories: 10 | - node_modules 11 | - ~/.yarn 12 | - ~/.cache/yarn 13 | - ~/.yarn-cache 14 | pre: 15 | - | 16 | if [[ ! -e ~/.yarn/bin/yarn || $(yarn --version) != "${YARN_VERSION}" ]]; then 17 | echo "Download and install Yarn." 18 | rm -rf .yarn 19 | curl -o- -L https://yarnpkg.com/install.sh | bash -s -- --version $YARN_VERSION 20 | else 21 | echo "The correct version of Yarn is already installed." 22 | fi 23 | override: 24 | - yarn install 25 | 26 | test: 27 | override: 28 | - ./tasks/test.sh 29 | -------------------------------------------------------------------------------- /flow/definitions/create-js-app-scripts.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | declare type ConfigurationEnvironment = Object & { 4 | NODE_ENV: string 5 | } 6 | declare type ConfigurationSettings = Object & { 7 | appNodeModulesDir: string, 8 | assetsPath: string, 9 | appSrc: string, 10 | babelrc: ?string, 11 | eslintrc: ?string 12 | } 13 | 14 | declare type Configuration = { 15 | env: ConfigurationEnvironment, 16 | plugins: Array, 17 | settings: ConfigurationSettings 18 | } 19 | 20 | declare interface Environment { 21 | cwd: string; 22 | configFileName: string; 23 | plugins: Array; 24 | 25 | constructor(cwd: string, configFilePath: string): void; 26 | configFilePath(): string; 27 | getConfiguration(): Configuration; 28 | getName(): string; 29 | start(): Promise; 30 | build(): Promise; 31 | restart(): Promise; 32 | stop(): Promise; 33 | } 34 | 35 | declare type Plugin = (env: Environment, runOnce: boolean, logger: Logger) => PluginController; 36 | 37 | declare type PluginController = { 38 | build(): Promise, 39 | start(): Promise, 40 | terminate(): Promise, 41 | } 42 | 43 | declare type ClientWebpackPluginConfiguration = Configuration & { 44 | settings: ConfigurationSettings & { 45 | client: { 46 | index: string, 47 | bundleDir: string, 48 | } 49 | } 50 | } 51 | 52 | declare type ServerWebpackPluginConfiguration = Configuration & { 53 | settings: ConfigurationSettings & { 54 | server: { 55 | index: string, 56 | bundleDir: string, 57 | } 58 | } 59 | } 60 | 61 | declare interface Logger { 62 | createGroup(name: string): LogGroup; 63 | removeGroup(name: string): void; 64 | render(): void; 65 | } 66 | 67 | declare interface LogGroup { 68 | clear(): void; 69 | constructor(name: string, logger: Logger): void; 70 | getMessages(): string[]; 71 | getName(): string; 72 | log(message: string): void; 73 | info(message: string): void; 74 | error(message: string): void; 75 | success(message: string): void; 76 | warning(message: string): void; 77 | remove(): void; 78 | } 79 | -------------------------------------------------------------------------------- /flow/definitions/path-exists.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | declare module 'path-exists' { 4 | declare function sync(fp: string): string; 5 | } 6 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "lerna": "2.0.0-rc.5", 3 | "version": "independent", 4 | "changelog": { 5 | "repo": "michalkvasnicak/create-js-app", 6 | "labels": { 7 | "tag: new feature": ":sparkles: New Feature", 8 | "tag: breaking change": ":boom: Breaking Change", 9 | "tag: bug fix": ":bug: Bug Fix", 10 | "tag: enhancement": ":lipstick: Enhancement", 11 | "tag: documentation": ":memo: Documentation", 12 | "tag: internal": ":house: Internal" 13 | }, 14 | "cacheDir": ".changelog" 15 | }, 16 | } 17 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "devDependencies": { 4 | "flow-bin": "^0.47.0", 5 | "husky": "^0.13.4", 6 | "lerna": "^2.0.0-rc.5", 7 | "lerna-changelog": "^0.5.0", 8 | "lint-staged": "^3.6.0", 9 | "prettier": "^1.4.1" 10 | }, 11 | "scripts": { 12 | "lint": "eslint packages", 13 | "flow": "flow check", 14 | "format": "prettier --trailing-comma es5 --single-quote --write 'packages/*/*.js' 'packages/*/!(node_modules)/**/*.js'", 15 | "changelog": "lerna-changelog", 16 | "postinstall": "lerna bootstrap", 17 | "precommit": "lint-staged" 18 | }, 19 | "lint-staged": { 20 | "*.js": [ 21 | "prettier --trailing-comma es5 --single-quote --write", 22 | "git add" 23 | ] 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /packages/babel-preset-js-app/README.md: -------------------------------------------------------------------------------- 1 | # babel-preset-js-app 2 | 3 | Babel preset used by Create JS App. 4 | -------------------------------------------------------------------------------- /packages/babel-preset-js-app/client.js: -------------------------------------------------------------------------------- 1 | const env = process.env.BABEL_ENV || process.env.NODE_ENV; 2 | 3 | module.exports = { 4 | compact: false, 5 | presets: [ 6 | [require.resolve('babel-preset-env'), { 7 | modules: false, // webpack 2 8 | targets: { 9 | browsers: [ 10 | 'last 2 Chrome versions', 11 | 'last 2 Firefox versions', 12 | 'last 2 Edge versions', 13 | 'last 2 Opera versions', 14 | 'last 2 Safari versions', 15 | 'last 2 iOS versions', 16 | 'Explorer >= 11', 17 | ], 18 | }, 19 | useBuiltIns: true, 20 | }], 21 | require.resolve('babel-preset-react'), 22 | ], 23 | plugins: [ 24 | // class { handleClick = () => { } } 25 | require.resolve('babel-plugin-transform-class-properties'), 26 | // { ...param, completed: true } 27 | require.resolve('babel-plugin-transform-object-rest-spread'), 28 | [require.resolve('react-loadable/babel'), { webpack: true, babel: true }], 29 | require.resolve('babel-plugin-idx'), 30 | require.resolve('babel-plugin-syntax-dynamic-import'), 31 | ], 32 | }; 33 | 34 | if (env === 'development' || env === 'test') { 35 | const devPlugins = [ 36 | // Adds component stack to warning messages 37 | require.resolve('babel-plugin-transform-react-jsx-source'), 38 | // Adds __self attribute to JSX which React will use for some warnings 39 | require.resolve('babel-plugin-transform-react-jsx-self'), 40 | ]; 41 | 42 | module.exports.plugins.push(...devPlugins); 43 | } 44 | -------------------------------------------------------------------------------- /packages/babel-preset-js-app/index.js: -------------------------------------------------------------------------------- 1 | const client = require('./client'); 2 | const env = process.env.BABEL_ENV || process.env.NODE_ENV; 3 | const server = require('./server'); 4 | 5 | if (env !== 'development' && env !== 'test' && env !== 'production') { 6 | throw new Error( 7 | `babel-preset-js-app invalid \`NODE_ENV\` or \`BABEL_ENV\`. 8 | Valid are development|production|test, instead received ${JSON.stringify(env)}` 9 | ); 10 | } 11 | 12 | module.exports = {}; 13 | module.exports.client = client; 14 | module.exports.server = server; 15 | -------------------------------------------------------------------------------- /packages/babel-preset-js-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "babel-preset-js-app", 3 | "version": "0.7.0", 4 | "description": "Babel preset used by Create JS App", 5 | "license": "MIT", 6 | "author": "Michal Kvasničák (https://twitter.com/@michalkvasnicak)", 7 | "repository": "michalkvasnicak/create-js-app", 8 | "bugs": { 9 | "url": "https://github.com/michalkvasnicak/create-js-app/issues" 10 | }, 11 | "engines": { 12 | "node": ">=6.0" 13 | }, 14 | "engineStrict": true, 15 | "files": [ 16 | "client.js", 17 | "index.js", 18 | "server.js" 19 | ], 20 | "dependencies": { 21 | "babel-plugin-dynamic-import-node": "1.0.2", 22 | "babel-plugin-idx": "1.5.1", 23 | "babel-plugin-syntax-dynamic-import": "6.18.0", 24 | "babel-plugin-transform-class-properties": "6.24.1", 25 | "babel-plugin-transform-object-rest-spread": "6.23.0", 26 | "babel-plugin-transform-react-jsx-self": "6.22.0", 27 | "babel-plugin-transform-react-jsx-source": "6.22.0", 28 | "babel-preset-env": "1.5.1", 29 | "babel-preset-react": "6.24.1", 30 | "react-loadable": "3.3.1" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /packages/babel-preset-js-app/server.js: -------------------------------------------------------------------------------- 1 | const env = process.env.BABEL_ENV || process.env.NODE_ENV; 2 | 3 | // this config is used for tests too so we use babel-preset-env only here :) 4 | 5 | module.exports = { 6 | compact: false, 7 | presets: [ 8 | [ 9 | require.resolve('babel-preset-env'), { 10 | useBuiltIns: true, 11 | targets: { 12 | node: 'current', 13 | }, 14 | }, 15 | ], 16 | require.resolve('babel-preset-react'), 17 | ], 18 | plugins: [ 19 | // class { handleClick = () => { } } 20 | require.resolve('babel-plugin-transform-class-properties'), 21 | // { ...param, completed: true } 22 | require.resolve('babel-plugin-transform-object-rest-spread'), 23 | [require.resolve('react-loadable/babel'), { webpack: true, babel: true }], 24 | require.resolve('babel-plugin-idx'), 25 | require.resolve('babel-plugin-syntax-dynamic-import'), 26 | require.resolve('babel-plugin-dynamic-import-node'), 27 | ], 28 | }; 29 | 30 | if (env === 'development' || env === 'test') { 31 | const devPlugins = [ 32 | // Adds component stack to warning messages 33 | require.resolve('babel-plugin-transform-react-jsx-source'), 34 | // Adds __self attribute to JSX which React will use for some warnings 35 | require.resolve('babel-plugin-transform-react-jsx-self'), 36 | ]; 37 | 38 | module.exports.plugins.push(...devPlugins); 39 | } 40 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "latest-minimal" 4 | ], 5 | "plugins": [ 6 | "transform-flow-strip-types", 7 | "transform-object-rest-spread" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | logs 3 | *.log 4 | npm-debug.log* 5 | pids 6 | *.pid 7 | *.seed 8 | lib-cov 9 | coverage 10 | .nyc_output 11 | .grunt 12 | .lock-wscript 13 | build 14 | node_modules 15 | jspm_packages 16 | .npm 17 | .node_repl_history 18 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/README.md: -------------------------------------------------------------------------------- 1 | # create-js-app-scripts 2 | 3 | Configuration and scripts used by [Create JS App](https://github.com/michalkvasnicak/create-js-app) 4 | 5 | ## Commands 6 | 7 | ### `npm build` - starts production build 8 | 9 | ### `npm start` - starts development environment 10 | 11 | ### `npm test` - starts jest tests configured for jsdom environment 12 | 13 | Starts jest tests configured for jsdom environment. In this case, test files has to be placed under `__tests__` directory or filenames has to be suffixed with `spec.(js|jsx)` or `test.(js|jsx)` suffix. 14 | 15 | ### `npm test -- --node` 16 | 17 | Starts jest tests configured for node environment. In this case, test files has to be placed under `__tests_node__` directory or filenames has to be suffixed with `spec.node.(js|jsx)` or `test.node.(js|jsx)` suffix. 18 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/bin/create-js-app-scripts.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | /* eslint-disable no-console */ 3 | const chalk = require('chalk'); 4 | const spawn = require('cross-spawn'); 5 | const script = process.argv[2]; 6 | const args = process.argv.slice(3); 7 | 8 | switch (script) { 9 | case 'build': 10 | case 'start': 11 | case 'test': { 12 | const result = spawn.sync( 13 | 'node', 14 | [require.resolve(`../build/${script}`)].concat(args), 15 | { stdio: 'inherit' } 16 | ); 17 | process.exit(result.status); 18 | break; 19 | } 20 | default: 21 | console.log(chalk.red(`Unknown script '${script}'.`)); 22 | console.log(chalk.red('Perhaps you need to update react-scripts?')); 23 | process.exit(1); 24 | break; 25 | } 26 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-js-app-scripts", 3 | "version": "0.15.0", 4 | "description": "Configuration and scripts for Create JS App", 5 | "license": "MIT", 6 | "author": "Michal Kvasničák (https://twitter.com/@michalkvasnicak)", 7 | "repository": "michalkvasnicak/create-js-app", 8 | "bugs": { 9 | "url": "https://github.com/michalkvasnicak/create-js-app/issues" 10 | }, 11 | "engines": { 12 | "node": ">=6.0" 13 | }, 14 | "engineStrict": true, 15 | "bin": { 16 | "create-js-app-scripts": "bin/create-js-app-scripts.js" 17 | }, 18 | "files": [ 19 | "bin", 20 | "build" 21 | ], 22 | "dependencies": { 23 | "babel-jest": "18.0.0", 24 | "babel-preset-js-app": "^0.7.0", 25 | "chalk": "1.1.3", 26 | "chokidar": "1.6.0", 27 | "cross-spawn": "4.0.2", 28 | "jest": "18.1.0", 29 | "path-exists": "3.0.0", 30 | "react-dev-utils": "0.4.2" 31 | }, 32 | "devDependencies": { 33 | "babel-cli": "6.22.2", 34 | "babel-plugin-transform-flow-strip-types": "6.22.0", 35 | "babel-plugin-transform-object-rest-spread": "6.22.0", 36 | "babel-preset-latest-minimal": "1.1.2", 37 | "babel-register": "6.22.0", 38 | "rimraf": "2.5.4" 39 | }, 40 | "optionalDependencies": { 41 | "fsevents": "^1.0.14" 42 | }, 43 | "scripts": { 44 | "build": "rimraf build && babel src -d build --ignore '**/__tests__/**'", 45 | "prepublish": "npm run build" 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/src/build.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | /* eslint-disable no-console */ 3 | 4 | // set environment to production 5 | process.env.NODE_ENV = 'production'; 6 | 7 | const chalk = require('chalk'); 8 | const Environment = require('./environment'); 9 | const Logger = require('./logger'); 10 | 11 | const logger: Logger = new Logger(); 12 | const env: Environment = new Environment(process.cwd(), undefined, logger); 13 | 14 | env.build().then( 15 | () => { 16 | console.log(chalk.green('Successfully built')); 17 | process.exit(0); 18 | }, 19 | (err) => { 20 | console.log(chalk.red('Build failed')); 21 | console.log(err); 22 | process.exit(1); 23 | } 24 | ); 25 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/src/environment.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | const path = require('path'); 3 | const loadConfiguration = require('./utils/loadConfiguration'); 4 | 5 | class Environment { 6 | cwd: string; 7 | configFileName: string; 8 | logger: Logger; 9 | plugins: Array; 10 | 11 | constructor(cwd: string, configFileName: string = '.app.js', logger: Logger) { 12 | this.cwd = cwd; 13 | this.configFileName = configFileName; 14 | this.logger = logger; 15 | } 16 | 17 | configFilePath(): string { 18 | return path.resolve(this.cwd, this.configFileName); 19 | } 20 | 21 | getConfiguration(): Configuration { 22 | return loadConfiguration(this); 23 | } 24 | 25 | getName(): string { 26 | return this.getConfiguration().env.NODE_ENV; 27 | } 28 | 29 | async build(): Promise { 30 | const config: Configuration = loadConfiguration(this); 31 | 32 | // run build phase on plugins (do not instantiate them) 33 | const pluginControllers: PluginController[] = await Promise.all(config.plugins.map( 34 | plugin => plugin(this, true, this.logger) 35 | )); 36 | 37 | await Promise.all(pluginControllers.map(pluginController => pluginController.build())); 38 | } 39 | 40 | async start(): Promise { 41 | const config: Configuration = loadConfiguration(this); 42 | 43 | // instantiate plugins 44 | this.plugins = await Promise.all(config.plugins.map( 45 | plugin => plugin(this, false, this.logger) 46 | )); 47 | 48 | await Promise.all(this.plugins.map(p => p.start())); 49 | } 50 | 51 | async restart(): Promise { 52 | // terminate all plugins 53 | await Promise.all(this.plugins.map(pluginController => pluginController.terminate())); 54 | 55 | // start all plugins 56 | await this.start(); 57 | } 58 | 59 | async stop(): Promise { 60 | await Promise.all(this.plugins.map(pluginController => pluginController.terminate())); 61 | } 62 | } 63 | 64 | module.exports = Environment; 65 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/src/jest/css.stub.js: -------------------------------------------------------------------------------- 1 | module.exports = {}; 2 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/src/jest/file.stub.js: -------------------------------------------------------------------------------- 1 | module.exports = 'test-file-stub'; 2 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/src/jest/transform.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | const babelJest = require('babel-jest'); 3 | 4 | module.exports = babelJest.createTransformer({ 5 | presets: [require.resolve('babel-preset-js-app/server')], 6 | }); 7 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/src/logGroup.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | const chalk = require('chalk'); 3 | 4 | class LogGroup { 5 | logger: Logger; 6 | messages: Array; 7 | name: string; 8 | 9 | constructor(name: string, logger: Logger) { 10 | this.name = name; 11 | this.logger = logger; 12 | this.messages = []; 13 | } 14 | 15 | clear(): void { 16 | this.messages = []; 17 | this.logger.render(); 18 | } 19 | 20 | log(message: string): void { 21 | this.messages.push(message); 22 | this.logger.render(); 23 | } 24 | 25 | info(message: string): void { 26 | this.log(chalk.cyan(message)); 27 | } 28 | 29 | success(message: string): void { 30 | this.log(chalk.green(message)); 31 | } 32 | 33 | warning(message: string): void { 34 | this.log(chalk.yellow(message)); 35 | } 36 | 37 | error(message: string): void { 38 | this.log(chalk.red(message)); 39 | } 40 | 41 | getMessages(): string[] { 42 | return this.messages; 43 | } 44 | 45 | getName(): string { 46 | return this.name; 47 | } 48 | 49 | remove(): void { 50 | this.logger.removeGroup(this.name); 51 | } 52 | } 53 | 54 | module.exports = LogGroup; 55 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/src/logger.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | /* eslint-disable no-console */ 3 | const clearConsole = require('react-dev-utils/clearConsole'); 4 | const LogGroup = require('./logGroup'); 5 | 6 | class Logger { 7 | groups: Array; 8 | 9 | constructor() { 10 | this.groups = []; 11 | } 12 | 13 | createGroup(name: string): LogGroup { 14 | if (this.groups.find(group => group.getName() === name)) { 15 | throw new Error(`Log group "${name}" already exists`); 16 | } 17 | 18 | const group = new LogGroup(name, this); 19 | this.groups.push(group); 20 | 21 | return group; 22 | } 23 | 24 | removeGroup(name: string): void { 25 | this.groups = this.groups.filter(group => group.getName() !== name); 26 | this.render(); 27 | } 28 | 29 | /** 30 | * Renders logs to console 31 | */ 32 | render() { 33 | clearConsole(); 34 | 35 | this.groups.forEach((group: LogGroup) => { 36 | if (!group.getMessages().length) { 37 | return; 38 | } 39 | 40 | group.getMessages().forEach( 41 | (message) => { 42 | console.log(message); 43 | console.log(); // aesthetics 44 | } 45 | ); 46 | 47 | // aesthetic 48 | console.log(''); 49 | }); 50 | } 51 | } 52 | 53 | module.exports = Logger; 54 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/src/plugins/watchConfiguration.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | const chokidar = require('chokidar'); 3 | const path = require('path'); 4 | 5 | function createUpdater(env: Environment, logger: LogGroup) { 6 | return (filePath: string) => { // eslint-disable-line no-unused-vars 7 | logger.clear(); 8 | logger.info('Detected change in configuration file, restarting environment...'); 9 | // restart environment (terminates all plugins and loads them again) 10 | env.restart(); 11 | }; 12 | } 13 | 14 | /** 15 | * Watches configuration file and restarts build on change 16 | * 17 | * @param {Object} env 18 | * @param {boolean} runOnce run only once (used in build script) 19 | * @param {Logger} logger 20 | */ 21 | const plugin: Plugin = ( 22 | env: Environment, 23 | runOnce: boolean = false, 24 | logger: Logger 25 | ): PluginController => { 26 | let logGroup; 27 | let watcher; 28 | 29 | return { 30 | async build() { 31 | return Promise.resolve(); 32 | }, 33 | 34 | async start() { 35 | return new Promise((resolve, reject) => { 36 | logGroup = logger.createGroup('watch configuration'); 37 | const updater = createUpdater(env, logGroup); 38 | 39 | logGroup.clear(); 40 | 41 | // start chokidar and watch for .app.js changes 42 | // everytime configuration changes, restart whole build 43 | watcher = chokidar.watch( 44 | `${path.resolve(env.cwd, './.app.js')}`, 45 | { 46 | cwd: env.cwd, 47 | } 48 | ); 49 | 50 | watcher.on('ready', () => { 51 | ['add', 'change', 'unlink'].forEach(event => watcher.on(event, updater)); 52 | resolve(); 53 | }); 54 | 55 | watcher.on('error', (error) => { 56 | logGroup.clear(); 57 | logGroup.error('Watch configuration plugin failed'); 58 | logGroup.error(error); 59 | 60 | reject(error); 61 | }); 62 | }); 63 | }, 64 | 65 | async terminate() { 66 | logGroup.remove(); 67 | watcher.close(); 68 | }, 69 | }; 70 | }; 71 | 72 | module.exports = plugin; 73 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/src/start.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | /* eslint-disable no-console */ 3 | // set environment to development 4 | process.env.NODE_ENV = 'development'; 5 | 6 | const fs = require('fs'); 7 | const Environment = require('./environment'); 8 | const Logger = require('./logger'); 9 | 10 | const env: Environment = new Environment( 11 | fs.realpathSync(process.cwd()), 12 | undefined, 13 | new Logger() 14 | ); 15 | 16 | process.on('SIGINT', () => { 17 | env.stop(); 18 | }); 19 | 20 | env.start().catch( 21 | (e) => { 22 | console.log(e); 23 | process.exit(1); 24 | } 25 | ); 26 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/src/test.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | process.env.NODE_ENV = 'test'; 3 | 4 | const jest = require('jest'); 5 | const path = require('path'); 6 | const pathExists = require('path-exists'); 7 | const argv = process.argv.slice(2); 8 | 9 | // Watch unless on CI 10 | if (!process.env.CI) { 11 | argv.push('--watch'); 12 | } 13 | 14 | const rootDir = process.cwd(); 15 | const setupTestsFile = pathExists.sync(path.resolve(rootDir, './src/setupTests.js')) 16 | ? '/src/setupTests.js' 17 | : undefined; 18 | 19 | argv.push('--config', JSON.stringify({ 20 | rootDir, 21 | moduleFileExtensions: ['jsx', 'js', 'json'], 22 | moduleNameMapper: { 23 | '^.+\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': require.resolve('./jest/file.stub.js'), 24 | '^.+\\.css$': require.resolve('./jest/css.stub.js'), 25 | }, 26 | transform: { 27 | '.js': require.resolve('./jest/transform.js'), 28 | }, 29 | setupFiles: [/* require.resolve('./jest/polyfills.js') */], 30 | setupTestFrameworkScriptFile: setupTestsFile, 31 | testPathIgnorePatterns: ['/(build|docs|node_modules)/'], 32 | testEnvironment: argv.indexOf('--node') !== -1 ? 'node' : 'jsdom', 33 | testRegex: argv.indexOf('--node') !== -1 34 | ? '(/__tests_node__/.*|\\.(test\\.node|spec\\.node))\\.(js|jsx)$' 35 | : '(/__tests__/.*|\\.(test|spec))\\.(js|jsx)$', 36 | })); 37 | 38 | jest.run(argv); 39 | -------------------------------------------------------------------------------- /packages/create-js-app-scripts/src/utils/loadConfiguration.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | 5 | function getEnvParam(param: string): string { 6 | if (process.env[param]) { 7 | return process.env[param]; 8 | } 9 | 10 | throw new Error(`process.env.${param} is not set`); 11 | } 12 | 13 | const cwd = fs.realpathSync(process.cwd()); 14 | 15 | const defaultConfig = { 16 | env: { 17 | NODE_ENV: getEnvParam('NODE_ENV'), 18 | }, 19 | plugins: [ 20 | require('../plugins/watchConfiguration'), // eslint-disable-line global-require 21 | ], 22 | settings: { 23 | appNodeModulesDir: path.resolve(cwd, './node_modules'), 24 | assetsPath: path.resolve(cwd, './build/assets.json'), 25 | appSrc: path.resolve(cwd, './src'), 26 | babelrc: null, 27 | eslintrc: path.resolve(cwd, './.eslintrc'), 28 | }, 29 | }; 30 | 31 | module.exports = function loadConfiguration(env: Environment): Configuration { 32 | try { 33 | const configModulePath = env.configFilePath(); 34 | 35 | // first clean up require cache so we always load fresh config 36 | delete require.cache[configModulePath]; 37 | const config = require(configModulePath); // eslint-disable-line global-require 38 | 39 | return { 40 | env: { 41 | ...defaultConfig.env, 42 | ...(config.env || {}), 43 | }, 44 | plugins: [ 45 | ...defaultConfig.plugins, 46 | ...(config.plugins || []), 47 | ], 48 | settings: { 49 | ...defaultConfig.settings, 50 | ...config.settings, 51 | }, 52 | }; 53 | } catch (e) { 54 | return defaultConfig; 55 | } 56 | }; 57 | 58 | module.exports.defaultConfig = defaultConfig; 59 | -------------------------------------------------------------------------------- /packages/create-js-app/README.md: -------------------------------------------------------------------------------- 1 | # Create JS App 2 | 3 | Develop any kind of javascript apps (mobile, full stack, libraries, ...) in an easy way. 4 | 5 | ## Installation 6 | 7 | `npm install -g create-js-app` 8 | 9 | ## Usage 10 | 11 | ### Create new project 12 | 13 | `create-js-app create ` - creates a project from the default template (`js-app-template-universal`) 14 | `create-js-app create --template ` - creates a project using defined template 15 | 16 | ### Init a project in existing directory 17 | 18 | `create-js-app init ` - installs only `create-js-app-scripts` in a given project and sets scripts 19 | 20 | ### Help 21 | 22 | `create-js-app --help` 23 | -------------------------------------------------------------------------------- /packages/create-js-app/commands/create.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable no-console */ 2 | const chalk = require('chalk'); 3 | const spawn = require('cross-spawn'); 4 | const fs = require('fs'); 5 | const fsExtra = require('fs-extra'); 6 | const path = require('path'); 7 | const pathExists = require('path-exists'); 8 | 9 | module.exports = { 10 | command: 'create ', 11 | desc: 'Creates an empty project in specified directory using template', 12 | builder: { 13 | template: { 14 | alias: 't', 15 | default: 'js-app-template-universal', 16 | describe: 'Create project using a template', 17 | type: 'string', 18 | }, 19 | }, 20 | handler: (argv) => { 21 | const destinationPath = path.resolve(process.cwd(), argv.path); 22 | const projectName = path.basename(destinationPath); 23 | const template = argv.template; 24 | const templateDirectory = path.basename(template.replace(/@.+/, '')); // strip version 25 | 26 | if (pathExists.sync(destinationPath)) { 27 | console.log( 28 | chalk.red('I am sorry but you can\'t create a project in existing directory') 29 | ); 30 | console.log(); 31 | console.log( 32 | chalk.cyan('You can try it using init command ;) just run "create-js-app init --help" if you need help') 33 | ); 34 | process.exit(1); 35 | } 36 | 37 | const packageJson = { 38 | name: projectName, 39 | version: '0.1.0', 40 | private: true, 41 | }; 42 | 43 | try { 44 | fs.mkdirSync(destinationPath); 45 | 46 | // save package.json to this directory 47 | fs.writeFileSync( 48 | path.join(destinationPath, 'package.json'), 49 | JSON.stringify(packageJson, null, 2) 50 | ); 51 | 52 | // change current directory 53 | process.chdir(destinationPath); 54 | 55 | // now install template 56 | console.log(chalk.cyan('Installing template. This might take a couple minutes.')); 57 | console.log(chalk.cyan(`Installing ${template} from npm...`)); 58 | console.log(); 59 | 60 | let result = spawn.sync( 61 | 'npm', 62 | [ 63 | 'install', 64 | '--save-dev', 65 | '--save-exact', 66 | template, 67 | ], 68 | { stdio: 'inherit' } 69 | ); 70 | 71 | if (result.status !== 0) { 72 | throw new Error('Template installation failed'); 73 | } 74 | 75 | // copy contents of template directory from node_modules to app folder 76 | fsExtra.copySync( 77 | path.join(destinationPath, 'node_modules', templateDirectory), 78 | destinationPath 79 | ); 80 | 81 | // remove template dependency from node_modules and package.json 82 | fsExtra.removeSync( 83 | path.join(destinationPath, 'node_modules', templateDirectory) 84 | ); 85 | 86 | const appPackageJsonPath = path.join(destinationPath, 'package.json'); 87 | 88 | // load package.json 89 | const appPackageJson = JSON.parse( 90 | fs.readFileSync(appPackageJsonPath, { encoding: 'utf8' }) 91 | ); 92 | 93 | // remove template dependency 94 | delete appPackageJson.devDependencies[templateDirectory]; 95 | 96 | // save package.json 97 | fs.writeFileSync(appPackageJsonPath, JSON.stringify(appPackageJson, null, 2)); 98 | 99 | // if there is gitignore file, rename it 100 | const gitignorePath = path.join(destinationPath, 'gitignore'); 101 | 102 | if (pathExists.sync(gitignorePath)) { 103 | fsExtra.renameSync(gitignorePath, path.join(destinationPath, '.gitignore')); 104 | } 105 | 106 | // find package.json from installed template 107 | // so we can copy dependencies 108 | const templatePackageJsonPath = path.join( 109 | destinationPath, 'package.json' 110 | ); 111 | 112 | if (!pathExists.sync(templatePackageJsonPath)) { 113 | console.log( 114 | chalk.red(`package.json not found in ${templatePackageJsonPath}`) 115 | ); 116 | } 117 | 118 | const templatePackageJson = JSON.parse( 119 | fs.readFileSync(templatePackageJsonPath, { encoding: 'utf8' }) 120 | ); 121 | 122 | // add dependencies from package.json 123 | packageJson.dependencies = templatePackageJson.dependencies || {}; 124 | packageJson.devDependencies = templatePackageJson.devDependencies || {}; 125 | packageJson.peerDependencies = templatePackageJson.peerDependencies || {}; 126 | packageJson.scripts = templatePackageJson.scripts || {}; 127 | 128 | fs.writeFileSync( 129 | templatePackageJsonPath, 130 | JSON.stringify(packageJson, null, 2) 131 | ); 132 | 133 | console.log( 134 | chalk.cyan('Installing template dependencies. This might take a couple minutes.') 135 | ); 136 | console.log('Installing from npm...'); 137 | console.log(); 138 | 139 | result = spawn.sync('npm', ['install'], { stdio: 'inherit' }); 140 | 141 | if (result.status !== 0) { 142 | console.log(chalk.red('Installation failed...')); 143 | process.exit(1); 144 | } 145 | 146 | // done, we don't install create-js-app-scripts here 147 | // because we are using templates, which can differ 148 | // only init command is installing create-js-app-scripts :) 149 | console.log(chalk.green(`Project ${projectName} successfully created`)); 150 | console.log(''); 151 | console.log(chalk.cyan('You can use these commands now:')); 152 | console.log(' - npm start - to start a development server'); 153 | console.log(' - npm run build - to build a production build'); 154 | console.log(' - npm test - to start testing'); 155 | console.log(' - For more check commands defined by the template'); 156 | console.log(''); 157 | 158 | console.log(chalk.cyan('Happy hacking ;)')); 159 | process.exit(0); 160 | } catch (e) { 161 | console.log(chalk.red('Error occurred:')); 162 | console.log(e); 163 | process.exit(1); 164 | } 165 | }, 166 | }; 167 | -------------------------------------------------------------------------------- /packages/create-js-app/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | /* eslint-disable no-unused-expressions, no-console, global-require */ 3 | 4 | const yargs = require('yargs'); 5 | const createCommand = require('./commands/create'); 6 | 7 | yargs 8 | .usage('Usage: $0 [args]') 9 | .command(createCommand) 10 | .help() 11 | .version('version', 'display version information', require('./package.json').version) 12 | .argv; 13 | -------------------------------------------------------------------------------- /packages/create-js-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "create-js-app", 3 | "version": "0.4.2", 4 | "description": "Create full stack javascript application with no build configuration.", 5 | "license": "MIT", 6 | "author": "Michal Kvasničák (https://twitter.com/@michalkvasnicak)", 7 | "repository": "michalkvasnicak/create-js-app", 8 | "bin": { 9 | "create-js-app": "./index.js" 10 | }, 11 | "bugs": { 12 | "url": "https://github.com/michalkvasnicak/create-js-app/issues" 13 | }, 14 | "engines": { 15 | "node": ">=6.0" 16 | }, 17 | "engineStrict": true, 18 | "files": [ 19 | "index.js", 20 | "commands" 21 | ], 22 | "dependencies": { 23 | "chalk": "1.1.3", 24 | "cross-spawn": "4.0.2", 25 | "find-cache-dir": "0.1.1", 26 | "fs-extra": "0.30.0", 27 | "path-exists": "3.0.0", 28 | "yargs": "6.0.0" 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /packages/eslint-config-js-app/README.md: -------------------------------------------------------------------------------- 1 | # eslint-config-js-app 2 | 3 | Default shareable eslint configuration used by [Create JS App](https://github.com/michalkvasnicak/create-js-app) 4 | -------------------------------------------------------------------------------- /packages/eslint-config-js-app/index.js: -------------------------------------------------------------------------------- 1 | const importPluginRules = Object.keys(require('eslint-plugin-import').rules); 2 | const airbnbConfig = Object.assign( 3 | {}, 4 | require('eslint-config-airbnb'), 5 | { 6 | root: true, 7 | env: { 8 | browser: true, 9 | commonjs: true, 10 | es6: true, 11 | jest: true, 12 | node: true, 13 | }, 14 | parser: 'babel-eslint', 15 | parserOptions: { 16 | ecmaVersion: 8, 17 | sourceType: 'module', 18 | ecmaFeatures: { 19 | generators: true, 20 | experimentalObjectRestSpread: true, 21 | }, 22 | }, 23 | plugins: ['flowtype'], 24 | // disable import rules temporarily 25 | rules: Object.assign( 26 | {}, 27 | importPluginRules.reduce( 28 | (rules, rule) => Object.assign({}, rules, { [`import/${rule}`]: 'off' }), {} 29 | ), 30 | { 31 | // 'flowtype-errors/show-errors': 'error', todo enable when problems are solved 32 | 'new-cap': 'off', 33 | 'react/jsx-filename-extension': 'off', 34 | 'comma-dangle': ['error', { 35 | arrays: 'always-multiline', 36 | objects: 'always-multiline', 37 | imports: 'always-multiline', 38 | exports: 'always-multiline', 39 | functions: 'ignore', 40 | }], 41 | } 42 | ), 43 | settings: { 44 | flowtype: { 45 | onlyFilesWithFlowAnnotation: true, 46 | }, 47 | }, 48 | } 49 | ); 50 | 51 | // add flowtype recommended configuration 52 | airbnbConfig.extends.push('plugin:flowtype/recommended'); 53 | 54 | module.exports = airbnbConfig; 55 | -------------------------------------------------------------------------------- /packages/eslint-config-js-app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "eslint-config-js-app", 3 | "version": "0.3.0", 4 | "description": "Eslint config used by Create JS App", 5 | "license": "MIT", 6 | "author": "Michal Kvasničák (https://twitter.com/@michalkvasnicak)", 7 | "repository": "michalkvasnicak/create-js-app", 8 | "bugs": { 9 | "url": "https://github.com/michalkvasnicak/create-js-app/issues" 10 | }, 11 | "engines": { 12 | "node": ">=6.0" 13 | }, 14 | "engineStrict": true, 15 | "files": [ 16 | "index.js" 17 | ], 18 | "peerDependencies": { 19 | "babel-eslint": "7.1.1", 20 | "eslint": "3.14.1", 21 | "eslint-config-airbnb": "14.0.0", 22 | "eslint-plugin-flowtype": "2.30.0", 23 | "eslint-plugin-jsx-a11y": "3.0.2", 24 | "eslint-plugin-react": "6.9.0" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": [ 3 | "latest-minimal" 4 | ], 5 | "plugins": [ 6 | "transform-flow-strip-types", 7 | "transform-object-rest-spread" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/.gitignore: -------------------------------------------------------------------------------- 1 | build 2 | node_modules 3 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/README.md: -------------------------------------------------------------------------------- 1 | # create-js-app-plugin-client-webpack 2 | 3 | Clientside webpack plugin used by Create JS App. 4 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-app-plugin-universal-webpack", 3 | "version": "0.15.0", 4 | "description": "Webpack client side compiler plugin for Create JS App", 5 | "license": "MIT", 6 | "author": "Michal Kvasničák (https://twitter.com/@michalkvasnicak)", 7 | "repository": "michalkvasnicak/create-js-app", 8 | "bugs": { 9 | "url": "https://github.com/michalkvasnicak/create-js-app/issues" 10 | }, 11 | "engines": { 12 | "node": ">=6.0" 13 | }, 14 | "engineStrict": true, 15 | "main": "build/index.js", 16 | "files": [ 17 | "build", 18 | "README.md" 19 | ], 20 | "dependencies": { 21 | "babel-core": "6.22.1", 22 | "babel-eslint": "7.1.1", 23 | "babel-loader": "6.2.10", 24 | "babel-preset-js-app": "^0.7.0", 25 | "case-sensitive-paths-webpack-plugin": "1.1.4", 26 | "compression-webpack-plugin": "0.3.2", 27 | "css-loader": "0.26.1", 28 | "eslint-loader": "1.6.1", 29 | "extract-text-webpack-plugin": "2.0.0-rc.2", 30 | "file-loader": "0.9.0", 31 | "find-cache-dir": "0.1.1", 32 | "fs-extra": "0.30.0", 33 | "json-loader": "0.5.4", 34 | "node-fetch": "1.6.3", 35 | "object-assign": "4.1.1", 36 | "postcss-apply": "0.4.0", 37 | "postcss-cssnext": "2.9.0", 38 | "postcss-import": "8.1.0", 39 | "postcss-loader": "1.2.2", 40 | "promise": "7.1.1", 41 | "react-dev-utils": "0.4.2", 42 | "source-map-support": "0.4.11", 43 | "style-loader": "0.13.1", 44 | "toposort": "1.0.0", 45 | "url-loader": "0.5.7", 46 | "webpack": "2.2.0", 47 | "webpack-dev-server": "2.2.0", 48 | "webpack-node-externals": "1.5.4", 49 | "whatwg-fetch": "2.0.2" 50 | }, 51 | "devDependencies": { 52 | "babel-cli": "6.22.2", 53 | "babel-plugin-transform-flow-strip-types": "6.22.0", 54 | "babel-plugin-transform-object-rest-spread": "6.22.0", 55 | "babel-preset-latest-minimal": "1.1.2", 56 | "babel-register": "6.22.0", 57 | "rimraf": "2.5.4" 58 | }, 59 | "optionalDependencies": { 60 | "fsevents": "^1.0.14" 61 | }, 62 | "scripts": { 63 | "build": "rimraf build && babel src -d build --ignore '**/__tests__/**'", 64 | "prepublish": "npm run build" 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/src/config/client/development.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | const AssetsPlugin = require('../../webpack/AssetsPlugin'); 3 | const defineVariables = require('../defineVariables'); 4 | const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); 5 | const findCacheDir = require('find-cache-dir'); 6 | const LoggerPlugin = require('../../webpack/LoggerPlugin'); 7 | const path = require('path'); 8 | const postCssImport = require('postcss-import'); 9 | const postCssCssNext = require('postcss-cssnext'); 10 | const postCssApply = require('postcss-apply'); 11 | const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin'); 12 | const webpack = require('webpack'); 13 | 14 | module.exports = function createConfig(env: Environment, logger: LogGroup): Object { 15 | const { 16 | env: envVariables, 17 | settings, 18 | }: ClientWebpackPluginConfiguration = env.getConfiguration(); 19 | 20 | const clientSettings = settings.client; 21 | let plugins: (() => any)[] = []; 22 | let decorateLoaders: (loaders: Array) => any = loaders => loaders; 23 | 24 | const pluginsInstatiators = clientSettings.webpackPlugins 25 | && clientSettings.webpackPlugins.development; 26 | 27 | if (Array.isArray(pluginsInstatiators)) { 28 | plugins = pluginsInstatiators; 29 | } 30 | 31 | const loadersDecorator = clientSettings.webpack 32 | && clientSettings.webpack.loadersDecorator 33 | && clientSettings.webpack.loadersDecorator.development; 34 | 35 | if (typeof loadersDecorator === 'function') { 36 | decorateLoaders = loadersDecorator; 37 | } 38 | 39 | const variablesToDefine = { 40 | 'process.env': defineVariables(envVariables, { IS_CLIENT: true }), 41 | }; 42 | 43 | return { 44 | devtool: 'eval', 45 | entry: [ 46 | `${require.resolve('react-dev-utils/webpackHotDevClient')}`, 47 | require.resolve('./polyfills'), 48 | settings.client.index, 49 | ], 50 | output: { 51 | path: settings.client.bundleDir, 52 | pathinfo: true, 53 | filename: '[name].js', 54 | publicPath: settings.client.publicPath || '/', 55 | }, 56 | resolve: { 57 | extensions: ['.js', '.json', '.jsx'], 58 | }, 59 | // resolve loaders from this plugin directory 60 | resolveLoader: { 61 | modules: [ 62 | path.resolve(__dirname, '../../../node_modules'), 63 | path.resolve(__dirname, '../../../../'), // resolve to project node_modules 64 | ], 65 | }, 66 | module: { 67 | rules: decorateLoaders([ 68 | // eslint 69 | { 70 | enforce: 'pre', 71 | test: /\.(js|jsx)$/, 72 | use: [ 73 | { 74 | loader: 'eslint-loader', 75 | options: { 76 | configFile: settings.eslintrc || require.resolve('eslint-config-js-app'), 77 | useEslintrc: false, 78 | }, 79 | }, 80 | ], 81 | include: settings.appSrc, 82 | }, 83 | 84 | // js 85 | { 86 | test: /\.(js|jsx)$/, 87 | include: settings.appSrc, 88 | use: [ 89 | { 90 | loader: 'babel-loader', 91 | options: { 92 | babelrc: false, 93 | presets: [ 94 | settings.babelrc || require.resolve('babel-preset-js-app/client'), 95 | ], 96 | cacheDirectory: findCacheDir({ 97 | name: 'create-js-app-scripts', 98 | }), 99 | }, 100 | }, 101 | ], 102 | }, 103 | 104 | // css 105 | { 106 | test: /\.css$/, 107 | use: [ 108 | { loader: 'style-loader' }, 109 | { 110 | loader: 'css-loader', 111 | options: { 112 | autoprefixer: false, 113 | modules: true, 114 | importLoaders: true, 115 | localIdentName: '[name]__[local]__[hash:base64:5]', 116 | }, 117 | }, 118 | { 119 | loader: 'postcss-loader', 120 | options: { 121 | plugins: () => [ 122 | postCssImport(), 123 | postCssCssNext({ 124 | browsers: [ 125 | '>1%', 126 | 'last 4 versions', 127 | 'Firefox ESR', 128 | 'not ie < 10', 129 | ], 130 | }), 131 | postCssApply(), 132 | ], 133 | }, 134 | }, 135 | ], 136 | }, 137 | 138 | // json 139 | { 140 | test: /\.json$/, 141 | use: [ 142 | { loader: 'json-loader' }, 143 | ], 144 | }, 145 | 146 | // url 147 | { 148 | test: /\.(mp4|webm|wav|mp3|m4a|aac|oga)(\?.*)?$/, 149 | use: [ 150 | { loader: 'url-loader', options: { limit: 10000 } }, 151 | ], 152 | }, 153 | // file 154 | { 155 | test: /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/, 156 | use: [ 157 | { loader: 'file-loader' }, 158 | ], 159 | }, 160 | ]), 161 | }, 162 | node: { 163 | fs: 'empty', 164 | net: 'empty', 165 | tls: 'empty', 166 | }, 167 | plugins: [ 168 | new AssetsPlugin(env), 169 | 170 | new webpack.optimize.CommonsChunkPlugin({ 171 | name: 'vendor', 172 | minChunks: module => /node_modules/.test(module.resource), 173 | }), 174 | 175 | // define global variable 176 | new webpack.DefinePlugin(variablesToDefine), 177 | 178 | // case sensitive paths 179 | new CaseSensitivePathsPlugin(), 180 | 181 | // hot replacement 182 | new webpack.HotModuleReplacementPlugin(), 183 | 184 | // watch missing node modules 185 | new WatchMissingNodeModulesPlugin(settings.appNodeModulesDir), 186 | 187 | // Logger plugin 188 | new LoggerPlugin(logger), 189 | 190 | // Custom plugins 191 | ...(plugins.map( 192 | pluginInstantiator => pluginInstantiator( 193 | env.getConfiguration(), 194 | variablesToDefine 195 | )) 196 | ), 197 | ], 198 | }; 199 | }; 200 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/src/config/client/polyfills.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable global-require */ 2 | if (typeof Promise === 'undefined') { 3 | require('promise/lib/rejection-tracking').enable(); 4 | window.Promise = require('promise/lib/es6-extensions.js'); 5 | } 6 | 7 | require('whatwg-fetch'); 8 | Object.assign = require('object-assign'); 9 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/src/config/client/production.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | const AssetsPlugin = require('../../webpack/AssetsPlugin'); 3 | const CompressionPlugin = require('compression-webpack-plugin'); 4 | const defineVariables = require('../defineVariables'); 5 | const ExtractTextPlugin = require('extract-text-webpack-plugin'); 6 | const LoggerPlugin = require('../../webpack/LoggerPlugin'); 7 | const path = require('path'); 8 | const postCssImport = require('postcss-import'); 9 | const postCssCssNext = require('postcss-cssnext'); 10 | const postCssApply = require('postcss-apply'); 11 | const webpack = require('webpack'); 12 | 13 | module.exports = function createConfig(env: Environment, logger: LogGroup): Object { 14 | const { env: envVariables, settings }: ClientWebpackPluginConfiguration = env.getConfiguration(); 15 | 16 | const clientSettings = settings.client; 17 | let plugins: (() => any)[] = []; 18 | let decorateLoaders: (loaders: Array) => any = loaders => loaders; 19 | 20 | const pluginsInstatiators = clientSettings.webpackPlugins 21 | && clientSettings.webpackPlugins.production; 22 | 23 | if (Array.isArray(pluginsInstatiators)) { 24 | plugins = pluginsInstatiators; 25 | } 26 | 27 | const loadersDecorator = clientSettings.webpack 28 | && clientSettings.webpack.loadersDecorator 29 | && clientSettings.webpack.loadersDecorator.production; 30 | 31 | if (typeof loadersDecorator === 'function') { 32 | decorateLoaders = loadersDecorator; 33 | } 34 | 35 | const variablesToDefine = { 36 | 'process.env': defineVariables(envVariables, { IS_CLIENT: true }), 37 | }; 38 | 39 | return { 40 | bail: true, 41 | devtool: 'source-map', 42 | entry: [ 43 | require.resolve('./polyfills'), 44 | settings.client.index, 45 | ], 46 | output: { 47 | path: settings.client.bundleDir, 48 | pathinfo: true, 49 | filename: '[name]-[chunkhash].js', 50 | publicPath: settings.client.publicPath || '/', 51 | }, 52 | resolve: { 53 | extensions: ['.js', '.json', '.jsx'], 54 | }, 55 | // resolve loaders from this plugin directory 56 | resolveLoader: { 57 | modules: [ 58 | path.resolve(__dirname, '../../../node_modules'), 59 | path.resolve(__dirname, '../../../../'), // resolve to project node_modules 60 | ], 61 | }, 62 | module: { 63 | rules: decorateLoaders([ 64 | // eslint 65 | { 66 | enforce: 'pre', 67 | test: /\.(js|jsx)$/, 68 | use: [ 69 | { 70 | loader: 'eslint-loader', 71 | options: { 72 | configFile: settings.eslintrc || require.resolve('eslint-config-js-app'), 73 | useEslintrc: false, 74 | }, 75 | }, 76 | ], 77 | include: settings.appSrc, 78 | }, 79 | 80 | // js 81 | { 82 | test: /\.(js|jsx)$/, 83 | include: settings.appSrc, 84 | use: [ 85 | { 86 | loader: 'babel-loader', 87 | options: { 88 | babelrc: false, 89 | presets: [ 90 | settings.babelrc || require.resolve('babel-preset-js-app/client'), 91 | ], 92 | }, 93 | }, 94 | ], 95 | }, 96 | 97 | // css 98 | { 99 | test: /\.css$/, 100 | loader: ExtractTextPlugin.extract({ 101 | fallbackLoader: 'style-loader', 102 | loader: [ 103 | { 104 | loader: 'css-loader', 105 | query: { 106 | modules: true, 107 | minimize: true, 108 | autoprefixer: false, 109 | importLoaders: 1, 110 | localIdentName: '[hash:base64]', 111 | }, 112 | }, 113 | { 114 | loader: 'postcss-loader', 115 | query: { 116 | plugins: () => [ 117 | postCssImport(), 118 | postCssCssNext({ 119 | browsers: [ 120 | '>1%', 121 | 'last 4 versions', 122 | 'Firefox ESR', 123 | 'not ie < 10', 124 | ], 125 | }), 126 | postCssApply(), 127 | ], 128 | }, 129 | }, 130 | ], 131 | }), 132 | }, 133 | 134 | // json 135 | { 136 | test: /\.json$/, 137 | use: [ 138 | { loader: 'json-loader' }, 139 | ], 140 | }, 141 | 142 | // url 143 | { 144 | test: /\.(mp4|webm|wav|mp3|m4a|aac|oga)(\?.*)?$/, 145 | use: [ 146 | { loader: 'url-loader', options: { limit: 10000 } }, 147 | ], 148 | }, 149 | // file 150 | { 151 | test: /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/, 152 | use: [ 153 | { loader: 'file-loader' }, 154 | ], 155 | }, 156 | ]), 157 | }, 158 | node: { 159 | fs: 'empty', 160 | net: 'empty', 161 | tls: 'empty', 162 | }, 163 | plugins: [ 164 | // loader options 165 | new webpack.LoaderOptionsPlugin({ 166 | debug: false, 167 | minimize: true, 168 | }), 169 | 170 | new webpack.optimize.CommonsChunkPlugin({ 171 | name: 'vendor', 172 | minChunks: module => /node_modules/.test(module.resource), 173 | }), 174 | 175 | // define global variable 176 | new webpack.DefinePlugin(variablesToDefine), 177 | 178 | new webpack.optimize.UglifyJsPlugin({ 179 | compress: { 180 | screw_ie8: true, // React doesn't support IE8 181 | warnings: false, 182 | }, 183 | mangle: { 184 | screw_ie8: true, 185 | }, 186 | output: { 187 | comments: false, 188 | screw_ie8: true, 189 | }, 190 | sourceMap: true, 191 | }), 192 | 193 | new ExtractTextPlugin({ 194 | filename: '[name]-[contenthash:8].css', 195 | allChunks: true, 196 | }), 197 | 198 | new AssetsPlugin(env), 199 | 200 | new CompressionPlugin({ 201 | asset: '[path].gz', 202 | algorithm: 'gzip', 203 | }), 204 | 205 | new LoggerPlugin(logger), 206 | 207 | // Custom plugins 208 | ...(plugins.map( 209 | pluginInstantiator => pluginInstantiator( 210 | env.getConfiguration(), 211 | variablesToDefine 212 | )) 213 | ), 214 | ], 215 | }; 216 | }; 217 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/src/config/defineVariables.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | /** 4 | * Defines variables used by webpack.DefinePlugin 5 | * 6 | * @param {Object} variables 7 | * @param {Object} predefined 8 | * @returns {Object} 9 | */ 10 | module.exports = function defineVariables( 11 | variables: Object, 12 | predefined: Object = {} 13 | ): { [key: string]: string } { 14 | if (!Object.keys(variables).length) { 15 | return {}; 16 | } 17 | 18 | return Object.keys(variables).reduce( 19 | (result: Object, key: string) => { 20 | let value = variables[key]; 21 | 22 | if (typeof value !== 'string' && value !== undefined) { 23 | value = String(value); 24 | } 25 | 26 | return { 27 | ...result, 28 | [key]: JSON.stringify(value), 29 | }; 30 | }, 31 | defineVariables(predefined) 32 | ); 33 | }; 34 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/src/config/server/development.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | const defineVariables = require('../defineVariables'); 3 | const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin'); 4 | const findCacheDir = require('find-cache-dir'); 5 | const LoggerPlugin = require('../../webpack/LoggerPlugin'); 6 | const nodeExternals = require('webpack-node-externals'); 7 | const path = require('path'); 8 | const postCssImport = require('postcss-import'); 9 | const postCssCssNext = require('postcss-cssnext'); 10 | const postCssApply = require('postcss-apply'); 11 | const ServerListenerPlugin = require('../../webpack/ServerListenerPlugin'); 12 | const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin'); 13 | const webpack = require('webpack'); 14 | 15 | module.exports = function createConfig(env: Environment, logger: LogGroup): Object { 16 | const { env: envVariables, settings }: ServerWebpackPluginConfiguration = env.getConfiguration(); 17 | 18 | const serverSettings = settings.server; 19 | let plugins: (() => any)[] = []; 20 | let decorateLoaders: (loaders: Array) => any = loaders => loaders; 21 | let whitelistedExternals = []; 22 | 23 | const pluginsInstatiators = serverSettings.webpackPlugins 24 | && serverSettings.webpackPlugins.development; 25 | 26 | if (Array.isArray(pluginsInstatiators)) { 27 | plugins = pluginsInstatiators; 28 | } 29 | 30 | const loadersDecorator = serverSettings.webpack 31 | && serverSettings.webpack.loadersDecorator 32 | && serverSettings.webpack.loadersDecorator.development; 33 | 34 | if (typeof loadersDecorator === 'function') { 35 | decorateLoaders = loadersDecorator; 36 | } 37 | 38 | const externalsWhitelist = serverSettings.webpack 39 | && serverSettings.webpack.externalsWhitelist 40 | && serverSettings.webpack.externalsWhitelist.development; 41 | 42 | if (Array.isArray(externalsWhitelist)) { 43 | whitelistedExternals = externalsWhitelist; 44 | } 45 | 46 | const variablesToDefine = { 47 | 'process.env': defineVariables(envVariables, { IS_SERVER: true }), 48 | }; 49 | 50 | return { 51 | devtool: 'eval', 52 | entry: [ 53 | require.resolve('./polyfills'), 54 | settings.server.index, 55 | ], 56 | target: 'node', 57 | externals: [nodeExternals({ 58 | whitelist: [ 59 | /\.(eot|woff|woff2|ttf|otf)$/, 60 | /\.(svg|png|jpg|jpeg|gif|ico)$/, 61 | /\.(mp4|mp3|ogg|swf|webp)$/, 62 | /\.(css|scss|sass|sss|less)$/, 63 | ...whitelistedExternals, 64 | ], 65 | })], 66 | output: { 67 | path: settings.server.bundleDir, 68 | pathinfo: true, 69 | filename: 'server.js', 70 | publicPath: settings.server.publicPath || '/', 71 | libraryTarget: 'commonjs2', 72 | }, 73 | resolve: { 74 | extensions: ['.js', '.json', '.jsx'], 75 | }, 76 | // resolve loaders from this plugin directory 77 | resolveLoader: { 78 | modules: [ 79 | path.resolve(__dirname, '../../../node_modules'), 80 | path.resolve(__dirname, '../../../../'), // resolve to project node_modules 81 | ], 82 | }, 83 | module: { 84 | rules: decorateLoaders([ 85 | // eslint 86 | { 87 | enforce: 'pre', 88 | test: /\.(js|jsx)$/, 89 | use: [ 90 | { 91 | loader: 'eslint-loader', 92 | options: { 93 | configFile: settings.eslintrc || require.resolve('eslint-config-js-app'), 94 | useEslintrc: false, 95 | }, 96 | }, 97 | ], 98 | include: settings.appSrc, 99 | }, 100 | 101 | // js 102 | { 103 | test: /\.(js|jsx)$/, 104 | include: settings.appSrc, 105 | use: [ 106 | { 107 | loader: 'babel-loader', 108 | options: { 109 | babelrc: false, 110 | presets: [ 111 | settings.babelrc || require.resolve('babel-preset-js-app/server'), 112 | ], 113 | cacheDirectory: findCacheDir({ 114 | name: 'create-js-app-scripts', 115 | }), 116 | }, 117 | }, 118 | ], 119 | }, 120 | 121 | // css 122 | { 123 | test: /\.css$/, 124 | use: [ 125 | { 126 | loader: 'css-loader/locals', 127 | options: { 128 | autoprefixer: false, 129 | modules: true, 130 | importLoaders: true, 131 | localIdentName: '[name]__[local]__[hash:base64:5]', 132 | }, 133 | }, 134 | { 135 | loader: 'postcss-loader', 136 | options: { 137 | plugins: () => [ 138 | postCssImport(), 139 | postCssCssNext({ 140 | browsers: [ 141 | '>1%', 142 | 'last 4 versions', 143 | 'Firefox ESR', 144 | 'not ie < 10', 145 | ], 146 | }), 147 | postCssApply(), 148 | ], 149 | }, 150 | }, 151 | ], 152 | }, 153 | 154 | // json 155 | { 156 | test: /\.json$/, 157 | use: [ 158 | { loader: 'json-loader' }, 159 | ], 160 | }, 161 | 162 | // url 163 | { 164 | test: /\.(mp4|webm|wav|mp3|m4a|aac|oga)(\?.*)?$/, 165 | use: [ 166 | { loader: 'url-loader', options: { emitFile: false, limit: 10000 } }, 167 | ], 168 | }, 169 | // file 170 | { 171 | test: /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/, 172 | use: [ 173 | { loader: 'file-loader', options: { emitFalse: false } }, 174 | ], 175 | }, 176 | ]), 177 | }, 178 | node: { 179 | console: true, 180 | }, 181 | plugins: [ 182 | // define global variable 183 | new webpack.DefinePlugin(variablesToDefine), 184 | 185 | new webpack.NoEmitOnErrorsPlugin(), 186 | 187 | new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1 }), 188 | 189 | // case sensitive paths 190 | new CaseSensitivePathsPlugin(), 191 | 192 | // watch missing node modules 193 | new WatchMissingNodeModulesPlugin(settings.appNodeModulesDir), 194 | 195 | new LoggerPlugin(logger), 196 | 197 | // Custom plugins 198 | ...(plugins.map( 199 | pluginInstantiator => pluginInstantiator( 200 | env.getConfiguration(), 201 | variablesToDefine 202 | )) 203 | ), 204 | 205 | new ServerListenerPlugin(env, logger), 206 | ], 207 | }; 208 | }; 209 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/src/config/server/polyfills.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable global-require */ 2 | 3 | // Promises are available in node 6 4 | // Object.assign is available in node 6 5 | global.fetch = require('node-fetch'); 6 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/src/config/server/production.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | const defineVariables = require('../defineVariables'); 3 | const LoggerPlugin = require('../../webpack/LoggerPlugin'); 4 | const nodeExternals = require('webpack-node-externals'); 5 | const path = require('path'); 6 | const postCssImport = require('postcss-import'); 7 | const postCssCssNext = require('postcss-cssnext'); 8 | const postCssApply = require('postcss-apply'); 9 | const webpack = require('webpack'); 10 | 11 | module.exports = function createConfig(env: Environment, logger: LogGroup): Object { 12 | const { env: envVariables, settings }: ServerWebpackPluginConfiguration = env.getConfiguration(); 13 | 14 | const serverSettings = settings.server; 15 | let plugins: (() => any)[] = []; 16 | let decorateLoaders: (loaders: Array) => any = loaders => loaders; 17 | let whitelistedExternals = []; 18 | 19 | const pluginsInstatiators = serverSettings.webpackPlugins 20 | && serverSettings.webpackPlugins.production; 21 | 22 | if (Array.isArray(pluginsInstatiators)) { 23 | plugins = pluginsInstatiators; 24 | } 25 | 26 | const loadersDecorator = serverSettings.webpack 27 | && serverSettings.webpack.loadersDecorator 28 | && serverSettings.webpack.loadersDecorator.production; 29 | 30 | if (typeof loadersDecorator === 'function') { 31 | decorateLoaders = loadersDecorator; 32 | } 33 | 34 | const externalsWhitelist = serverSettings.webpack 35 | && serverSettings.webpack.externalsWhitelist 36 | && serverSettings.webpack.externalsWhitelist.production; 37 | 38 | if (Array.isArray(externalsWhitelist)) { 39 | whitelistedExternals = externalsWhitelist; 40 | } 41 | 42 | const variablesToDefine = { 43 | 'process.env': defineVariables(envVariables, { IS_SERVER: true }), 44 | }; 45 | 46 | return { 47 | bail: true, 48 | devtool: 'source-map', 49 | entry: [ 50 | require.resolve('source-map-support/register'), 51 | require.resolve('./polyfills'), 52 | settings.server.index, 53 | ], 54 | target: 'node', 55 | externals: [nodeExternals({ 56 | whitelist: [ 57 | /\.(eot|woff|woff2|ttf|otf)$/, 58 | /\.(svg|png|jpg|jpeg|gif|ico)$/, 59 | /\.(mp4|mp3|ogg|swf|webp)$/, 60 | /\.(css|scss|sass|sss|less)$/, 61 | ...whitelistedExternals, 62 | ], 63 | })], 64 | output: { 65 | path: settings.server.bundleDir, 66 | pathinfo: true, 67 | filename: 'server.js', 68 | publicPath: settings.server.publicPath || '/', 69 | libraryTarget: 'commonjs2', 70 | }, 71 | resolve: { 72 | extensions: ['.js', '.json', '.jsx'], 73 | }, 74 | // resolve loaders from this plugin directory 75 | resolveLoader: { 76 | modules: [ 77 | path.resolve(__dirname, '../../../node_modules'), 78 | path.resolve(__dirname, '../../../../'), // resolve to project node_modules 79 | ], 80 | }, 81 | module: { 82 | rules: decorateLoaders([ 83 | // eslint 84 | { 85 | enforce: 'pre', 86 | test: /\.(js|jsx)$/, 87 | use: [ 88 | { 89 | loader: 'eslint-loader', 90 | options: { 91 | configFile: settings.eslintrc || require.resolve('eslint-config-js-app'), 92 | useEslintrc: false, 93 | }, 94 | }, 95 | ], 96 | include: settings.appSrc, 97 | }, 98 | 99 | // js 100 | { 101 | test: /\.(js|jsx)$/, 102 | include: settings.appSrc, 103 | use: [ 104 | { 105 | loader: 'babel-loader', 106 | options: { 107 | babelrc: false, 108 | presets: [ 109 | settings.babelrc || require.resolve('babel-preset-js-app/server'), 110 | ], 111 | }, 112 | }, 113 | ], 114 | }, 115 | 116 | // css 117 | { 118 | test: /\.css$/, 119 | use: [ 120 | { 121 | loader: 'css-loader/locals', 122 | options: { 123 | modules: true, 124 | minimize: true, 125 | autoprefixer: false, 126 | importLoaders: 1, 127 | localIdentName: '[hash:base64]', 128 | }, 129 | }, 130 | { 131 | loader: 'postcss-loader', 132 | options: { 133 | plugins: () => [ 134 | postCssImport(), 135 | postCssCssNext({ 136 | browsers: [ 137 | '>1%', 138 | 'last 4 versions', 139 | 'Firefox ESR', 140 | 'not ie < 10', 141 | ], 142 | }), 143 | postCssApply(), 144 | ], 145 | }, 146 | }, 147 | ], 148 | }, 149 | 150 | // json 151 | { 152 | test: /\.json$/, 153 | use: [ 154 | { loader: 'json-loader' }, 155 | ], 156 | }, 157 | 158 | // url 159 | { 160 | test: /\.(mp4|webm|wav|mp3|m4a|aac|oga)(\?.*)?$/, 161 | use: [ 162 | { loader: 'url-loader', options: { emitFile: false, limit: 10000 } }, 163 | ], 164 | }, 165 | // file 166 | { 167 | test: /\.(ico|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2)(\?.*)?$/, 168 | use: [ 169 | { loader: 'file-loader', options: { emitFile: false } }, 170 | ], 171 | }, 172 | ]), 173 | }, 174 | node: { 175 | console: true, 176 | }, 177 | plugins: [ 178 | // define global variable 179 | new webpack.DefinePlugin(variablesToDefine), 180 | 181 | new webpack.optimize.LimitChunkCountPlugin({ maxChunks: 1 }), 182 | 183 | new LoggerPlugin(logger), 184 | 185 | // Custom plugins 186 | ...(plugins.map( 187 | pluginInstantiator => pluginInstantiator( 188 | env.getConfiguration(), 189 | variablesToDefine 190 | )) 191 | ), 192 | ], 193 | }; 194 | }; 195 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/src/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | /* eslint-disable global-require, no-console */ 3 | const fs = require('fs-extra'); 4 | const openBrowser = require('react-dev-utils/openBrowser'); 5 | const webpack = require('webpack'); 6 | const WebpackDevServer = require('webpack-dev-server'); 7 | 8 | const configurations = { 9 | client: { 10 | development: require('./config/client/development'), 11 | production: require('./config/client/production'), 12 | }, 13 | server: { 14 | development: require('./config/server/development'), 15 | production: require('./config/server/production'), 16 | }, 17 | }; 18 | 19 | function createRunOnceCompiler(webpackConfig: Object): Promise { 20 | return new Promise((resolve, reject) => { 21 | try { 22 | webpack(webpackConfig, (err, stats) => { 23 | if (err || stats.hasErrors()) { 24 | return reject(err); 25 | } 26 | 27 | return resolve(); 28 | }); 29 | } catch (e) { 30 | reject(e); 31 | } 32 | }); 33 | } 34 | 35 | const plugin: Plugin = ( 36 | env: Environment, 37 | runOnce: boolean = false, 38 | logger: Logger 39 | ): PluginController => { 40 | let clientLogger; 41 | let serverLogger; 42 | const { env: envVariables, settings } = env.getConfiguration(); 43 | let serverCompiler; 44 | let clientDevServer; 45 | 46 | return { 47 | async build() { 48 | clientLogger = logger.createGroup('client'); 49 | serverLogger = logger.createGroup('server'); 50 | const clientConfig = configurations.client[env.getName()](env, clientLogger); 51 | const serverConfig = configurations.server[env.getName()](env, serverLogger); 52 | 53 | fs.removeSync(settings.client.bundleDir); 54 | fs.removeSync(settings.server.bundleDir); 55 | 56 | const compilers = [ 57 | createRunOnceCompiler(clientConfig), 58 | createRunOnceCompiler(serverConfig), 59 | ]; 60 | 61 | return Promise.all(compilers); 62 | }, 63 | 64 | async start() { 65 | clientLogger = logger.createGroup('client'); 66 | serverLogger = logger.createGroup('server'); 67 | const clientConfig = configurations.client[env.getName()](env, clientLogger); 68 | const serverConfig = configurations.server[env.getName()](env, serverLogger); 69 | 70 | return new Promise((resolve, reject) => { 71 | try { 72 | const clientCompiler = webpack(clientConfig); 73 | 74 | clientDevServer = new WebpackDevServer(clientCompiler, { 75 | clientLogLevel: 'none', 76 | contentBase: envVariables.PUBLIC_DIR, 77 | historyApiFallback: { 78 | disableDotRule: true, 79 | }, 80 | https: settings.client.protocol === 'https', 81 | host: 'localhost', 82 | hot: true, 83 | proxy: { 84 | '!(/__webpack_hmr|**/*.*)': `http://localhost:${envVariables.SERVER_PORT}`, 85 | }, 86 | publicPath: '/', 87 | quiet: true, 88 | watchOptions: { 89 | ignored: /node_modules/, 90 | }, 91 | }); 92 | 93 | clientDevServer.listen(envVariables.SERVER_PORT - 1, (err) => { 94 | if (err) { 95 | console.log(err); 96 | return reject(err); 97 | } 98 | 99 | return openBrowser( 100 | `${settings.client.protocol || 'http'}://localhost:${envVariables.SERVER_PORT - 1}/` 101 | ); 102 | }); 103 | 104 | serverCompiler = webpack({ 105 | ...serverConfig, 106 | watchOptions: { 107 | ignored: /node_modules/, 108 | }, 109 | }).watch({}, () => {}); 110 | } catch (e) { 111 | reject(e); 112 | } 113 | 114 | resolve(); 115 | }); 116 | }, 117 | 118 | async terminate() { 119 | clientLogger.remove(); 120 | serverLogger.remove(); 121 | 122 | if (serverCompiler) { 123 | return Promise.all([ 124 | new Promise(resolve => serverCompiler.close(resolve)), 125 | new Promise(resolve => clientDevServer.close(resolve)), 126 | ]); 127 | } 128 | 129 | return true; 130 | }, 131 | }; 132 | }; 133 | 134 | module.exports = plugin; 135 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/src/webpack/AssetsPlugin.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | const fs = require('fs'); 3 | const fsExtra = require('fs-extra'); 4 | const path = require('path'); 5 | const toposort = require('toposort'); 6 | 7 | module.exports = class AssetsPlugin { 8 | assetsPath: string; 9 | env: Environment; 10 | 11 | constructor(env: Environment) { 12 | this.env = env; 13 | this.assetsPath = env.getConfiguration().settings.assetsPath; 14 | } 15 | 16 | apply(compiler: Object): void { 17 | compiler.plugin('done', (stats) => { 18 | const publicPath = compiler.options.output.publicPath; 19 | 20 | const json = stats.toJson(); 21 | const initialChunks = json.chunks.filter(chunk => chunk.initial); 22 | const chunks = {}; 23 | const entryPoints = {}; 24 | 25 | initialChunks.forEach((chunk) => { 26 | chunks[chunk.id] = chunk; 27 | }); 28 | 29 | const edges = []; 30 | 31 | initialChunks.forEach((chunk) => { 32 | if (chunk.parents) { 33 | // Add an edge for each parent (parent -> child) 34 | chunk.parents.forEach((parentId) => { 35 | const parentChunk = chunks[parentId]; 36 | // If the parent chunk does not exist (e.g. because of an excluded chunk) 37 | // we ignore that parent 38 | if (parentChunk) { 39 | edges.push([parentChunk, chunk]); 40 | } 41 | }); 42 | } 43 | }); 44 | 45 | const sorted = toposort.array(initialChunks, edges); 46 | 47 | sorted.forEach((chunk) => { 48 | let map; 49 | 50 | if (!entryPoints[chunk.names[0]]) { 51 | map = entryPoints[chunk.names[0]] = { css: [], js: [] }; 52 | } else { 53 | map = entryPoints[chunk.names[0]]; 54 | } 55 | 56 | const files = Array.isArray(chunk.files) ? chunk.files : [chunk.files]; 57 | 58 | files.forEach((file) => { 59 | const filePath = publicPath + file; 60 | 61 | if (/\.js$/.test(file)) { 62 | map.js.push(filePath); 63 | } else if (/\.css$/.test(file)) { 64 | map.css.push(filePath); 65 | } 66 | }); 67 | }); 68 | 69 | // create build directory just in case 70 | fsExtra.mkdirsSync(path.dirname(this.assetsPath)); 71 | fs.writeFileSync(this.assetsPath, JSON.stringify(entryPoints)); 72 | }); 73 | } 74 | }; 75 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/src/webpack/LoggerPlugin.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | type formatter = () => { errors: string[], warnings: string[] }; 3 | 4 | const formatWebpackMessages: formatter = require('react-dev-utils/formatWebpackMessages'); 5 | 6 | class LoggerPlugin { 7 | logger: LogGroup; 8 | 9 | constructor(logger: LogGroup) { 10 | this.logger = logger; 11 | } 12 | 13 | apply(compiler: Object): void { 14 | compiler.plugin('invalid', () => { 15 | this.logger.clear(); 16 | this.logger.info(`Compiling "${this.logger.getName()}" bundle...`); 17 | }); 18 | 19 | compiler.plugin('done', (stats) => { 20 | const bundleName = this.logger.getName(); 21 | const formattedMessages = formatWebpackMessages(stats.toJson({}, true)); 22 | 23 | this.logger.clear(); 24 | 25 | const { errors, warnings } = formattedMessages; 26 | 27 | if (errors.length) { 28 | this.logger.error(`Bundle "${bundleName}" compiled with errors:\n`); 29 | errors.forEach(error => this.logger.log(error)); 30 | return; 31 | } 32 | 33 | if (warnings.length) { 34 | this.logger.warning(`Bundle "${bundleName}" compiled with warnings:\n`); 35 | warnings.forEach(warning => this.logger.log(warning)); 36 | return; 37 | } 38 | 39 | if (!errors.length && !warnings.length) { 40 | this.logger.success(`Bundle "${bundleName}" successfully compiled`); 41 | } 42 | }); 43 | } 44 | } 45 | 46 | module.exports = LoggerPlugin; 47 | -------------------------------------------------------------------------------- /packages/js-app-plugin-universal-webpack/src/webpack/ServerListenerPlugin.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | /* eslint-disable no-console */ 3 | const path = require('path'); 4 | 5 | class ServerManager { 6 | logger: LogGroup; 7 | server: ?net$Server; 8 | socketId: number; 9 | sockets: { [key: string]: net$Socket }; 10 | 11 | constructor() { 12 | this.socketId = 0; 13 | this.sockets = {}; 14 | } 15 | 16 | async manage(server: ?net$Server) { 17 | if (this.server) { 18 | await this.close(); 19 | } 20 | 21 | this.server = server; 22 | 23 | if (!this.server) { 24 | this.logger.error('Server bundle did not export a http listener'); 25 | this.logger.info('Please export a http listener using `export default` syntax'); 26 | 27 | throw new Error('Server bundle did not export a http listener.'); 28 | } else if (typeof this.server.on !== 'function') { 29 | const message = 'Cannot attach connection handler to listener because it is missing an `on` method'; 30 | this.logger.error(message); 31 | 32 | throw new Error(message); 33 | } 34 | 35 | this.server.unref(); 36 | 37 | const on = this.server 38 | ? this.server.on.bind(this.server) 39 | : () => {}; 40 | 41 | // listen to all connections so we can destroy them on restart 42 | on('connection', (socket: net$Socket) => { 43 | socket.unref(); 44 | 45 | const socketId = this.socketId = this.socketId + 1; 46 | this.sockets[socketId.toString()] = socket; 47 | 48 | socket.on('close', () => delete this.sockets[socketId.toString()]); 49 | }); 50 | } 51 | 52 | setLogger(logger: LogGroup) { 53 | this.logger = logger; 54 | } 55 | 56 | async close() { 57 | if (this.server) { 58 | Object.keys(this.sockets).forEach((socketId) => { 59 | const socket = this.sockets[socketId.toString()]; 60 | socket.destroy(); 61 | }); 62 | this.sockets = {}; 63 | const close = this.server 64 | ? this.server.close.bind(this.server) 65 | : cb => cb(); 66 | 67 | await new Promise(resolve => close(resolve)); 68 | 69 | this.server = null; 70 | } 71 | } 72 | } 73 | 74 | const sharedServerManager = new ServerManager(); 75 | 76 | module.exports = class ServerListenerPlugin { 77 | env: Environment; 78 | logger: LogGroup; 79 | serverManager: Object; 80 | 81 | constructor( 82 | env: Environment, 83 | logger: LogGroup, 84 | serverManager: ServerManager = sharedServerManager 85 | ) { 86 | this.env = env; 87 | this.logger = logger; 88 | this.serverManager = serverManager; 89 | 90 | this.serverManager.setLogger(logger); 91 | 92 | process.on('SIGINT', () => { 93 | this.serverManager.close(); 94 | }); 95 | } 96 | 97 | apply(compiler: Object): void { 98 | compiler.plugin('done', async (stats) => { 99 | const bundleName = this.logger.getName(); 100 | 101 | if (stats.hasErrors()) { 102 | this.logger.error(`Bundle "${bundleName}" compiled with errors, keeping previous server instance running`); 103 | return; 104 | } 105 | 106 | // Clear out all files from this build 107 | Object.keys(require.cache).forEach((modulePath) => { 108 | if (modulePath.indexOf(compiler.options.output.path) === 0) { 109 | delete require.cache[modulePath]; 110 | } 111 | }); 112 | 113 | const serverBuildPath = path.resolve( 114 | compiler.options.output.path, 115 | compiler.options.output.filename 116 | ); 117 | 118 | await this.serverManager.close(); 119 | 120 | // start server 121 | try { 122 | // const shouldOpenBrowser = !this.runningServer; 123 | 124 | const server = require(serverBuildPath).default; // eslint-disable-line global-require, max-len 125 | 126 | await this.serverManager.manage(server); 127 | 128 | const port = this.env.getConfiguration().env.SERVER_PORT; 129 | const url = `http://localhost:${port}`; 130 | 131 | this.logger.info(`\tServer is listening on ${url}`); 132 | } catch (e) { 133 | this.logger.error('Error during server bundle start/restart'); 134 | this.logger.log(e); 135 | 136 | throw e; 137 | } 138 | }); 139 | } 140 | }; 141 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/.app.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | 3 | module.exports = { 4 | env: { 5 | // everything here will be passed directly to webpack build 6 | // using DefinePlugin 7 | ASSETS_PATH: path.resolve(__dirname, './build/assets.json'), 8 | ASSETS_DIR: path.resolve(__dirname, './build/client'), 9 | PUBLIC_DIR: path.resolve(__dirname, './public'), 10 | SERVER_PORT: 3000 11 | }, 12 | plugins: [require('js-app-plugin-universal-webpack')], 13 | settings: { 14 | client: { 15 | index: path.resolve(__dirname, './src/client/index.js'), 16 | bundleDir: path.resolve(__dirname, './build/client'), 17 | webpackPlugins: { 18 | development: [ 19 | /* (configuration: Configuration, variables: Object) => typeof WebpackPlugin */ 20 | ], 21 | production: [], 22 | }, 23 | }, 24 | server: { 25 | index: path.resolve(__dirname, './src/server/index.js'), 26 | bundleDir: path.resolve(__dirname, './build/server'), 27 | webpackPlugins: { 28 | development: [], 29 | production: [], 30 | }, 31 | } 32 | }, 33 | }; 34 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "js-app" 3 | } 4 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/.flowconfig: -------------------------------------------------------------------------------- 1 | [include] 2 | 3 | [ignore] 4 | 5 | # Including these files causes issues. 6 | .*/node_modules/fbjs/.* 7 | .*/create-js-app-scripts/.* 8 | .*/js-app-plugin-universal-webpack/.* 9 | 10 | [libs] 11 | 12 | flow/definitions/ 13 | 14 | [options] 15 | esproposal.class_static_fields=enable 16 | esproposal.class_instance_fields=enable 17 | module.ignore_non_literal_requires=true 18 | module.name_mapper='^\(.*\)\.\(eot\|gif\|ico\|jpg\|jpeg\|otf\|mp3\|mp4\|ogg\|png\|svg\|swf\|ttf\|webp\|woff\|woff2\)$' -> '/flow/stubs/WebpackAsset.js.flow' 19 | module.name_mapper='^\(.*\)\.\(css\|less\|sass\|scss\)$' -> '/flow/stubs/WebpackAsset.css.flow' 20 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/README.md: -------------------------------------------------------------------------------- 1 | # Universal template 2 | 3 | Universal project template using Create JS App. 4 | 5 | ## Development 6 | 7 | `npm start` 8 | `npm run lint` 9 | `npm run flow` 10 | `npm test` 11 | 12 | ## Production 13 | 14 | `npm build` 15 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/flow/definitions/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michalkvasnicak/create-js-app/64c908bba278f69af29f028164128ae911ed315f/packages/js-app-template-universal/flow/definitions/.gitkeep -------------------------------------------------------------------------------- /packages/js-app-template-universal/flow/stubs/WebpackAsset.css.flow: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | declare export default Object 4 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/flow/stubs/WebpackAsset.js.flow: -------------------------------------------------------------------------------- 1 | // @flow 2 | 3 | declare export default string 4 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/gitignore: -------------------------------------------------------------------------------- 1 | build 2 | node_modules 3 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "js-app-template-universal", 3 | "version": "0.14.0", 4 | "description": "Universal project template used by Create JS App", 5 | "license": "MIT", 6 | "author": "Michal Kvasničák (https://twitter.com/@michalkvasnicak)", 7 | "repository": "michalkvasnicak/create-js-app", 8 | "bugs": { 9 | "url": "https://github.com/michalkvasnicak/create-js-app/issues" 10 | }, 11 | "engines": { 12 | "node": ">=6.0" 13 | }, 14 | "engineStrict": true, 15 | "files": [ 16 | ".app.js", 17 | ".flowconfig", 18 | "gitignore", 19 | ".eslintrc", 20 | "README.md", 21 | "flow", 22 | "public", 23 | "src", 24 | "postcss.config.js" 25 | ], 26 | "dependencies": { 27 | "koa": "2.0", 28 | "koa-convert": "1.2.0", 29 | "koa-static-cache": "3.1.7", 30 | "normalize.css": "5.0.0", 31 | "react": "15.4.2", 32 | "react-dom": "15.4.2", 33 | "react-helmet": "3.2.2" 34 | }, 35 | "devDependencies": { 36 | "babel-eslint": "7.0.0", 37 | "create-js-app-scripts": "^0.15.0", 38 | "eslint": "3.14.1", 39 | "eslint-config-airbnb": "14.0.0", 40 | "eslint-config-js-app": "^0.3.0", 41 | "eslint-loader": "1.6.1", 42 | "eslint-plugin-flowtype": "2.30.0", 43 | "eslint-plugin-import": "2.2.0", 44 | "eslint-plugin-jsx-a11y": "3.0.2", 45 | "eslint-plugin-react": "6.9.0", 46 | "flow-bin": "0.38.0", 47 | "js-app-plugin-universal-webpack": "^0.15.0", 48 | "react-test-renderer": "15.4.2" 49 | }, 50 | "scripts": { 51 | "build": "create-js-app-scripts build", 52 | "lint": "node ./node_modules/.bin/eslint src", 53 | "flow": "node ./node_modules/.bin/flow check", 54 | "start": "create-js-app-scripts start", 55 | "test": "create-js-app-scripts test" 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | 'postcss-import': {}, 4 | 'postcss-cssnext': { 5 | browsers: [ 6 | '>1%', 7 | 'last 4 versions', 8 | 'Firefox ESR', 9 | 'not ie < 10', 10 | ], 11 | }, 12 | 'postcss-apply': {}, 13 | }, 14 | }; 15 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/michalkvasnicak/create-js-app/64c908bba278f69af29f028164128ae911ed315f/packages/js-app-template-universal/public/favicon.ico -------------------------------------------------------------------------------- /packages/js-app-template-universal/src/client/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import React from 'react'; 3 | import { render } from 'react-dom'; 4 | import App from '../shared/App'; 5 | 6 | render( 7 | , 8 | document.querySelector('#app') 9 | ); 10 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/src/server/assets.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | import fs from 'fs'; 4 | import { ASSETS_PATH, IS_DEVELOPMENT } from './config'; 5 | 6 | type AssetsMap = {| 7 | scripts: string[], 8 | styles: string[] 9 | |}; 10 | 11 | type Chunk = { 12 | css: string[], 13 | js: string[] 14 | }; 15 | 16 | let assetsMap: AssetsMap = { 17 | scripts: [], 18 | styles: [], 19 | }; 20 | let loadedAssets = {}; 21 | 22 | function hasAssets(): boolean { 23 | return assetsMap.scripts.length > 0 || assetsMap.styles.length > 0; 24 | } 25 | 26 | export default function assets(): AssetsMap { 27 | if (hasAssets() && !IS_DEVELOPMENT) { 28 | return assetsMap; 29 | } 30 | 31 | try { 32 | loadedAssets = JSON.parse(fs.readFileSync(ASSETS_PATH, 'utf8')); 33 | } catch (e) { 34 | // do nothing 35 | } 36 | 37 | const chunks: Chunk[] = Object.keys(loadedAssets).map(key => loadedAssets[key]); 38 | assetsMap = chunks.reduce( 39 | (acc: AssetsMap, chunk: Chunk) => { 40 | if (chunk.js) { 41 | acc.scripts.push(...chunk.js); 42 | } 43 | 44 | if (chunk.css) { 45 | acc.styles.push(...chunk.css); 46 | } 47 | 48 | return acc; 49 | }, 50 | { scripts: [], styles: [] } 51 | ); 52 | 53 | return assetsMap; 54 | } 55 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/src/server/config.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | 3 | function notEmpty(value: ?string): string { 4 | if (value == null) { 5 | throw new Error('Has to be nonempty string'); 6 | } 7 | 8 | return value; 9 | } 10 | 11 | export const ASSETS_PATH: string = notEmpty(process.env.ASSETS_PATH); 12 | export const ASSETS_DIR: string = notEmpty(process.env.ASSETS_DIR); 13 | export const IS_DEVELOPMENT: boolean = notEmpty(process.env.NODE_ENV) === 'development'; 14 | export const PUBLIC_DIR: string = notEmpty(process.env.PUBLIC_DIR); 15 | export const SERVER_PORT: number = parseInt(notEmpty(process.env.SERVER_PORT), 10); 16 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/src/server/index.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import convert from 'koa-convert'; 3 | import Koa from 'koa'; 4 | import React from 'react'; 5 | import staticCache from 'koa-static-cache'; 6 | 7 | import App from '../shared/App'; 8 | import renderHtml from './renderHtml'; 9 | import { ASSETS_DIR, PUBLIC_DIR, SERVER_PORT } from './config'; 10 | 11 | const app = new Koa(); 12 | 13 | // serve static files 14 | app.use(convert(staticCache( 15 | PUBLIC_DIR, { 16 | buffer: true, 17 | gzip: true, 18 | usePrecompiledGzip: true, 19 | prefix: '/public', 20 | dynamic: true, 21 | } 22 | ))); 23 | app.use(convert(staticCache( 24 | ASSETS_DIR, { 25 | buffer: true, 26 | gzip: false, 27 | usePrecompiledGzip: true, 28 | prefix: '/', 29 | dynamic: true, 30 | } 31 | ))); 32 | 33 | // render app 34 | app.use( 35 | async (ctx: Object, next: () => Promise) => { 36 | ctx.status = 200; // eslint-disable-line no-param-reassign 37 | ctx.body = renderHtml(); // eslint-disable-line no-param-reassign 38 | 39 | return next(); 40 | } 41 | ); 42 | 43 | const listener = app.listen(SERVER_PORT); 44 | 45 | export default listener; 46 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/src/server/renderHtml.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import assets from './assets'; 3 | import Helmet from 'react-helmet'; 4 | import { renderToString } from 'react-dom/server'; 5 | 6 | function styleTags(styles: Array) { 7 | return styles 8 | .map(style => 9 | `` 10 | ) 11 | .join('\n'); 12 | } 13 | 14 | function scriptTags(scripts: Array) { 15 | return scripts 16 | .map(script => 17 | `` 18 | ) 19 | .join('\n'); 20 | } 21 | 22 | const styles = styleTags(assets().styles); 23 | const scripts = scriptTags(assets().scripts); 24 | 25 | export default function renderHtml(element: ?Object, initialState: ?Object): string { 26 | const reactRenderString = element 27 | ? renderToString(element) 28 | : null; 29 | 30 | const helmet = element 31 | ? Helmet.rewind() 32 | : null; 33 | 34 | return ` 35 | 36 | 37 | 38 | 39 | 40 | 41 | ${helmet ? helmet.title.toString() : ''} 42 | ${helmet ? helmet.meta.toString() : ''} 43 | ${helmet ? helmet.link.toString() : ''} 44 | 45 | ${styles} 46 | ${helmet ? helmet.style.toString() : ''} 47 | 48 | 49 |
${reactRenderString || ''}
50 | 51 | 56 | 57 | ${scripts} 58 | ${helmet ? helmet.script.toString() : ''} 59 | 60 | `; 61 | } 62 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/src/shared/App.css: -------------------------------------------------------------------------------- 1 | .red { 2 | color: red; 3 | } 4 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/src/shared/App.js: -------------------------------------------------------------------------------- 1 | /* @flow */ 2 | import 'normalize.css'; 3 | import Helmet from 'react-helmet'; 4 | import React from 'react'; 5 | import styles from './App.css'; 6 | 7 | export default function App(/* props: Object */) { 8 | return ( 9 |
10 | 11 |

Hello World

12 |
13 | ); 14 | } 15 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/src/shared/App.spec.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import renderer from 'react-test-renderer'; 3 | 4 | import App from './App'; 5 | 6 | test('renders App', () => { 7 | const component = renderer.create(); 8 | const tree = component.toJSON(); 9 | expect(tree).toMatchSnapshot(); 10 | }); 11 | -------------------------------------------------------------------------------- /packages/js-app-template-universal/src/shared/__snapshots__/App.spec.js.snap: -------------------------------------------------------------------------------- 1 | exports[`test renders App 1`] = ` 2 |
3 |

5 | Hello World 6 |

7 |
8 | `; 9 | -------------------------------------------------------------------------------- /tasks/replace-package.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const fs = require('fs'); 4 | const path = require('path'); 5 | const argv = process.argv.slice(2); 6 | const package = argv[0]; 7 | const packageName = argv[1]; 8 | const packagePath = argv[2]; 9 | 10 | const packageJsonPath = path.join(package, argv[3] || 'package.json'); 11 | const packageJson = JSON.parse( 12 | fs.readFileSync(packageJsonPath, { encoding: 'utf8' }) 13 | ); 14 | 15 | let changed = false; 16 | 17 | if (packageJson.dependencies[packageName]) { 18 | changed = true; 19 | packageJson.dependencies[packageName] = `file:${packagePath}`; 20 | } 21 | 22 | if (packageJson.devDependencies[packageName]) { 23 | changed = true; 24 | packageJson.devDependencies[packageName] = `file:${packagePath}`; 25 | } 26 | 27 | changed && fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2)); 28 | -------------------------------------------------------------------------------- /tasks/resolve-package.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const path = require('path'); 4 | const argv = process.argv.slice(2); 5 | 6 | console.log(path.resolve(process.cwd(), 'packages', argv[0])); 7 | -------------------------------------------------------------------------------- /tasks/test.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | cd "$(dirname "$0")" 4 | 5 | function cleanup { 6 | echo 'Cleaning up.' 7 | rm -rf $temp_path 8 | } 9 | 10 | # Error messages are redirected to stderr 11 | function handle_error { 12 | echo "$(basename $0): ERROR! An error was encountered executing line $1." 1>&2; 13 | cleanup 14 | echo 'Exiting with error.' 1>&2; 15 | exit 1 16 | } 17 | 18 | function handle_exit { 19 | cleanup 20 | echo 'Exiting without error.' 1>&2; 21 | exit 22 | } 23 | 24 | function replace_package { 25 | ./tasks/replace-package.sh $* 26 | } 27 | 28 | function lerna { 29 | $temp_path/node_modules/.bin/lerna $* 30 | } 31 | 32 | # Exit the script with a helpful error message when any error is encountered 33 | trap 'set +x; handle_error $LINENO $BASH_COMMAND' ERR 34 | 35 | # Cleanup before exit on any termination signal 36 | trap 'set +x; handle_exit' SIGQUIT SIGTERM SIGINT SIGKILL SIGHUP 37 | 38 | # echo every command 39 | set -x 40 | 41 | # substitute paths to packages to local directories 42 | cd .. 43 | 44 | # Install the CLI in a temporary location 45 | # http://unix.stackexchange.com/a/84980 46 | temp_path=`mktemp -d 2>/dev/null || mktemp -d -t 'temp_cli_path'` 47 | 48 | # copy current folder to test folder 49 | rsync -av --exclude="**/node_modules/**" --exclude="**.git/*" --exclude="**.idea/**" . $temp_path 50 | 51 | cd $temp_path 52 | 53 | # install dependencies 54 | yarn install 55 | 56 | # bootstrap packages ( this will build them ) 57 | lerna bootstrap 58 | 59 | # run lint 60 | yarn lint 61 | 62 | # run flow 63 | yarn flow 64 | lerna run flow 65 | 66 | # now substitute paths to packages 67 | babel_preset_js_app=$(./tasks/resolve-package.sh babel-preset-js-app) 68 | create_js_app_scripts=$(./tasks/resolve-package.sh create-js-app-scripts) 69 | eslint_config_js_app=$(./tasks/resolve-package.sh eslint-config-js-app) 70 | js_app_plugin_universal_webpack=$(./tasks/resolve-package.sh js-app-plugin-universal-webpack) 71 | js_app_template_universal=$(./tasks/resolve-package.sh js-app-template-universal) 72 | 73 | replace_package $create_js_app_scripts babel-preset-js-app $babel_preset_js_app 74 | replace_package $js_app_plugin_universal_webpack babel-preset-js-app $babel_preset_js_app 75 | replace_package $js_app_template_universal eslint-config-js-app $eslint_config_js_app 76 | replace_package $js_app_template_universal create-js-app-scripts $create_js_app_scripts 77 | replace_package $js_app_template_universal js-app-plugin-universal-webpack $js_app_plugin_universal_webpack 78 | 79 | # create application using create command 80 | node packages/create-js-app/index.js create test-app --template=$js_app_template_universal 81 | 82 | # go to project dir 83 | cd test-app 84 | 85 | # lint project 86 | yarn lint 87 | 88 | # try to flow type check 89 | yarn flow 90 | lerna run flow 91 | 92 | # run tests 93 | CI=true yarn test 94 | CI=true lerna run test 95 | 96 | # try to build production build 97 | yarn build 98 | 99 | # cleanup 100 | cleanup 101 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | # yarn v0.25.2 4 | # node v7.6.0 5 | 6 | 7 | JSONStream@^1.0.4: 8 | version "1.3.1" 9 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.1.tgz#707f761e01dae9e16f1bcf93703b78c70966579a" 10 | dependencies: 11 | jsonparse "^1.2.0" 12 | through ">=2.2.7 <3" 13 | 14 | add-stream@^1.0.0: 15 | version "1.0.0" 16 | resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" 17 | 18 | align-text@^0.1.1, align-text@^0.1.3: 19 | version "0.1.4" 20 | resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" 21 | dependencies: 22 | kind-of "^3.0.2" 23 | longest "^1.0.1" 24 | repeat-string "^1.5.2" 25 | 26 | amdefine@>=0.0.4: 27 | version "1.0.1" 28 | resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" 29 | 30 | ansi-escapes@^1.0.0, ansi-escapes@^1.1.0: 31 | version "1.4.0" 32 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 33 | 34 | ansi-regex@^2.0.0: 35 | version "2.1.1" 36 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 37 | 38 | ansi-styles@^2.2.1: 39 | version "2.2.1" 40 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 41 | 42 | app-root-path@^2.0.0: 43 | version "2.0.1" 44 | resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" 45 | 46 | aproba@^1.0.3: 47 | version "1.1.1" 48 | resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" 49 | 50 | are-we-there-yet@~1.1.2: 51 | version "1.1.4" 52 | resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" 53 | dependencies: 54 | delegates "^1.0.0" 55 | readable-stream "^2.0.6" 56 | 57 | argparse@^1.0.7: 58 | version "1.0.9" 59 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 60 | dependencies: 61 | sprintf-js "~1.0.2" 62 | 63 | array-find-index@^1.0.1: 64 | version "1.0.2" 65 | resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" 66 | 67 | array-ify@^1.0.0: 68 | version "1.0.0" 69 | resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" 70 | 71 | array-union@^1.0.1: 72 | version "1.0.2" 73 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 74 | dependencies: 75 | array-uniq "^1.0.1" 76 | 77 | array-uniq@^1.0.1: 78 | version "1.0.3" 79 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 80 | 81 | async@^1.4.0, async@^1.5.0: 82 | version "1.5.2" 83 | resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 84 | 85 | balanced-match@^0.4.1: 86 | version "0.4.2" 87 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 88 | 89 | brace-expansion@^1.1.7: 90 | version "1.1.7" 91 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" 92 | dependencies: 93 | balanced-match "^0.4.1" 94 | concat-map "0.0.1" 95 | 96 | buffer-shims@^1.0.0: 97 | version "1.0.0" 98 | resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" 99 | 100 | builtin-modules@^1.0.0: 101 | version "1.1.1" 102 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 103 | 104 | byline@^5.0.0: 105 | version "5.0.0" 106 | resolved "https://registry.yarnpkg.com/byline/-/byline-5.0.0.tgz#741c5216468eadc457b03410118ad77de8c1ddb1" 107 | 108 | camelcase-keys@^2.0.0: 109 | version "2.1.0" 110 | resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" 111 | dependencies: 112 | camelcase "^2.0.0" 113 | map-obj "^1.0.0" 114 | 115 | camelcase@^1.0.2: 116 | version "1.2.1" 117 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" 118 | 119 | camelcase@^2.0.0: 120 | version "2.1.1" 121 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" 122 | 123 | camelcase@^3.0.0: 124 | version "3.0.0" 125 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" 126 | 127 | camelcase@^4.1.0: 128 | version "4.1.0" 129 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 130 | 131 | center-align@^0.1.1: 132 | version "0.1.3" 133 | resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" 134 | dependencies: 135 | align-text "^0.1.3" 136 | lazy-cache "^1.0.3" 137 | 138 | chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: 139 | version "1.1.3" 140 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 141 | dependencies: 142 | ansi-styles "^2.2.1" 143 | escape-string-regexp "^1.0.2" 144 | has-ansi "^2.0.0" 145 | strip-ansi "^3.0.0" 146 | supports-color "^2.0.0" 147 | 148 | ci-info@^1.0.0: 149 | version "1.0.0" 150 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.0.0.tgz#dc5285f2b4e251821683681c381c3388f46ec534" 151 | 152 | cli-cursor@^1.0.2: 153 | version "1.0.2" 154 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 155 | dependencies: 156 | restore-cursor "^1.0.1" 157 | 158 | cli-cursor@^2.1.0: 159 | version "2.1.0" 160 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 161 | dependencies: 162 | restore-cursor "^2.0.0" 163 | 164 | cli-spinners@^0.1.2: 165 | version "0.1.2" 166 | resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" 167 | 168 | cli-truncate@^0.2.1: 169 | version "0.2.1" 170 | resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" 171 | dependencies: 172 | slice-ansi "0.0.4" 173 | string-width "^1.0.1" 174 | 175 | cli-width@^2.0.0: 176 | version "2.1.0" 177 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.1.0.tgz#b234ca209b29ef66fc518d9b98d5847b00edf00a" 178 | 179 | cliui@^2.1.0: 180 | version "2.1.0" 181 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" 182 | dependencies: 183 | center-align "^0.1.1" 184 | right-align "^0.1.1" 185 | wordwrap "0.0.2" 186 | 187 | cliui@^3.2.0: 188 | version "3.2.0" 189 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" 190 | dependencies: 191 | string-width "^1.0.1" 192 | strip-ansi "^3.0.1" 193 | wrap-ansi "^2.0.0" 194 | 195 | clone@^1.0.2: 196 | version "1.0.2" 197 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" 198 | 199 | cmd-shim@^2.0.2: 200 | version "2.0.2" 201 | resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-2.0.2.tgz#6fcbda99483a8fd15d7d30a196ca69d688a2efdb" 202 | dependencies: 203 | graceful-fs "^4.1.2" 204 | mkdirp "~0.5.0" 205 | 206 | code-point-at@^1.0.0: 207 | version "1.1.0" 208 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 209 | 210 | columnify@^1.5.4: 211 | version "1.5.4" 212 | resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" 213 | dependencies: 214 | strip-ansi "^3.0.0" 215 | wcwidth "^1.0.0" 216 | 217 | command-join@^2.0.0: 218 | version "2.0.0" 219 | resolved "https://registry.yarnpkg.com/command-join/-/command-join-2.0.0.tgz#52e8b984f4872d952ff1bdc8b98397d27c7144cf" 220 | 221 | commander@^2.9.0: 222 | version "2.9.0" 223 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" 224 | dependencies: 225 | graceful-readlink ">= 1.0.0" 226 | 227 | compare-func@^1.3.1: 228 | version "1.3.2" 229 | resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" 230 | dependencies: 231 | array-ify "^1.0.0" 232 | dot-prop "^3.0.0" 233 | 234 | concat-map@0.0.1: 235 | version "0.0.1" 236 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 237 | 238 | concat-stream@^1.4.10: 239 | version "1.6.0" 240 | resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" 241 | dependencies: 242 | inherits "^2.0.3" 243 | readable-stream "^2.2.2" 244 | typedarray "^0.0.6" 245 | 246 | console-control-strings@^1.0.0, console-control-strings@~1.1.0: 247 | version "1.1.0" 248 | resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 249 | 250 | conventional-changelog-angular@^1.3.4: 251 | version "1.3.4" 252 | resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.3.4.tgz#7d7cdfbd358948312904d02229a61fd6075cf455" 253 | dependencies: 254 | compare-func "^1.3.1" 255 | github-url-from-git "^1.4.0" 256 | q "^1.4.1" 257 | 258 | conventional-changelog-atom@^0.1.0: 259 | version "0.1.0" 260 | resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-0.1.0.tgz#67a47c66a42b2f8909ef1587c9989ae1de730b92" 261 | dependencies: 262 | q "^1.4.1" 263 | 264 | conventional-changelog-cli@^1.3.1: 265 | version "1.3.1" 266 | resolved "https://registry.yarnpkg.com/conventional-changelog-cli/-/conventional-changelog-cli-1.3.1.tgz#1cd5a9dbae25ffb5ffe67afef1e136eaceefd2d5" 267 | dependencies: 268 | add-stream "^1.0.0" 269 | conventional-changelog "^1.1.3" 270 | lodash "^4.1.0" 271 | meow "^3.7.0" 272 | tempfile "^1.1.1" 273 | 274 | conventional-changelog-codemirror@^0.1.0: 275 | version "0.1.0" 276 | resolved "https://registry.yarnpkg.com/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.1.0.tgz#7577a591dbf9b538e7a150a7ee62f65a2872b334" 277 | dependencies: 278 | q "^1.4.1" 279 | 280 | conventional-changelog-core@^1.9.0: 281 | version "1.9.0" 282 | resolved "https://registry.yarnpkg.com/conventional-changelog-core/-/conventional-changelog-core-1.9.0.tgz#de5dfbc091847656508d4a389e35c9a1bc49e7f4" 283 | dependencies: 284 | conventional-changelog-writer "^1.1.0" 285 | conventional-commits-parser "^1.0.0" 286 | dateformat "^1.0.12" 287 | get-pkg-repo "^1.0.0" 288 | git-raw-commits "^1.2.0" 289 | git-remote-origin-url "^2.0.0" 290 | git-semver-tags "^1.2.0" 291 | lodash "^4.0.0" 292 | normalize-package-data "^2.3.5" 293 | q "^1.4.1" 294 | read-pkg "^1.1.0" 295 | read-pkg-up "^1.0.1" 296 | through2 "^2.0.0" 297 | 298 | conventional-changelog-ember@^0.2.6: 299 | version "0.2.6" 300 | resolved "https://registry.yarnpkg.com/conventional-changelog-ember/-/conventional-changelog-ember-0.2.6.tgz#8b7355419f5127493c4c562473ab2fc792f1c2b6" 301 | dependencies: 302 | q "^1.4.1" 303 | 304 | conventional-changelog-eslint@^0.1.0: 305 | version "0.1.0" 306 | resolved "https://registry.yarnpkg.com/conventional-changelog-eslint/-/conventional-changelog-eslint-0.1.0.tgz#a52411e999e0501ce500b856b0a643d0330907e2" 307 | dependencies: 308 | q "^1.4.1" 309 | 310 | conventional-changelog-express@^0.1.0: 311 | version "0.1.0" 312 | resolved "https://registry.yarnpkg.com/conventional-changelog-express/-/conventional-changelog-express-0.1.0.tgz#55c6c841c811962036c037bdbd964a54ae310fce" 313 | dependencies: 314 | q "^1.4.1" 315 | 316 | conventional-changelog-jquery@^0.1.0: 317 | version "0.1.0" 318 | resolved "https://registry.yarnpkg.com/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz#0208397162e3846986e71273b6c79c5b5f80f510" 319 | dependencies: 320 | q "^1.4.1" 321 | 322 | conventional-changelog-jscs@^0.1.0: 323 | version "0.1.0" 324 | resolved "https://registry.yarnpkg.com/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz#0479eb443cc7d72c58bf0bcf0ef1d444a92f0e5c" 325 | dependencies: 326 | q "^1.4.1" 327 | 328 | conventional-changelog-jshint@^0.1.0: 329 | version "0.1.0" 330 | resolved "https://registry.yarnpkg.com/conventional-changelog-jshint/-/conventional-changelog-jshint-0.1.0.tgz#00cab8e9a3317487abd94c4d84671342918d2a07" 331 | dependencies: 332 | compare-func "^1.3.1" 333 | q "^1.4.1" 334 | 335 | conventional-changelog-writer@^1.1.0: 336 | version "1.4.1" 337 | resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-1.4.1.tgz#3f4cb4d003ebb56989d30d345893b52a43639c8e" 338 | dependencies: 339 | compare-func "^1.3.1" 340 | conventional-commits-filter "^1.0.0" 341 | dateformat "^1.0.11" 342 | handlebars "^4.0.2" 343 | json-stringify-safe "^5.0.1" 344 | lodash "^4.0.0" 345 | meow "^3.3.0" 346 | semver "^5.0.1" 347 | split "^1.0.0" 348 | through2 "^2.0.0" 349 | 350 | conventional-changelog@^1.1.3: 351 | version "1.1.4" 352 | resolved "https://registry.yarnpkg.com/conventional-changelog/-/conventional-changelog-1.1.4.tgz#108bc750c2a317e200e2f9b413caaa1f8c7efa3b" 353 | dependencies: 354 | conventional-changelog-angular "^1.3.4" 355 | conventional-changelog-atom "^0.1.0" 356 | conventional-changelog-codemirror "^0.1.0" 357 | conventional-changelog-core "^1.9.0" 358 | conventional-changelog-ember "^0.2.6" 359 | conventional-changelog-eslint "^0.1.0" 360 | conventional-changelog-express "^0.1.0" 361 | conventional-changelog-jquery "^0.1.0" 362 | conventional-changelog-jscs "^0.1.0" 363 | conventional-changelog-jshint "^0.1.0" 364 | 365 | conventional-commits-filter@^1.0.0: 366 | version "1.0.0" 367 | resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-1.0.0.tgz#6fc2a659372bc3f2339cf9ffff7e1b0344b93039" 368 | dependencies: 369 | is-subset "^0.1.1" 370 | modify-values "^1.0.0" 371 | 372 | conventional-commits-parser@^1.0.0, conventional-commits-parser@^1.0.1: 373 | version "1.3.0" 374 | resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-1.3.0.tgz#e327b53194e1a7ad5dc63479ee9099a52b024865" 375 | dependencies: 376 | JSONStream "^1.0.4" 377 | is-text-path "^1.0.0" 378 | lodash "^4.2.1" 379 | meow "^3.3.0" 380 | split2 "^2.0.0" 381 | through2 "^2.0.0" 382 | trim-off-newlines "^1.0.0" 383 | 384 | conventional-recommended-bump@^1.0.0: 385 | version "1.0.0" 386 | resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-1.0.0.tgz#6d303a27837ae938b7c68c8ddeed34559b4b0789" 387 | dependencies: 388 | concat-stream "^1.4.10" 389 | conventional-commits-filter "^1.0.0" 390 | conventional-commits-parser "^1.0.1" 391 | git-raw-commits "^1.2.0" 392 | git-semver-tags "^1.2.0" 393 | meow "^3.3.0" 394 | object-assign "^4.0.1" 395 | 396 | core-util-is@~1.0.0: 397 | version "1.0.2" 398 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 399 | 400 | cosmiconfig@^1.1.0: 401 | version "1.1.0" 402 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-1.1.0.tgz#0dea0f9804efdfb929fbb1b188e25553ea053d37" 403 | dependencies: 404 | graceful-fs "^4.1.2" 405 | js-yaml "^3.4.3" 406 | minimist "^1.2.0" 407 | object-assign "^4.0.1" 408 | os-homedir "^1.0.1" 409 | parse-json "^2.2.0" 410 | pinkie-promise "^2.0.0" 411 | require-from-string "^1.1.0" 412 | 413 | cross-spawn@^4.0.0: 414 | version "4.0.2" 415 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" 416 | dependencies: 417 | lru-cache "^4.0.1" 418 | which "^1.2.9" 419 | 420 | cross-spawn@^5.0.1: 421 | version "5.1.0" 422 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 423 | dependencies: 424 | lru-cache "^4.0.1" 425 | shebang-command "^1.2.0" 426 | which "^1.2.9" 427 | 428 | currently-unhandled@^0.4.1: 429 | version "0.4.1" 430 | resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" 431 | dependencies: 432 | array-find-index "^1.0.1" 433 | 434 | dargs@^4.0.1: 435 | version "4.1.0" 436 | resolved "https://registry.yarnpkg.com/dargs/-/dargs-4.1.0.tgz#03a9dbb4b5c2f139bf14ae53f0b8a2a6a86f4e17" 437 | dependencies: 438 | number-is-nan "^1.0.0" 439 | 440 | date-fns@^1.27.2: 441 | version "1.28.5" 442 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.5.tgz#257cfc45d322df45ef5658665967ee841cd73faf" 443 | 444 | dateformat@^1.0.11, dateformat@^1.0.12: 445 | version "1.0.12" 446 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" 447 | dependencies: 448 | get-stdin "^4.0.1" 449 | meow "^3.3.0" 450 | 451 | decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: 452 | version "1.2.0" 453 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 454 | 455 | dedent@^0.7.0: 456 | version "0.7.0" 457 | resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" 458 | 459 | defaults@^1.0.3: 460 | version "1.0.3" 461 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 462 | dependencies: 463 | clone "^1.0.2" 464 | 465 | define-properties@^1.1.2: 466 | version "1.1.2" 467 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 468 | dependencies: 469 | foreach "^2.0.5" 470 | object-keys "^1.0.8" 471 | 472 | delegates@^1.0.0: 473 | version "1.0.0" 474 | resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" 475 | 476 | detect-indent@^5.0.0: 477 | version "5.0.0" 478 | resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" 479 | 480 | dot-prop@^3.0.0: 481 | version "3.0.0" 482 | resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-3.0.0.tgz#1b708af094a49c9a0e7dbcad790aba539dac1177" 483 | dependencies: 484 | is-obj "^1.0.0" 485 | 486 | duplexer@^0.1.1: 487 | version "0.1.1" 488 | resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" 489 | 490 | elegant-spinner@^1.0.1: 491 | version "1.0.1" 492 | resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" 493 | 494 | encoding@^0.1.11: 495 | version "0.1.12" 496 | resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" 497 | dependencies: 498 | iconv-lite "~0.4.13" 499 | 500 | error-ex@^1.2.0: 501 | version "1.3.0" 502 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.0.tgz#e67b43f3e82c96ea3a584ffee0b9fc3325d802d9" 503 | dependencies: 504 | is-arrayish "^0.2.1" 505 | 506 | es-abstract@^1.4.3: 507 | version "1.7.0" 508 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c" 509 | dependencies: 510 | es-to-primitive "^1.1.1" 511 | function-bind "^1.1.0" 512 | is-callable "^1.1.3" 513 | is-regex "^1.0.3" 514 | 515 | es-to-primitive@^1.1.1: 516 | version "1.1.1" 517 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 518 | dependencies: 519 | is-callable "^1.1.1" 520 | is-date-object "^1.0.1" 521 | is-symbol "^1.0.1" 522 | 523 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 524 | version "1.0.5" 525 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 526 | 527 | esprima@^2.6.0: 528 | version "2.7.3" 529 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" 530 | 531 | execa@^0.5.0: 532 | version "0.5.1" 533 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.5.1.tgz#de3fb85cb8d6e91c85bcbceb164581785cb57b36" 534 | dependencies: 535 | cross-spawn "^4.0.0" 536 | get-stream "^2.2.0" 537 | is-stream "^1.1.0" 538 | npm-run-path "^2.0.0" 539 | p-finally "^1.0.0" 540 | signal-exit "^3.0.0" 541 | strip-eof "^1.0.0" 542 | 543 | execa@^0.6.0, execa@^0.6.3: 544 | version "0.6.3" 545 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.6.3.tgz#57b69a594f081759c69e5370f0d17b9cb11658fe" 546 | dependencies: 547 | cross-spawn "^5.0.1" 548 | get-stream "^3.0.0" 549 | is-stream "^1.1.0" 550 | npm-run-path "^2.0.0" 551 | p-finally "^1.0.0" 552 | signal-exit "^3.0.0" 553 | strip-eof "^1.0.0" 554 | 555 | exit-hook@^1.0.0: 556 | version "1.1.1" 557 | resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 558 | 559 | external-editor@^2.0.1: 560 | version "2.0.4" 561 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.0.4.tgz#1ed9199da9cbfe2ef2f7a31b2fde8b0d12368972" 562 | dependencies: 563 | iconv-lite "^0.4.17" 564 | jschardet "^1.4.2" 565 | tmp "^0.0.31" 566 | 567 | figures@^1.7.0: 568 | version "1.7.0" 569 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 570 | dependencies: 571 | escape-string-regexp "^1.0.5" 572 | object-assign "^4.1.0" 573 | 574 | figures@^2.0.0: 575 | version "2.0.0" 576 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 577 | dependencies: 578 | escape-string-regexp "^1.0.5" 579 | 580 | find-parent-dir@^0.3.0: 581 | version "0.3.0" 582 | resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" 583 | 584 | find-up@^1.0.0: 585 | version "1.1.2" 586 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" 587 | dependencies: 588 | path-exists "^2.0.0" 589 | pinkie-promise "^2.0.0" 590 | 591 | find-up@^2.0.0, find-up@^2.1.0: 592 | version "2.1.0" 593 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" 594 | dependencies: 595 | locate-path "^2.0.0" 596 | 597 | flow-bin@^0.47.0: 598 | version "0.47.0" 599 | resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.47.0.tgz#a2a08ab3e0d1f1cb57d17e27b30b118b62fda367" 600 | 601 | foreach@^2.0.5: 602 | version "2.0.5" 603 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 604 | 605 | fs-extra@^3.0.1: 606 | version "3.0.1" 607 | resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" 608 | dependencies: 609 | graceful-fs "^4.1.2" 610 | jsonfile "^3.0.0" 611 | universalify "^0.1.0" 612 | 613 | fs.realpath@^1.0.0: 614 | version "1.0.0" 615 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 616 | 617 | function-bind@^1.0.2, function-bind@^1.1.0: 618 | version "1.1.0" 619 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.0.tgz#16176714c801798e4e8f2cf7f7529467bb4a5771" 620 | 621 | gauge@~2.7.3: 622 | version "2.7.4" 623 | resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" 624 | dependencies: 625 | aproba "^1.0.3" 626 | console-control-strings "^1.0.0" 627 | has-unicode "^2.0.0" 628 | object-assign "^4.1.0" 629 | signal-exit "^3.0.0" 630 | string-width "^1.0.1" 631 | strip-ansi "^3.0.1" 632 | wide-align "^1.1.0" 633 | 634 | get-caller-file@^1.0.1: 635 | version "1.0.2" 636 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" 637 | 638 | get-pkg-repo@^1.0.0: 639 | version "1.3.0" 640 | resolved "https://registry.yarnpkg.com/get-pkg-repo/-/get-pkg-repo-1.3.0.tgz#43c6b4c048b75dd604fc5388edecde557f6335df" 641 | dependencies: 642 | hosted-git-info "^2.1.4" 643 | meow "^3.3.0" 644 | normalize-package-data "^2.3.0" 645 | parse-github-repo-url "^1.3.0" 646 | through2 "^2.0.0" 647 | 648 | get-port@^3.1.0: 649 | version "3.1.0" 650 | resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.1.0.tgz#ef01b18a84ca6486970ff99e54446141a73ffd3e" 651 | 652 | get-stdin@^4.0.1: 653 | version "4.0.1" 654 | resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" 655 | 656 | get-stream@^2.2.0: 657 | version "2.3.1" 658 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-2.3.1.tgz#5f38f93f346009666ee0150a054167f91bdd95de" 659 | dependencies: 660 | object-assign "^4.0.1" 661 | pinkie-promise "^2.0.0" 662 | 663 | get-stream@^3.0.0: 664 | version "3.0.0" 665 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 666 | 667 | git-raw-commits@^1.2.0: 668 | version "1.2.0" 669 | resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-1.2.0.tgz#0f3a8bfd99ae0f2d8b9224d58892975e9a52d03c" 670 | dependencies: 671 | dargs "^4.0.1" 672 | lodash.template "^4.0.2" 673 | meow "^3.3.0" 674 | split2 "^2.0.0" 675 | through2 "^2.0.0" 676 | 677 | git-remote-origin-url@^2.0.0: 678 | version "2.0.0" 679 | resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" 680 | dependencies: 681 | gitconfiglocal "^1.0.0" 682 | pify "^2.3.0" 683 | 684 | git-semver-tags@^1.2.0: 685 | version "1.2.0" 686 | resolved "https://registry.yarnpkg.com/git-semver-tags/-/git-semver-tags-1.2.0.tgz#b31fd02c8ab578bd6c9b5cacca5e1c64c1177ac1" 687 | dependencies: 688 | meow "^3.3.0" 689 | semver "^5.0.1" 690 | 691 | gitconfiglocal@^1.0.0: 692 | version "1.0.0" 693 | resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" 694 | dependencies: 695 | ini "^1.3.2" 696 | 697 | github-url-from-git@^1.4.0: 698 | version "1.5.0" 699 | resolved "https://registry.yarnpkg.com/github-url-from-git/-/github-url-from-git-1.5.0.tgz#f985fedcc0a9aa579dc88d7aff068d55cc6251a0" 700 | 701 | glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 702 | version "7.1.2" 703 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 704 | dependencies: 705 | fs.realpath "^1.0.0" 706 | inflight "^1.0.4" 707 | inherits "2" 708 | minimatch "^3.0.4" 709 | once "^1.3.0" 710 | path-is-absolute "^1.0.0" 711 | 712 | globby@^6.1.0: 713 | version "6.1.0" 714 | resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" 715 | dependencies: 716 | array-union "^1.0.1" 717 | glob "^7.0.3" 718 | object-assign "^4.0.1" 719 | pify "^2.0.0" 720 | pinkie-promise "^2.0.0" 721 | 722 | graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: 723 | version "4.1.11" 724 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 725 | 726 | "graceful-readlink@>= 1.0.0": 727 | version "1.0.1" 728 | resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" 729 | 730 | handlebars@^4.0.2: 731 | version "4.0.10" 732 | resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f" 733 | dependencies: 734 | async "^1.4.0" 735 | optimist "^0.6.1" 736 | source-map "^0.4.4" 737 | optionalDependencies: 738 | uglify-js "^2.6" 739 | 740 | has-ansi@^2.0.0: 741 | version "2.0.0" 742 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 743 | dependencies: 744 | ansi-regex "^2.0.0" 745 | 746 | has-unicode@^2.0.0: 747 | version "2.0.1" 748 | resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" 749 | 750 | has@^1.0.1: 751 | version "1.0.1" 752 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 753 | dependencies: 754 | function-bind "^1.0.2" 755 | 756 | hosted-git-info@^2.1.4: 757 | version "2.1.5" 758 | resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.1.5.tgz#0ba81d90da2e25ab34a332e6ec77936e1598118b" 759 | 760 | husky@^0.13.4: 761 | version "0.13.4" 762 | resolved "https://registry.yarnpkg.com/husky/-/husky-0.13.4.tgz#48785c5028de3452a51c48c12c4f94b2124a1407" 763 | dependencies: 764 | chalk "^1.1.3" 765 | find-parent-dir "^0.3.0" 766 | is-ci "^1.0.9" 767 | normalize-path "^1.0.0" 768 | 769 | iconv-lite@^0.4.17, iconv-lite@~0.4.13: 770 | version "0.4.17" 771 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.17.tgz#4fdaa3b38acbc2c031b045d0edcdfe1ecab18c8d" 772 | 773 | imurmurhash@^0.1.4: 774 | version "0.1.4" 775 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 776 | 777 | indent-string@^2.1.0: 778 | version "2.1.0" 779 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 780 | dependencies: 781 | repeating "^2.0.0" 782 | 783 | indent-string@^3.0.0: 784 | version "3.1.0" 785 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.1.0.tgz#08ff4334603388399b329e6b9538dc7a3cf5de7d" 786 | 787 | inflight@^1.0.4: 788 | version "1.0.6" 789 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 790 | dependencies: 791 | once "^1.3.0" 792 | wrappy "1" 793 | 794 | inherits@2, inherits@^2.0.3, inherits@~2.0.1: 795 | version "2.0.3" 796 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 797 | 798 | ini@^1.3.2: 799 | version "1.3.4" 800 | resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" 801 | 802 | inquirer@^3.0.6: 803 | version "3.0.6" 804 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.0.6.tgz#e04aaa9d05b7a3cb9b0f407d04375f0447190347" 805 | dependencies: 806 | ansi-escapes "^1.1.0" 807 | chalk "^1.0.0" 808 | cli-cursor "^2.1.0" 809 | cli-width "^2.0.0" 810 | external-editor "^2.0.1" 811 | figures "^2.0.0" 812 | lodash "^4.3.0" 813 | mute-stream "0.0.7" 814 | run-async "^2.2.0" 815 | rx "^4.1.0" 816 | string-width "^2.0.0" 817 | strip-ansi "^3.0.0" 818 | through "^2.3.6" 819 | 820 | invert-kv@^1.0.0: 821 | version "1.0.0" 822 | resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" 823 | 824 | is-arrayish@^0.2.1: 825 | version "0.2.1" 826 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 827 | 828 | is-buffer@^1.1.5: 829 | version "1.1.5" 830 | resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" 831 | 832 | is-builtin-module@^1.0.0: 833 | version "1.0.0" 834 | resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" 835 | dependencies: 836 | builtin-modules "^1.0.0" 837 | 838 | is-callable@^1.1.1, is-callable@^1.1.3: 839 | version "1.1.3" 840 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 841 | 842 | is-ci@^1.0.10, is-ci@^1.0.9: 843 | version "1.0.10" 844 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" 845 | dependencies: 846 | ci-info "^1.0.0" 847 | 848 | is-date-object@^1.0.1: 849 | version "1.0.1" 850 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 851 | 852 | is-finite@^1.0.0: 853 | version "1.0.2" 854 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 855 | dependencies: 856 | number-is-nan "^1.0.0" 857 | 858 | is-fullwidth-code-point@^1.0.0: 859 | version "1.0.0" 860 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 861 | dependencies: 862 | number-is-nan "^1.0.0" 863 | 864 | is-fullwidth-code-point@^2.0.0: 865 | version "2.0.0" 866 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 867 | 868 | is-obj@^1.0.0: 869 | version "1.0.1" 870 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 871 | 872 | is-plain-obj@^1.0.0: 873 | version "1.1.0" 874 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 875 | 876 | is-promise@^2.1.0: 877 | version "2.1.0" 878 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 879 | 880 | is-regex@^1.0.3: 881 | version "1.0.4" 882 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 883 | dependencies: 884 | has "^1.0.1" 885 | 886 | is-stream@^1.0.1, is-stream@^1.1.0: 887 | version "1.1.0" 888 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 889 | 890 | is-subset@^0.1.1: 891 | version "0.1.1" 892 | resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" 893 | 894 | is-symbol@^1.0.1: 895 | version "1.0.1" 896 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 897 | 898 | is-text-path@^1.0.0: 899 | version "1.0.1" 900 | resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" 901 | dependencies: 902 | text-extensions "^1.0.0" 903 | 904 | is-utf8@^0.2.0: 905 | version "0.2.1" 906 | resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" 907 | 908 | isarray@~1.0.0: 909 | version "1.0.0" 910 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 911 | 912 | isexe@^1.1.1: 913 | version "1.1.2" 914 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-1.1.2.tgz#36f3e22e60750920f5e7241a476a8c6a42275ad0" 915 | 916 | js-yaml@^3.4.3: 917 | version "3.7.0" 918 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.7.0.tgz#5c967ddd837a9bfdca5f2de84253abe8a1c03b80" 919 | dependencies: 920 | argparse "^1.0.7" 921 | esprima "^2.6.0" 922 | 923 | jschardet@^1.4.2: 924 | version "1.4.2" 925 | resolved "https://registry.yarnpkg.com/jschardet/-/jschardet-1.4.2.tgz#2aa107f142af4121d145659d44f50830961e699a" 926 | 927 | json-stringify-safe@^5.0.1: 928 | version "5.0.1" 929 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 930 | 931 | jsonfile@^3.0.0: 932 | version "3.0.0" 933 | resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-3.0.0.tgz#92e7c7444e5ffd5fa32e6a9ae8b85034df8347d0" 934 | optionalDependencies: 935 | graceful-fs "^4.1.6" 936 | 937 | jsonparse@^1.2.0: 938 | version "1.3.1" 939 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" 940 | 941 | kind-of@^3.0.2: 942 | version "3.2.2" 943 | resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" 944 | dependencies: 945 | is-buffer "^1.1.5" 946 | 947 | lazy-cache@^1.0.3: 948 | version "1.0.4" 949 | resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" 950 | 951 | lcid@^1.0.0: 952 | version "1.0.0" 953 | resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" 954 | dependencies: 955 | invert-kv "^1.0.0" 956 | 957 | lerna-changelog@^0.5.0: 958 | version "0.5.0" 959 | resolved "https://registry.yarnpkg.com/lerna-changelog/-/lerna-changelog-0.5.0.tgz#1617a8193a1309451ffa1e686b425faf0424b3f8" 960 | dependencies: 961 | chalk "^1.1.3" 962 | mkdirp "^0.5.1" 963 | node-fetch "^1.7.0" 964 | p-map "^1.1.1" 965 | progress "^1.1.8" 966 | string.prototype.padend "^3.0.0" 967 | yargs "^6.6.0" 968 | 969 | lerna@^2.0.0-rc.5: 970 | version "2.0.0-rc.5" 971 | resolved "https://registry.yarnpkg.com/lerna/-/lerna-2.0.0-rc.5.tgz#b59d168caaac6e3443078c1bce194208c9aa3090" 972 | dependencies: 973 | async "^1.5.0" 974 | chalk "^1.1.1" 975 | cmd-shim "^2.0.2" 976 | columnify "^1.5.4" 977 | command-join "^2.0.0" 978 | conventional-changelog-cli "^1.3.1" 979 | conventional-recommended-bump "^1.0.0" 980 | dedent "^0.7.0" 981 | execa "^0.6.3" 982 | find-up "^2.1.0" 983 | fs-extra "^3.0.1" 984 | get-port "^3.1.0" 985 | glob "^7.1.2" 986 | globby "^6.1.0" 987 | graceful-fs "^4.1.11" 988 | inquirer "^3.0.6" 989 | is-ci "^1.0.10" 990 | load-json-file "^2.0.0" 991 | lodash "^4.17.4" 992 | minimatch "^3.0.4" 993 | npmlog "^4.1.0" 994 | p-finally "^1.0.0" 995 | path-exists "^3.0.0" 996 | read-cmd-shim "^1.0.1" 997 | read-pkg "^2.0.0" 998 | rimraf "^2.6.1" 999 | safe-buffer "^5.0.1" 1000 | semver "^5.1.0" 1001 | signal-exit "^3.0.2" 1002 | strong-log-transformer "^1.0.6" 1003 | temp-write "^3.3.0" 1004 | write-file-atomic "^2.1.0" 1005 | write-json-file "^2.1.0" 1006 | write-pkg "^3.0.1" 1007 | yargs "^8.0.1" 1008 | 1009 | lint-staged@^3.6.0: 1010 | version "3.6.0" 1011 | resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-3.6.0.tgz#cda8f0bef16e7928cc14b735186ae12cd662599c" 1012 | dependencies: 1013 | app-root-path "^2.0.0" 1014 | cosmiconfig "^1.1.0" 1015 | execa "^0.6.0" 1016 | listr "^0.12.0" 1017 | lodash.chunk "^4.2.0" 1018 | minimatch "^3.0.0" 1019 | npm-which "^3.0.1" 1020 | p-map "^1.1.1" 1021 | staged-git-files "0.0.4" 1022 | 1023 | listr-silent-renderer@^1.1.1: 1024 | version "1.1.1" 1025 | resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" 1026 | 1027 | listr-update-renderer@^0.2.0: 1028 | version "0.2.0" 1029 | resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz#ca80e1779b4e70266807e8eed1ad6abe398550f9" 1030 | dependencies: 1031 | chalk "^1.1.3" 1032 | cli-truncate "^0.2.1" 1033 | elegant-spinner "^1.0.1" 1034 | figures "^1.7.0" 1035 | indent-string "^3.0.0" 1036 | log-symbols "^1.0.2" 1037 | log-update "^1.0.2" 1038 | strip-ansi "^3.0.1" 1039 | 1040 | listr-verbose-renderer@^0.4.0: 1041 | version "0.4.0" 1042 | resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.0.tgz#44dc01bb0c34a03c572154d4d08cde9b1dc5620f" 1043 | dependencies: 1044 | chalk "^1.1.3" 1045 | cli-cursor "^1.0.2" 1046 | date-fns "^1.27.2" 1047 | figures "^1.7.0" 1048 | 1049 | listr@^0.12.0: 1050 | version "0.12.0" 1051 | resolved "https://registry.yarnpkg.com/listr/-/listr-0.12.0.tgz#6bce2c0f5603fa49580ea17cd6a00cc0e5fa451a" 1052 | dependencies: 1053 | chalk "^1.1.3" 1054 | cli-truncate "^0.2.1" 1055 | figures "^1.7.0" 1056 | indent-string "^2.1.0" 1057 | is-promise "^2.1.0" 1058 | is-stream "^1.1.0" 1059 | listr-silent-renderer "^1.1.1" 1060 | listr-update-renderer "^0.2.0" 1061 | listr-verbose-renderer "^0.4.0" 1062 | log-symbols "^1.0.2" 1063 | log-update "^1.0.2" 1064 | ora "^0.2.3" 1065 | p-map "^1.1.1" 1066 | rxjs "^5.0.0-beta.11" 1067 | stream-to-observable "^0.1.0" 1068 | strip-ansi "^3.0.1" 1069 | 1070 | load-json-file@^1.0.0: 1071 | version "1.1.0" 1072 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" 1073 | dependencies: 1074 | graceful-fs "^4.1.2" 1075 | parse-json "^2.2.0" 1076 | pify "^2.0.0" 1077 | pinkie-promise "^2.0.0" 1078 | strip-bom "^2.0.0" 1079 | 1080 | load-json-file@^2.0.0: 1081 | version "2.0.0" 1082 | resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" 1083 | dependencies: 1084 | graceful-fs "^4.1.2" 1085 | parse-json "^2.2.0" 1086 | pify "^2.0.0" 1087 | strip-bom "^3.0.0" 1088 | 1089 | locate-path@^2.0.0: 1090 | version "2.0.0" 1091 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 1092 | dependencies: 1093 | p-locate "^2.0.0" 1094 | path-exists "^3.0.0" 1095 | 1096 | lodash._reinterpolate@~3.0.0: 1097 | version "3.0.0" 1098 | resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" 1099 | 1100 | lodash.chunk@^4.2.0: 1101 | version "4.2.0" 1102 | resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc" 1103 | 1104 | lodash.template@^4.0.2: 1105 | version "4.4.0" 1106 | resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" 1107 | dependencies: 1108 | lodash._reinterpolate "~3.0.0" 1109 | lodash.templatesettings "^4.0.0" 1110 | 1111 | lodash.templatesettings@^4.0.0: 1112 | version "4.1.0" 1113 | resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" 1114 | dependencies: 1115 | lodash._reinterpolate "~3.0.0" 1116 | 1117 | lodash@^4.0.0, lodash@^4.1.0, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0: 1118 | version "4.17.4" 1119 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" 1120 | 1121 | log-symbols@^1.0.2: 1122 | version "1.0.2" 1123 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" 1124 | dependencies: 1125 | chalk "^1.0.0" 1126 | 1127 | log-update@^1.0.2: 1128 | version "1.0.2" 1129 | resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" 1130 | dependencies: 1131 | ansi-escapes "^1.0.0" 1132 | cli-cursor "^1.0.2" 1133 | 1134 | longest@^1.0.1: 1135 | version "1.0.1" 1136 | resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" 1137 | 1138 | loud-rejection@^1.0.0: 1139 | version "1.6.0" 1140 | resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" 1141 | dependencies: 1142 | currently-unhandled "^0.4.1" 1143 | signal-exit "^3.0.0" 1144 | 1145 | lru-cache@^4.0.1: 1146 | version "4.0.2" 1147 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" 1148 | dependencies: 1149 | pseudomap "^1.0.1" 1150 | yallist "^2.0.0" 1151 | 1152 | make-dir@^1.0.0: 1153 | version "1.0.0" 1154 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" 1155 | dependencies: 1156 | pify "^2.3.0" 1157 | 1158 | map-obj@^1.0.0, map-obj@^1.0.1: 1159 | version "1.0.1" 1160 | resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" 1161 | 1162 | mem@^1.1.0: 1163 | version "1.1.0" 1164 | resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" 1165 | dependencies: 1166 | mimic-fn "^1.0.0" 1167 | 1168 | meow@^3.3.0, meow@^3.7.0: 1169 | version "3.7.0" 1170 | resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" 1171 | dependencies: 1172 | camelcase-keys "^2.0.0" 1173 | decamelize "^1.1.2" 1174 | loud-rejection "^1.0.0" 1175 | map-obj "^1.0.1" 1176 | minimist "^1.1.3" 1177 | normalize-package-data "^2.3.4" 1178 | object-assign "^4.0.1" 1179 | read-pkg-up "^1.0.1" 1180 | redent "^1.0.0" 1181 | trim-newlines "^1.0.0" 1182 | 1183 | mimic-fn@^1.0.0: 1184 | version "1.1.0" 1185 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" 1186 | 1187 | minimatch@^3.0.0, minimatch@^3.0.4: 1188 | version "3.0.4" 1189 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 1190 | dependencies: 1191 | brace-expansion "^1.1.7" 1192 | 1193 | minimist@0.0.8, minimist@~0.0.1: 1194 | version "0.0.8" 1195 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 1196 | 1197 | minimist@^0.1.0: 1198 | version "0.1.0" 1199 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" 1200 | 1201 | minimist@^1.1.3, minimist@^1.2.0: 1202 | version "1.2.0" 1203 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 1204 | 1205 | mkdirp@^0.5.1, mkdirp@~0.5.0: 1206 | version "0.5.1" 1207 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 1208 | dependencies: 1209 | minimist "0.0.8" 1210 | 1211 | modify-values@^1.0.0: 1212 | version "1.0.0" 1213 | resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.0.tgz#e2b6cdeb9ce19f99317a53722f3dbf5df5eaaab2" 1214 | 1215 | moment@^2.6.0: 1216 | version "2.18.1" 1217 | resolved "https://registry.yarnpkg.com/moment/-/moment-2.18.1.tgz#c36193dd3ce1c2eed2adb7c802dbbc77a81b1c0f" 1218 | 1219 | mute-stream@0.0.7: 1220 | version "0.0.7" 1221 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 1222 | 1223 | node-fetch@^1.7.0: 1224 | version "1.7.0" 1225 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.0.tgz#3ff6c56544f9b7fb00682338bb55ee6f54a8a0ef" 1226 | dependencies: 1227 | encoding "^0.1.11" 1228 | is-stream "^1.0.1" 1229 | 1230 | normalize-package-data@^2.3.0, normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.3.5: 1231 | version "2.3.5" 1232 | resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" 1233 | dependencies: 1234 | hosted-git-info "^2.1.4" 1235 | is-builtin-module "^1.0.0" 1236 | semver "2 || 3 || 4 || 5" 1237 | validate-npm-package-license "^3.0.1" 1238 | 1239 | normalize-path@^1.0.0: 1240 | version "1.0.0" 1241 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" 1242 | 1243 | npm-path@^2.0.2: 1244 | version "2.0.3" 1245 | resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.3.tgz#15cff4e1c89a38da77f56f6055b24f975dfb2bbe" 1246 | dependencies: 1247 | which "^1.2.10" 1248 | 1249 | npm-run-path@^2.0.0: 1250 | version "2.0.2" 1251 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 1252 | dependencies: 1253 | path-key "^2.0.0" 1254 | 1255 | npm-which@^3.0.1: 1256 | version "3.0.1" 1257 | resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" 1258 | dependencies: 1259 | commander "^2.9.0" 1260 | npm-path "^2.0.2" 1261 | which "^1.2.10" 1262 | 1263 | npmlog@^4.1.0: 1264 | version "4.1.0" 1265 | resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" 1266 | dependencies: 1267 | are-we-there-yet "~1.1.2" 1268 | console-control-strings "~1.1.0" 1269 | gauge "~2.7.3" 1270 | set-blocking "~2.0.0" 1271 | 1272 | number-is-nan@^1.0.0: 1273 | version "1.0.1" 1274 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 1275 | 1276 | object-assign@^4.0.1, object-assign@^4.1.0: 1277 | version "4.1.1" 1278 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 1279 | 1280 | object-keys@^1.0.8: 1281 | version "1.0.11" 1282 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 1283 | 1284 | once@^1.3.0: 1285 | version "1.4.0" 1286 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1287 | dependencies: 1288 | wrappy "1" 1289 | 1290 | onetime@^1.0.0: 1291 | version "1.1.0" 1292 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 1293 | 1294 | onetime@^2.0.0: 1295 | version "2.0.1" 1296 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 1297 | dependencies: 1298 | mimic-fn "^1.0.0" 1299 | 1300 | optimist@^0.6.1: 1301 | version "0.6.1" 1302 | resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" 1303 | dependencies: 1304 | minimist "~0.0.1" 1305 | wordwrap "~0.0.2" 1306 | 1307 | ora@^0.2.3: 1308 | version "0.2.3" 1309 | resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" 1310 | dependencies: 1311 | chalk "^1.1.1" 1312 | cli-cursor "^1.0.2" 1313 | cli-spinners "^0.1.2" 1314 | object-assign "^4.0.1" 1315 | 1316 | os-homedir@^1.0.1: 1317 | version "1.0.2" 1318 | resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" 1319 | 1320 | os-locale@^1.4.0: 1321 | version "1.4.0" 1322 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" 1323 | dependencies: 1324 | lcid "^1.0.0" 1325 | 1326 | os-locale@^2.0.0: 1327 | version "2.0.0" 1328 | resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.0.0.tgz#15918ded510522b81ee7ae5a309d54f639fc39a4" 1329 | dependencies: 1330 | execa "^0.5.0" 1331 | lcid "^1.0.0" 1332 | mem "^1.1.0" 1333 | 1334 | os-tmpdir@^1.0.0, os-tmpdir@~1.0.1: 1335 | version "1.0.2" 1336 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 1337 | 1338 | p-finally@^1.0.0: 1339 | version "1.0.0" 1340 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 1341 | 1342 | p-limit@^1.1.0: 1343 | version "1.1.0" 1344 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" 1345 | 1346 | p-locate@^2.0.0: 1347 | version "2.0.0" 1348 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" 1349 | dependencies: 1350 | p-limit "^1.1.0" 1351 | 1352 | p-map@^1.1.1: 1353 | version "1.1.1" 1354 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.1.1.tgz#05f5e4ae97a068371bc2a5cc86bfbdbc19c4ae7a" 1355 | 1356 | parse-github-repo-url@^1.3.0: 1357 | version "1.4.0" 1358 | resolved "https://registry.yarnpkg.com/parse-github-repo-url/-/parse-github-repo-url-1.4.0.tgz#286c53e2c9962e0641649ee3ac9508fca4dd959c" 1359 | 1360 | parse-json@^2.2.0: 1361 | version "2.2.0" 1362 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" 1363 | dependencies: 1364 | error-ex "^1.2.0" 1365 | 1366 | path-exists@^2.0.0: 1367 | version "2.1.0" 1368 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" 1369 | dependencies: 1370 | pinkie-promise "^2.0.0" 1371 | 1372 | path-exists@^3.0.0: 1373 | version "3.0.0" 1374 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" 1375 | 1376 | path-is-absolute@^1.0.0: 1377 | version "1.0.1" 1378 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1379 | 1380 | path-key@^2.0.0: 1381 | version "2.0.1" 1382 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 1383 | 1384 | path-type@^1.0.0: 1385 | version "1.1.0" 1386 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" 1387 | dependencies: 1388 | graceful-fs "^4.1.2" 1389 | pify "^2.0.0" 1390 | pinkie-promise "^2.0.0" 1391 | 1392 | path-type@^2.0.0: 1393 | version "2.0.0" 1394 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" 1395 | dependencies: 1396 | pify "^2.0.0" 1397 | 1398 | pify@^2.0.0, pify@^2.2.0, pify@^2.3.0: 1399 | version "2.3.0" 1400 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 1401 | 1402 | pinkie-promise@^2.0.0: 1403 | version "2.0.1" 1404 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 1405 | dependencies: 1406 | pinkie "^2.0.0" 1407 | 1408 | pinkie@^2.0.0: 1409 | version "2.0.4" 1410 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 1411 | 1412 | prettier@^1.4.1: 1413 | version "1.4.1" 1414 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.4.1.tgz#3526cc46aea102e980db5b70cabe2020910ef142" 1415 | 1416 | process-nextick-args@~1.0.6: 1417 | version "1.0.7" 1418 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" 1419 | 1420 | progress@^1.1.8: 1421 | version "1.1.8" 1422 | resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" 1423 | 1424 | pseudomap@^1.0.1: 1425 | version "1.0.2" 1426 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 1427 | 1428 | q@^1.4.1: 1429 | version "1.5.0" 1430 | resolved "https://registry.yarnpkg.com/q/-/q-1.5.0.tgz#dd01bac9d06d30e6f219aecb8253ee9ebdc308f1" 1431 | 1432 | read-cmd-shim@^1.0.1: 1433 | version "1.0.1" 1434 | resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz#2d5d157786a37c055d22077c32c53f8329e91c7b" 1435 | dependencies: 1436 | graceful-fs "^4.1.2" 1437 | 1438 | read-pkg-up@^1.0.1: 1439 | version "1.0.1" 1440 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" 1441 | dependencies: 1442 | find-up "^1.0.0" 1443 | read-pkg "^1.0.0" 1444 | 1445 | read-pkg-up@^2.0.0: 1446 | version "2.0.0" 1447 | resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" 1448 | dependencies: 1449 | find-up "^2.0.0" 1450 | read-pkg "^2.0.0" 1451 | 1452 | read-pkg@^1.0.0, read-pkg@^1.1.0: 1453 | version "1.1.0" 1454 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" 1455 | dependencies: 1456 | load-json-file "^1.0.0" 1457 | normalize-package-data "^2.3.2" 1458 | path-type "^1.0.0" 1459 | 1460 | read-pkg@^2.0.0: 1461 | version "2.0.0" 1462 | resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" 1463 | dependencies: 1464 | load-json-file "^2.0.0" 1465 | normalize-package-data "^2.3.2" 1466 | path-type "^2.0.0" 1467 | 1468 | readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2: 1469 | version "2.2.2" 1470 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.2.tgz#a9e6fec3c7dda85f8bb1b3ba7028604556fc825e" 1471 | dependencies: 1472 | buffer-shims "^1.0.0" 1473 | core-util-is "~1.0.0" 1474 | inherits "~2.0.1" 1475 | isarray "~1.0.0" 1476 | process-nextick-args "~1.0.6" 1477 | string_decoder "~0.10.x" 1478 | util-deprecate "~1.0.1" 1479 | 1480 | redent@^1.0.0: 1481 | version "1.0.0" 1482 | resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" 1483 | dependencies: 1484 | indent-string "^2.1.0" 1485 | strip-indent "^1.0.1" 1486 | 1487 | repeat-string@^1.5.2: 1488 | version "1.6.1" 1489 | resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" 1490 | 1491 | repeating@^2.0.0: 1492 | version "2.0.1" 1493 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 1494 | dependencies: 1495 | is-finite "^1.0.0" 1496 | 1497 | require-directory@^2.1.1: 1498 | version "2.1.1" 1499 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1500 | 1501 | require-from-string@^1.1.0: 1502 | version "1.2.1" 1503 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-1.2.1.tgz#529c9ccef27380adfec9a2f965b649bbee636418" 1504 | 1505 | require-main-filename@^1.0.1: 1506 | version "1.0.1" 1507 | resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" 1508 | 1509 | restore-cursor@^1.0.1: 1510 | version "1.0.1" 1511 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 1512 | dependencies: 1513 | exit-hook "^1.0.0" 1514 | onetime "^1.0.0" 1515 | 1516 | restore-cursor@^2.0.0: 1517 | version "2.0.0" 1518 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 1519 | dependencies: 1520 | onetime "^2.0.0" 1521 | signal-exit "^3.0.2" 1522 | 1523 | right-align@^0.1.1: 1524 | version "0.1.3" 1525 | resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" 1526 | dependencies: 1527 | align-text "^0.1.1" 1528 | 1529 | rimraf@^2.6.1: 1530 | version "2.6.1" 1531 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" 1532 | dependencies: 1533 | glob "^7.0.5" 1534 | 1535 | run-async@^2.2.0: 1536 | version "2.3.0" 1537 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 1538 | dependencies: 1539 | is-promise "^2.1.0" 1540 | 1541 | rx@^4.1.0: 1542 | version "4.1.0" 1543 | resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" 1544 | 1545 | rxjs@^5.0.0-beta.11: 1546 | version "5.4.0" 1547 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.0.tgz#a7db14ab157f9d7aac6a56e655e7a3860d39bf26" 1548 | dependencies: 1549 | symbol-observable "^1.0.1" 1550 | 1551 | safe-buffer@^5.0.1: 1552 | version "5.0.1" 1553 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" 1554 | 1555 | "semver@2 || 3 || 4 || 5", semver@^5.0.1, semver@^5.1.0: 1556 | version "5.3.0" 1557 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 1558 | 1559 | set-blocking@^2.0.0, set-blocking@~2.0.0: 1560 | version "2.0.0" 1561 | resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" 1562 | 1563 | shebang-command@^1.2.0: 1564 | version "1.2.0" 1565 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 1566 | dependencies: 1567 | shebang-regex "^1.0.0" 1568 | 1569 | shebang-regex@^1.0.0: 1570 | version "1.0.0" 1571 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 1572 | 1573 | signal-exit@^3.0.0, signal-exit@^3.0.2: 1574 | version "3.0.2" 1575 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 1576 | 1577 | slice-ansi@0.0.4: 1578 | version "0.0.4" 1579 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 1580 | 1581 | slide@^1.1.5: 1582 | version "1.1.6" 1583 | resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" 1584 | 1585 | sort-keys@^1.1.1, sort-keys@^1.1.2: 1586 | version "1.1.2" 1587 | resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" 1588 | dependencies: 1589 | is-plain-obj "^1.0.0" 1590 | 1591 | source-map@^0.4.4: 1592 | version "0.4.4" 1593 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" 1594 | dependencies: 1595 | amdefine ">=0.0.4" 1596 | 1597 | source-map@~0.5.1: 1598 | version "0.5.6" 1599 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" 1600 | 1601 | spdx-correct@~1.0.0: 1602 | version "1.0.2" 1603 | resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" 1604 | dependencies: 1605 | spdx-license-ids "^1.0.2" 1606 | 1607 | spdx-expression-parse@~1.0.0: 1608 | version "1.0.4" 1609 | resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" 1610 | 1611 | spdx-license-ids@^1.0.2: 1612 | version "1.2.2" 1613 | resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" 1614 | 1615 | split2@^2.0.0: 1616 | version "2.1.1" 1617 | resolved "https://registry.yarnpkg.com/split2/-/split2-2.1.1.tgz#7a1f551e176a90ecd3345f7246a0cfe175ef4fd0" 1618 | dependencies: 1619 | through2 "^2.0.2" 1620 | 1621 | split@^1.0.0: 1622 | version "1.0.0" 1623 | resolved "https://registry.yarnpkg.com/split/-/split-1.0.0.tgz#c4395ce683abcd254bc28fe1dabb6e5c27dcffae" 1624 | dependencies: 1625 | through "2" 1626 | 1627 | sprintf-js@~1.0.2: 1628 | version "1.0.3" 1629 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 1630 | 1631 | staged-git-files@0.0.4: 1632 | version "0.0.4" 1633 | resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35" 1634 | 1635 | stream-to-observable@^0.1.0: 1636 | version "0.1.0" 1637 | resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.1.0.tgz#45bf1d9f2d7dc09bed81f1c307c430e68b84cffe" 1638 | 1639 | string-width@^1.0.1, string-width@^1.0.2: 1640 | version "1.0.2" 1641 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 1642 | dependencies: 1643 | code-point-at "^1.0.0" 1644 | is-fullwidth-code-point "^1.0.0" 1645 | strip-ansi "^3.0.0" 1646 | 1647 | string-width@^2.0.0: 1648 | version "2.0.0" 1649 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" 1650 | dependencies: 1651 | is-fullwidth-code-point "^2.0.0" 1652 | strip-ansi "^3.0.0" 1653 | 1654 | string.prototype.padend@^3.0.0: 1655 | version "3.0.0" 1656 | resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz#f3aaef7c1719f170c5eab1c32bf780d96e21f2f0" 1657 | dependencies: 1658 | define-properties "^1.1.2" 1659 | es-abstract "^1.4.3" 1660 | function-bind "^1.0.2" 1661 | 1662 | string_decoder@~0.10.x: 1663 | version "0.10.31" 1664 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" 1665 | 1666 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 1667 | version "3.0.1" 1668 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 1669 | dependencies: 1670 | ansi-regex "^2.0.0" 1671 | 1672 | strip-bom@^2.0.0: 1673 | version "2.0.0" 1674 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" 1675 | dependencies: 1676 | is-utf8 "^0.2.0" 1677 | 1678 | strip-bom@^3.0.0: 1679 | version "3.0.0" 1680 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1681 | 1682 | strip-eof@^1.0.0: 1683 | version "1.0.0" 1684 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 1685 | 1686 | strip-indent@^1.0.1: 1687 | version "1.0.1" 1688 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" 1689 | dependencies: 1690 | get-stdin "^4.0.1" 1691 | 1692 | strong-log-transformer@^1.0.6: 1693 | version "1.0.6" 1694 | resolved "https://registry.yarnpkg.com/strong-log-transformer/-/strong-log-transformer-1.0.6.tgz#f7fb93758a69a571140181277eea0c2eb1301fa3" 1695 | dependencies: 1696 | byline "^5.0.0" 1697 | duplexer "^0.1.1" 1698 | minimist "^0.1.0" 1699 | moment "^2.6.0" 1700 | through "^2.3.4" 1701 | 1702 | supports-color@^2.0.0: 1703 | version "2.0.0" 1704 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 1705 | 1706 | symbol-observable@^1.0.1: 1707 | version "1.0.4" 1708 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" 1709 | 1710 | temp-dir@^1.0.0: 1711 | version "1.0.0" 1712 | resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" 1713 | 1714 | temp-write@^3.3.0: 1715 | version "3.3.0" 1716 | resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-3.3.0.tgz#c1a96de2b36061342eae81f44ff001aec8f615a9" 1717 | dependencies: 1718 | graceful-fs "^4.1.2" 1719 | is-stream "^1.1.0" 1720 | make-dir "^1.0.0" 1721 | pify "^2.2.0" 1722 | temp-dir "^1.0.0" 1723 | uuid "^3.0.1" 1724 | 1725 | tempfile@^1.1.1: 1726 | version "1.1.1" 1727 | resolved "https://registry.yarnpkg.com/tempfile/-/tempfile-1.1.1.tgz#5bcc4eaecc4ab2c707d8bc11d99ccc9a2cb287f2" 1728 | dependencies: 1729 | os-tmpdir "^1.0.0" 1730 | uuid "^2.0.1" 1731 | 1732 | text-extensions@^1.0.0: 1733 | version "1.4.0" 1734 | resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.4.0.tgz#c385d2e80879fe6ef97893e1709d88d9453726e9" 1735 | 1736 | through2@^2.0.0, through2@^2.0.2: 1737 | version "2.0.3" 1738 | resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" 1739 | dependencies: 1740 | readable-stream "^2.1.5" 1741 | xtend "~4.0.1" 1742 | 1743 | through@2, "through@>=2.2.7 <3", through@^2.3.4, through@^2.3.6: 1744 | version "2.3.8" 1745 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1746 | 1747 | tmp@^0.0.31: 1748 | version "0.0.31" 1749 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.31.tgz#8f38ab9438e17315e5dbd8b3657e8bfb277ae4a7" 1750 | dependencies: 1751 | os-tmpdir "~1.0.1" 1752 | 1753 | trim-newlines@^1.0.0: 1754 | version "1.0.0" 1755 | resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" 1756 | 1757 | trim-off-newlines@^1.0.0: 1758 | version "1.0.1" 1759 | resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" 1760 | 1761 | typedarray@^0.0.6: 1762 | version "0.0.6" 1763 | resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" 1764 | 1765 | uglify-js@^2.6: 1766 | version "2.8.27" 1767 | resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.27.tgz#47787f912b0f242e5b984343be8e35e95f694c9c" 1768 | dependencies: 1769 | source-map "~0.5.1" 1770 | yargs "~3.10.0" 1771 | optionalDependencies: 1772 | uglify-to-browserify "~1.0.0" 1773 | 1774 | uglify-to-browserify@~1.0.0: 1775 | version "1.0.2" 1776 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" 1777 | 1778 | universalify@^0.1.0: 1779 | version "0.1.0" 1780 | resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.0.tgz#9eb1c4651debcc670cc94f1a75762332bb967778" 1781 | 1782 | util-deprecate@~1.0.1: 1783 | version "1.0.2" 1784 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1785 | 1786 | uuid@^2.0.1: 1787 | version "2.0.3" 1788 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" 1789 | 1790 | uuid@^3.0.1: 1791 | version "3.0.1" 1792 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" 1793 | 1794 | validate-npm-package-license@^3.0.1: 1795 | version "3.0.1" 1796 | resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" 1797 | dependencies: 1798 | spdx-correct "~1.0.0" 1799 | spdx-expression-parse "~1.0.0" 1800 | 1801 | wcwidth@^1.0.0: 1802 | version "1.0.1" 1803 | resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 1804 | dependencies: 1805 | defaults "^1.0.3" 1806 | 1807 | which-module@^1.0.0: 1808 | version "1.0.0" 1809 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" 1810 | 1811 | which-module@^2.0.0: 1812 | version "2.0.0" 1813 | resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 1814 | 1815 | which@^1.2.10, which@^1.2.9: 1816 | version "1.2.12" 1817 | resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" 1818 | dependencies: 1819 | isexe "^1.1.1" 1820 | 1821 | wide-align@^1.1.0: 1822 | version "1.1.2" 1823 | resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" 1824 | dependencies: 1825 | string-width "^1.0.2" 1826 | 1827 | window-size@0.1.0: 1828 | version "0.1.0" 1829 | resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" 1830 | 1831 | wordwrap@0.0.2: 1832 | version "0.0.2" 1833 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" 1834 | 1835 | wordwrap@~0.0.2: 1836 | version "0.0.3" 1837 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 1838 | 1839 | wrap-ansi@^2.0.0: 1840 | version "2.1.0" 1841 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" 1842 | dependencies: 1843 | string-width "^1.0.1" 1844 | strip-ansi "^3.0.1" 1845 | 1846 | wrappy@1: 1847 | version "1.0.2" 1848 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1849 | 1850 | write-file-atomic@^2.0.0, write-file-atomic@^2.1.0: 1851 | version "2.1.0" 1852 | resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" 1853 | dependencies: 1854 | graceful-fs "^4.1.11" 1855 | imurmurhash "^0.1.4" 1856 | slide "^1.1.5" 1857 | 1858 | write-json-file@^2.0.0, write-json-file@^2.1.0: 1859 | version "2.2.0" 1860 | resolved "https://registry.yarnpkg.com/write-json-file/-/write-json-file-2.2.0.tgz#51862506bbb3b619eefab7859f1fd6c6d0530876" 1861 | dependencies: 1862 | detect-indent "^5.0.0" 1863 | graceful-fs "^4.1.2" 1864 | make-dir "^1.0.0" 1865 | pify "^2.0.0" 1866 | sort-keys "^1.1.1" 1867 | write-file-atomic "^2.0.0" 1868 | 1869 | write-pkg@^3.0.1: 1870 | version "3.0.1" 1871 | resolved "https://registry.yarnpkg.com/write-pkg/-/write-pkg-3.0.1.tgz#f95245805be6f6a4eb1d6c31c43b57226815e6e3" 1872 | dependencies: 1873 | sort-keys "^1.1.2" 1874 | write-json-file "^2.0.0" 1875 | 1876 | xtend@~4.0.1: 1877 | version "4.0.1" 1878 | resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" 1879 | 1880 | y18n@^3.2.1: 1881 | version "3.2.1" 1882 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" 1883 | 1884 | yallist@^2.0.0: 1885 | version "2.0.0" 1886 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.0.0.tgz#306c543835f09ee1a4cb23b7bce9ab341c91cdd4" 1887 | 1888 | yargs-parser@^4.2.0: 1889 | version "4.2.1" 1890 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" 1891 | dependencies: 1892 | camelcase "^3.0.0" 1893 | 1894 | yargs-parser@^7.0.0: 1895 | version "7.0.0" 1896 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" 1897 | dependencies: 1898 | camelcase "^4.1.0" 1899 | 1900 | yargs@^6.6.0: 1901 | version "6.6.0" 1902 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" 1903 | dependencies: 1904 | camelcase "^3.0.0" 1905 | cliui "^3.2.0" 1906 | decamelize "^1.1.1" 1907 | get-caller-file "^1.0.1" 1908 | os-locale "^1.4.0" 1909 | read-pkg-up "^1.0.1" 1910 | require-directory "^2.1.1" 1911 | require-main-filename "^1.0.1" 1912 | set-blocking "^2.0.0" 1913 | string-width "^1.0.2" 1914 | which-module "^1.0.0" 1915 | y18n "^3.2.1" 1916 | yargs-parser "^4.2.0" 1917 | 1918 | yargs@^8.0.1: 1919 | version "8.0.1" 1920 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.1.tgz#420ef75e840c1457a80adcca9bc6fa3849de51aa" 1921 | dependencies: 1922 | camelcase "^4.1.0" 1923 | cliui "^3.2.0" 1924 | decamelize "^1.1.1" 1925 | get-caller-file "^1.0.1" 1926 | os-locale "^2.0.0" 1927 | read-pkg-up "^2.0.0" 1928 | require-directory "^2.1.1" 1929 | require-main-filename "^1.0.1" 1930 | set-blocking "^2.0.0" 1931 | string-width "^2.0.0" 1932 | which-module "^2.0.0" 1933 | y18n "^3.2.1" 1934 | yargs-parser "^7.0.0" 1935 | 1936 | yargs@~3.10.0: 1937 | version "3.10.0" 1938 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" 1939 | dependencies: 1940 | camelcase "^1.0.2" 1941 | cliui "^2.1.0" 1942 | decamelize "^1.0.0" 1943 | window-size "0.1.0" 1944 | --------------------------------------------------------------------------------