pax_global_header00006660000000000000000000000064134666635370014535gustar00rootroot0000000000000052 comment=f31c3c8623161967bbd1b4d50b16dcc4be1fb503 cosmiconfig-5.2.1/000077500000000000000000000000001346666353700140425ustar00rootroot00000000000000cosmiconfig-5.2.1/.eslintignore000066400000000000000000000000631346666353700165440ustar00rootroot00000000000000test/fixtures coverage .nyc_output flow-typed dist cosmiconfig-5.2.1/.eslintrc.json000066400000000000000000000011111346666353700166300ustar00rootroot00000000000000{ "parser": "babel-eslint", "parserOptions": { "sourceType": "script" }, "extends": [ "eslint-config-davidtheclark-node", "prettier" ], "plugins": [ "flowtype" ], "rules": { "no-var": "off", "prefer-const": "off", "prefer-arrow-callback": "off", "node/no-unsupported-features": ["error", {"version": 4}], "func-names": ["error", "always"], "prefer-template": "error", "object-shorthand": [ "error", "always", { "avoidExplicitReturnArrows": true } ], "flowtype/define-flow-type": "error" } } cosmiconfig-5.2.1/.flowconfig000066400000000000000000000001541346666353700162000ustar00rootroot00000000000000[ignore] .*/test/fixtures/.* [include] [libs] [lints] [options] module.ignore_non_literal_requires=true cosmiconfig-5.2.1/.gitignore000066400000000000000000000001061346666353700160270ustar00rootroot00000000000000node_modules *.log .nyc_output coverage *.DS_Store dist .idea .vscode cosmiconfig-5.2.1/.npmrc000066400000000000000000000000271346666353700151610ustar00rootroot00000000000000"package-lock=false" cosmiconfig-5.2.1/.travis.yml000066400000000000000000000003531346666353700161540ustar00rootroot00000000000000language: node_js git: depth: 5 cache: yarn branches: only: - master matrix: include: - node_js: "4" - node_js: "6" - node_js: "8" after_success: "bash <(curl -s https://codecov.io/bash)" - node_js: "10"cosmiconfig-5.2.1/CHANGELOG.md000066400000000000000000000140171346666353700156560ustar00rootroot00000000000000# Changelog ## 5.2.1 - Chore: Upgrade `js-yaml` to avoid npm audit warning. ## 5.2.0 - Added: `packageProp` values can be arrays of strings, to allow for property names that include periods. (This was possible before, but not documented or deliberately supported.) - Chore: Replaced the `lodash.get` dependency with a locally defined function. - Chore: Upgrade `js-yaml` to avoid npm audit warning. ## 5.1.0 - Added: `packageProp` values can include periods to describe paths to nested objects within `package.json`. ## 5.0.7 - Fixed: JS loader bypasses Node's `require` cache, fixing a bug where updates to `.js` config files would not load even when Cosmiconfig was told not to cache. ## 5.0.6 - Fixed: Better error message if the end user tries an extension Cosmiconfig is not configured to understand. ## 5.0.5 - Fixed: `load` and `loadSync` work with paths relative to `process.cwd()`. ## 5.0.4 - Fixed: `rc` files with `.js` extensions included in default `searchPlaces`. ## 5.0.3 - Docs: Minor corrections to documentation. *Released to update package documentation on npm*. ## 5.0.2 - Fixed: Allow `searchSync` and `loadSync` to load JS configuration files whose export is a Promise. ## 5.0.1 The API has been completely revamped to increase clarity and enable a very wide range of new usage. **Please read the readme for all the details.** While the defaults remain just as useful as before — and you can still pass no options at all — now you can also do all kinds of wild and crazy things. - The `loaders` option allows you specify custom functions to derive config objects from files. Your loader functions could parse ES2015 modules or TypeScript, JSON5, even INI or XML. Whatever suits you. - The `searchPlaces` option allows you to specify exactly where cosmiconfig looks within each directory it searches. - The combination of `loaders` and `searchPlaces` means that you should be able to load pretty much any kind of configuration file you want, from wherever you want it to look. Additionally, the overloaded `load()` function has been split up into several clear and focused functions: - `search()` now searches up the directory tree, and `load()` loads a configuration file that you don't need to search for. - The `sync` option has been replaced with separate synchronous functions: `searchSync()` and `loadSync()`. - `clearFileCache()` and `clearDirectoryCache()` have been renamed to `clearLoadCache()` and `clearSearchPath()` respectively. More details: - The default JS loader uses `require`, instead of `require-from-string`. So you *could* use `require` hooks to control the loading of JS files (e.g. pass them through esm or Babel). In most cases it is probably preferable to use a custom loader. - The options `rc`, `js`, and `rcExtensions` have all been removed. You can accomplish the same and more with `searchPlaces`. - The default `searchPlaces` include `rc` files with extensions, e.g. `.thingrc.json`, `.thingrc.yaml`, `.thingrc.yml`. This is the equivalent of switching the default value of the old `rcExtensions` option to `true`. - The option `rcStrictJson` has been removed. To get the same effect, you can specify `noExt: cosmiconfig.loadJson` in your `loaders` object. - `packageProp` no longer accepts `false`. If you don't want to look in `package.json`, write a `searchPlaces` array that does not include it. - By default, empty files are ignored by `search()`. The new option `ignoreEmptySearchPlaces` allows you to load them, instead, in case you want to do something with empty files. - The option `configPath` has been removed. Just pass your filepaths directory to `load()`. - Removed the `format` option. Formats are now all handled via the file extensions specified in `loaders`. (If you're wondering with happened to 5.0.0 ... it was a silly publishing mistake.) ## 4.0.0 - Licensing improvement: updated `parse-json` from `3.0.0` to `4.0.0`(see [sindresorhus/parse-json#12][parse-json-pr-12]). - Changed: error message format for `JSON` parse errors(see [#101][pr-101]). If you were relying on the format of JSON-parsing error messages, this will be a breaking change for you. - Changed: set default for `searchPath` as `process.cwd()` in `explorer.load`. ## 3.1.0 - Added: infer format based on filePath ## 3.0.1 - Fixed: memory leak due to bug in `require-from-string`. - Added: for JSON files, append position to end of error message. ## 3.0.0 - Removed: support for loading config path using the `--config` flag. cosmiconfig will not parse command line arguments. Your application can parse command line arguments and pass them to cosmiconfig. - Removed: `argv` config option. - Removed: support for Node versions < 4. - Added: `sync` option. - Fixed: Throw a clear error on getting empty config file. - Fixed: when a `options.configPath` is `package.json`, return the package prop, not the entire JSON file. ## 2.2.2 - Fixed: `options.configPath` and `--config` flag are respected. ## 2.2.0, 2.2.1 - 2.2.0 included a number of improvements but somehow broke stylelint. The changes were reverted in 2.2.1, to be restored later. ## 2.1.3 - Licensing improvement: switched from `json-parse-helpfulerror` to `parse-json`. ## 2.1.2 - Fixed: bug where an `ENOENT` error would be thrown is `searchPath` referenced a non-existent file. - Fixed: JSON parsing errors in Node v7. ## 2.1.1 - Fixed: swapped `graceful-fs` for regular `fs`, fixing a garbage collection problem. ## 2.1.0 - Added: Node 0.12 support. ## 2.0.2 - Fixed: Node version specified in `package.json`. ## 2.0.1 - Fixed: no more infinite loop in Windows. ## 2.0.0 - Changed: module now creates cosmiconfig instances with `load` methods (see README). - Added: caching (enabled by the change above). - Removed: support for Node versions <4. ## 1.1.0 - Add `rcExtensions` option. ## 1.0.2 - Fix handling of `require()`'s within JS module configs. ## 1.0.1 - Switch Promise implementation to pinkie-promise. ## 1.0.0 - Initial release. [parse-json-pr-12]: https://github.com/sindresorhus/parse-json/pull/12 [pr-101]: https://github.com/davidtheclark/cosmiconfig/pull/101 cosmiconfig-5.2.1/CODE_OF_CONDUCT.md000066400000000000000000000036151346666353700166460ustar00rootroot00000000000000# Contributor Code of Conduct As contributors and maintainers of this project, and in the interest of fostering an open and welcoming community, we pledge to respect all people who contribute through reporting issues, posting feature requests, updating documentation, submitting pull requests or patches, and other activities. We are committed to making participation in this project a harassment-free experience for everyone, regardless of level of experience, gender, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, or nationality. Examples of unacceptable behavior by participants include: - The use of sexualized language or imagery - Personal attacks - Trolling or insulting/derogatory comments - Public or private harassment - Publishing other's private information, such as physical or electronic addresses, without explicit permission - Other unethical or unprofessional conduct. Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct. By adopting this Code of Conduct, project maintainers commit themselves to fairly and consistently applying these principles to every aspect of managing this project. Project maintainers who do not follow or enforce the Code of Conduct may be permanently removed from the project team. This code of conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by opening an issue or contacting one or more of the project maintainers. This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.2.0, available at cosmiconfig-5.2.1/LICENSE000066400000000000000000000020671346666353700150540ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015 David Clark 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: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 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. cosmiconfig-5.2.1/README.md000066400000000000000000000437431346666353700153340ustar00rootroot00000000000000# cosmiconfig [![Build Status](https://img.shields.io/travis/davidtheclark/cosmiconfig/master.svg?label=unix%20build)](https://travis-ci.org/davidtheclark/cosmiconfig) [![Build status](https://img.shields.io/appveyor/ci/davidtheclark/cosmiconfig/master.svg?label=windows%20build)](https://ci.appveyor.com/project/davidtheclark/cosmiconfig/branch/master) [![codecov](https://codecov.io/gh/davidtheclark/cosmiconfig/branch/master/graph/badge.svg)](https://codecov.io/gh/davidtheclark/cosmiconfig) Cosmiconfig searches for and loads configuration for your program. It features smart defaults based on conventional expectations in the JavaScript ecosystem. But it's also flexible enough to search wherever you'd like to search, and load whatever you'd like to load. By default, Cosmiconfig will start where you tell it to start and search up the directory tree for the following: - a `package.json` property - a JSON or YAML, extensionless "rc file" - an "rc file" with the extensions `.json`, `.yaml`, `.yml`, or `.js`. - a `.config.js` CommonJS module For example, if your module's name is "soursocks", cosmiconfig will search up the directory tree for configuration in the following places: - a `soursocks` property in `package.json` - a `.soursocksrc` file in JSON or YAML format - a `.soursocksrc.json` file - a `.soursocksrc.yaml`, `.soursocksrc.yml`, or `.soursocksrc.js` file - a `soursocks.config.js` file exporting a JS object Cosmiconfig continues to search up the directory tree, checking each of these places in each directory, until it finds some acceptable configuration (or hits the home directory). 👀 **Looking for the v4 docs?** v5 involves significant revisions to Cosmiconfig's API, allowing for much greater flexibility and clarifying some things. If you have trouble switching from v4 to v5, please file an issue. If you are still using v4, those v4 docs are available [in the `4.0.0` tag](https://github.com/davidtheclark/cosmiconfig/tree/4.0.0). ## Table of contents - [Installation](#installation) - [Usage](#usage) - [Result](#result) - [cosmiconfig()](#cosmiconfig-1) - [moduleName](#modulename) - [explorer.search()](#explorersearch) - [searchFrom](#searchfrom) - [explorer.searchSync()](#explorersearchsync) - [explorer.load()](#explorerload) - [explorer.loadSync()](#explorerloadsync) - [explorer.clearLoadCache()](#explorerclearloadcache) - [explorer.clearSearchCache()](#explorerclearsearchcache) - [explorer.clearCaches()](#explorerclearcaches) - [cosmiconfigOptions](#cosmiconfigoptions) - [searchPlaces](#searchplaces) - [loaders](#loaders) - [packageProp](#packageprop) - [stopDir](#stopdir) - [cache](#cache) - [transform](#transform) - [ignoreEmptySearchPlaces](#ignoreemptysearchplaces) - [Caching](#caching) - [Differences from rc](#differences-from-rc) - [Contributing & Development](#contributing--development) ## Installation ``` npm install cosmiconfig ``` Tested in Node 4+. ## Usage Create a Cosmiconfig explorer, then either `search` for or directly `load` a configuration file. ```js const cosmiconfig = require('cosmiconfig'); // ... const explorer = cosmiconfig(moduleName); // Search for a configuration by walking up directories. // See documentation for search, below. explorer.search() .then((result) => { // result.config is the parsed configuration object. // result.filepath is the path to the config file that was found. // result.isEmpty is true if there was nothing to parse in the config file. }) .catch((error) => { // Do something constructive. }); // Load a configuration directly when you know where it should be. // The result object is the same as for search. // See documentation for load, below. explorer.load(pathToConfig).then(..); // You can also search and load synchronously. const searchedFor = explorer.searchSync(); const loaded = explorer.loadSync(pathToConfig); ``` ## Result The result object you get from `search` or `load` has the following properties: - **config:** The parsed configuration object. `undefined` if the file is empty. - **filepath:** The path to the configuration file that was found. - **isEmpty:** `true` if the configuration file is empty. This property will not be present if the configuration file is not empty. ## cosmiconfig() ```js const explorer = cosmiconfig(moduleName[, cosmiconfigOptions]) ``` Creates a cosmiconfig instance ("explorer") configured according to the arguments, and initializes its caches. ### moduleName Type: `string`. **Required.** Your module name. This is used to create the default [`searchPlaces`] and [`packageProp`]. **[`cosmiconfigOptions`] are documented below.** You may not need them, and should first read about the functions you'll use. ## explorer.search() ```js explorer.search([searchFrom]).then(result => {..}) ``` Searches for a configuration file. Returns a Promise that resolves with a [result] or with `null`, if no configuration file is found. You can do the same thing synchronously with [`searchSync()`]. Let's say your module name is `goldengrahams` so you initialized with `const explorer = cosmiconfig('goldengrahams');`. Here's how your default [`search()`] will work: - Starting from `process.cwd()` (or some other directory defined by the `searchFrom` argument to [`search()`]), look for configuration objects in the following places: 1. A `goldengrahams` property in a `package.json` file. 2. A `.goldengrahamsrc` file with JSON or YAML syntax. 3. A `.goldengrahamsrc.json` file. 4. A `.goldengrahamsrc.yaml`, `.goldengrahamsrc.yml`, or `.goldengrahamsrc.js` file. 5. A `goldengrahams.config.js` JS file exporting the object. - If none of those searches reveal a configuration object, move up one directory level and try again. So the search continues in `./`, `../`, `../../`, `../../../`, etc., checking the same places in each directory. - Continue searching until arriving at your home directory (or some other directory defined by the cosmiconfig option [`stopDir`]). - If at any point a parseable configuration is found, the [`search()`] Promise resolves with its [result] \(or, with [`searchSync()`], the [result] is returned). - If no configuration object is found, the [`search()`] Promise resolves with `null` (or, with [`searchSync()`], `null` is returned). - If a configuration object is found *but is malformed* (causing a parsing error), the [`search()`] Promise rejects with that error (so you should `.catch()` it). (Or, with [`searchSync()`], the error is thrown.) **If you know exactly where your configuration file should be, you can use [`load()`], instead.** **The search process is highly customizable.** Use the cosmiconfig options [`searchPlaces`] and [`loaders`] to precisely define where you want to look for configurations and how you want to load them. ### searchFrom Type: `string`. Default: `process.cwd()`. A filename. [`search()`] will start its search here. If the value is a directory, that's where the search starts. If it's a file, the search starts in that file's directory. ## explorer.searchSync() ```js const result = explorer.searchSync([searchFrom]); ``` Synchronous version of [`search()`]. Returns a [result] or `null`. ## explorer.load() ```js explorer.load(loadPath).then(result => {..}) ``` Loads a configuration file. Returns a Promise that resolves with a [result] or rejects with an error (if the file does not exist or cannot be loaded). Use `load` if you already know where the configuration file is and you just need to load it. ```js explorer.load('load/this/file.json'); // Tries to load load/this/file.json. ``` If you load a `package.json` file, the result will be derived from whatever property is specified as your [`packageProp`]. ## explorer.loadSync() ```js const result = explorer.loadSync(loadPath); ``` Synchronous version of [`load()`]. Returns a [result]. ## explorer.clearLoadCache() Clears the cache used in [`load()`]. ## explorer.clearSearchCache() Clears the cache used in [`search()`]. ## explorer.clearCaches() Performs both [`clearLoadCache()`] and [`clearSearchCache()`]. ## cosmiconfigOptions Type: `Object`. Possible options are documented below. ### searchPlaces Type: `Array`. Default: See below. An array of places that [`search()`] will check in each directory as it moves up the directory tree. Each place is relative to the directory being searched, and the places are checked in the specified order. **Default `searchPlaces`:** ```js [ 'package.json', `.${moduleName}rc`, `.${moduleName}rc.json`, `.${moduleName}rc.yaml`, `.${moduleName}rc.yml`, `.${moduleName}rc.js`, `${moduleName}.config.js`, ] ``` Create your own array to search more, fewer, or altogether different places. Every item in `searchPlaces` needs to have a loader in [`loaders`] that corresponds to its extension. (Common extensions are covered by default loaders.) Read more about [`loaders`] below. `package.json` is a special value: When it is included in `searchPlaces`, Cosmiconfig will always parse it as JSON and load a property within it, not the whole file. That property is defined with the [`packageProp`] option, and defaults to your module name. Examples, with a module named `porgy`: ```js // Disallow extensions on rc files: [ 'package.json', '.porgyrc', 'porgy.config.js' ] // ESLint searches for configuration in these places: [ '.eslintrc.js', '.eslintrc.yaml', '.eslintrc.yml', '.eslintrc.json', '.eslintrc', 'package.json' ] // Babel looks in fewer places: [ 'package.json', '.babelrc' ] // Maybe you want to look for a wide variety of JS flavors: [ 'porgy.config.js', 'porgy.config.mjs', 'porgy.config.ts', 'porgy.config.coffee' ] // ^^ You will need to designate custom loaders to tell // Cosmiconfig how to handle these special JS flavors. // Look within a .config/ subdirectory of every searched directory: [ 'package.json', '.porgyrc', '.config/.porgyrc', '.porgyrc.json', '.config/.porgyrc.json' ] ``` ### loaders Type: `Object`. Default: See below. An object that maps extensions to the loader functions responsible for loading and parsing files with those extensions. Cosmiconfig exposes its default loaders for `.js`, `.json`, and `.yaml` as `cosmiconfig.loadJs`, `cosmiconfig.loadJson`, and `cosmiconfig.loadYaml`, respectively. **Default `loaders`:** ```js { '.json': cosmiconfig.loadJson, '.yaml': cosmiconfig.loadYaml, '.yml': cosmiconfig.loadYaml, '.js': cosmiconfig.loadJs, noExt: cosmiconfig.loadYaml } ``` (YAML is a superset of JSON; which means YAML parsers can parse JSON; which is how extensionless files can be either YAML *or* JSON with only one parser.) **If you provide a `loaders` object, your object will be *merged* with the defaults.** So you can override one or two without having to override them all. **Keys in `loaders`** are extensions (starting with a period), or `noExt` to specify the loader for files *without* extensions, like `.soursocksrc`. **Values in `loaders`** are either a loader function (described below) or an object with `sync` and/or `async` properties, whose values are loader functions. **The most common use case for custom loaders value is to load extensionless `rc` files as strict JSON**, instead of JSON *or* YAML (the default). To accomplish that, provide the following `loaders` value: ```js { noExt: cosmiconfig.loadJson } ``` If you want to load files that are not handled by the loader functions Cosmiconfig exposes, you can write a custom loader function or use one from NPM if it exists. **Third-party loaders:** - [@endemolshinegroup/cosmiconfig-typescript-loader](https://github.com/EndemolShineGroup/cosmiconfig-typescript-loader) **Use cases for custom loader function:** - Allow configuration syntaxes that aren't handled by Cosmiconfig's defaults, like JSON5, INI, or XML. - Allow ES2015 modules from `.mjs` configuration files. - Parse JS files with Babel before deriving the configuration. **Custom loader functions** have the following signature: ```js // Sync (filepath: string, content: string) => Object | null // Async (filepath: string, content: string) => Object | null | Promise ``` Cosmiconfig reads the file when it checks whether the file exists, so it will provide you with both the file's path and its content. Do whatever you need to, and return either a configuration object or `null` (or, for async-only loaders, a Promise that resolves with one of those). `null` indicates that no real configuration was found and the search should continue. It's easiest if you make your custom loader function synchronous. Then it can be used regardless of whether you end up calling [`search()`] or [`searchSync()`], [`load()`] or [`loadSync()`]. If you want or need to provide an async-only loader, you can do so by making the value of `loaders` an object with an `async` property whose value is the async loader. You can also add a `sync` property to designate a sync loader, if you want to use both async and sync search and load functions. A few things to note: - If you use a custom loader, be aware of whether it's sync or async and how that aligned with your usage of sync or async search and load functions. - **Special JS syntax can also be handled by using a `require` hook**, because `cosmiconfig.loadJs` just uses `require`. Whether you use custom loaders or a `require` hook is up to you. Examples: ```js // Allow JSON5 syntax: { '.json': json5Loader } // Allow XML, and treat sync and async separately: { '.xml': { async: asyncXmlLoader, sync: syncXmlLoader } } // Allow a special configuration syntax of your own creation: { '.special': specialLoader } // Allow many flavors of JS, using custom loaders: { '.mjs': esmLoader, '.ts': typeScriptLoader, '.coffee': coffeeScriptLoader } // Allow many flavors of JS but rely on require hooks: { '.mjs': cosmiconfig.loadJs, '.ts': cosmiconfig.loadJs, '.coffee': cosmiconfig.loadJs } ``` ### packageProp Type: `string | Array`. Default: `` `${moduleName}` ``. Name of the property in `package.json` to look for. Use a period-delimited string or an array of strings to describe a path to nested properties. For example, the value `'configs.myPackage'` or `['configs', 'myPackage']` will get you the `"myPackage"` value in a `package.json` like this: ```json { "configs": { "myPackage": {..} } } ``` If nested property names within the path include periods, you need to use an array of strings. For example, the value `['configs', 'foo.bar', 'baz']` will get you the `"baz"` value in a `package.json` like this: ```json { "configs": { "foo.bar": { "baz": {..} } } } ``` If a string includes period but corresponds to a top-level property name, it will not be interpreted as a period-delimited path. For example, the value `'one.two'` will get you the `"three"` value in a `package.json` like this: ```json { "one.two": "three", "one": { "two": "four" } } ``` ### stopDir Type: `string`. Default: Absolute path to your home directory. Directory where the search will stop. ### cache Type: `boolean`. Default: `true`. If `false`, no caches will be used. Read more about ["Caching"](#caching) below. ### transform Type: `(Result) => Promise | Result`. A function that transforms the parsed configuration. Receives the [result]. If using [`search()`] or [`load()`] \(which are async), the transform function can return the transformed result or return a Promise that resolves with the transformed result. If using [`searchSync()`] or [`loadSync()`], the function must be synchronous and return the transformed result. The reason you might use this option — instead of simply applying your transform function some other way — is that *the transformed result will be cached*. If your transformation involves additional filesystem I/O or other potentially slow processing, you can use this option to avoid repeating those steps every time a given configuration is searched or loaded. ### ignoreEmptySearchPlaces Type: `boolean`. Default: `true`. By default, if [`search()`] encounters an empty file (containing nothing but whitespace) in one of the [`searchPlaces`], it will ignore the empty file and move on. If you'd like to load empty configuration files, instead, set this option to `false`. Why might you want to load empty configuration files? If you want to throw an error, or if an empty configuration file means something to your program. ## Caching As of v2, cosmiconfig uses caching to reduce the need for repetitious reading of the filesystem or expensive transforms. Every new cosmiconfig instance (created with `cosmiconfig()`) has its own caches. To avoid or work around caching, you can do the following: - Set the `cosmiconfig` option [`cache`] to `false`. - Use the cache-clearing methods [`clearLoadCache()`], [`clearSearchCache()`], and [`clearCaches()`]. - Create separate instances of cosmiconfig (separate "explorers"). ## Differences from [rc](https://github.com/dominictarr/rc) [rc](https://github.com/dominictarr/rc) serves its focused purpose well. cosmiconfig differs in a few key ways — making it more useful for some projects, less useful for others: - Looks for configuration in some different places: in a `package.json` property, an rc file, a `.config.js` file, and rc files with extensions. - Built-in support for JSON, YAML, and CommonJS formats. - Stops at the first configuration found, instead of finding all that can be found up the directory tree and merging them automatically. - Options. - Asynchronous by default (though can be run synchronously). ## Contributing & Development Please note that this project is released with a [Contributor Code of Conduct](CODE_OF_CONDUCT.md). By participating in this project you agree to abide by its terms. And please do participate! [result]: #result [`load()`]: #explorerload [`loadsync()`]: #explorerloadsync [`search()`]: #explorersearch [`searchsync()`]: #explorersearchsync [`clearloadcache()`]: #explorerclearloadcache [`clearsearchcache()`]: #explorerclearsearchcache [`clearcaches()`]: #explorerclearcaches [`packageprop`]: #packageprop [`cache`]: #cache [`stopdir`]: #stopdir [`searchplaces`]: #searchplaces [`loaders`]: #loaders [`cosmiconfigoptions`]: #cosmiconfigoptions cosmiconfig-5.2.1/appveyor.yml000066400000000000000000000007021346666353700164310ustar00rootroot00000000000000# http://www.appveyor.com/docs/appveyor-yml environment: matrix: - nodejs_version: 4 - nodejs_version: 6 - nodejs_version: 8 - nodejs_version: 10 branches: only: - master - v5 clone_depth: 5 version: "{build}" build: off deploy: off cache: - "%LOCALAPPDATA%\\Yarn" install: - ps: Install-Product node $env:nodejs_version x64 - yarn install test_script: - node --version - yarn --version - cmd: "yarn test" cosmiconfig-5.2.1/codecov.yml000066400000000000000000000000141346666353700162020ustar00rootroot00000000000000comment: offcosmiconfig-5.2.1/flow-typed/000077500000000000000000000000001346666353700161345ustar00rootroot00000000000000cosmiconfig-5.2.1/flow-typed/defs.js000066400000000000000000000017451346666353700174220ustar00rootroot00000000000000type CosmiconfigResult = { config: any, filepath: string, isEmpty?: boolean, } | null; type LoaderResult = { config: Object | null, filepath: string, }; // These are the user options with defaults applied. type ExplorerOptions = { stopDir: string, cache: boolean, transform: CosmiconfigResult => CosmiconfigResult, packageProp: string, loaders: Loaders, searchPlaces: Array, ignoreEmptySearchPlaces: boolean, }; type ExplorerContext = ExplorerOptions & { loadCache: ?Map>, loadSyncCache: ?Map, searchCache: ?Map>, searchSyncCache: ?Map, }; type SyncLoader = (filepath: string, content: string) => Object | null; type AsyncLoader = ( filepath: string, content: string ) => Object | null | Promise; type LoaderEntry = { sync?: SyncLoader, async?: AsyncLoader, }; type Loaders = { [string]: LoaderEntry, }; cosmiconfig-5.2.1/flow-typed/modules.js000066400000000000000000000004731346666353700201460ustar00rootroot00000000000000declare module 'is-directory' { declare module.exports: { (filename: string, (err: ?Error, result: boolean) => void): void, sync(filename: string): boolean, }; } declare module 'parse-json' { declare module.exports: ( input: string, reviver?: Function, filename?: string ) => Object; } cosmiconfig-5.2.1/package.json000066400000000000000000000055651346666353700163430ustar00rootroot00000000000000{ "name": "cosmiconfig", "version": "5.2.1", "description": "Find and load configuration from a package.json property, rc file, or CommonJS module", "main": "dist/index.js", "files": [ "dist" ], "scripts": { "precommit": "lint-staged && jest && flow check", "lint:md-partial": "remark -u remark-preset-davidtheclark --frail --quiet --no-stdout --output --", "lint:md": "npm run lint:md-partial -- *.md", "lint:fix": "eslint . --fix", "lint": "eslint . && npm run lint:md", "format": "prettier --write \"{src/*.js,test/*.js}\"", "pretest": "npm run lint && flow check", "test": "jest --coverage", "test:watch": "jest --watch", "coverage": "jest --coverage --coverageReporters=html --coverageReporters=text", "build": "flow-remove-types src --out-dir dist --quiet", "prepublishOnly": "npm run build" }, "lint-staged": { "*.js": [ "eslint --fix", "prettier --write", "git add" ], "*.md": [ "npm run lint:md-partial", "git add" ] }, "repository": { "type": "git", "url": "git+https://github.com/davidtheclark/cosmiconfig.git" }, "keywords": [ "load", "configuration", "config" ], "author": "David Clark ", "contributors": [ "Bogdan Chadkin ", "Suhas Karanth " ], "license": "MIT", "bugs": { "url": "https://github.com/davidtheclark/cosmiconfig/issues" }, "homepage": "https://github.com/davidtheclark/cosmiconfig#readme", "prettier": { "trailingComma": "es5", "singleQuote": true, "printWidth": 80, "tabWidth": 2 }, "jest": { "testEnvironment": "node", "collectCoverageFrom": [ "src/*.js" ], "coverageReporters": [ "text", "html", "lcov" ], "coverageThreshold": { "global": { "branches": 100, "functions": 100, "lines": 100, "statements": 100 } }, "resetModules": true, "resetMocks": true }, "babel": { "plugins": [ "transform-flow-strip-types" ] }, "dependencies": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", "js-yaml": "^3.13.1", "parse-json": "^4.0.0" }, "devDependencies": { "babel-eslint": "^8.0.3", "babel-plugin-transform-flow-strip-types": "^6.22.0", "del": "^3.0.0", "eslint": "^4.12.1", "eslint-config-davidtheclark-node": "^0.2.2", "eslint-config-prettier": "^2.9.0", "eslint-plugin-flowtype": "^2.39.1", "eslint-plugin-node": "^5.2.1", "flow-bin": "^0.68.0", "flow-remove-types": "^1.2.3", "husky": "^0.14.3", "jest": "^21.2.1", "lint-staged": "^6.0.0", "make-dir": "^1.2.0", "parent-module": "^0.1.0", "prettier": "^1.8.2", "remark-cli": "^5.0.0", "remark-preset-davidtheclark": "^0.7.0" }, "engines": { "node": ">=4" } } cosmiconfig-5.2.1/src/000077500000000000000000000000001346666353700146315ustar00rootroot00000000000000cosmiconfig-5.2.1/src/cacheWrapper.js000066400000000000000000000005111346666353700175700ustar00rootroot00000000000000// @flow 'use strict'; function cacheWrapper(cache: ?Map, key: string, fn: () => T): T { if (!cache) { return fn(); } const cached = cache.get(key); if (cached !== undefined) { return cached; } const result = fn(); cache.set(key, result); return result; } module.exports = cacheWrapper; cosmiconfig-5.2.1/src/createExplorer.js000066400000000000000000000226161346666353700201620ustar00rootroot00000000000000// @flow 'use strict'; const path = require('path'); const loaders = require('./loaders'); const readFile = require('./readFile'); const cacheWrapper = require('./cacheWrapper'); const getDirectory = require('./getDirectory'); const getPropertyByPath = require('./getPropertyByPath'); const MODE_SYNC = 'sync'; // An object value represents a config object. // null represents that the loader did not find anything relevant. // undefined represents that the loader found something relevant // but it was empty. type LoadedFileContent = Object | null | void; class Explorer { loadCache: ?Map>; loadSyncCache: ?Map; searchCache: ?Map>; searchSyncCache: ?Map; config: ExplorerOptions; constructor(options: ExplorerOptions) { this.loadCache = options.cache ? new Map() : null; this.loadSyncCache = options.cache ? new Map() : null; this.searchCache = options.cache ? new Map() : null; this.searchSyncCache = options.cache ? new Map() : null; this.config = options; this.validateConfig(); } clearLoadCache() { if (this.loadCache) { this.loadCache.clear(); } if (this.loadSyncCache) { this.loadSyncCache.clear(); } } clearSearchCache() { if (this.searchCache) { this.searchCache.clear(); } if (this.searchSyncCache) { this.searchSyncCache.clear(); } } clearCaches() { this.clearLoadCache(); this.clearSearchCache(); } validateConfig() { const config = this.config; config.searchPlaces.forEach(place => { const loaderKey = path.extname(place) || 'noExt'; const loader = config.loaders[loaderKey]; if (!loader) { throw new Error( `No loader specified for ${getExtensionDescription( place )}, so searchPlaces item "${place}" is invalid` ); } }); } search(searchFrom?: string): Promise { searchFrom = searchFrom || process.cwd(); return getDirectory(searchFrom).then(dir => { return this.searchFromDirectory(dir); }); } searchFromDirectory(dir: string): Promise { const absoluteDir = path.resolve(process.cwd(), dir); const run = () => { return this.searchDirectory(absoluteDir).then(result => { const nextDir = this.nextDirectoryToSearch(absoluteDir, result); if (nextDir) { return this.searchFromDirectory(nextDir); } return this.config.transform(result); }); }; if (this.searchCache) { return cacheWrapper(this.searchCache, absoluteDir, run); } return run(); } searchSync(searchFrom?: string): CosmiconfigResult { searchFrom = searchFrom || process.cwd(); const dir = getDirectory.sync(searchFrom); return this.searchFromDirectorySync(dir); } searchFromDirectorySync(dir: string): CosmiconfigResult { const absoluteDir = path.resolve(process.cwd(), dir); const run = () => { const result = this.searchDirectorySync(absoluteDir); const nextDir = this.nextDirectoryToSearch(absoluteDir, result); if (nextDir) { return this.searchFromDirectorySync(nextDir); } return this.config.transform(result); }; if (this.searchSyncCache) { return cacheWrapper(this.searchSyncCache, absoluteDir, run); } return run(); } searchDirectory(dir: string): Promise { return this.config.searchPlaces.reduce((prevResultPromise, place) => { return prevResultPromise.then(prevResult => { if (this.shouldSearchStopWithResult(prevResult)) { return prevResult; } return this.loadSearchPlace(dir, place); }); }, Promise.resolve(null)); } searchDirectorySync(dir: string): CosmiconfigResult { let result = null; for (const place of this.config.searchPlaces) { result = this.loadSearchPlaceSync(dir, place); if (this.shouldSearchStopWithResult(result)) break; } return result; } shouldSearchStopWithResult(result: CosmiconfigResult): boolean { if (result === null) return false; if (result.isEmpty && this.config.ignoreEmptySearchPlaces) return false; return true; } loadSearchPlace(dir: string, place: string): Promise { const filepath = path.join(dir, place); return readFile(filepath).then(content => { return this.createCosmiconfigResult(filepath, content); }); } loadSearchPlaceSync(dir: string, place: string): CosmiconfigResult { const filepath = path.join(dir, place); const content = readFile.sync(filepath); return this.createCosmiconfigResultSync(filepath, content); } nextDirectoryToSearch( currentDir: string, currentResult: CosmiconfigResult ): ?string { if (this.shouldSearchStopWithResult(currentResult)) { return null; } const nextDir = nextDirUp(currentDir); if (nextDir === currentDir || currentDir === this.config.stopDir) { return null; } return nextDir; } loadPackageProp(filepath: string, content: string) { const parsedContent = loaders.loadJson(filepath, content); const packagePropValue = getPropertyByPath( parsedContent, this.config.packageProp ); return packagePropValue || null; } getLoaderEntryForFile(filepath: string): LoaderEntry { if (path.basename(filepath) === 'package.json') { const loader = this.loadPackageProp.bind(this); return { sync: loader, async: loader }; } const loaderKey = path.extname(filepath) || 'noExt'; return this.config.loaders[loaderKey] || {}; } getSyncLoaderForFile(filepath: string): SyncLoader { const entry = this.getLoaderEntryForFile(filepath); if (!entry.sync) { throw new Error( `No sync loader specified for ${getExtensionDescription(filepath)}` ); } return entry.sync; } getAsyncLoaderForFile(filepath: string): AsyncLoader { const entry = this.getLoaderEntryForFile(filepath); const loader = entry.async || entry.sync; if (!loader) { throw new Error( `No async loader specified for ${getExtensionDescription(filepath)}` ); } return loader; } loadFileContent( mode: 'sync' | 'async', filepath: string, content: string | null ): Promise | LoadedFileContent { if (content === null) { return null; } if (content.trim() === '') { return undefined; } const loader = mode === MODE_SYNC ? this.getSyncLoaderForFile(filepath) : this.getAsyncLoaderForFile(filepath); return loader(filepath, content); } loadedContentToCosmiconfigResult( filepath: string, loadedContent: LoadedFileContent ): CosmiconfigResult { if (loadedContent === null) { return null; } if (loadedContent === undefined) { return { filepath, config: undefined, isEmpty: true }; } return { config: loadedContent, filepath }; } createCosmiconfigResult( filepath: string, content: string | null ): Promise { return Promise.resolve() .then(() => { return this.loadFileContent('async', filepath, content); }) .then(loaderResult => { return this.loadedContentToCosmiconfigResult(filepath, loaderResult); }); } createCosmiconfigResultSync( filepath: string, content: string | null ): CosmiconfigResult { const loaderResult = this.loadFileContent('sync', filepath, content); return this.loadedContentToCosmiconfigResult(filepath, loaderResult); } validateFilePath(filepath?: string) { if (!filepath) { throw new Error('load and loadSync must pass a non-empty string'); } } load(filepath: string): Promise { return Promise.resolve().then(() => { this.validateFilePath(filepath); const absoluteFilePath = path.resolve(process.cwd(), filepath); return cacheWrapper(this.loadCache, absoluteFilePath, () => { return readFile(absoluteFilePath, { throwNotFound: true }) .then(content => { return this.createCosmiconfigResult(absoluteFilePath, content); }) .then(this.config.transform); }); }); } loadSync(filepath: string): CosmiconfigResult { this.validateFilePath(filepath); const absoluteFilePath = path.resolve(process.cwd(), filepath); return cacheWrapper(this.loadSyncCache, absoluteFilePath, () => { const content = readFile.sync(absoluteFilePath, { throwNotFound: true }); const result = this.createCosmiconfigResultSync( absoluteFilePath, content ); return this.config.transform(result); }); } } module.exports = function createExplorer(options: ExplorerOptions) { const explorer = new Explorer(options); return { search: explorer.search.bind(explorer), searchSync: explorer.searchSync.bind(explorer), load: explorer.load.bind(explorer), loadSync: explorer.loadSync.bind(explorer), clearLoadCache: explorer.clearLoadCache.bind(explorer), clearSearchCache: explorer.clearSearchCache.bind(explorer), clearCaches: explorer.clearCaches.bind(explorer), }; }; function nextDirUp(dir: string): string { return path.dirname(dir); } function getExtensionDescription(filepath: string): string { const ext = path.extname(filepath); return ext ? `extension "${ext}"` : 'files without extensions'; } cosmiconfig-5.2.1/src/getDirectory.js000066400000000000000000000011271346666353700176340ustar00rootroot00000000000000// @flow 'use strict'; const path = require('path'); const isDirectory = require('is-directory'); function getDirectory(filepath: string): Promise { return new Promise((resolve, reject) => { return isDirectory(filepath, (err, filepathIsDirectory) => { if (err) { return reject(err); } return resolve(filepathIsDirectory ? filepath : path.dirname(filepath)); }); }); } getDirectory.sync = function getDirectorySync(filepath: string): string { return isDirectory.sync(filepath) ? filepath : path.dirname(filepath); }; module.exports = getDirectory; cosmiconfig-5.2.1/src/getPropertyByPath.js000066400000000000000000000014071346666353700206250ustar00rootroot00000000000000// @flow 'use strict'; // Resolves property names or property paths defined with period-delimited // strings or arrays of strings. Property names that are found on the source // object are used directly (even if they include a period). // Nested property names that include periods, within a path, are only // understood in array paths. function getPropertyByPath(source: Object, path: string | Array): any { if (typeof path === 'string' && source.hasOwnProperty(path)) { return source[path]; } const parsedPath = typeof path === 'string' ? path.split('.') : path; return parsedPath.reduce((previous, key) => { if (previous === undefined) { return previous; } return previous[key]; }, source); } module.exports = getPropertyByPath; cosmiconfig-5.2.1/src/index.js000066400000000000000000000036661346666353700163110ustar00rootroot00000000000000// @flow 'use strict'; const os = require('os'); const createExplorer = require('./createExplorer'); const loaders = require('./loaders'); module.exports = cosmiconfig; function cosmiconfig( moduleName: string, options: { packageProp?: string, loaders?: Object, searchPlaces?: Array, ignoreEmptySearchPlaces?: boolean, stopDir?: string, cache?: boolean, transform?: CosmiconfigResult => CosmiconfigResult, } ) { options = options || {}; const defaults = { packageProp: moduleName, searchPlaces: [ 'package.json', `.${moduleName}rc`, `.${moduleName}rc.json`, `.${moduleName}rc.yaml`, `.${moduleName}rc.yml`, `.${moduleName}rc.js`, `${moduleName}.config.js`, ], ignoreEmptySearchPlaces: true, stopDir: os.homedir(), cache: true, transform: identity, }; const normalizedOptions: ExplorerOptions = Object.assign( {}, defaults, options, { loaders: normalizeLoaders(options.loaders), } ); return createExplorer(normalizedOptions); } cosmiconfig.loadJs = loaders.loadJs; cosmiconfig.loadJson = loaders.loadJson; cosmiconfig.loadYaml = loaders.loadYaml; function normalizeLoaders(rawLoaders?: Object): Loaders { const defaults = { '.js': { sync: loaders.loadJs, async: loaders.loadJs }, '.json': { sync: loaders.loadJson, async: loaders.loadJson }, '.yaml': { sync: loaders.loadYaml, async: loaders.loadYaml }, '.yml': { sync: loaders.loadYaml, async: loaders.loadYaml }, noExt: { sync: loaders.loadYaml, async: loaders.loadYaml }, }; if (!rawLoaders) { return defaults; } return Object.keys(rawLoaders).reduce((result, ext) => { const entry = rawLoaders && rawLoaders[ext]; if (typeof entry === 'function') { result[ext] = { sync: entry, async: entry }; } else { result[ext] = entry; } return result; }, defaults); } function identity(x) { return x; } cosmiconfig-5.2.1/src/loaders.js000066400000000000000000000011711346666353700166200ustar00rootroot00000000000000// @flow 'use strict'; const parseJson = require('parse-json'); const yaml = require('js-yaml'); const importFresh = require('import-fresh'); function loadJs(filepath: string): Object { const result = importFresh(filepath); return result; } function loadJson(filepath: string, content: string): Object { try { return parseJson(content); } catch (err) { err.message = `JSON Error in ${filepath}:\n${err.message}`; throw err; } } function loadYaml(filepath: string, content: string): Object { return yaml.safeLoad(content, { filename: filepath }); } module.exports = { loadJs, loadJson, loadYaml, }; cosmiconfig-5.2.1/src/readFile.js000066400000000000000000000016241346666353700167050ustar00rootroot00000000000000// @flow 'use strict'; const fs = require('fs'); type Options = { throwNotFound?: boolean, }; function readFile(filepath: string, options?: Options): Promise { options = options || {}; const throwNotFound = options.throwNotFound || false; return new Promise((resolve, reject) => { fs.readFile(filepath, 'utf8', (err, content) => { if (err && err.code === 'ENOENT' && !throwNotFound) { return resolve(null); } if (err) return reject(err); resolve(content); }); }); } readFile.sync = function readFileSync( filepath: string, options?: Options ): string | null { options = options || {}; const throwNotFound = options.throwNotFound || false; try { return fs.readFileSync(filepath, 'utf8'); } catch (err) { if (err.code === 'ENOENT' && !throwNotFound) { return null; } throw err; } }; module.exports = readFile; cosmiconfig-5.2.1/test/000077500000000000000000000000001346666353700150215ustar00rootroot00000000000000cosmiconfig-5.2.1/test/.eslintrc.json000066400000000000000000000000441346666353700176130ustar00rootroot00000000000000{ "env": { "jest": true } } cosmiconfig-5.2.1/test/caches.test.js000066400000000000000000000423601346666353700175700ustar00rootroot00000000000000'use strict'; const fs = require('fs'); const importFreshMock = require('import-fresh'); const util = require('./util'); const cosmiconfig = require('../src'); // mocks are hoisted jest.mock('import-fresh'); const temp = new util.TempDir(); beforeEach(() => { temp.clean(); temp.createDir('a/b/c/d/e/f/'); temp.createFile('a/b/c/d/package.json', '{ "false": "hope" }'); temp.createFile('a/b/c/d/.foorc', '{ "foundInD": true }'); temp.createFile('a/b/package.json', '{ "foo": { "foundInB": true } }'); }); afterEach(() => { jest.restoreAllMocks(); }); afterAll(() => { // Remove temp.dir created for tests temp.deleteTempDir(); }); describe('cache is not used initially', () => { const searchPath = temp.absolutePath('a/b/c/d/e'); const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/package.json', 'a/b/c/d/e/.foorc', 'a/b/c/d/e/.foorc.json', 'a/b/c/d/e/.foorc.yaml', 'a/b/c/d/e/.foorc.yml', 'a/b/c/d/e/.foorc.js', 'a/b/c/d/e/foo.config.js', 'a/b/c/d/package.json', 'a/b/c/d/.foorc', ]); expect(result).toEqual({ filepath: temp.absolutePath('a/b/c/d/.foorc'), config: { foundInD: true }, }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); const cachedSearch = cosmiconfig('foo').search; return cachedSearch(searchPath).then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const cachedSearchSync = cosmiconfig('foo').searchSync; const result = cachedSearchSync(searchPath); checkResult(readFileSpy, result); }); }); describe('cache is used for already-visited directories', () => { const searchPath = temp.absolutePath('a/b/c/d/e'); const checkResult = (readFileSpy, result) => { expect(readFileSpy).toHaveBeenCalledTimes(0); expect(result).toEqual({ filepath: temp.absolutePath('a/b/c/d/.foorc'), config: { foundInD: true }, }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); const cachedSearch = cosmiconfig('foo').search; // First pass, prime the cache ... return cachedSearch(searchPath) .then(() => { // Reset readFile mocks and search again. readFileSpy.mockClear(); return cachedSearch(searchPath); }) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const cachedSearchSync = cosmiconfig('foo').searchSync; // First pass, prime the cache ... cachedSearchSync(searchPath); // Reset readFile mocks and search again. readFileSpy.mockClear(); const result = cachedSearchSync(searchPath); checkResult(readFileSpy, result); }); }); describe('cache is used for already-loaded file', () => { const loadPath = temp.absolutePath('a/b/c/d/.foorc'); const checkResult = (readFileSpy, result) => { expect(readFileSpy).toHaveBeenCalledTimes(0); expect(result).toEqual({ filepath: temp.absolutePath('a/b/c/d/.foorc'), config: { foundInD: true }, }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); const cachedLoad = cosmiconfig('foo').load; // First pass, prime the cache ... return cachedLoad(loadPath) .then(() => { // Reset readFile mocks and search again. readFileSpy.mockClear(); return cachedLoad(loadPath); }) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const cachedLoadSync = cosmiconfig('foo').loadSync; // First pass, prime the cache ... cachedLoadSync(loadPath); // Reset readFile mocks and search again. readFileSpy.mockClear(); const result = cachedLoadSync(loadPath); checkResult(readFileSpy, result); }); }); describe('cache is used when some directories in search are already visted', () => { const firstSearchPath = temp.absolutePath('a/b/c/d/e'); const secondSearchPath = temp.absolutePath('a/b/c/d/e/f'); const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yaml', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/f/.foorc.js', 'a/b/c/d/e/f/foo.config.js', ]); expect(result).toEqual({ filepath: temp.absolutePath('a/b/c/d/.foorc'), config: { foundInD: true }, }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); const cachedSearch = cosmiconfig('foo').search; // First pass, prime the cache ... return cachedSearch(firstSearchPath) .then(() => { // Reset readFile mocks and search again. readFileSpy.mockClear(); return cachedSearch(secondSearchPath); }) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const cachedSearchSync = cosmiconfig('foo').searchSync; // First pass, prime the cache ... cachedSearchSync(firstSearchPath); // Reset readFile mocks and search again. readFileSpy.mockClear(); const result = cachedSearchSync(secondSearchPath); checkResult(readFileSpy, result); }); }); describe('cache is not used when directly loading an unvisited file', () => { const firstSearchPath = temp.absolutePath('a/b/c/d/e'); const loadPath = temp.absolutePath('a/b/package.json'); const checkResult = (readFileSpy, result) => { expect(readFileSpy).toHaveBeenCalledTimes(1); expect(result).toEqual({ filepath: temp.absolutePath('a/b/package.json'), config: { foundInB: true }, }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); const explorer = cosmiconfig('foo'); // First pass, prime the cache ... return explorer .search(firstSearchPath) .then(() => { // Reset readFile mocks and search again. readFileSpy.mockClear(); return explorer.load(loadPath); }) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const explorer = cosmiconfig('foo'); // First pass, prime the cache ... explorer.searchSync(firstSearchPath); // Reset readFile mocks and search again. readFileSpy.mockClear(); const result = explorer.loadSync(loadPath); checkResult(readFileSpy, result); }); }); describe('cache is not used in a new cosmiconfig instance', () => { const searchPath = temp.absolutePath('a/b/c/d/e'); const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/package.json', 'a/b/c/d/e/.foorc', 'a/b/c/d/e/.foorc.json', 'a/b/c/d/e/.foorc.yaml', 'a/b/c/d/e/.foorc.yml', 'a/b/c/d/e/.foorc.js', 'a/b/c/d/e/foo.config.js', 'a/b/c/d/package.json', 'a/b/c/d/.foorc', ]); expect(result).toEqual({ filepath: temp.absolutePath('a/b/c/d/.foorc'), config: { foundInD: true }, }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo') .search(searchPath) .then(() => { // Reset readFile mocks and search again. readFileSpy.mockClear(); return cosmiconfig('foo').search(searchPath); }) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); cosmiconfig('foo').searchSync(searchPath); // Reset readFile mocks and search again. readFileSpy.mockClear(); const result = cosmiconfig('foo').searchSync(searchPath); checkResult(readFileSpy, result); }); }); describe('clears file cache on calling clearLoadCache', () => { const loadPath = temp.absolutePath('a/b/c/d/.foorc'); const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual(['a/b/c/d/.foorc']); expect(result).toEqual({ filepath: temp.absolutePath('a/b/c/d/.foorc'), config: { foundInD: true }, }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); const explorer = cosmiconfig('foo'); return explorer .load(loadPath) .then(() => { // Reset readFile mocks and search again. readFileSpy.mockClear(); explorer.clearLoadCache(); return explorer.load(loadPath); }) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const explorer = cosmiconfig('foo'); explorer.loadSync(loadPath); // Reset readFile mocks and search again. readFileSpy.mockClear(); explorer.clearLoadCache(); const result = explorer.loadSync(loadPath); checkResult(readFileSpy, result); }); }); describe('clears file cache on calling clearCaches', () => { const loadPath = temp.absolutePath('a/b/c/d/.foorc'); const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual(['a/b/c/d/.foorc']); expect(result).toEqual({ filepath: temp.absolutePath('a/b/c/d/.foorc'), config: { foundInD: true }, }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); const explorer = cosmiconfig('foo'); return explorer .load(loadPath) .then(() => { // Reset readFile mocks and search again. readFileSpy.mockClear(); explorer.clearCaches(); return explorer.load(loadPath); }) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const explorer = cosmiconfig('foo'); explorer.loadSync(loadPath); // Reset readFile mocks and search again. readFileSpy.mockClear(); explorer.clearCaches(); const result = explorer.loadSync(loadPath); checkResult(readFileSpy, result); }); }); describe('clears directory cache on calling clearSearchCache', () => { const searchPath = temp.absolutePath('a/b/c/d/e'); const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/package.json', 'a/b/c/d/e/.foorc', 'a/b/c/d/e/.foorc.json', 'a/b/c/d/e/.foorc.yaml', 'a/b/c/d/e/.foorc.yml', 'a/b/c/d/e/.foorc.js', 'a/b/c/d/e/foo.config.js', 'a/b/c/d/package.json', 'a/b/c/d/.foorc', ]); expect(result).toEqual({ filepath: temp.absolutePath('a/b/c/d/.foorc'), config: { foundInD: true }, }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); const explorer = cosmiconfig('foo'); return explorer .search(searchPath) .then(() => { // Reset readFile mocks and search again. readFileSpy.mockClear(); explorer.clearSearchCache(); return explorer.search(searchPath); }) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const explorer = cosmiconfig('foo'); explorer.searchSync(searchPath); // Reset readFile mocks and search again. readFileSpy.mockClear(); explorer.clearSearchCache(); const result = explorer.searchSync(searchPath); checkResult(readFileSpy, result); }); }); describe('clears directory cache on calling clearCaches', () => { const searchPath = temp.absolutePath('a/b/c/d/e'); const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/package.json', 'a/b/c/d/e/.foorc', 'a/b/c/d/e/.foorc.json', 'a/b/c/d/e/.foorc.yaml', 'a/b/c/d/e/.foorc.yml', 'a/b/c/d/e/.foorc.js', 'a/b/c/d/e/foo.config.js', 'a/b/c/d/package.json', 'a/b/c/d/.foorc', ]); expect(result).toEqual({ filepath: temp.absolutePath('a/b/c/d/.foorc'), config: { foundInD: true }, }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); const explorer = cosmiconfig('foo'); return explorer .search(searchPath) .then(() => { // Reset readFile mocks and search again. readFileSpy.mockClear(); explorer.clearCaches(); return explorer.search(searchPath); }) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const explorer = cosmiconfig('foo'); explorer.searchSync(searchPath); // Reset readFile mocks and search again. readFileSpy.mockClear(); explorer.clearCaches(); const result = explorer.searchSync(searchPath); checkResult(readFileSpy, result); }); }); describe('with cache disabled', () => { const explorer = cosmiconfig('foo', { cache: false }); test('does not throw an error when clearFileCache is called', () => { expect(() => explorer.clearLoadCache()).not.toThrow(); }); test('does not throw an error when clearDirectoryCache is called', () => { expect(() => explorer.clearSearchCache()).not.toThrow(); }); test('does not throw an error when clearCaches is called', () => { expect(() => explorer.clearCaches()).not.toThrow(); }); }); describe('with cache disabled, does not cache directory results', () => { const searchPath = temp.absolutePath('a/b/c/d/e'); const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/package.json', 'a/b/c/d/e/.foorc', 'a/b/c/d/e/.foorc.json', 'a/b/c/d/e/.foorc.yaml', 'a/b/c/d/e/.foorc.yml', 'a/b/c/d/e/.foorc.js', 'a/b/c/d/e/foo.config.js', 'a/b/c/d/package.json', 'a/b/c/d/.foorc', ]); expect(result).toEqual({ filepath: temp.absolutePath('a/b/c/d/.foorc'), config: { foundInD: true }, }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); const explorer = cosmiconfig('foo', { cache: false }); return explorer .search(searchPath) .then(() => { // Reset readFile mocks and search again. readFileSpy.mockClear(); return explorer.search(searchPath); }) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const explorer = cosmiconfig('foo', { cache: false }); explorer.searchSync(searchPath); // Reset readFile mocks and search again. readFileSpy.mockClear(); const result = explorer.searchSync(searchPath); checkResult(readFileSpy, result); }); }); describe('with cache disabled, does not cache file results', () => { const loadPath = temp.absolutePath('a/b/c/d/.foorc'); const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual(['a/b/c/d/.foorc']); expect(result).toEqual({ filepath: temp.absolutePath('a/b/c/d/.foorc'), config: { foundInD: true }, }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); const explorer = cosmiconfig('foo', { cache: false }); return explorer .load(loadPath) .then(() => { // Reset readFile mocks and search again. readFileSpy.mockClear(); return explorer.load(loadPath); }) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const explorer = cosmiconfig('foo', { cache: false }); explorer.loadSync(loadPath); // Reset readFile mocks and search again. readFileSpy.mockClear(); const result = explorer.loadSync(loadPath); checkResult(readFileSpy, result); }); }); describe('ensure import-fresh is called when loading a js file', () => { const tempFileName = 'a/b/c/d/.foorc.js'; const loadPath = temp.absolutePath(tempFileName); beforeEach(() => { importFreshMock.mockReturnValue({ foundJs: true }); }); const checkResult = result => { expect(importFreshMock).toHaveBeenCalledTimes(1); expect(importFreshMock).toHaveBeenCalledWith(loadPath); expect(result.config).toEqual({ foundJs: true }); }; test('async', () => { const explorer = cosmiconfig('foo'); temp.createFile(tempFileName, 'module.exports = { foundJs: true };'); return explorer.load(loadPath).then(result => { checkResult(result); }); }); test('sync', () => { const explorer = cosmiconfig('foo'); temp.createFile(tempFileName, 'module.exports = { foundJs: true };'); const result = explorer.loadSync(loadPath); checkResult(result); }); }); cosmiconfig-5.2.1/test/failed-directories.test.js000066400000000000000000000444601346666353700221030ustar00rootroot00000000000000'use strict'; const fs = require('fs'); const cosmiconfig = require('../src'); const util = require('./util'); const temp = new util.TempDir(); beforeEach(() => { temp.clean(); temp.createDir('a/b/c/d/e/f/'); }); afterEach(() => { jest.restoreAllMocks(); }); afterAll(() => { // Remove temp.dir created for tests temp.deleteTempDir(); }); describe('gives up if it cannot find the file', () => { const startDir = temp.absolutePath('a/b'); const explorerOptions = { stopDir: temp.absolutePath('.') }; const checkResult = (statSpy, readFileSpy, result) => { const statPath = temp.getSpyPathCalls(statSpy); expect(statPath).toEqual(['a/b']); const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/package.json', 'a/b/.foorc', 'a/b/.foorc.json', 'a/b/.foorc.yaml', 'a/b/.foorc.yml', 'a/b/.foorc.js', 'a/b/foo.config.js', 'a/package.json', 'a/.foorc', 'a/.foorc.json', 'a/.foorc.yaml', 'a/.foorc.yml', 'a/.foorc.js', 'a/foo.config.js', 'package.json', '.foorc', '.foorc.json', '.foorc.yaml', '.foorc.yml', '.foorc.js', 'foo.config.js', ]); expect(result).toBe(null); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); const statSpy = jest.spyOn(fs, 'stat'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(statSpy, readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const statSpy = jest.spyOn(fs, 'statSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(statSpy, readFileSpy, result); }); }); describe('stops at stopDir and gives up', () => { const startDir = temp.absolutePath('a/b'); const explorerOptions = { stopDir: temp.absolutePath('a') }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/package.json', 'a/b/.foorc', 'a/b/.foorc.json', 'a/b/.foorc.yaml', 'a/b/.foorc.yml', 'a/b/.foorc.js', 'a/b/foo.config.js', 'a/package.json', 'a/.foorc', 'a/.foorc.json', 'a/.foorc.yaml', 'a/.foorc.yml', 'a/.foorc.js', 'a/foo.config.js', ]); expect(result).toBe(null); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('throws error for invalid YAML in rc file', () => { beforeEach(() => { temp.createFile('a/b/.foorc', 'found: true: broken'); }); const startDir = temp.absolutePath('a/b'); const explorerOptions = { stopDir: temp.absolutePath('a') }; const checkError = error => { expect(error.name).toBe('YAMLException'); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('foo', explorerOptions) .search(startDir) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig('foo', explorerOptions).searchSync(startDir); } catch (error) { checkError(error); } }); }); describe('throws error for invalid JSON in extensionless rc file loaded as JSON', () => { beforeEach(() => { temp.createFile('a/b/.foorc', 'found: true: broken'); }); const startDir = temp.absolutePath('a/b'); const explorerOptions = { stopDir: temp.absolutePath('a'), loaders: { noExt: cosmiconfig.loadJson, }, }; const checkError = error => { expect(error.name).toMatch(/JSONError/); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('foo', explorerOptions) .search(startDir) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig('foo', explorerOptions).searchSync(startDir); } catch (error) { checkError(error); } }); }); describe('throws error for invalid package.json', () => { beforeEach(() => { temp.createFile('a/b/package.json', '{ "foo": "bar", }'); }); const startDir = temp.absolutePath('a/b'); const explorerOptions = { stopDir: temp.absolutePath('a') }; const checkError = error => { expect(error.name).toMatch(/JSONError/); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('foo', explorerOptions) .search(startDir) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig('foo', explorerOptions).searchSync(startDir); } catch (error) { checkError(error); } }); }); describe('throws error for invalid JS in .config.js file', () => { beforeEach(() => { temp.createFile( 'a/b/foo.config.js', 'module.exports = { found: true: false,' ); }); const startDir = temp.absolutePath('a/b'); const explorerOptions = { stopDir: temp.absolutePath('a') }; const checkError = error => { expect(error.name).toBe('SyntaxError'); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('foo', explorerOptions) .search(startDir) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig('foo', explorerOptions).searchSync(startDir); } catch (error) { checkError(error); } }); }); describe('throws error for invalid JSON in .foorc.json', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/f/.foorc.json', '{ "found": true,, }'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), }; const checkError = error => { expect(error.message).toMatch(/JSON Error/); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('foo', explorerOptions) .search(startDir) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig('foo', explorerOptions).searchSync(startDir); } catch (error) { checkError(error); } }); }); describe('throws error for invalid YAML in .foorc.yml', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/f/.foorc.yml', 'found: thing: true'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), }; const checkError = error => { expect(error.name).toBe('YAMLException'); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('foo', explorerOptions) .search(startDir) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig('foo', explorerOptions).searchSync(startDir); } catch (error) { checkError(error); } }); }); describe('searching for rc files with specified extensions, throws error for invalid JS in .foorc.js', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/f/.foorc.js', 'module.exports = found: true };'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: [ 'package.json', '.foorc', '.foorc.json', '.foorc.yaml', '.foorc.yml', '.foorc.js', 'foo.config.js', ], }; const checkError = error => { expect(error.name).toBe('SyntaxError'); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('foo', explorerOptions) .search(startDir) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig('foo', explorerOptions).searchSync(startDir); } catch (error) { checkError(error); } }); }); describe('without ignoring empty files, returns an empty config result for an empty rc file', () => { beforeEach(() => { temp.createFile('a/b/.foorc', ''); }); const startDir = temp.absolutePath('a/b'); const explorerOptions = { stopDir: temp.absolutePath('a'), ignoreEmptySearchPlaces: false, }; const checkResult = result => { expect(result).toEqual({ config: undefined, filepath: temp.absolutePath('a/b/.foorc'), isEmpty: true, }); }; test('async', () => { return cosmiconfig('foo', explorerOptions) .search(startDir) .then(checkResult); }); test('sync', () => { const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(result); }); }); describe('without ignoring empty files, returns an empty config result for an empty .config.js file', () => { beforeEach(() => { temp.createFile('a/b/foo.config.js', ''); }); const startDir = temp.absolutePath('a/b'); const explorerOptions = { stopDir: temp.absolutePath('a'), ignoreEmptySearchPlaces: false, }; const checkResult = result => { expect(result).toEqual({ config: undefined, filepath: temp.absolutePath('a/b/foo.config.js'), isEmpty: true, }); }; test('async', () => { return cosmiconfig('foo', explorerOptions) .search(startDir) .then(checkResult); }); test('sync', () => { const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(result); }); }); describe('without ignoring empty files, returns an empty config result for an empty .json rc file', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/f/.foorc.json', ''); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('a'), ignoreEmptySearchPlaces: false, }; const checkResult = result => { expect(result).toEqual({ config: undefined, filepath: temp.absolutePath('a/b/c/d/e/f/.foorc.json'), isEmpty: true, }); }; test('async', () => { return cosmiconfig('foo', explorerOptions) .search(startDir) .then(checkResult); }); test('sync', () => { const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(result); }); }); describe('returns an empty config result for an empty .yaml rc file', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/f/.foorc.yaml', ''); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('a'), ignoreEmptySearchPlaces: false, }; const checkResult = result => { expect(result).toEqual({ config: undefined, filepath: temp.absolutePath('a/b/c/d/e/f/.foorc.yaml'), isEmpty: true, }); }; test('async', () => { return cosmiconfig('foo', explorerOptions) .search(startDir) .then(checkResult); }); test('sync', () => { const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(result); }); }); describe('without ignoring empty configs and searching for rc files with specified extensions, returns an empty config result for an empty .js rc file', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/f/.foorc.js', ''); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('a'), ignoreEmptySearchPlaces: false, searchPlaces: [ 'package.json', '.foorc', '.foorc.json', '.foorc.yaml', '.foorc.yml', '.foorc.js', 'foo.config.js', ], }; const checkResult = result => { expect(result).toEqual({ config: undefined, filepath: temp.absolutePath('a/b/c/d/e/f/.foorc.js'), isEmpty: true, }); }; test('async', () => { return cosmiconfig('foo', explorerOptions) .search(startDir) .then(checkResult); }); test('sync', () => { const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(result); }); }); describe('without ignoring empty configs and searching for rc files with specified extensions, returns an empty config result for an empty .js rc file with whitespace', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/f/.foorc.js', ' \t\r\v\n\f'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('a'), ignoreEmptySearchPlaces: false, searchPlaces: [ 'package.json', '.foorc', '.foorc.json', '.foorc.yaml', '.foorc.yml', '.foorc.js', 'foo.config.js', ], }; const checkResult = result => { expect(result).toEqual({ config: undefined, filepath: temp.absolutePath('a/b/c/d/e/f/.foorc.js'), isEmpty: true, }); }; test('async', () => { return cosmiconfig('foo', explorerOptions) .search(startDir) .then(checkResult); }); test('sync', () => { const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(result); }); }); describe('throws error if a file in searchPlaces does not have a corresponding loader', () => { const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: [ 'package.json', '.foorc', '.foorc.things', '.foorc.js', 'foo.config.js', ], }; const checkError = error => { expect(error.message).toMatch( /No loader specified for extension "\.things"/ ); }; test('on instantiation', () => { expect.hasAssertions(); try { cosmiconfig('foo', explorerOptions); } catch (error) { checkError(error); } }); }); describe('throws error if an extensionless file in searchPlaces does not have a corresponding loader', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/f/.foorc', '{ "foo": "bar" }'); }); const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: ['package.json', '.foorc'], loaders: { noExt: undefined, }, }; const checkError = error => { expect(error.message).toMatch( /No loader specified for files without extensions/ ); }; test('on instantiation', () => { expect.hasAssertions(); try { cosmiconfig('foo', explorerOptions); } catch (error) { checkError(error); } }); }); describe('does not swallow errors from custom loaders', () => { const loadJs = () => { throw new Error('Failed to load JS'); }; beforeEach(() => { temp.createFile('a/b/c/d/e/f/.foorc.js', 'module.exports = {};'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: ['package.json', '.foorc', '.foorc.js'], loaders: { '.js': loadJs, }, }; const checkError = error => { expect(error.message).toBe('Failed to load JS'); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('foo', explorerOptions) .search(startDir) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig('foo', explorerOptions).searchSync(startDir); } catch (error) { checkError(error); } }); }); describe('errors not swallowed when async custom loader throws them', () => { const startDir = temp.absolutePath('a/b/c/d/e/f'); beforeEach(() => { temp.createFile( 'a/b/c/d/e/f/.foorc.things', 'one\ntwo\nthree\t\t\n four\n' ); }); const expectedError = new Error(); const loadThingsAsync = () => { throw expectedError; }; const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: ['.foorc.things'], loaders: { '.things': { async: loadThingsAsync }, }, }; const checkError = error => { expect(error).toBe(expectedError); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('foo', explorerOptions) .search(startDir) .catch(checkError); }); }); describe('errors not swallowed when async custom loader rejects', () => { const startDir = temp.absolutePath('a/b/c/d/e/f'); beforeEach(() => { temp.createFile( 'a/b/c/d/e/f/.foorc.things', 'one\ntwo\nthree\t\t\n four\n' ); }); const expectedError = new Error(); const loadThingsAsync = () => { return Promise.reject(expectedError); }; const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: ['.foorc.things'], loaders: { '.things': { async: loadThingsAsync }, }, }; const checkError = error => { expect(error).toBe(expectedError); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('foo', explorerOptions) .search(startDir) .catch(checkError); }); }); describe('errors if only async loader is set but you call sync search', () => { const startDir = temp.absolutePath('a/b/c/d/e/f'); beforeEach(() => { temp.createFile( 'a/b/c/d/e/f/.foorc.things', 'one\ntwo\nthree\t\t\n four\n' ); }); const loadThings = () => { return Promise.resolve({ things: true }); }; const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: ['.foorc.things'], loaders: { '.things': { async: loadThings }, }, }; const checkError = error => { expect(error.message).toMatch( /No sync loader specified for extension "\.things"/ ); }; test('sync', () => { expect.hasAssertions(); try { cosmiconfig('foo', explorerOptions).searchSync(startDir); } catch (error) { checkError(error); } }); }); describe('errors if it cannot figure out an async loader', () => { const startDir = temp.absolutePath('a/b/c/d/e/f'); beforeEach(() => { temp.createFile( 'a/b/c/d/e/f/.foorc.things', 'one\ntwo\nthree\t\t\n four\n' ); }); const loadThings = () => { return Promise.resolve({ things: true }); }; const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: ['.foorc.things'], loaders: { '.things': { wawa: loadThings }, }, }; const checkError = error => { expect(error.message).toMatch( /No async loader specified for extension "\.things"/ ); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('foo', explorerOptions) .search(startDir) .catch(checkError); }); }); cosmiconfig-5.2.1/test/failed-files.test.js000066400000000000000000000165471346666353700206760ustar00rootroot00000000000000'use strict'; const util = require('./util'); const cosmiconfig = require('../src'); const temp = new util.TempDir(); beforeEach(() => { temp.clean(); }); afterEach(() => { jest.restoreAllMocks(); }); afterAll(() => { // Remove temp.dir created for tests temp.deleteTempDir(); }); describe('throws error if defined file does not exist', () => { const file = temp.absolutePath('does/not/exist'); const checkError = error => { expect(error.code).toBe('ENOENT'); }; test('async', () => { expect.hasAssertions(); return cosmiconfig() .load(file) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig().loadSync(file); } catch (error) { checkError(error); } }); }); describe('throws error if defined JSON file has syntax error', () => { beforeEach(() => { temp.createFile('foo-invalid.json', '{ "foo": true: }'); }); const file = temp.absolutePath('foo-invalid.json'); const checkError = error => { expect(error.message).toMatch(/JSON Error/); }; test('async', () => { expect.hasAssertions(); return cosmiconfig() .load(file) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig().loadSync(file); } catch (error) { checkError(error); } }); }); describe('throws error if defined YAML file has syntax error', () => { beforeEach(() => { temp.createFile('foo-invalid.yaml', 'foo: true: false'); }); const file = temp.absolutePath('foo-invalid.yaml'); const checkError = error => { expect(error.name).toBe('YAMLException'); }; test('async', () => { expect.hasAssertions(); return cosmiconfig() .load(file) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig().loadSync(file); } catch (error) { checkError(error); } }); }); describe('throws error if defined JS file has syntax error', () => { beforeEach(() => { temp.createFile('foo-invalid.js', 'module.exports = { foo }'); }); const file = temp.absolutePath('foo-invalid.js'); const checkError = error => { expect(error.name).toBe('ReferenceError'); }; test('async', () => { expect.hasAssertions(); return cosmiconfig() .load(file) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig().loadSync(file); } catch (error) { checkError(error); } }); }); describe('returns an empty config result for empty file, format JS', () => { beforeEach(() => { temp.createFile('foo-empty.js', ''); }); const file = temp.absolutePath('foo-empty.js'); const checkResult = result => { expect(result).toEqual({ config: undefined, filepath: file, isEmpty: true, }); }; test('async', () => { expect.hasAssertions(); return cosmiconfig() .load(file) .then(checkResult); }); test('sync', () => { const result = cosmiconfig().loadSync(file); checkResult(result); }); }); describe('returns an empty config result for empty file, format JSON', () => { beforeEach(() => { temp.createFile('foo-empty.json', ''); }); const file = temp.absolutePath('foo-empty.json'); const checkResult = result => { expect(result).toEqual({ config: undefined, filepath: file, isEmpty: true, }); }; test('async', () => { expect.hasAssertions(); return cosmiconfig() .load(file) .then(checkResult); }); test('sync', () => { const result = cosmiconfig().loadSync(file); checkResult(result); }); }); describe('returns an empty config result for empty file, format YAML', () => { beforeEach(() => { temp.createFile('foo-empty.yaml', ''); }); const file = temp.absolutePath('foo-empty.yaml'); const checkResult = result => { expect(result).toEqual({ config: undefined, filepath: file, isEmpty: true, }); }; test('async', () => { expect.hasAssertions(); return cosmiconfig() .load(file) .then(checkResult); }); test('sync', () => { const result = cosmiconfig().loadSync(file); checkResult(result); }); }); describe('throws an error if no configPath was specified and load is called without an argument', () => { const checkError = error => { expect(error.message).toMatch(/non-empty string/); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('not_exist_rc_name') .load() .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig('not_exist_rc_name').loadSync(); } catch (error) { checkError(error); } }); }); describe('errors not swallowed when async custom loader throws them', () => { const file = temp.absolutePath('.foorc.things'); beforeEach(() => { temp.createFile('.foorc.things', 'one\ntwo\nthree\t\t\n four\n'); }); const expectedError = new Error(); const loadThingsAsync = () => { throw expectedError; }; const explorerOptions = { loaders: { '.things': { async: loadThingsAsync }, }, }; const checkError = error => { expect(error).toBe(expectedError); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('not_exist_rc_name', explorerOptions) .load(file) .catch(checkError); }); }); describe('errors not swallowed when async custom loader rejects', () => { const file = temp.absolutePath('.foorc.things'); beforeEach(() => { temp.createFile('.foorc.things', 'one\ntwo\nthree\t\t\n four\n'); }); const expectedError = new Error(); const loadThingsAsync = () => { return Promise.reject(expectedError); }; const explorerOptions = { loaders: { '.things': { async: loadThingsAsync }, }, }; const checkError = error => { expect(error).toBe(expectedError); }; test('async', () => { expect.hasAssertions(); return cosmiconfig('not_exist_rc_name', explorerOptions) .load(file) .catch(checkError); }); }); describe('errors if only async loader is set but you call sync search', () => { const file = temp.absolutePath('.foorc.things'); beforeEach(() => { temp.createFile('.foorc.things', 'one\ntwo\nthree\t\t\n four\n'); }); const loadThingsAsync = () => { return Promise.resolve({ things: true }); }; const explorerOptions = { loaders: { '.things': { async: loadThingsAsync }, }, }; const checkError = error => { expect(error.message).toMatch( /No sync loader specified for extension "\.things"/ ); }; test('sync', () => { expect.hasAssertions(); try { cosmiconfig('not_exist_rc_name', explorerOptions).loadSync(file); } catch (error) { checkError(error); } }); }); describe('errors if no loader is set but you call sync load', () => { const file = temp.absolutePath('.foorc.things'); beforeEach(() => { temp.createFile('.foorc.things', 'one\ntwo\nthree\t\t\n four\n'); }); const explorerOptions = { loaders: {}, }; const checkError = error => { expect(error.message).toMatch( /No sync loader specified for extension "\.things"/ ); }; test('sync', () => { expect.hasAssertions(); try { cosmiconfig('not_exist_rc_name', explorerOptions).loadSync(file); } catch (error) { checkError(error); } }); }); cosmiconfig-5.2.1/test/getDirectory.test.js000066400000000000000000000026751346666353700210130ustar00rootroot00000000000000'use strict'; const getDirectory = require('../src/getDirectory'); describe('returns the searchPath if it is a directory', () => { const subject = __dirname; const checkResult = result => { expect(result).toBe(subject); }; test('async', () => { return getDirectory(subject, false).then(checkResult); }); test('sync', () => { checkResult(getDirectory.sync(subject, true)); }); }); describe('returns the parent directory if it is a file', () => { const subject = __filename; const checkResult = result => { expect(result).toBe(__dirname); }; test('async', () => { return getDirectory(subject, false).then(checkResult); }); test('sync', () => { checkResult(getDirectory.sync(subject, true)); }); }); test('returns a promise if sync is not true', () => { // Although we explicitly pass `false`, the result will be a promise even // if a value was not passed, because it would be falsy and not exactly // equal to `true`. const res = getDirectory(__dirname, false); expect(res).toBeInstanceOf(Promise); }); test('propagates error thrown by is-directory in sync', () => { expect(() => getDirectory.sync(null, true)).toThrowError( 'expected filepath to be a string' ); }); test('rejects with the error thrown by is-directory in async', () => { expect.hasAssertions(); return getDirectory(null, false).catch(err => { expect(err.message).toBe('expected filepath to be a string'); }); }); cosmiconfig-5.2.1/test/getPropertyByPath.test.js000066400000000000000000000043231346666353700217730ustar00rootroot00000000000000'use strict'; const getPropertyPath = require('../src/getPropertyByPath'); const source = { ant: { beetle: { cootie: { flea: 'foo', }, louse: { vermin: 'bar', }, }, 'fancy.name': { 'another.fancy.name': 9, }, }, 'ant.beetle.cootie': 333, }; describe('with a property name that includes a period', () => { test('does not treat it as a period-delimited path', () => { expect(getPropertyPath(source, 'ant.beetle.cootie')).toBe(333); }); }); describe('with period-delimited string path', () => { test('returns a defined value', () => { expect(getPropertyPath(source, 'ant')).toBe(source.ant); expect(getPropertyPath(source, 'ant.beetle.cootie.flea')).toBe('foo'); expect(getPropertyPath(source, 'ant.beetle.louse')).toBe( source.ant.beetle.louse ); }); test('returns undefined', () => { expect(getPropertyPath(source, 'beetle')).toBeUndefined(); expect(getPropertyPath(source, 'ant.beetle.cootie.fleeee')).toBeUndefined(); expect(getPropertyPath(source, 'ant.beetle.vermin')).toBeUndefined(); expect(getPropertyPath(source, 'ant.fancy.name')).toBeUndefined(); }); }); describe('with array path', () => { test('returns a defined value', () => { expect(getPropertyPath(source, ['ant'])).toBe(source.ant); expect(getPropertyPath(source, ['ant', 'beetle', 'cootie', 'flea'])).toBe( 'foo' ); expect(getPropertyPath(source, ['ant', 'beetle', 'louse'])).toBe( source.ant.beetle.louse ); }); test('returns undefined', () => { expect(getPropertyPath(source, ['beetle'])).toBeUndefined(); expect( getPropertyPath(source, ['ant', 'beetle', 'cootie', 'fleeee']) ).toBeUndefined(); expect( getPropertyPath(source, ['ant', 'beetle', 'vermin']) ).toBeUndefined(); }); test('handles property names with periods', () => { expect( getPropertyPath(source, ['ant', 'fancy.name', 'another.fancy.name']) ).toBe(9); expect( getPropertyPath(source, [ 'ant', 'fancy.name', 'another.fancy.name', 'foo', ]) ).toBeUndefined; expect(getPropertyPath(source, ['ant', 'fancy.namez'])).toBeUndefined; }); }); cosmiconfig-5.2.1/test/index.test.js000066400000000000000000000062741346666353700174550ustar00rootroot00000000000000'use strict'; // Mock `createExplorer` because we want to check what it is called with. jest.mock('../src/createExplorer'); const os = require('os'); const cosmiconfig = require('../src'); const util = require('./util'); const createExplorerMock = require('../src/createExplorer'); const loaders = require('../src/loaders'); const temp = new util.TempDir(); describe('cosmiconfig', () => { const moduleName = 'foo'; beforeEach(() => { temp.clean(); }); afterEach(() => { // Clean up a mock's usage data between tests jest.clearAllMocks(); jest.restoreAllMocks(); }); afterAll(() => { // Remove temp.dir created for tests temp.deleteTempDir(); }); it('creates explorer with default options if not specified', () => { cosmiconfig(moduleName); expect(createExplorerMock).toHaveBeenCalledTimes(1); const explorerOptions = createExplorerMock.mock.calls[0][0]; expect(explorerOptions).toMatchObject({ packageProp: moduleName, searchPlaces: [ 'package.json', `.${moduleName}rc`, `.${moduleName}rc.json`, `.${moduleName}rc.yaml`, `.${moduleName}rc.yml`, `.${moduleName}rc.js`, `${moduleName}.config.js`, ], ignoreEmptySearchPlaces: true, stopDir: os.homedir(), cache: true, loaders: { '.js': { sync: loaders.loadJs, async: loaders.loadJs }, '.json': { sync: loaders.loadJson, async: loaders.loadJson }, '.yaml': { sync: loaders.loadYaml, async: loaders.loadYaml }, '.yml': { sync: loaders.loadYaml, async: loaders.loadYaml }, noExt: { sync: loaders.loadYaml, async: loaders.loadYaml }, }, transform: expect.any(Function), }); }); it('defaults transform to identity function', () => { cosmiconfig(moduleName); const explorerOptions = createExplorerMock.mock.calls[0][0]; const x = {}; expect(explorerOptions.transform(x)).toBe(x); }); it('creates explorer with preference for given options over defaults', () => { temp.createFile('foo.json', '{ "foo": true }'); const noExtLoader = () => {}; const jsLoader = () => {}; const jsonLoader = () => {}; const yamlLoader = () => {}; cosmiconfig(moduleName, { stopDir: __dirname, cache: false, searchPlaces: ['.foorc.json', 'wildandfree.js'], packageProp: 'wildandfree', ignoreEmptySearchPlaces: false, loaders: { noExt: noExtLoader, '.js': { async: jsLoader }, '.json': { sync: jsonLoader }, '.yaml': { sync: yamlLoader, async: yamlLoader }, }, }); const explorerOptions = createExplorerMock.mock.calls[0][0]; expect(explorerOptions).toMatchObject({ packageProp: 'wildandfree', searchPlaces: ['.foorc.json', 'wildandfree.js'], ignoreEmptySearchPlaces: false, stopDir: __dirname, cache: false, loaders: { '.js': { async: jsLoader }, '.json': { sync: jsonLoader }, '.yaml': { sync: yamlLoader, async: yamlLoader }, '.yml': { sync: loaders.loadYaml, async: loaders.loadYaml }, noExt: { sync: noExtLoader, async: noExtLoader }, }, transform: expect.any(Function), }); }); }); cosmiconfig-5.2.1/test/successful-directories.test.js000066400000000000000000000727241346666353700230420ustar00rootroot00000000000000'use strict'; const fs = require('fs'); const util = require('./util'); const cosmiconfig = require('../src'); const temp = new util.TempDir(); beforeEach(() => { temp.clean(); temp.createDir('a/b/c/d/e/f/'); }); afterEach(() => { jest.restoreAllMocks(); }); afterAll(() => { // Remove temp.dir created for tests temp.deleteTempDir(); }); describe('finds rc file in third searched dir, with a package.json lacking prop', () => { beforeEach(() => { temp.createFile('a/b/c/d/package.json', '{ "false": "hope" }'); temp.createFile('a/b/c/d/.foorc', '{ "found": true }'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.') }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yaml', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/f/.foorc.js', 'a/b/c/d/e/f/foo.config.js', 'a/b/c/d/e/package.json', 'a/b/c/d/e/.foorc', 'a/b/c/d/e/.foorc.json', 'a/b/c/d/e/.foorc.yaml', 'a/b/c/d/e/.foorc.yml', 'a/b/c/d/e/.foorc.js', 'a/b/c/d/e/foo.config.js', 'a/b/c/d/package.json', 'a/b/c/d/.foorc', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/.foorc'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('finds package.json prop in second searched dir', () => { beforeEach(() => { temp.createFile( 'a/b/c/d/e/package.json', '{ "author": "Todd", "foo": { "found": true } }' ); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.') }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yaml', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/f/.foorc.js', 'a/b/c/d/e/f/foo.config.js', 'a/b/c/d/e/package.json', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/e/package.json'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('finds package.json with nested packageProp in second searched dir', () => { beforeEach(() => { // First package.json exists but does not include the nested packageProp. temp.createFile( 'a/b/c/d/e/f/package.json', '{ "author": "Todd", "configs": { "notYourPkg": { "yes": "ofcourse" } } }' ); temp.createFile( 'a/b/c/d/e/package.json', '{ "author": "Todd", "configs": { "pkg": { "please": "no" } } }' ); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), packageProp: 'configs.pkg', }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yaml', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/f/.foorc.js', 'a/b/c/d/e/f/foo.config.js', 'a/b/c/d/e/package.json', ]); expect(result).toEqual({ config: { please: 'no' }, filepath: temp.absolutePath('a/b/c/d/e/package.json'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('finds JS file in first searched dir', () => { beforeEach(() => { temp.createFile( 'a/b/c/d/e/f/foo.config.js', 'module.exports = { found: true };' ); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.') }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yaml', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/f/.foorc.js', 'a/b/c/d/e/f/foo.config.js', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/e/f/foo.config.js'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('finds .foorc.js file in first searched dir', () => { beforeEach(() => { temp.createFile( 'a/b/c/d/e/f/.foorc.js', 'module.exports = { found: true };' ); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.') }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yaml', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/f/.foorc.js', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/e/f/.foorc.js'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('skips over empty file to find JS file in first searched dir', () => { beforeEach(() => { temp.createFile( 'a/b/c/d/e/f/foo.config.js', 'module.exports = { found: true };' ); temp.createFile('a/b/c/d/e/f/.foorc', ''); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.') }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yaml', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/f/.foorc.js', 'a/b/c/d/e/f/foo.config.js', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/e/f/foo.config.js'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('finds package.json in second dir searched, with alternate names', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/package.json', '{ "heeha": { "found": true } }'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), packageProp: 'heeha', searchPlaces: ['package.json', '.wowza', 'wowzaConfig.js'], }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.wowza', 'a/b/c/d/e/f/wowzaConfig.js', 'a/b/c/d/e/package.json', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/e/package.json'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('finds rc file in third searched dir, skipping packageProp, parsing extensionless files as JSON', () => { beforeEach(() => { temp.createFile('a/b/c/d/.foorc', '{ "found": true }'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), loaders: { noExt: cosmiconfig.loadJson, }, searchPlaces: ['.foorc', 'foo.config.js'], }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/foo.config.js', 'a/b/c/d/e/.foorc', 'a/b/c/d/e/foo.config.js', 'a/b/c/d/.foorc', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/.foorc'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('finds package.json file in second searched dir, skipping JS and RC files', () => { beforeEach(() => { temp.createFile( 'a/b/c/d/e/package.json', '{ "author": "Todd", "foo": { "found": true } }' ); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { searchPlaces: ['package.json'], }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/package.json', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/e/package.json'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('finds .foorc.json in second searched dir', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/.foorc.json', '{ "found": true }'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yaml', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/f/.foorc.js', 'a/b/c/d/e/f/foo.config.js', 'a/b/c/d/e/package.json', 'a/b/c/d/e/.foorc', 'a/b/c/d/e/.foorc.json', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/e/.foorc.json'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('finds .foorc.yaml in first searched dir', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/f/.foorc.yaml', 'found: true'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yaml', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/e/f/.foorc.yaml'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('finds .foorc.yml in first searched dir', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/f/.foorc.yml', 'found: true'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yaml', 'a/b/c/d/e/f/.foorc.yml', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/e/f/.foorc.yml'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('adding myfooconfig.js to searchPlaces, finds it in first searched dir', () => { beforeEach(() => { temp.createFile( 'a/b/c/d/e/f/myfooconfig.js', 'module.exports = { found: true };' ); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: [ 'package.json', '.foorc', '.foorc.json', '.foorc.yaml', '.foorc.yml', '.foorc.js', 'foo.config.js', 'myfooconfig.js', ], }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yaml', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/f/.foorc.js', 'a/b/c/d/e/f/foo.config.js', 'a/b/c/d/e/f/myfooconfig.js', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/e/f/myfooconfig.js'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('finds JS file traversing from cwd', () => { const originalCwd = process.cwd(); beforeEach(() => { temp.createFile( 'a/b/c/d/e/foo.config.js', 'module.exports = { found: true };' ); process.chdir(temp.absolutePath('a/b/c/d/e/f')); }); afterEach(() => { process.chdir(originalCwd); }); const explorerOptions = { stopDir: temp.absolutePath('.'), }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yaml', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/f/.foorc.js', 'a/b/c/d/e/f/foo.config.js', 'a/b/c/d/e/package.json', 'a/b/c/d/e/.foorc', 'a/b/c/d/e/.foorc.json', 'a/b/c/d/e/.foorc.yaml', 'a/b/c/d/e/.foorc.yml', 'a/b/c/d/e/.foorc.js', 'a/b/c/d/e/foo.config.js', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/e/foo.config.js'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search() .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(); checkResult(readFileSpy, result); }); }); describe('searchPlaces can include subdirectories', () => { beforeEach(() => { temp.createFile('a/b/c/d/e/.config/.foorc.json', '{ "found": true }'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: [ '.foorc.json', 'package.json', '.config/.foorc.json', '.config/foo/config.json', ], }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.config/.foorc.json', 'a/b/c/d/e/f/.config/foo/config.json', 'a/b/c/d/e/.foorc.json', 'a/b/c/d/e/package.json', 'a/b/c/d/e/.config/.foorc.json', ]); expect(result).toEqual({ config: { found: true }, filepath: temp.absolutePath('a/b/c/d/e/.config/.foorc.json'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('custom loaders allow non-default file types', () => { const loadThings = (filepath, content) => { return { things: content .split('\n') .map(x => x.trim()) .filter(x => !!x), }; }; const loadGrumbly = () => ({ grumbly: true }); beforeEach(() => { temp.createFile('a/b/c/d/e/.foorc.things', 'one\ntwo\nthree\t\t\n four\n'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: [ 'package.json', '.foorc.json', '.foorc.yml', '.foorc.things', '.foorc.grumbly', ], loaders: { '.things': loadThings, '.grumbly': loadGrumbly, }, }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/f/.foorc.things', 'a/b/c/d/e/f/.foorc.grumbly', 'a/b/c/d/e/package.json', 'a/b/c/d/e/.foorc.json', 'a/b/c/d/e/.foorc.yml', 'a/b/c/d/e/.foorc.things', ]); expect(result).toEqual({ config: { things: ['one', 'two', 'three', 'four'] }, filepath: temp.absolutePath('a/b/c/d/e/.foorc.things'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('adding custom loaders allows for default and non-default file types', () => { const loadThings = (filepath, content) => { return { things: content .split('\n') .map(x => x.trim()) .filter(x => !!x), }; }; const loadGrumbly = () => ({ grumbly: true }); beforeEach(() => { temp.createFile('a/b/c/d/e/.foorc.things', 'one\ntwo\nthree\t\t\n four\n'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: [ 'package.json', '.foorc.json', '.foorc.yml', '.foorc.things', '.foorc.grumbly', ], loaders: { '.things': loadThings, '.grumbly': loadGrumbly, }, }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/f/.foorc.things', 'a/b/c/d/e/f/.foorc.grumbly', 'a/b/c/d/e/package.json', 'a/b/c/d/e/.foorc.json', 'a/b/c/d/e/.foorc.yml', 'a/b/c/d/e/.foorc.things', ]); expect(result).toEqual({ config: { things: ['one', 'two', 'three', 'four'] }, filepath: temp.absolutePath('a/b/c/d/e/.foorc.things'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('defaults loaders can be overridden', () => { const loadGrumbly = () => ({ grumbly: true }); beforeEach(() => { temp.createFile('a/b/c/d/e/foo.config.js', 'foo'); }); const startDir = temp.absolutePath('a/b/c/d/e/f'); const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: [ 'package.json', '.foorc.json', 'foo.config.js', '.foorc.yml', ], loaders: { '.js': loadGrumbly, }, }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual([ 'a/b/c/d/e/f/package.json', 'a/b/c/d/e/f/.foorc.json', 'a/b/c/d/e/f/foo.config.js', 'a/b/c/d/e/f/.foorc.yml', 'a/b/c/d/e/package.json', 'a/b/c/d/e/.foorc.json', 'a/b/c/d/e/foo.config.js', ]); expect(result).toEqual({ config: { grumbly: true }, filepath: temp.absolutePath('a/b/c/d/e/foo.config.js'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('custom loaders can be async', () => { const startDir = temp.absolutePath('a/b/c/d/e/f'); let loadThingsSync; let loadThingsAsync; let explorerOptions; beforeEach(() => { temp.createFile( 'a/b/c/d/e/f/.foorc.things', 'one\ntwo\nthree\t\t\n four\n' ); loadThingsSync = jest.fn(() => { return { things: true }; }); loadThingsAsync = jest.fn(() => { return Promise.resolve({ things: true }); }); explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: ['.foorc.things'], loaders: { '.things': { sync: loadThingsSync, async: loadThingsAsync }, }, }; }); const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual(['a/b/c/d/e/f/.foorc.things']); expect(result).toEqual({ config: { things: true }, filepath: temp.absolutePath('a/b/c/d/e/f/.foorc.things'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { expect(loadThingsSync).not.toHaveBeenCalled(); expect(loadThingsAsync).toHaveBeenCalled(); checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); expect(loadThingsSync).toHaveBeenCalled(); expect(loadThingsAsync).not.toHaveBeenCalled(); checkResult(readFileSpy, result); }); }); describe('a custom loader entry can include just an async loader', () => { const startDir = temp.absolutePath('a/b/c/d/e/f'); beforeEach(() => { temp.createFile( 'a/b/c/d/e/f/.foorc.things', 'one\ntwo\nthree\t\t\n four\n' ); }); const loadThingsAsync = () => { return Promise.resolve({ things: true }); }; const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: ['.foorc.things'], loaders: { '.things': { async: loadThingsAsync }, }, }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual(['a/b/c/d/e/f/.foorc.things']); expect(result).toEqual({ config: { things: true }, filepath: temp.absolutePath('a/b/c/d/e/f/.foorc.things'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); }); describe('a custom loader entry can include only a sync loader and work for both sync and async functions', () => { const startDir = temp.absolutePath('a/b/c/d/e/f'); beforeEach(() => { temp.createFile( 'a/b/c/d/e/f/.foorc.things', 'one\ntwo\nthree\t\t\n four\n' ); }); const loadThingsSync = () => { return { things: true }; }; const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: ['.foorc.things'], loaders: { '.things': { sync: loadThingsSync }, }, }; const checkResult = (readFileSpy, result) => { const filesChecked = temp.getSpyPathCalls(readFileSpy); expect(filesChecked).toEqual(['a/b/c/d/e/f/.foorc.things']); expect(result).toEqual({ config: { things: true }, filepath: temp.absolutePath('a/b/c/d/e/f/.foorc.things'), }); }; test('async', () => { const readFileSpy = jest.spyOn(fs, 'readFile'); return cosmiconfig('foo', explorerOptions) .search(startDir) .then(result => { checkResult(readFileSpy, result); }); }); test('sync', () => { const readFileSpy = jest.spyOn(fs, 'readFileSync'); const result = cosmiconfig('foo', explorerOptions).searchSync(startDir); checkResult(readFileSpy, result); }); }); describe('works fine if sync loader returns a Promise from a JS file', () => { const startDir = temp.absolutePath('a/b/c/d/e/f'); beforeEach(() => { temp.createFile( 'a/b/c/d/e/f/bar.config.js', 'module.exports = Promise.resolve({ a: 1 });' ); }); const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: ['bar.config.js'], }; test('sync', () => { const result = cosmiconfig('bar', explorerOptions).searchSync(startDir); expect(result).toEqual({ filepath: temp.absolutePath('a/b/c/d/e/f/bar.config.js'), config: expect.any(Promise), }); return result.config.then(resolved => { expect(resolved).toEqual({ a: 1 }); }); }); }); cosmiconfig-5.2.1/test/successful-files.test.js000066400000000000000000000272321346666353700216220ustar00rootroot00000000000000'use strict'; const util = require('./util'); const cosmiconfig = require('../src'); const temp = new util.TempDir(); beforeEach(() => { temp.clean(); }); afterEach(() => { jest.restoreAllMocks(); }); afterAll(() => { // Remove temp.dir created for tests temp.deleteTempDir(); }); describe('loads defined JSON config path', () => { beforeEach(() => { temp.createFile('foo.json', '{ "foo": true }'); }); const file = temp.absolutePath('foo.json'); const checkResult = result => { expect(result.config).toEqual({ foo: true }); expect(result.filepath).toBe(file); }; test('async', () => { return cosmiconfig() .load(file) .then(checkResult); }); test('sync', () => { const result = cosmiconfig().loadSync(file); checkResult(result); }); }); describe('loads defined YAML config path', () => { beforeEach(() => { temp.createFile('foo.yaml', 'foo: true'); }); const file = temp.absolutePath('foo.yaml'); const checkResult = result => { expect(result.config).toEqual({ foo: true }); expect(result.filepath).toBe(file); }; test('async', () => { return cosmiconfig() .load(file) .then(checkResult); }); test('sync', () => { const result = cosmiconfig().loadSync(file); checkResult(result); }); }); describe('loads defined JS config path', () => { beforeEach(() => { temp.createFile('foo.js', 'module.exports = { foo: true };'); }); const file = temp.absolutePath('foo.js'); const checkResult = result => { expect(result.config).toEqual({ foo: true }); expect(result.filepath).toBe(file); }; test('async', () => { return cosmiconfig() .load(file) .then(checkResult); }); test('sync', () => { const result = cosmiconfig().loadSync(file); checkResult(result); }); }); describe('loads modularized JS config path', () => { beforeEach(() => { temp.createFile('foo.js', 'module.exports = { foo: true };'); temp.createFile('foo-module.js', 'module.exports = require("./foo");'); }); const file = temp.absolutePath('foo-module.js'); const checkResult = result => { expect(result.config).toEqual({ foo: true }); expect(result.filepath).toBe(file); }; test('async', () => { return cosmiconfig() .load(file) .then(checkResult); }); test('sync', () => { const result = cosmiconfig().loadSync(file); checkResult(result); }); }); describe('loads yaml-like JS config path', () => { beforeEach(() => { temp.createFile('foo-yaml-like.js', 'module.exports = { foo: true };'); }); const file = temp.absolutePath('foo-yaml-like.js'); const checkResult = result => { expect(result.config).toEqual({ foo: true }); expect(result.filepath).toBe(file); }; test('async', () => { return cosmiconfig() .load(file) .then(checkResult); }); test('sync', () => { const result = cosmiconfig().loadSync(file); checkResult(result); }); }); describe('loads package prop when configPath is package.json', () => { beforeEach(() => { temp.createFile( 'package.json', `{ "foo": { "bar": "baz" }, "otherPackage": { "please": "no" } }` ); }); const configPath = temp.absolutePath('package.json'); const checkResult = (result, expectedConfig) => { expect(result.config).toEqual(expectedConfig); expect(result.filepath).toBe(configPath); }; describe('default package prop', () => { const explorer = cosmiconfig('foo'); const expectedConfig = { bar: 'baz' }; test('async', () => { return explorer .load(configPath) .then(result => checkResult(result, expectedConfig)); }); test('sync', () => { const result = explorer.loadSync(configPath); checkResult(result, expectedConfig); }); }); describe('specified packageProp', () => { const explorer = cosmiconfig('foo', { packageProp: 'otherPackage' }); const expectedConfig = { please: 'no' }; test('async', () => { return explorer .load(configPath) .then(result => checkResult(result, expectedConfig)); }); test('sync', () => { const result = explorer.loadSync(configPath); checkResult(result, expectedConfig); }); }); describe('nested packageProp', () => { const explorer = cosmiconfig('foo', { packageProp: 'foo.bar' }); const expectedConfig = 'baz'; test('async', () => { return explorer .load(configPath) .then(result => checkResult(result, expectedConfig)); }); test('sync', () => { const result = explorer.loadSync(configPath); checkResult(result, expectedConfig); }); }); describe('inaccurate packageProp returns undefined, does not error', () => { const explorer = cosmiconfig('foo', { packageProp: 'otherrrPackage' }); test('async', () => { return explorer .load(configPath) .then(result => expect(result).toBeNull()); }); test('sync', () => { const result = explorer.loadSync(configPath); expect(result).toBeNull(); }); }); describe('inaccurate nested packageProp returns undefined, does not error', () => { const explorer = cosmiconfig('foo', { packageProp: 'foo.baz' }); test('async', () => { return explorer .load(configPath) .then(result => expect(result).toBeNull()); }); test('sync', () => { const result = explorer.loadSync(configPath); expect(result).toBeNull(); }); }); }); describe('runs transform', () => { beforeEach(() => { temp.createFile('foo.json', '{ "foo": true }'); }); const configPath = temp.absolutePath('foo.json'); const transform = result => { result.config.foo = [result.config.foo]; return result; }; const checkResult = result => { expect(result.config).toEqual({ foo: [true] }); }; test('async', () => { return cosmiconfig(null, { transform }) .load(configPath) .then(checkResult); }); test('sync', () => { const result = cosmiconfig(null, { transform }).loadSync(configPath); checkResult(result); }); }); describe('does not swallow transform errors', () => { beforeEach(() => { temp.createFile('foo.json', '{ "foo": true }'); }); const configPath = temp.absolutePath('foo.json'); const transform = () => { throw new Error('These pretzels are making me thirsty!'); }; const checkError = error => { expect(error.message).toBe('These pretzels are making me thirsty!'); }; test('async', () => { expect.hasAssertions(); return cosmiconfig(null, { transform }) .load(configPath) .catch(checkError); }); test('sync', () => { expect.hasAssertions(); try { cosmiconfig(null, { transform }).loadSync(configPath); } catch (error) { checkError(error); } }); }); describe('loads defined JSON file with no extension', () => { beforeEach(() => { temp.createFile('foo-valid-json', '{ "json": true }'); }); const file = temp.absolutePath('foo-valid-json'); const checkResult = result => { expect(result.config).toEqual({ json: true }); expect(result.filepath).toBe(file); }; test('async', () => { return cosmiconfig() .load(file) .then(result => { checkResult(result); }); }); test('sync', () => { const result = cosmiconfig().loadSync(file); checkResult(result); }); }); describe('loads defined YAML file with no extension', () => { beforeEach(() => { temp.createFile('foo-valid-yaml', 'yaml: true'); }); const file = temp.absolutePath('foo-valid-yaml'); const checkResult = result => { expect(result.config).toEqual({ yaml: true }); expect(result.filepath).toBe(file); }; test('async', () => { return cosmiconfig() .load(file) .then(result => { checkResult(result); }); }); test('sync', () => { const result = cosmiconfig().loadSync(file); checkResult(result); }); }); describe('custom loaders can be async', () => { let loadThingsSync; let loadThingsAsync; let explorerOptions; beforeEach(() => { temp.createFile('.foorc.things', 'one\ntwo\nthree\t\t\n four\n'); loadThingsSync = jest.fn(() => { return { things: true }; }); loadThingsAsync = jest.fn(() => { return Promise.resolve({ things: true }); }); explorerOptions = { loaders: { '.things': { sync: loadThingsSync, async: loadThingsAsync }, }, }; }); const file = temp.absolutePath('.foorc.things'); const checkResult = result => { expect(result.config).toEqual({ things: true }); expect(result.filepath).toBe(file); }; test('async', () => { return cosmiconfig('foo', explorerOptions) .load(file) .then(checkResult); }); test('sync', () => { const result = cosmiconfig('foo', explorerOptions).loadSync(file); checkResult(result); }); }); describe('a custom loader entry can include just an async loader', () => { beforeEach(() => { temp.createFile('.foorc.things', 'one\ntwo\nthree\t\t\n four\n'); }); const loadThingsAsync = () => { return Promise.resolve({ things: true }); }; const explorerOptions = { loaders: { '.things': { async: loadThingsAsync }, }, }; const file = temp.absolutePath('.foorc.things'); const checkResult = result => { expect(result.config).toEqual({ things: true }); expect(result.filepath).toBe(file); }; test('async', () => { return cosmiconfig('foo', explorerOptions) .load(file) .then(checkResult); }); }); describe('a custom loader entry can include only a sync loader and work for both sync and async functions', () => { beforeEach(() => { temp.createFile('.foorc.things', 'one\ntwo\nthree\t\t\n four\n'); }); const loadThingsAsync = () => { return { things: true }; }; const explorerOptions = { loaders: { '.things': { sync: loadThingsAsync }, }, }; const file = temp.absolutePath('.foorc.things'); const checkResult = result => { expect(result.config).toEqual({ things: true }); expect(result.filepath).toBe(file); }; test('async', () => { return cosmiconfig('foo', explorerOptions) .load(file) .then(checkResult); }); test('sync', () => { const result = cosmiconfig('foo', explorerOptions).loadSync(file); checkResult(result); }); }); describe('works fine if sync loader returns a Promise from a JS file', () => { beforeEach(() => { temp.createFile( 'foo.config.js', 'module.exports = Promise.resolve({ a: 1 });' ); }); const file = temp.absolutePath('foo.config.js'); const explorerOptions = { stopDir: temp.absolutePath('.'), searchPlaces: ['foo.config.js'], }; test('sync', () => { const result = cosmiconfig('foo', explorerOptions).loadSync(file); expect(result).toEqual({ filepath: file, config: expect.any(Promise), }); return result.config.then(resolved => { expect(resolved).toEqual({ a: 1 }); }); }); }); describe('loads defined JS config relative path', () => { const currentDir = process.cwd(); beforeEach(() => { temp.createFile('config/bar.js', 'module.exports = { bar: true };'); process.chdir(temp.dir); }); afterEach(() => { process.chdir(currentDir); }); const relativeFile = './config/bar.js'; const absoluteFile = temp.absolutePath(relativeFile); const checkResult = result => { expect(result.config).toEqual({ bar: true }); expect(result.filepath).toBe(absoluteFile); }; test('async', () => { return cosmiconfig() .load(relativeFile) .then(checkResult); }); test('sync', () => { const result = cosmiconfig().loadSync(relativeFile); checkResult(result); }); }); cosmiconfig-5.2.1/test/util.js000066400000000000000000000052221346666353700163350ustar00rootroot00000000000000'use strict'; const path = require('path'); const del = require('del'); const makeDir = require('make-dir'); const parentModule = require('parent-module'); const os = require('os'); const fs = require.requireActual('fs'); class TempDir { dir: string; constructor() { /** * Get the actual path for temp directories that are symlinks (MacOS). * Without the actual path, tests that use process.chdir will unexpectedly * return the real path instead of symlink path. */ const tempDir = fs.realpathSync(os.tmpdir()); /** * Get the pathname of the file that imported util.js. * Used to create a unique directory name for each test suite. */ const parent = parentModule(); const relativeParent = path.relative(process.cwd(), parent); /** * Each temp directory will be unique to the test file. * This ensures that temp files/dirs won't cause side effects for other tests. */ this.dir = path.resolve(tempDir, 'cosmiconfig', `${relativeParent}-dir`); // create directory makeDir.sync(this.dir); (this: any).absolutePath = this.absolutePath.bind(this); (this: any).createDir = this.createDir.bind(this); (this: any).createFile = this.createFile.bind(this); (this: any).clean = this.clean.bind(this); (this: any).deleteTempDir = this.deleteTempDir.bind(this); } absolutePath(dir: string) { // Use path.join to ensure dir is always inside the working temp directory const absolutePath = path.join(this.dir, dir); return absolutePath; } createDir(dir: string) { const dirname = this.absolutePath(dir); makeDir.sync(dirname); } createFile(file: string, contents: string) { const filePath = this.absolutePath(file); const fileDir = path.parse(filePath).dir; makeDir.sync(fileDir); fs.writeFileSync(filePath, `${contents}\n`); } getSpyPathCalls(spy) { const calls = spy.mock.calls; const result = calls.map(call => { const filePath = call[0]; const relativePath = path.relative(this.dir, filePath); /** * Replace Windows backslash directory separators with forward slashes * so expected paths will be consistent cross platform */ const normalizeCrossPlatform = relativePath.replace(/\\/g, '/'); return normalizeCrossPlatform; }); return result; } clean() { const cleanPattern = this.absolutePath('**/*'); const removed = del.sync(cleanPattern, { dot: true, force: true, }); return removed; } deleteTempDir() { const removed = del.sync(this.dir, { force: true, dot: true }); return removed; } } module.exports = { TempDir, }; cosmiconfig-5.2.1/yarn.lock000066400000000000000000004737101346666353700157010ustar00rootroot00000000000000# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 "@babel/code-frame@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" dependencies: "@babel/highlight" "7.0.0-beta.44" "@babel/generator@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" dependencies: "@babel/types" "7.0.0-beta.44" jsesc "^2.5.1" lodash "^4.2.0" source-map "^0.5.0" trim-right "^1.0.1" "@babel/helper-function-name@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" dependencies: "@babel/helper-get-function-arity" "7.0.0-beta.44" "@babel/template" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" "@babel/helper-get-function-arity@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" dependencies: "@babel/types" "7.0.0-beta.44" "@babel/helper-split-export-declaration@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" dependencies: "@babel/types" "7.0.0-beta.44" "@babel/highlight@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^3.0.0" "@babel/template@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.44.tgz#f8832f4fdcee5d59bf515e595fc5106c529b394f" dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" babylon "7.0.0-beta.44" lodash "^4.2.0" "@babel/traverse@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/generator" "7.0.0-beta.44" "@babel/helper-function-name" "7.0.0-beta.44" "@babel/helper-split-export-declaration" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" babylon "7.0.0-beta.44" debug "^3.1.0" globals "^11.1.0" invariant "^2.2.0" lodash "^4.2.0" "@babel/types@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" dependencies: esutils "^2.0.2" lodash "^4.2.0" to-fast-properties "^2.0.0" abab@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" acorn-globals@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf" dependencies: acorn "^4.0.4" acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" dependencies: acorn "^3.0.4" acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" acorn@^5.5.0: version "5.5.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" ajv@^4.9.1: version "4.11.8" resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" dependencies: co "^4.6.0" json-stable-stringify "^1.0.1" ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.3.0" align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" dependencies: kind-of "^3.0.2" longest "^1.0.1" repeat-string "^1.5.2" amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" ansi-escapes@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" dependencies: color-convert "^1.9.0" any-observable@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242" anymatch@^1.3.0: version "1.3.2" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" dependencies: micromatch "^2.1.5" normalize-path "^2.0.0" anymatch@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" dependencies: micromatch "^3.1.4" normalize-path "^2.1.1" app-root-path@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" append-transform@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" dependencies: default-require-extensions "^1.0.0" aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" are-we-there-yet@~1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" dependencies: delegates "^1.0.0" readable-stream "^2.0.6" argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" dependencies: sprintf-js "~1.0.2" arr-diff@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" dependencies: arr-flatten "^1.0.1" arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" arr-union@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" array-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" array-iterate@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/array-iterate/-/array-iterate-1.1.2.tgz#f66a57e84426f8097f4197fbb6c051b8e5cdf7d8" array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" dependencies: array-uniq "^1.0.1" array-uniq@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" asn1@~0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" assign-symbols@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" astral-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" async@^2.1.4: version "2.6.0" resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" dependencies: lodash "^4.14.0" asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" atob@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.0.tgz#ab2b150e51d7b122b9efc8d7340c06b6c41076bc" aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" aws4@^1.2.1, aws4@^1.6.0: version "1.7.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.7.0.tgz#d4d0e9b9dbfca77bf08eeb0a8a471550fe39e289" babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: chalk "^1.1.3" esutils "^2.0.2" js-tokens "^3.0.2" babel-core@^6.0.0, babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" dependencies: babel-code-frame "^6.26.0" babel-generator "^6.26.0" babel-helpers "^6.24.1" babel-messages "^6.23.0" babel-register "^6.26.0" babel-runtime "^6.26.0" babel-template "^6.26.0" babel-traverse "^6.26.0" babel-types "^6.26.0" babylon "^6.18.0" convert-source-map "^1.5.0" debug "^2.6.8" json5 "^0.5.1" lodash "^4.17.4" minimatch "^3.0.4" path-is-absolute "^1.0.1" private "^0.1.7" slash "^1.0.0" source-map "^0.5.6" babel-eslint@^8.0.3: version "8.2.3" resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.2.3.tgz#1a2e6681cc9bc4473c32899e59915e19cd6733cf" dependencies: "@babel/code-frame" "7.0.0-beta.44" "@babel/traverse" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" babylon "7.0.0-beta.44" eslint-scope "~3.7.1" eslint-visitor-keys "^1.0.0" babel-generator@^6.18.0, babel-generator@^6.26.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" dependencies: babel-messages "^6.23.0" babel-runtime "^6.26.0" babel-types "^6.26.0" detect-indent "^4.0.0" jsesc "^1.3.0" lodash "^4.17.4" source-map "^0.5.7" trim-right "^1.0.1" babel-helpers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" babel-jest@^21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-21.2.0.tgz#2ce059519a9374a2c46f2455b6fbef5ad75d863e" dependencies: babel-plugin-istanbul "^4.0.0" babel-preset-jest "^21.2.0" babel-messages@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" dependencies: babel-runtime "^6.22.0" babel-plugin-istanbul@^4.0.0: version "4.1.6" resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz#36c59b2192efce81c5b378321b74175add1c9a45" dependencies: babel-plugin-syntax-object-rest-spread "^6.13.0" find-up "^2.1.0" istanbul-lib-instrument "^1.10.1" test-exclude "^4.2.1" babel-plugin-jest-hoist@^21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-21.2.0.tgz#2cef637259bd4b628a6cace039de5fcd14dbb006" babel-plugin-syntax-flow@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-flow/-/babel-plugin-syntax-flow-6.18.0.tgz#4c3ab20a2af26aa20cd25995c398c4eb70310c8d" babel-plugin-syntax-object-rest-spread@^6.13.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" babel-plugin-transform-flow-strip-types@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-flow-strip-types/-/babel-plugin-transform-flow-strip-types-6.22.0.tgz#84cb672935d43714fdc32bce84568d87441cf7cf" dependencies: babel-plugin-syntax-flow "^6.18.0" babel-runtime "^6.22.0" babel-preset-jest@^21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-21.2.0.tgz#ff9d2bce08abd98e8a36d9a8a5189b9173b85638" dependencies: babel-plugin-jest-hoist "^21.2.0" babel-plugin-syntax-object-rest-spread "^6.13.0" babel-register@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" dependencies: babel-core "^6.26.0" babel-runtime "^6.26.0" core-js "^2.5.0" home-or-tmp "^2.0.0" lodash "^4.17.4" mkdirp "^0.5.1" source-map-support "^0.4.15" babel-runtime@^6.22.0, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" dependencies: core-js "^2.4.0" regenerator-runtime "^0.11.0" babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" dependencies: babel-runtime "^6.26.0" babel-traverse "^6.26.0" babel-types "^6.26.0" babylon "^6.18.0" lodash "^4.17.4" babel-traverse@^6.18.0, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" dependencies: babel-code-frame "^6.26.0" babel-messages "^6.23.0" babel-runtime "^6.26.0" babel-types "^6.26.0" babylon "^6.18.0" debug "^2.6.8" globals "^9.18.0" invariant "^2.2.2" lodash "^4.17.4" babel-types@^6.18.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" dependencies: babel-runtime "^6.26.0" esutils "^2.0.2" lodash "^4.17.4" to-fast-properties "^1.0.3" babylon@7.0.0-beta.44: version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" babylon@^6.15.0, babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" bail@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.2.tgz#f7d6c1731630a9f9f0d4d35ed1f962e2074a1764" balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" base@^0.11.1: version "0.11.2" resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" dependencies: cache-base "^1.0.1" class-utils "^0.3.5" component-emitter "^1.2.1" define-property "^1.0.0" isobject "^3.0.1" mixin-deep "^1.2.0" pascalcase "^0.1.1" bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" dependencies: tweetnacl "^0.14.3" binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" dependencies: inherits "~2.0.0" boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" dependencies: hoek "2.x.x" boom@4.x.x: version "4.3.1" resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" dependencies: hoek "4.x.x" boom@5.x.x: version "5.2.0" resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" dependencies: hoek "4.x.x" brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" dependencies: balanced-match "^1.0.0" concat-map "0.0.1" braces@^1.8.2: version "1.8.5" resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" dependencies: expand-range "^1.8.1" preserve "^0.2.0" repeat-element "^1.1.2" braces@^2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" dependencies: arr-flatten "^1.1.0" array-unique "^0.3.2" extend-shallow "^2.0.1" fill-range "^4.0.0" isobject "^3.0.1" repeat-element "^1.1.2" snapdragon "^0.8.1" snapdragon-node "^2.0.1" split-string "^3.0.2" to-regex "^3.0.1" browser-resolve@^1.11.2: version "1.11.2" resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" dependencies: resolve "1.1.7" bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" dependencies: node-int64 "^0.4.0" buffer-from@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.0.0.tgz#4cb8832d23612589b0406e9e2956c17f06fdf531" builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" dependencies: collection-visit "^1.0.0" component-emitter "^1.2.1" get-value "^2.0.6" has-value "^1.0.0" isobject "^3.0.1" set-value "^2.0.0" to-object-path "^0.3.0" union-value "^1.0.0" unset-value "^1.0.0" caller-callsite@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134" integrity sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ= dependencies: callsites "^2.0.0" caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" dependencies: callsites "^0.2.0" caller-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz#468f83044e369ab2010fac5f06ceee15bb2cb1f4" integrity sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ= dependencies: caller-callsite "^2.0.0" callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" callsites@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/callsites/-/callsites-1.0.1.tgz#c14c24188ce8e1d6a030b4c3c942e6ba895b6a1a" callsites@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" ccount@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/ccount/-/ccount-1.0.2.tgz#53b6a2f815bb77b9c2871f7b9a72c3a25f1d8e89" center-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad" dependencies: align-text "^0.1.3" lazy-cache "^1.0.3" chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" dependencies: ansi-styles "^2.2.1" escape-string-regexp "^1.0.2" has-ansi "^2.0.0" strip-ansi "^3.0.0" supports-color "^2.0.0" chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0: version "2.3.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.2.tgz#250dc96b07491bfd601e648d66ddf5f60c7a5c65" dependencies: ansi-styles "^3.2.1" escape-string-regexp "^1.0.5" supports-color "^5.3.0" character-entities-html4@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/character-entities-html4/-/character-entities-html4-1.1.1.tgz#359a2a4a0f7e29d3dc2ac99bdbe21ee39438ea50" character-entities-legacy@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz#f40779df1a101872bb510a3d295e1fccf147202f" character-entities@^1.0.0: version "1.2.1" resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-1.2.1.tgz#f76871be5ef66ddb7f8f8e3478ecc374c27d6dca" character-reference-invalid@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz#942835f750e4ec61a308e60c2ef8cc1011202efc" chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" chokidar@^1.5.1: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: anymatch "^1.3.0" async-each "^1.0.0" glob-parent "^2.0.0" inherits "^2.0.1" is-binary-path "^1.0.0" is-glob "^2.0.0" path-is-absolute "^1.0.0" readdirp "^2.0.0" optionalDependencies: fsevents "^1.0.0" ci-info@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.3.tgz#710193264bb05c77b8c90d02f5aaf22216a667b2" circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" class-utils@^0.3.5: version "0.3.6" resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" dependencies: arr-union "^3.1.0" define-property "^0.2.5" isobject "^3.0.0" static-extend "^0.1.1" cli-cursor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" dependencies: restore-cursor "^1.0.1" cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" dependencies: restore-cursor "^2.0.0" cli-spinners@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" cli-truncate@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" dependencies: slice-ansi "0.0.4" string-width "^1.0.1" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" dependencies: center-align "^0.1.1" right-align "^0.1.1" wordwrap "0.0.2" cliui@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" wrap-ansi "^2.0.0" co@3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/co/-/co-3.1.0.tgz#4ea54ea5a08938153185e15210c68d9092bc1b78" co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" collapse-white-space@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/collapse-white-space/-/collapse-white-space-1.0.4.tgz#ce05cf49e54c3277ae573036a26851ba430a0091" collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" dependencies: map-visit "^1.0.0" object-visit "^1.0.0" color-convert@^1.9.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" dependencies: color-name "^1.1.1" color-name@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" dependencies: delayed-stream "~1.0.0" commander@^2.11.0, commander@^2.9.0: version "2.15.1" resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" compare-versions@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/compare-versions/-/compare-versions-3.1.0.tgz#43310256a5c555aaed4193c04d8f154cf9c6efd5" component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" concat-stream@^1.5.1, concat-stream@^1.6.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" dependencies: buffer-from "^1.0.0" inherits "^2.0.3" readable-stream "^2.2.2" typedarray "^0.0.6" console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" content-type-parser@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" convert-source-map@^1.4.0, convert-source-map@^1.5.0: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" core-js@^2.4.0, core-js@^2.5.0: version "2.5.5" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.5.tgz#b14dde936c640c0579a6b50cabcc132dd6127e3b" core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" cosmiconfig@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-4.0.0.tgz#760391549580bbd2df1e562bc177b13c290972dc" dependencies: is-directory "^0.3.1" js-yaml "^3.9.0" parse-json "^4.0.0" require-from-string "^2.0.1" cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" dependencies: lru-cache "^4.0.1" shebang-command "^1.2.0" which "^1.2.9" cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" dependencies: boom "2.x.x" cryptiles@3.x.x: version "3.1.2" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" dependencies: boom "5.x.x" cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": version "0.3.2" resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" "cssstyle@>= 0.2.37 < 0.3.0": version "0.2.37" resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" dependencies: cssom "0.3.x" dashdash@^1.12.0: version "1.14.1" resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" dependencies: assert-plus "^1.0.0" date-fns@^1.27.2: version "1.29.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" debug@^2.2.0, debug@^2.3.3, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: ms "2.0.0" decamelize@^1.0.0, decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" dedent@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" default-require-extensions@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" dependencies: strip-bom "^2.0.0" define-property@^0.2.5: version "0.2.5" resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" dependencies: is-descriptor "^0.1.0" define-property@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" dependencies: is-descriptor "^1.0.0" define-property@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" dependencies: is-descriptor "^1.0.2" isobject "^3.0.1" del@^2.0.2: version "2.2.2" resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" dependencies: globby "^5.0.0" is-path-cwd "^1.0.0" is-path-in-cwd "^1.0.0" object-assign "^4.0.1" pify "^2.0.0" pinkie-promise "^2.0.0" rimraf "^2.2.8" del@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" dependencies: globby "^6.1.0" is-path-cwd "^1.0.0" is-path-in-cwd "^1.0.0" p-map "^1.1.1" pify "^3.0.0" rimraf "^2.2.8" delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" detect-indent@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" dependencies: repeating "^2.0.0" detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" diff@^3.2.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" doctrine@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" dependencies: esutils "^2.0.2" ecc-jsbn@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" dependencies: jsbn "~0.1.0" elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" "emoji-regex@>=6.0.0 <=6.1.1": version "6.1.1" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-6.1.1.tgz#c6cd0ec1b0642e2a3c67a1137efc5e796da4f88e" errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" dependencies: prr "~1.0.1" error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" dependencies: is-arrayish "^0.2.1" escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" escodegen@^1.6.1: version "1.9.1" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.1.tgz#dbae17ef96c8e4bedb1356f4504fa4cc2f7cb7e2" dependencies: esprima "^3.1.3" estraverse "^4.2.0" esutils "^2.0.2" optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" eslint-config-davidtheclark-node@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/eslint-config-davidtheclark-node/-/eslint-config-davidtheclark-node-0.2.2.tgz#aafad92703fc22e03dfab26d6256571e0c92bde2" eslint-config-prettier@^2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-2.9.0.tgz#5ecd65174d486c22dff389fe036febf502d468a3" dependencies: get-stdin "^5.0.1" eslint-plugin-flowtype@^2.39.1: version "2.46.2" resolved "https://registry.yarnpkg.com/eslint-plugin-flowtype/-/eslint-plugin-flowtype-2.46.2.tgz#8749fddda6f6c30d0672011151bea726765b5753" dependencies: lodash "^4.15.0" eslint-plugin-node@^5.2.1: version "5.2.1" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz#80df3253c4d7901045ec87fa660a284e32bdca29" dependencies: ignore "^3.3.6" minimatch "^3.0.4" resolve "^1.3.3" semver "5.3.0" eslint-scope@^3.7.1, eslint-scope@~3.7.1: version "3.7.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.1.tgz#3d63c3edfda02e06e01a452ad88caacc7cdcb6e8" dependencies: esrecurse "^4.1.0" estraverse "^4.1.1" eslint-visitor-keys@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" eslint@^4.12.1: version "4.19.1" resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" chalk "^2.1.0" concat-stream "^1.6.0" cross-spawn "^5.1.0" debug "^3.1.0" doctrine "^2.1.0" eslint-scope "^3.7.1" eslint-visitor-keys "^1.0.0" espree "^3.5.4" esquery "^1.0.0" esutils "^2.0.2" file-entry-cache "^2.0.0" functional-red-black-tree "^1.0.1" glob "^7.1.2" globals "^11.0.1" ignore "^3.3.3" imurmurhash "^0.1.4" inquirer "^3.0.6" is-resolvable "^1.0.0" js-yaml "^3.9.1" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.3.0" lodash "^4.17.4" minimatch "^3.0.2" mkdirp "^0.5.1" natural-compare "^1.4.0" optionator "^0.8.2" path-is-inside "^1.0.2" pluralize "^7.0.0" progress "^2.0.0" regexpp "^1.0.1" require-uncached "^1.0.3" semver "^5.3.0" strip-ansi "^4.0.0" strip-json-comments "~2.0.1" table "4.0.2" text-table "~0.2.0" espree@^3.5.4: version "3.5.4" resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" dependencies: acorn "^5.5.0" acorn-jsx "^3.0.0" esprima@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" esquery@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" dependencies: estraverse "^4.0.0" esrecurse@^4.1.0: version "4.2.1" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" dependencies: estraverse "^4.1.0" estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" exec-sh@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" dependencies: merge "^1.1.3" execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" is-stream "^1.1.0" npm-run-path "^2.0.0" p-finally "^1.0.0" signal-exit "^3.0.0" strip-eof "^1.0.0" execa@^0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" dependencies: cross-spawn "^5.0.1" get-stream "^3.0.0" is-stream "^1.1.0" npm-run-path "^2.0.0" p-finally "^1.0.0" signal-exit "^3.0.0" strip-eof "^1.0.0" exit-hook@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" dependencies: is-posix-bracket "^0.1.0" expand-brackets@^2.1.4: version "2.1.4" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" dependencies: debug "^2.3.3" define-property "^0.2.5" extend-shallow "^2.0.1" posix-character-classes "^0.1.0" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.1" expand-range@^1.8.1: version "1.8.2" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" dependencies: fill-range "^2.1.0" expect@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/expect/-/expect-21.2.1.tgz#003ac2ac7005c3c29e73b38a272d4afadd6d1d7b" dependencies: ansi-styles "^3.2.0" jest-diff "^21.2.1" jest-get-type "^21.2.0" jest-matcher-utils "^21.2.1" jest-message-util "^21.2.1" jest-regex-util "^21.2.0" extend-shallow@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" dependencies: is-extendable "^0.1.0" extend-shallow@^3.0.0, extend-shallow@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" dependencies: assign-symbols "^1.0.0" is-extendable "^1.0.1" extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" extend@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-2.0.1.tgz#1ee8010689e7395ff9448241c98652bc759a8260" external-editor@^2.0.4: version "2.2.0" resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" dependencies: chardet "^0.4.0" iconv-lite "^0.4.17" tmp "^0.0.33" extglob@^0.3.1: version "0.3.2" resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" dependencies: is-extglob "^1.0.0" extglob@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" dependencies: array-unique "^0.3.2" define-property "^1.0.0" expand-brackets "^2.1.4" extend-shallow "^2.0.1" fragment-cache "^0.2.1" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.1" extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" fast-deep-equal@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" fault@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/fault/-/fault-1.0.1.tgz#de8d350dfd48be24b5dc1b02867e0871b9135092" dependencies: format "^0.2.2" fb-watchman@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" dependencies: bser "^2.0.0" figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" dependencies: escape-string-regexp "^1.0.5" object-assign "^4.1.0" figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" dependencies: escape-string-regexp "^1.0.5" file-entry-cache@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" dependencies: flat-cache "^1.2.1" object-assign "^4.0.1" filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" fileset@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" dependencies: glob "^7.0.3" minimatch "^3.0.3" fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" dependencies: is-number "^2.1.0" isobject "^2.0.0" randomatic "^1.1.3" repeat-element "^1.1.2" repeat-string "^1.5.2" fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" dependencies: extend-shallow "^2.0.1" is-number "^3.0.0" repeat-string "^1.6.1" to-regex-range "^2.1.0" find-parent-dir@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" dependencies: path-exists "^2.0.0" pinkie-promise "^2.0.0" find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: locate-path "^2.0.0" flat-cache@^1.2.1: version "1.3.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" dependencies: circular-json "^0.3.1" del "^2.0.2" graceful-fs "^4.1.2" write "^0.2.1" flow-bin@^0.68.0: version "0.68.0" resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.68.0.tgz#86c2d14857d306eb2e85e274f2eebf543564f623" flow-remove-types@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/flow-remove-types/-/flow-remove-types-1.2.3.tgz#6131aefc7da43364bb8b479758c9dec7735d1a18" dependencies: babylon "^6.15.0" vlq "^0.2.1" fn-name@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-2.0.1.tgz#5214d7537a4d06a4a301c0cc262feb84188002e7" for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" for-own@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" dependencies: for-in "^1.0.1" forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" form-data@~2.1.1: version "2.1.4" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" dependencies: asynckit "^0.4.0" combined-stream "^1.0.5" mime-types "^2.1.12" form-data@~2.3.1: version "2.3.2" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" dependencies: asynckit "^0.4.0" combined-stream "1.0.6" mime-types "^2.1.12" format@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/format/-/format-0.2.2.tgz#d6170107e9efdc4ed30c9dc39016df942b5cb58b" fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" dependencies: map-cache "^0.2.2" fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" fsevents@^1.0.0, fsevents@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" dependencies: nan "^2.3.0" node-pre-gyp "^0.6.39" fstream-ignore@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" dependencies: fstream "^1.0.0" inherits "2" minimatch "^3.0.0" fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" dependencies: graceful-fs "^4.1.2" inherits "~2.0.0" mkdirp ">=0.5 0" rimraf "2" functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" dependencies: aproba "^1.0.3" console-control-strings "^1.0.0" has-unicode "^2.0.0" object-assign "^4.1.0" signal-exit "^3.0.0" string-width "^1.0.1" strip-ansi "^3.0.1" wide-align "^1.1.0" get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" get-own-enumerable-property-symbols@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b" get-stdin@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-5.0.1.tgz#122e161591e21ff4c52530305693f20e6393a398" get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" dependencies: assert-plus "^1.0.0" github-slugger@^1.0.0, github-slugger@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/github-slugger/-/github-slugger-1.2.0.tgz#8ada3286fd046d8951c3c952a8d7854cfd90fd9a" dependencies: emoji-regex ">=6.0.0 <=6.1.1" glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" dependencies: glob-parent "^2.0.0" is-glob "^2.0.0" glob-parent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" dependencies: is-glob "^2.0.0" glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" minimatch "^3.0.4" once "^1.3.0" path-is-absolute "^1.0.0" globals@^11.0.1, globals@^11.1.0: version "11.4.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.4.0.tgz#b85c793349561c16076a3c13549238a27945f1bc" globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" dependencies: array-union "^1.0.1" arrify "^1.0.0" glob "^7.0.3" object-assign "^4.0.1" pify "^2.0.0" pinkie-promise "^2.0.0" globby@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" dependencies: array-union "^1.0.1" glob "^7.0.3" object-assign "^4.0.1" pify "^2.0.0" pinkie-promise "^2.0.0" graceful-fs@^4.1.11, graceful-fs@^4.1.2: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" handlebars@^4.0.3: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" dependencies: async "^1.4.0" optimist "^0.6.1" source-map "^0.4.4" optionalDependencies: uglify-js "^2.6" har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" har-validator@~4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" dependencies: ajv "^4.9.1" har-schema "^1.0.5" har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" dependencies: ajv "^5.1.0" har-schema "^2.0.0" has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" dependencies: ansi-regex "^2.0.0" has-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" has-value@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" dependencies: get-value "^2.0.3" has-values "^0.1.4" isobject "^2.0.0" has-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" dependencies: get-value "^2.0.6" has-values "^1.0.0" isobject "^3.0.0" has-values@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" has-values@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" dependencies: is-number "^3.0.0" kind-of "^4.0.0" hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" dependencies: boom "2.x.x" cryptiles "2.x.x" hoek "2.x.x" sntp "1.x.x" hawk@~6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" dependencies: boom "4.x.x" cryptiles "3.x.x" hoek "4.x.x" sntp "2.x.x" hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" hoek@4.x.x: version "4.2.1" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.1" hosted-git-info@^2.1.4, hosted-git-info@^2.5.0: version "2.6.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" html-encoding-sniffer@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" dependencies: whatwg-encoding "^1.0.1" http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" dependencies: assert-plus "^0.2.0" jsprim "^1.2.2" sshpk "^1.7.0" http-signature@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" dependencies: assert-plus "^1.0.0" jsprim "^1.2.2" sshpk "^1.7.0" husky@^0.14.3: version "0.14.3" resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3" dependencies: is-ci "^1.0.10" normalize-path "^1.0.0" strip-indent "^2.0.0" iconv-lite@0.4.19: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" iconv-lite@^0.4.17: version "0.4.21" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.21.tgz#c47f8733d02171189ebc4a400f3218d348094798" dependencies: safer-buffer "^2.1.0" ignore@^3.2.0, ignore@^3.3.3, ignore@^3.3.6: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" integrity sha1-2BNVwVYS04bGH53dOSLUMEgipUY= dependencies: caller-path "^2.0.0" resolve-from "^3.0.0" imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" indent-string@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" dependencies: repeating "^2.0.0" indent-string@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" dependencies: once "^1.3.0" wrappy "1" inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" inquirer@^3.0.6: version "3.3.0" resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.0" cli-cursor "^2.1.0" cli-width "^2.0.0" external-editor "^2.0.4" figures "^2.0.0" lodash "^4.3.0" mute-stream "0.0.7" run-async "^2.2.0" rx-lite "^4.0.8" rx-lite-aggregates "^4.0.8" string-width "^2.1.0" strip-ansi "^4.0.0" through "^2.3.6" invariant@^2.2.0, invariant@^2.2.2: version "2.2.4" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" dependencies: loose-envify "^1.0.0" invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" irregular-plurals@^1.0.0: version "1.4.0" resolved "https://registry.yarnpkg.com/irregular-plurals/-/irregular-plurals-1.4.0.tgz#2ca9b033651111855412f16be5d77c62a458a766" is-accessor-descriptor@^0.1.6: version "0.1.6" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" dependencies: kind-of "^3.0.2" is-accessor-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" dependencies: kind-of "^6.0.0" is-alphabetical@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-alphabetical/-/is-alphabetical-1.0.1.tgz#c77079cc91d4efac775be1034bf2d243f95e6f08" is-alphanumeric@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-alphanumeric/-/is-alphanumeric-1.0.0.tgz#4a9cef71daf4c001c1d81d63d140cf53fd6889f4" is-alphanumerical@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz#dfb4aa4d1085e33bdb61c2dee9c80e9c6c19f53b" dependencies: is-alphabetical "^1.0.0" is-decimal "^1.0.0" is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" dependencies: binary-extensions "^1.0.0" is-buffer@^1.1.4, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" dependencies: builtin-modules "^1.0.0" is-ci@^1.0.10: version "1.1.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" dependencies: ci-info "^1.0.0" is-data-descriptor@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" dependencies: kind-of "^3.0.2" is-data-descriptor@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" dependencies: kind-of "^6.0.0" is-decimal@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.1.tgz#f5fb6a94996ad9e8e3761fbfbd091f1fca8c4e82" is-descriptor@^0.1.0: version "0.1.6" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" dependencies: is-accessor-descriptor "^0.1.6" is-data-descriptor "^0.1.4" kind-of "^5.0.0" is-descriptor@^1.0.0, is-descriptor@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" dependencies: is-accessor-descriptor "^1.0.0" is-data-descriptor "^1.0.0" kind-of "^6.0.2" is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" is-empty@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-empty/-/is-empty-1.2.0.tgz#de9bb5b278738a05a0b09a57e1fb4d4a341a9f6b" is-equal-shallow@^0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" dependencies: is-primitive "^2.0.0" is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" is-extendable@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" dependencies: is-plain-object "^2.0.4" is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" dependencies: number-is-nan "^1.0.0" is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" is-glob@^2.0.0, is-glob@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" dependencies: is-extglob "^1.0.0" is-glob@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" dependencies: is-extglob "^2.1.1" is-hexadecimal@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz#6e084bbc92061fbb0971ec58b6ce6d404e24da69" is-hidden@^1.0.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-hidden/-/is-hidden-1.1.1.tgz#82ee6a93aeef3fb007ad5b9457c0584d45329f38" is-number@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" dependencies: kind-of "^3.0.2" is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" dependencies: kind-of "^3.0.2" is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" is-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" is-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" is-observable@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2" dependencies: symbol-observable "^0.2.2" is-odd@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-2.0.0.tgz#7646624671fd7ea558ccd9a2795182f2958f1b24" dependencies: is-number "^4.0.0" is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" is-path-in-cwd@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" dependencies: is-path-inside "^1.0.0" is-path-inside@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" dependencies: path-is-inside "^1.0.1" is-plain-obj@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" dependencies: isobject "^3.0.1" is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" is-regexp@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" is-whitespace-character@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.1.tgz#9ae0176f3282b65457a1992cdb084f8a5f833e3b" is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" is-word-character@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-word-character/-/is-word-character-1.0.1.tgz#5a03fa1ea91ace8a6eb0c7cd770eb86d65c8befb" isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" isobject@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" dependencies: isarray "1.0.0" isobject@^3.0.0, isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" istanbul-api@^1.1.1: version "1.3.1" resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.1.tgz#4c3b05d18c0016d1022e079b98dc82c40f488954" dependencies: async "^2.1.4" compare-versions "^3.1.0" fileset "^2.0.2" istanbul-lib-coverage "^1.2.0" istanbul-lib-hook "^1.2.0" istanbul-lib-instrument "^1.10.1" istanbul-lib-report "^1.1.4" istanbul-lib-source-maps "^1.2.4" istanbul-reports "^1.3.0" js-yaml "^3.7.0" mkdirp "^0.5.1" once "^1.4.0" istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.0.tgz#f7d8f2e42b97e37fe796114cb0f9d68b5e3a4341" istanbul-lib-hook@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.0.tgz#ae556fd5a41a6e8efa0b1002b1e416dfeaf9816c" dependencies: append-transform "^0.4.0" istanbul-lib-instrument@^1.10.1, istanbul-lib-instrument@^1.4.2: version "1.10.1" resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.1.tgz#724b4b6caceba8692d3f1f9d0727e279c401af7b" dependencies: babel-generator "^6.18.0" babel-template "^6.16.0" babel-traverse "^6.18.0" babel-types "^6.18.0" babylon "^6.18.0" istanbul-lib-coverage "^1.2.0" semver "^5.3.0" istanbul-lib-report@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.4.tgz#e886cdf505c4ebbd8e099e4396a90d0a28e2acb5" dependencies: istanbul-lib-coverage "^1.2.0" mkdirp "^0.5.1" path-parse "^1.0.5" supports-color "^3.1.2" istanbul-lib-source-maps@^1.1.0: version "1.2.3" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.3.tgz#20fb54b14e14b3fb6edb6aca3571fd2143db44e6" dependencies: debug "^3.1.0" istanbul-lib-coverage "^1.1.2" mkdirp "^0.5.1" rimraf "^2.6.1" source-map "^0.5.3" istanbul-lib-source-maps@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.4.tgz#cc7ccad61629f4efff8e2f78adb8c522c9976ec7" dependencies: debug "^3.1.0" istanbul-lib-coverage "^1.2.0" mkdirp "^0.5.1" rimraf "^2.6.1" source-map "^0.5.3" istanbul-reports@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.3.0.tgz#2f322e81e1d9520767597dca3c20a0cce89a3554" dependencies: handlebars "^4.0.3" jest-changed-files@^21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-21.2.0.tgz#5dbeecad42f5d88b482334902ce1cba6d9798d29" dependencies: throat "^4.0.0" jest-cli@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-21.2.1.tgz#9c528b6629d651911138d228bdb033c157ec8c00" dependencies: ansi-escapes "^3.0.0" chalk "^2.0.1" glob "^7.1.2" graceful-fs "^4.1.11" is-ci "^1.0.10" istanbul-api "^1.1.1" istanbul-lib-coverage "^1.0.1" istanbul-lib-instrument "^1.4.2" istanbul-lib-source-maps "^1.1.0" jest-changed-files "^21.2.0" jest-config "^21.2.1" jest-environment-jsdom "^21.2.1" jest-haste-map "^21.2.0" jest-message-util "^21.2.1" jest-regex-util "^21.2.0" jest-resolve-dependencies "^21.2.0" jest-runner "^21.2.1" jest-runtime "^21.2.1" jest-snapshot "^21.2.1" jest-util "^21.2.1" micromatch "^2.3.11" node-notifier "^5.0.2" pify "^3.0.0" slash "^1.0.0" string-length "^2.0.0" strip-ansi "^4.0.0" which "^1.2.12" worker-farm "^1.3.1" yargs "^9.0.0" jest-config@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-21.2.1.tgz#c7586c79ead0bcc1f38c401e55f964f13bf2a480" dependencies: chalk "^2.0.1" glob "^7.1.1" jest-environment-jsdom "^21.2.1" jest-environment-node "^21.2.1" jest-get-type "^21.2.0" jest-jasmine2 "^21.2.1" jest-regex-util "^21.2.0" jest-resolve "^21.2.0" jest-util "^21.2.1" jest-validate "^21.2.1" pretty-format "^21.2.1" jest-diff@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-21.2.1.tgz#46cccb6cab2d02ce98bc314011764bb95b065b4f" dependencies: chalk "^2.0.1" diff "^3.2.0" jest-get-type "^21.2.0" pretty-format "^21.2.1" jest-docblock@^21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" jest-environment-jsdom@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-21.2.1.tgz#38d9980c8259b2a608ec232deee6289a60d9d5b4" dependencies: jest-mock "^21.2.0" jest-util "^21.2.1" jsdom "^9.12.0" jest-environment-node@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-21.2.1.tgz#98c67df5663c7fbe20f6e792ac2272c740d3b8c8" dependencies: jest-mock "^21.2.0" jest-util "^21.2.1" jest-get-type@^21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23" jest-haste-map@^21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-21.2.0.tgz#1363f0a8bb4338f24f001806571eff7a4b2ff3d8" dependencies: fb-watchman "^2.0.0" graceful-fs "^4.1.11" jest-docblock "^21.2.0" micromatch "^2.3.11" sane "^2.0.0" worker-farm "^1.3.1" jest-jasmine2@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz#9cc6fc108accfa97efebce10c4308548a4ea7592" dependencies: chalk "^2.0.1" expect "^21.2.1" graceful-fs "^4.1.11" jest-diff "^21.2.1" jest-matcher-utils "^21.2.1" jest-message-util "^21.2.1" jest-snapshot "^21.2.1" p-cancelable "^0.3.0" jest-matcher-utils@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz#72c826eaba41a093ac2b4565f865eb8475de0f64" dependencies: chalk "^2.0.1" jest-get-type "^21.2.0" pretty-format "^21.2.1" jest-message-util@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-21.2.1.tgz#bfe5d4692c84c827d1dcf41823795558f0a1acbe" dependencies: chalk "^2.0.1" micromatch "^2.3.11" slash "^1.0.0" jest-mock@^21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-21.2.0.tgz#7eb0770e7317968165f61ea2a7281131534b3c0f" jest-regex-util@^21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-21.2.0.tgz#1b1e33e63143babc3e0f2e6c9b5ba1eb34b2d530" jest-resolve-dependencies@^21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-21.2.0.tgz#9e231e371e1a736a1ad4e4b9a843bc72bfe03d09" dependencies: jest-regex-util "^21.2.0" jest-resolve@^21.2.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-21.2.0.tgz#068913ad2ba6a20218e5fd32471f3874005de3a6" dependencies: browser-resolve "^1.11.2" chalk "^2.0.1" is-builtin-module "^1.0.0" jest-runner@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-21.2.1.tgz#194732e3e518bfb3d7cbfc0fd5871246c7e1a467" dependencies: jest-config "^21.2.1" jest-docblock "^21.2.0" jest-haste-map "^21.2.0" jest-jasmine2 "^21.2.1" jest-message-util "^21.2.1" jest-runtime "^21.2.1" jest-util "^21.2.1" pify "^3.0.0" throat "^4.0.0" worker-farm "^1.3.1" jest-runtime@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-21.2.1.tgz#99dce15309c670442eee2ebe1ff53a3cbdbbb73e" dependencies: babel-core "^6.0.0" babel-jest "^21.2.0" babel-plugin-istanbul "^4.0.0" chalk "^2.0.1" convert-source-map "^1.4.0" graceful-fs "^4.1.11" jest-config "^21.2.1" jest-haste-map "^21.2.0" jest-regex-util "^21.2.0" jest-resolve "^21.2.0" jest-util "^21.2.1" json-stable-stringify "^1.0.1" micromatch "^2.3.11" slash "^1.0.0" strip-bom "3.0.0" write-file-atomic "^2.1.0" yargs "^9.0.0" jest-snapshot@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-21.2.1.tgz#29e49f16202416e47343e757e5eff948c07fd7b0" dependencies: chalk "^2.0.1" jest-diff "^21.2.1" jest-matcher-utils "^21.2.1" mkdirp "^0.5.1" natural-compare "^1.4.0" pretty-format "^21.2.1" jest-util@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-21.2.1.tgz#a274b2f726b0897494d694a6c3d6a61ab819bb78" dependencies: callsites "^2.0.0" chalk "^2.0.1" graceful-fs "^4.1.11" jest-message-util "^21.2.1" jest-mock "^21.2.0" jest-validate "^21.2.1" mkdirp "^0.5.1" jest-validate@^21.1.0, jest-validate@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7" dependencies: chalk "^2.0.1" jest-get-type "^21.2.0" leven "^2.1.0" pretty-format "^21.2.1" jest@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/jest/-/jest-21.2.1.tgz#c964e0b47383768a1438e3ccf3c3d470327604e1" dependencies: jest-cli "^21.2.1" js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" js-yaml@^3.13.1: version "3.13.1" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" integrity sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw== dependencies: argparse "^1.0.7" esprima "^4.0.0" js-yaml@^3.6.1, js-yaml@^3.7.0, js-yaml@^3.9.0, js-yaml@^3.9.1: version "3.11.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.11.0.tgz#597c1a8bd57152f26d622ce4117851a51f5ebaef" dependencies: argparse "^1.0.7" esprima "^4.0.0" jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" jsdom@^9.12.0: version "9.12.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.12.0.tgz#e8c546fffcb06c00d4833ca84410fed7f8a097d4" dependencies: abab "^1.0.3" acorn "^4.0.4" acorn-globals "^3.1.0" array-equal "^1.0.0" content-type-parser "^1.0.1" cssom ">= 0.3.2 < 0.4.0" cssstyle ">= 0.2.37 < 0.3.0" escodegen "^1.6.1" html-encoding-sniffer "^1.0.1" nwmatcher ">= 1.3.9 < 2.0.0" parse5 "^1.5.1" request "^2.79.0" sax "^1.2.1" symbol-tree "^3.2.1" tough-cookie "^2.3.2" webidl-conversions "^4.0.0" whatwg-encoding "^1.0.1" whatwg-url "^4.3.0" xml-name-validator "^2.0.1" jsesc@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" jsesc@^2.5.1: version "2.5.1" resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.1.tgz#e421a2a8e20d6b0819df28908f782526b96dd1fe" json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" json-schema-traverse@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" dependencies: jsonify "~0.0.0" json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" dependencies: assert-plus "1.0.0" extsprintf "1.3.0" json-schema "0.2.3" verror "1.10.0" kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: is-buffer "^1.1.5" kind-of@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" dependencies: is-buffer "^1.1.5" kind-of@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" kind-of@^6.0.0, kind-of@^6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" dependencies: invert-kv "^1.0.0" leven@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" levenshtein-edit-distance@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/levenshtein-edit-distance/-/levenshtein-edit-distance-1.0.0.tgz#895baf478cce8b5c1a0d27e45d7c1d978a661e49" levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" dependencies: prelude-ls "~1.1.2" type-check "~0.3.2" lint-staged@^6.0.0: version "6.1.1" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-6.1.1.tgz#cd08c4d9b8ccc2d37198d1c47ce77d22be6cf324" dependencies: app-root-path "^2.0.0" chalk "^2.1.0" commander "^2.11.0" cosmiconfig "^4.0.0" debug "^3.1.0" dedent "^0.7.0" execa "^0.8.0" find-parent-dir "^0.3.0" is-glob "^4.0.0" jest-validate "^21.1.0" listr "^0.13.0" lodash "^4.17.4" log-symbols "^2.0.0" minimatch "^3.0.0" npm-which "^3.0.1" p-map "^1.1.1" path-is-inside "^1.0.2" pify "^3.0.0" staged-git-files "1.0.0" stringify-object "^3.2.0" listr-silent-renderer@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" listr-update-renderer@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7" dependencies: chalk "^1.1.3" cli-truncate "^0.2.1" elegant-spinner "^1.0.1" figures "^1.7.0" indent-string "^3.0.0" log-symbols "^1.0.2" log-update "^1.0.2" strip-ansi "^3.0.1" listr-verbose-renderer@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" dependencies: chalk "^1.1.3" cli-cursor "^1.0.2" date-fns "^1.27.2" figures "^1.7.0" listr@^0.13.0: version "0.13.0" resolved "https://registry.yarnpkg.com/listr/-/listr-0.13.0.tgz#20bb0ba30bae660ee84cc0503df4be3d5623887d" dependencies: chalk "^1.1.3" cli-truncate "^0.2.1" figures "^1.7.0" indent-string "^2.1.0" is-observable "^0.2.0" is-promise "^2.1.0" is-stream "^1.1.0" listr-silent-renderer "^1.1.1" listr-update-renderer "^0.4.0" listr-verbose-renderer "^0.4.0" log-symbols "^1.0.2" log-update "^1.0.2" ora "^0.2.3" p-map "^1.1.1" rxjs "^5.4.2" stream-to-observable "^0.2.0" strip-ansi "^3.0.1" load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" pify "^2.0.0" pinkie-promise "^2.0.0" strip-bom "^2.0.0" load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" dependencies: graceful-fs "^4.1.2" parse-json "^2.2.0" pify "^2.0.0" strip-bom "^3.0.0" load-plugin@^2.0.0: version "2.2.2" resolved "https://registry.yarnpkg.com/load-plugin/-/load-plugin-2.2.2.tgz#ebc7599491ff33e5077719fbe051d5725a9f7a89" dependencies: npm-prefix "^1.2.0" resolve-from "^4.0.0" locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" dependencies: p-locate "^2.0.0" path-exists "^3.0.0" lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" log-symbols@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" dependencies: chalk "^1.0.0" log-symbols@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" dependencies: chalk "^2.0.1" log-update@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" dependencies: ansi-escapes "^1.0.0" cli-cursor "^1.0.2" longest-streak@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.2.tgz#2421b6ba939a443bb9ffebf596585a50b4c38e2e" longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" loose-envify@^1.0.0: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: js-tokens "^3.0.0" lru-cache@^4.0.1: version "4.1.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.2.tgz#45234b2e6e2f2b33da125624c4664929a0224c3f" dependencies: pseudomap "^1.0.2" yallist "^2.1.2" make-dir@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b" dependencies: pify "^3.0.0" makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" dependencies: tmpl "1.0.x" map-cache@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" dependencies: object-visit "^1.0.0" markdown-escapes@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.1.tgz#1994df2d3af4811de59a6714934c2b2292734518" markdown-extensions@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/markdown-extensions/-/markdown-extensions-1.1.1.tgz#fea03b539faeaee9b4ef02a3769b455b189f7fc3" markdown-table@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/markdown-table/-/markdown-table-1.1.1.tgz#4b3dd3a133d1518b8ef0dbc709bf2a1b4824bc8c" mdast-util-compact@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz#cdb5f84e2b6a2d3114df33bd05d9cb32e3c4083a" dependencies: unist-util-modify-children "^1.0.0" unist-util-visit "^1.1.0" mdast-util-definitions@^1.0.0: version "1.2.2" resolved "https://registry.yarnpkg.com/mdast-util-definitions/-/mdast-util-definitions-1.2.2.tgz#673f4377c3e23d3de7af7a4fe2214c0e221c5ac7" dependencies: unist-util-visit "^1.0.0" mdast-util-to-string@^1.0.0, mdast-util-to-string@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/mdast-util-to-string/-/mdast-util-to-string-1.0.4.tgz#5c455c878c9355f0c1e7f3e8b719cf583691acfb" mdast-util-toc@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/mdast-util-toc/-/mdast-util-toc-2.0.1.tgz#b1d2cb23bfb01f812fa7b55bffe8b0a8bedf6f21" dependencies: github-slugger "^1.1.1" mdast-util-to-string "^1.0.2" unist-util-visit "^1.1.0" mem@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" dependencies: mimic-fn "^1.0.0" merge@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" micromatch@^2.1.5, micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: arr-diff "^2.0.0" array-unique "^0.2.1" braces "^1.8.2" expand-brackets "^0.1.4" extglob "^0.3.1" filename-regex "^2.0.0" is-extglob "^1.0.0" is-glob "^2.0.1" kind-of "^3.0.2" normalize-path "^2.0.1" object.omit "^2.0.0" parse-glob "^3.0.4" regex-cache "^0.4.2" micromatch@^3.1.4, micromatch@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" braces "^2.3.1" define-property "^2.0.2" extend-shallow "^3.0.2" extglob "^2.0.4" fragment-cache "^0.2.1" kind-of "^6.0.2" nanomatch "^1.2.9" object.pick "^1.3.0" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.2" mime-db@~1.33.0: version "1.33.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.18" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" dependencies: mime-db "~1.33.0" mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" dependencies: brace-expansion "^1.1.7" minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" minimist@^1.1.1, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" mixin-deep@^1.2.0: version "1.3.1" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.1.tgz#a49e7268dce1a0d9698e45326c5626df3543d0fe" dependencies: for-in "^1.0.2" is-extendable "^1.0.1" "mkdirp@>=0.5 0", mkdirp@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: minimist "0.0.8" ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" nan@^2.3.0: version "2.10.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.10.0.tgz#96d0cd610ebd58d4b4de9cc0c6828cda99c7548f" nanomatch@^1.2.9: version "1.2.9" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.9.tgz#879f7150cb2dab7a471259066c104eee6e0fa7c2" dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" define-property "^2.0.2" extend-shallow "^3.0.2" fragment-cache "^0.2.1" is-odd "^2.0.0" is-windows "^1.0.2" kind-of "^6.0.2" object.pick "^1.3.0" regex-not "^1.0.0" snapdragon "^0.8.1" to-regex "^3.0.1" natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" node-notifier@^5.0.2: version "5.2.1" resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" dependencies: growly "^1.3.0" semver "^5.4.1" shellwords "^0.1.1" which "^1.3.0" node-pre-gyp@^0.6.39: version "0.6.39" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" dependencies: detect-libc "^1.0.2" hawk "3.1.3" mkdirp "^0.5.1" nopt "^4.0.1" npmlog "^4.0.2" rc "^1.1.7" request "2.81.0" rimraf "^2.6.1" semver "^5.3.0" tar "^2.2.1" tar-pack "^3.4.0" nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" dependencies: abbrev "1" osenv "^0.1.4" normalize-package-data@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" dependencies: hosted-git-info "^2.1.4" is-builtin-module "^1.0.0" semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" normalize-path@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: remove-trailing-separator "^1.0.1" npm-path@^2.0.2: version "2.0.4" resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" dependencies: which "^1.2.10" npm-prefix@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/npm-prefix/-/npm-prefix-1.2.0.tgz#e619455f7074ba54cc66d6d0d37dd9f1be6bcbc0" dependencies: rc "^1.1.0" shellsubstitute "^1.1.0" untildify "^2.1.0" npm-run-path@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" dependencies: path-key "^2.0.0" npm-which@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" dependencies: commander "^2.9.0" npm-path "^2.0.2" which "^1.2.10" npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" gauge "~2.7.3" set-blocking "~2.0.0" number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" "nwmatcher@>= 1.3.9 < 2.0.0": version "1.4.4" resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.4.tgz#2285631f34a95f0d0395cd900c96ed39b58f346e" oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" object-copy@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" dependencies: copy-descriptor "^0.1.0" define-property "^0.2.5" kind-of "^3.0.3" object-visit@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" dependencies: isobject "^3.0.0" object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" dependencies: for-own "^0.1.4" is-extendable "^0.1.1" object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" dependencies: isobject "^3.0.1" once@^1.3.0, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: wrappy "1" onetime@^1.0.0: version "1.1.0" resolved "http://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" onetime@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" dependencies: mimic-fn "^1.0.0" optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" dependencies: minimist "~0.0.1" wordwrap "~0.0.2" optionator@^0.8.1, optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: deep-is "~0.1.3" fast-levenshtein "~2.0.4" levn "~0.3.0" prelude-ls "~1.1.2" type-check "~0.3.2" wordwrap "~1.0.0" ora@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" dependencies: chalk "^1.1.1" cli-cursor "^1.0.2" cli-spinners "^0.1.2" object-assign "^4.0.1" os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" dependencies: execa "^0.7.0" lcid "^1.0.0" mem "^1.1.0" os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" osenv@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" dependencies: os-homedir "^1.0.0" os-tmpdir "^1.0.0" p-cancelable@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.3.0.tgz#b9e123800bcebb7ac13a479be195b507b98d30fa" p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" p-limit@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" dependencies: p-try "^1.0.0" p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" dependencies: p-limit "^1.1.0" p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" parent-module@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-0.1.0.tgz#b5292863a1e8c476ecf857e7d75c98920b24b8a6" dependencies: callsites "^1.0.0" parse-entities@^1.0.2, parse-entities@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/parse-entities/-/parse-entities-1.1.1.tgz#8112d88471319f27abae4d64964b122fe4e1b890" dependencies: character-entities "^1.0.0" character-entities-legacy "^1.0.0" character-reference-invalid "^1.0.0" is-alphanumerical "^1.0.0" is-decimal "^1.0.0" is-hexadecimal "^1.0.0" parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" dependencies: glob-base "^0.3.0" is-dotfile "^1.0.0" is-extglob "^1.0.0" is-glob "^2.0.0" parse-json@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" dependencies: error-ex "^1.2.0" parse-json@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" dependencies: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" pascalcase@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" path-exists@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" dependencies: pinkie-promise "^2.0.0" path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" dependencies: graceful-fs "^4.1.2" pify "^2.0.0" pinkie-promise "^2.0.0" path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" dependencies: pify "^2.0.0" performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" pify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" dependencies: pinkie "^2.0.0" pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" plur@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/plur/-/plur-2.1.2.tgz#7482452c1a0f508e3e344eaec312c91c29dc655a" dependencies: irregular-plurals "^1.0.0" pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" prettier@^1.8.2: version "1.12.0" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.12.0.tgz#d26fc5894b9230de97629b39cae225b503724ce8" pretty-format@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36" dependencies: ansi-regex "^3.0.0" ansi-styles "^3.2.0" private@^0.1.7: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" process-nextick-args@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" propose@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/propose/-/propose-0.0.5.tgz#48a065d9ec7d4c8667f4050b15c4a2d85dbca56b" dependencies: levenshtein-edit-distance "^1.0.0" prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" randomatic@^1.1.3: version "1.1.7" resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" dependencies: is-number "^3.0.0" kind-of "^4.0.0" rc@^1.1.0, rc@^1.1.7: version "1.2.6" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.6.tgz#eb18989c6d4f4f162c399f79ddd29f3835568092" dependencies: deep-extend "~0.4.0" ini "~1.3.0" minimist "^1.2.0" strip-json-comments "~2.0.1" read-pkg-up@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" dependencies: find-up "^1.0.0" read-pkg "^1.0.0" read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" dependencies: find-up "^2.0.0" read-pkg "^2.0.0" read-pkg@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" dependencies: load-json-file "^1.0.0" normalize-package-data "^2.3.2" path-type "^1.0.0" read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" dependencies: load-json-file "^2.0.0" normalize-package-data "^2.3.2" path-type "^2.0.0" readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: core-util-is "~1.0.0" inherits "~2.0.3" isarray "~1.0.0" process-nextick-args "~2.0.0" safe-buffer "~5.1.1" string_decoder "~1.1.1" util-deprecate "~1.0.1" readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" dependencies: graceful-fs "^4.1.2" minimatch "^3.0.2" readable-stream "^2.0.2" set-immediate-shim "^1.0.1" regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" dependencies: is-equal-shallow "^0.1.3" regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" dependencies: extend-shallow "^3.0.2" safe-regex "^1.1.0" regexpp@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" remark-cli@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/remark-cli/-/remark-cli-4.0.0.tgz#bb84c14ffeb6f5b658eff4dfbb77cdd7775bab73" dependencies: markdown-extensions "^1.1.0" remark "^8.0.0" unified-args "^4.0.0" remark-cli@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/remark-cli/-/remark-cli-5.0.0.tgz#9feefd06474f3d0ff132df21b5334c546df12ab6" dependencies: markdown-extensions "^1.1.0" remark "^9.0.0" unified-args "^5.0.0" remark-lint-blockquote-indentation@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/remark-lint-blockquote-indentation/-/remark-lint-blockquote-indentation-1.0.1.tgz#0b000dc4a2ca0c8576b07bb7101c5ab1b632dd99" dependencies: mdast-util-to-string "^1.0.2" plur "^2.1.2" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^1.1.1" remark-lint-file-extension@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/remark-lint-file-extension/-/remark-lint-file-extension-1.0.1.tgz#80c0d2688d0fcee6eeb46f4727a415129d35eb42" dependencies: unified-lint-rule "^1.0.0" remark-lint-final-definition@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/remark-lint-final-definition/-/remark-lint-final-definition-1.0.1.tgz#6027a6a6f41a927f8af4f1b30c3a75e333f1086a" dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^1.1.1" remark-lint-no-duplicate-definitions@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-duplicate-definitions/-/remark-lint-no-duplicate-definitions-1.0.1.tgz#1f08139ef5dbd51d9e7445fbde4597ea292c2270" dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^1.1.1" remark-lint-no-duplicate-headings@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-duplicate-headings/-/remark-lint-no-duplicate-headings-1.0.1.tgz#24324dd7e2c703b285201cdf76d8689cd6b86e12" dependencies: mdast-util-to-string "^1.0.2" unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^1.1.1" remark-lint-no-multiple-toplevel-headings@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-multiple-toplevel-headings/-/remark-lint-no-multiple-toplevel-headings-1.0.1.tgz#f4c0a05865e961826863d1f1a5d82fc80e772794" dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-position "^3.0.0" unist-util-visit "^1.1.1" remark-lint-no-tabs@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-tabs/-/remark-lint-no-tabs-1.0.1.tgz#cf1267e19825affd863ee870a11b50a7f6dd99c8" dependencies: unified-lint-rule "^1.0.0" vfile-location "^2.0.1" remark-lint-no-undefined-references@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/remark-lint-no-undefined-references/-/remark-lint-no-undefined-references-1.0.1.tgz#7f630a7fa65bb02b49b10410b52dc2bd12bafed7" dependencies: unified-lint-rule "^1.0.0" unist-util-generated "^1.1.0" unist-util-visit "^1.1.1" remark-parse@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-4.0.0.tgz#99f1f049afac80382366e2e0d0bd55429dd45d8b" dependencies: collapse-white-space "^1.0.2" is-alphabetical "^1.0.0" is-decimal "^1.0.0" is-whitespace-character "^1.0.0" is-word-character "^1.0.0" markdown-escapes "^1.0.0" parse-entities "^1.0.2" repeat-string "^1.5.4" state-toggle "^1.0.0" trim "0.0.1" trim-trailing-lines "^1.0.0" unherit "^1.0.4" unist-util-remove-position "^1.0.0" vfile-location "^2.0.0" xtend "^4.0.1" remark-parse@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/remark-parse/-/remark-parse-5.0.0.tgz#4c077f9e499044d1d5c13f80d7a98cf7b9285d95" dependencies: collapse-white-space "^1.0.2" is-alphabetical "^1.0.0" is-decimal "^1.0.0" is-whitespace-character "^1.0.0" is-word-character "^1.0.0" markdown-escapes "^1.0.0" parse-entities "^1.1.0" repeat-string "^1.5.4" state-toggle "^1.0.0" trim "0.0.1" trim-trailing-lines "^1.0.0" unherit "^1.0.4" unist-util-remove-position "^1.0.0" vfile-location "^2.0.0" xtend "^4.0.1" remark-preset-davidtheclark@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/remark-preset-davidtheclark/-/remark-preset-davidtheclark-0.7.0.tgz#599e932a3a87ce8ba7bf04a1fc621c45d330c390" dependencies: execa "^0.8.0" remark-cli "^4.0.0" remark-lint-blockquote-indentation "^1.0.1" remark-lint-file-extension "^1.0.1" remark-lint-final-definition "^1.0.1" remark-lint-no-duplicate-definitions "^1.0.1" remark-lint-no-duplicate-headings "^1.0.1" remark-lint-no-multiple-toplevel-headings "^1.0.1" remark-lint-no-tabs "^1.0.1" remark-lint-no-undefined-references "^1.0.1" remark-toc "^4.0.1" remark-validate-links "^7.0.0" remark-slug@^4.0.0, remark-slug@^4.2.1: version "4.2.3" resolved "https://registry.yarnpkg.com/remark-slug/-/remark-slug-4.2.3.tgz#8d987d0e5e63d4a49ea37b90fe999a3dcfc81b72" dependencies: github-slugger "^1.0.0" mdast-util-to-string "^1.0.0" unist-util-visit "^1.0.0" remark-stringify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-4.0.0.tgz#4431884c0418f112da44991b4e356cfe37facd87" dependencies: ccount "^1.0.0" is-alphanumeric "^1.0.0" is-decimal "^1.0.0" is-whitespace-character "^1.0.0" longest-streak "^2.0.1" markdown-escapes "^1.0.0" markdown-table "^1.1.0" mdast-util-compact "^1.0.0" parse-entities "^1.0.2" repeat-string "^1.5.4" state-toggle "^1.0.0" stringify-entities "^1.0.1" unherit "^1.0.4" xtend "^4.0.1" remark-stringify@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/remark-stringify/-/remark-stringify-5.0.0.tgz#336d3a4d4a6a3390d933eeba62e8de4bd280afba" dependencies: ccount "^1.0.0" is-alphanumeric "^1.0.0" is-decimal "^1.0.0" is-whitespace-character "^1.0.0" longest-streak "^2.0.1" markdown-escapes "^1.0.0" markdown-table "^1.1.0" mdast-util-compact "^1.0.0" parse-entities "^1.0.2" repeat-string "^1.5.4" state-toggle "^1.0.0" stringify-entities "^1.0.1" unherit "^1.0.4" xtend "^4.0.1" remark-toc@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/remark-toc/-/remark-toc-4.0.1.tgz#ff36ff6de54ea07dd59e3f5334a4a3aac1e93185" dependencies: mdast-util-toc "^2.0.0" remark-slug "^4.0.0" remark-validate-links@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/remark-validate-links/-/remark-validate-links-7.0.0.tgz#31de803ac4682ea923b68a82560810981853d110" dependencies: hosted-git-info "^2.5.0" mdast-util-definitions "^1.0.0" propose "0.0.5" remark-slug "^4.2.1" unist-util-visit "^1.0.0" urljoin "^0.1.5" xtend "^4.0.1" remark@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/remark/-/remark-8.0.0.tgz#287b6df2fe1190e263c1d15e486d3fa835594d6d" dependencies: remark-parse "^4.0.0" remark-stringify "^4.0.0" unified "^6.0.0" remark@^9.0.0: version "9.0.0" resolved "https://registry.yarnpkg.com/remark/-/remark-9.0.0.tgz#c5cfa8ec535c73a67c4b0f12bfdbd3a67d8b2f60" dependencies: remark-parse "^5.0.0" remark-stringify "^5.0.0" unified "^6.0.0" remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" repeat-element@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" repeat-string@^1.5.0, repeat-string@^1.5.2, repeat-string@^1.5.4, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" repeating@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" dependencies: is-finite "^1.0.0" replace-ext@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: aws-sign2 "~0.6.0" aws4 "^1.2.1" caseless "~0.12.0" combined-stream "~1.0.5" extend "~3.0.0" forever-agent "~0.6.1" form-data "~2.1.1" har-validator "~4.2.1" hawk "~3.1.3" http-signature "~1.1.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" mime-types "~2.1.7" oauth-sign "~0.8.1" performance-now "^0.2.0" qs "~6.4.0" safe-buffer "^5.0.1" stringstream "~0.0.4" tough-cookie "~2.3.0" tunnel-agent "^0.6.0" uuid "^3.0.0" request@^2.79.0: version "2.85.0" resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" caseless "~0.12.0" combined-stream "~1.0.5" extend "~3.0.1" forever-agent "~0.6.1" form-data "~2.3.1" har-validator "~5.0.3" hawk "~6.0.2" http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" mime-types "~2.1.17" oauth-sign "~0.8.2" performance-now "^2.1.0" qs "~6.5.1" safe-buffer "^5.1.1" stringstream "~0.0.5" tough-cookie "~2.3.3" tunnel-agent "^0.6.0" uuid "^3.1.0" require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" require-from-string@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" dependencies: caller-path "^0.1.0" resolve-from "^1.0.0" resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" resolve@1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" resolve@^1.3.3: version "1.7.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.7.1.tgz#aadd656374fd298aee895bc026b8297418677fd3" dependencies: path-parse "^1.0.5" restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" dependencies: exit-hook "^1.0.0" onetime "^1.0.0" restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" dependencies: onetime "^2.0.0" signal-exit "^3.0.2" ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" right-align@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef" dependencies: align-text "^0.1.1" rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: glob "^7.0.5" run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" dependencies: is-promise "^2.1.0" rx-lite-aggregates@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" dependencies: rx-lite "*" rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" rxjs@^5.4.2: version "5.5.10" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.10.tgz#fde02d7a614f6c8683d0d1957827f492e09db045" dependencies: symbol-observable "1.0.1" safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" safe-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" dependencies: ret "~0.1.10" safer-buffer@^2.1.0: version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" sane@^2.0.0: version "2.5.0" resolved "https://registry.yarnpkg.com/sane/-/sane-2.5.0.tgz#6359cd676f5efd9988b264d8ce3b827dd6b27bec" dependencies: anymatch "^2.0.0" exec-sh "^0.2.0" fb-watchman "^2.0.0" micromatch "^3.1.4" minimist "^1.1.1" walker "~1.0.5" watch "~0.18.0" optionalDependencies: fsevents "^1.1.1" sax@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" "semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" semver@5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" set-value@^0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" is-plain-object "^2.0.1" to-object-path "^0.3.0" set-value@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" dependencies: extend-shallow "^2.0.1" is-extendable "^0.1.1" is-plain-object "^2.0.3" split-string "^3.0.1" shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" dependencies: shebang-regex "^1.0.0" shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" shellsubstitute@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shellsubstitute/-/shellsubstitute-1.2.0.tgz#e4f702a50c518b0f6fe98451890d705af29b6b70" shellwords@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" slice-ansi@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" dependencies: is-fullwidth-code-point "^2.0.0" sliced@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/sliced/-/sliced-1.0.1.tgz#0b3a662b5d04c3177b1926bea82b03f837a2ef41" snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" dependencies: define-property "^1.0.0" isobject "^3.0.0" snapdragon-util "^3.0.1" snapdragon-util@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" dependencies: kind-of "^3.2.0" snapdragon@^0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" dependencies: base "^0.11.1" debug "^2.2.0" define-property "^0.2.5" extend-shallow "^2.0.1" map-cache "^0.2.2" source-map "^0.5.6" source-map-resolve "^0.5.0" use "^3.1.0" sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" dependencies: hoek "2.x.x" sntp@2.x.x: version "2.1.0" resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" dependencies: hoek "4.x.x" source-map-resolve@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" dependencies: atob "^2.0.0" decode-uri-component "^0.2.0" resolve-url "^0.2.1" source-map-url "^0.4.0" urix "^0.1.0" source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" dependencies: source-map "^0.5.6" source-map-url@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" source-map@^0.4.4: version "0.4.4" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.4.4.tgz#eba4f5da9c0dc999de68032d8b4f76173652036b" dependencies: amdefine ">=0.0.4" source-map@^0.5.0, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, source-map@~0.5.1: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" spdx-expression-parse@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" dependencies: extend-shallow "^3.0.0" sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" sshpk@^1.7.0: version "1.14.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" dashdash "^1.12.0" getpass "^0.1.1" optionalDependencies: bcrypt-pbkdf "^1.0.0" ecc-jsbn "~0.1.1" jsbn "~0.1.0" tweetnacl "~0.14.0" staged-git-files@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-1.0.0.tgz#cdb847837c1fcc52c08a872d4883cc0877668a80" state-toggle@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/state-toggle/-/state-toggle-1.0.0.tgz#d20f9a616bb4f0c3b98b91922d25b640aa2bc425" static-extend@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" dependencies: define-property "^0.2.5" object-copy "^0.1.0" stream-to-observable@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.2.0.tgz#59d6ea393d87c2c0ddac10aa0d561bc6ba6f0e10" dependencies: any-observable "^0.2.0" string-length@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" dependencies: astral-regex "^1.0.0" strip-ansi "^4.0.0" string-width@^1.0.0, string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" dependencies: code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" dependencies: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" dependencies: safe-buffer "~5.1.0" stringify-entities@^1.0.1: version "1.3.1" resolved "https://registry.yarnpkg.com/stringify-entities/-/stringify-entities-1.3.1.tgz#b150ec2d72ac4c1b5f324b51fb6b28c9cdff058c" dependencies: character-entities-html4 "^1.0.0" character-entities-legacy "^1.0.0" is-alphanumerical "^1.0.0" is-hexadecimal "^1.0.0" stringify-object@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.2.2.tgz#9853052e5a88fb605a44cd27445aa257ad7ffbcd" dependencies: get-own-enumerable-property-symbols "^2.0.1" is-obj "^1.0.1" is-regexp "^1.0.0" stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" dependencies: ansi-regex "^2.0.0" strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" dependencies: ansi-regex "^3.0.0" strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" dependencies: is-utf8 "^0.2.0" strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" supports-color@^3.1.2: version "3.2.3" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" dependencies: has-flag "^1.0.0" supports-color@^4.1.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" dependencies: has-flag "^2.0.0" supports-color@^5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.3.0.tgz#5b24ac15db80fa927cf5227a4a33fd3c4c7676c0" dependencies: has-flag "^3.0.0" symbol-observable@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" symbol-observable@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" symbol-tree@^3.2.1: version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" table@4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" dependencies: ajv "^5.2.3" ajv-keywords "^2.1.0" chalk "^2.1.0" lodash "^4.17.4" slice-ansi "1.0.0" string-width "^2.1.1" tar-pack@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" dependencies: debug "^2.2.0" fstream "^1.0.10" fstream-ignore "^1.0.5" once "^1.3.3" readable-stream "^2.1.4" rimraf "^2.5.1" tar "^2.2.1" uid-number "^0.0.6" tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" dependencies: block-stream "*" fstream "^1.0.2" inherits "2" test-exclude@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.2.1.tgz#dfa222f03480bca69207ca728b37d74b45f724fa" dependencies: arrify "^1.0.1" micromatch "^3.1.8" object-assign "^4.1.0" read-pkg-up "^1.0.1" require-main-filename "^1.0.1" text-table@^0.2.0, text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" throat@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" dependencies: os-tmpdir "~1.0.2" tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" dependencies: kind-of "^3.0.2" to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" dependencies: is-number "^3.0.0" repeat-string "^1.6.1" to-regex@^3.0.1, to-regex@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" dependencies: define-property "^2.0.2" extend-shallow "^3.0.2" regex-not "^1.0.2" safe-regex "^1.1.0" to-vfile@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/to-vfile/-/to-vfile-2.2.0.tgz#342d1705e6df526d569b1fc8bfa29f1f36d6c416" dependencies: is-buffer "^1.1.4" vfile "^2.0.0" x-is-function "^1.0.4" tough-cookie@^2.3.2, tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.4" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" dependencies: punycode "^1.4.1" tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" trim-trailing-lines@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz#7aefbb7808df9d669f6da2e438cac8c46ada7684" trim@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/trim/-/trim-0.0.1.tgz#5858547f6b290757ee95cccc666fb50084c460dd" trough@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.2.tgz#7f1663ec55c480139e2de5e486c6aef6cc24a535" tunnel-agent@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" dependencies: safe-buffer "^5.0.1" tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" type-check@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" dependencies: prelude-ls "~1.1.2" typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" uglify-js@^2.6: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" dependencies: source-map "~0.5.1" yargs "~3.10.0" optionalDependencies: uglify-to-browserify "~1.0.0" uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" unherit@^1.0.4: version "1.1.0" resolved "https://registry.yarnpkg.com/unherit/-/unherit-1.1.0.tgz#6b9aaedfbf73df1756ad9e316dd981885840cd7d" dependencies: inherits "^2.0.1" xtend "^4.0.1" unified-args@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/unified-args/-/unified-args-4.0.0.tgz#8d9b9b8ad347beb37f430562a62c4d361b42220f" dependencies: camelcase "^4.0.0" chalk "^2.0.0" chokidar "^1.5.1" minimist "^1.2.0" text-table "^0.2.0" unified-engine "^4.0.0" unified-args@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/unified-args/-/unified-args-5.1.0.tgz#1889200e072998a662e6e84d817d6f4b5f448dd1" dependencies: camelcase "^4.0.0" chalk "^2.0.0" chokidar "^1.5.1" json5 "^0.5.1" minimist "^1.2.0" text-table "^0.2.0" unified-engine "^5.1.0" unified-engine@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/unified-engine/-/unified-engine-4.0.1.tgz#9692aa97fd5c4ec36889779e12514bef8e863fc3" dependencies: concat-stream "^1.5.1" debug "^2.2.0" fault "^1.0.0" fn-name "^2.0.1" glob "^7.0.3" ignore "^3.2.0" is-empty "^1.0.0" is-hidden "^1.0.1" is-object "^1.0.1" js-yaml "^3.6.1" load-plugin "^2.0.0" parse-json "^2.2.0" to-vfile "^2.0.0" trough "^1.0.0" vfile-reporter "^4.0.0" vfile-statistics "^1.1.0" x-is-function "^1.0.4" x-is-string "^0.1.0" xtend "^4.0.1" unified-engine@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/unified-engine/-/unified-engine-5.1.0.tgz#30db83bcc76c821f773bb5a8a491aa0e2471e3d1" dependencies: concat-stream "^1.5.1" debug "^3.1.0" fault "^1.0.0" fn-name "^2.0.1" glob "^7.0.3" ignore "^3.2.0" is-empty "^1.0.0" is-hidden "^1.0.1" is-object "^1.0.1" js-yaml "^3.6.1" load-plugin "^2.0.0" parse-json "^4.0.0" to-vfile "^2.0.0" trough "^1.0.0" unist-util-inspect "^4.1.2" vfile-reporter "^4.0.0" vfile-statistics "^1.1.0" x-is-function "^1.0.4" x-is-string "^0.1.0" xtend "^4.0.1" unified-lint-rule@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/unified-lint-rule/-/unified-lint-rule-1.0.2.tgz#419270d7de71436938cbcb34d8683f56a14d74b7" dependencies: wrapped "^1.0.1" unified@^6.0.0: version "6.1.6" resolved "https://registry.yarnpkg.com/unified/-/unified-6.1.6.tgz#5ea7f807a0898f1f8acdeefe5f25faa010cc42b1" dependencies: bail "^1.0.0" extend "^3.0.0" is-plain-obj "^1.1.0" trough "^1.0.0" vfile "^2.0.0" x-is-function "^1.0.4" x-is-string "^0.1.0" union-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" dependencies: arr-union "^3.1.0" get-value "^2.0.6" is-extendable "^0.1.1" set-value "^0.4.3" unist-util-generated@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/unist-util-generated/-/unist-util-generated-1.1.1.tgz#99f16c78959ac854dee7c615c291924c8bf4de7f" unist-util-inspect@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/unist-util-inspect/-/unist-util-inspect-4.1.2.tgz#440520d0c7911f1a41eb5f568ef9b2efc3c29363" dependencies: is-empty "^1.0.0" unist-util-is@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/unist-util-is/-/unist-util-is-2.1.1.tgz#0c312629e3f960c66e931e812d3d80e77010947b" unist-util-modify-children@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/unist-util-modify-children/-/unist-util-modify-children-1.1.1.tgz#66d7e6a449e6f67220b976ab3cb8b5ebac39e51d" dependencies: array-iterate "^1.0.0" unist-util-position@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/unist-util-position/-/unist-util-position-3.0.0.tgz#e6e1e03eeeb81c5e1afe553e8d4adfbd7c0d8f82" unist-util-remove-position@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/unist-util-remove-position/-/unist-util-remove-position-1.1.1.tgz#5a85c1555fc1ba0c101b86707d15e50fa4c871bb" dependencies: unist-util-visit "^1.1.0" unist-util-stringify-position@^1.0.0, unist-util-stringify-position@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unist-util-stringify-position/-/unist-util-stringify-position-1.1.1.tgz#3ccbdc53679eed6ecf3777dd7f5e3229c1b6aa3c" unist-util-visit@^1.0.0, unist-util-visit@^1.1.0, unist-util-visit@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/unist-util-visit/-/unist-util-visit-1.3.0.tgz#41ca7c82981fd1ce6c762aac397fc24e35711444" dependencies: unist-util-is "^2.1.1" unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" dependencies: has-value "^0.3.1" isobject "^3.0.0" untildify@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/untildify/-/untildify-2.1.0.tgz#17eb2807987f76952e9c0485fc311d06a826a2e0" dependencies: os-homedir "^1.0.0" urix@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" urljoin@^0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/urljoin/-/urljoin-0.1.5.tgz#b25d2c6112c55ac9d50096a49a0f1fb7f4f53921" dependencies: extend "~2.0.0" use@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/use/-/use-3.1.0.tgz#14716bf03fdfefd03040aef58d8b4b85f3a7c544" dependencies: kind-of "^6.0.2" util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" uuid@^3.0.0, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" validate-npm-package-license@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" dependencies: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" dependencies: assert-plus "^1.0.0" core-util-is "1.0.2" extsprintf "^1.2.0" vfile-location@^2.0.0, vfile-location@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/vfile-location/-/vfile-location-2.0.2.tgz#d3675c59c877498e492b4756ff65e4af1a752255" vfile-message@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/vfile-message/-/vfile-message-1.0.0.tgz#a6adb0474ea400fa25d929f1d673abea6a17e359" dependencies: unist-util-stringify-position "^1.1.1" vfile-reporter@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/vfile-reporter/-/vfile-reporter-4.0.0.tgz#ea6f0ae1342f4841573985e05f941736f27de9da" dependencies: repeat-string "^1.5.0" string-width "^1.0.0" supports-color "^4.1.0" unist-util-stringify-position "^1.0.0" vfile-statistics "^1.1.0" vfile-statistics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/vfile-statistics/-/vfile-statistics-1.1.0.tgz#02104c60fdeed1d11b1f73ad65330b7634b3d895" vfile@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/vfile/-/vfile-2.3.0.tgz#e62d8e72b20e83c324bc6c67278ee272488bf84a" dependencies: is-buffer "^1.1.4" replace-ext "1.0.0" unist-util-stringify-position "^1.0.0" vfile-message "^1.0.0" vlq@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" dependencies: makeerror "1.0.x" watch@~0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" dependencies: exec-sh "^0.2.0" minimist "^1.2.0" webidl-conversions@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" webidl-conversions@^4.0.0: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" whatwg-encoding@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" dependencies: iconv-lite "0.4.19" whatwg-url@^4.3.0: version "4.8.0" resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-4.8.0.tgz#d2981aa9148c1e00a41c5a6131166ab4683bbcc0" dependencies: tr46 "~0.0.3" webidl-conversions "^3.0.0" which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" which@^1.2.10, which@^1.2.12, which@^1.2.9, which@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: isexe "^2.0.0" wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" dependencies: string-width "^1.0.2" window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" worker-farm@^1.3.1: version "1.6.0" resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" dependencies: errno "~0.1.7" wrap-ansi@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" dependencies: string-width "^1.0.1" strip-ansi "^3.0.1" wrapped@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/wrapped/-/wrapped-1.0.1.tgz#c783d9d807b273e9b01e851680a938c87c907242" dependencies: co "3.1.0" sliced "^1.0.1" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" write-file-atomic@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" dependencies: graceful-fs "^4.1.11" imurmurhash "^0.1.4" signal-exit "^3.0.2" write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" dependencies: mkdirp "^0.5.1" x-is-function@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/x-is-function/-/x-is-function-1.0.4.tgz#5d294dc3d268cbdd062580e0c5df77a391d1fa1e" x-is-string@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/x-is-string/-/x-is-string-0.1.0.tgz#474b50865af3a49a9c4657f05acd145458f77d82" xml-name-validator@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" xtend@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" dependencies: camelcase "^4.1.0" yargs@^9.0.0: version "9.0.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-9.0.1.tgz#52acc23feecac34042078ee78c0c007f5085db4c" dependencies: camelcase "^4.1.0" cliui "^3.2.0" decamelize "^1.1.1" get-caller-file "^1.0.1" os-locale "^2.0.0" read-pkg-up "^2.0.0" require-directory "^2.1.1" require-main-filename "^1.0.1" set-blocking "^2.0.0" string-width "^2.0.0" which-module "^2.0.0" y18n "^3.2.1" yargs-parser "^7.0.0" yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" dependencies: camelcase "^1.0.2" cliui "^2.1.0" decamelize "^1.0.0" window-size "0.1.0"