├── .gitignore ├── .npmignore ├── .travis.yml ├── AUTHORS ├── LICENSE ├── README.md ├── lib ├── cacheize.js ├── dirHas.js ├── preprocessor.js ├── stringOrArray.js └── webpackInfo.js ├── package-lock.json ├── package.json └── test ├── dirHas.test.js ├── fixture ├── basic.js ├── setup.js └── webpackInfo │ ├── alt-config-location.js │ ├── es6-default-exports.js │ ├── no-profile.js │ ├── profile-missing-resolve-root.js │ ├── profile-not-array.js │ ├── profile-not-found.js │ └── profile-not-specified.js ├── lib └── expect.js ├── preprocessor.test.js ├── stringOrArray.test.js └── webpackInfo.test.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | /.coveralls.yml 4 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .gitignore 2 | .npmignore 3 | node_modules 4 | /.coveralls.yml 5 | /.travis.yml 6 | /test 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '4.2' 4 | script: npm run-script coverage 5 | -------------------------------------------------------------------------------- /AUTHORS: -------------------------------------------------------------------------------- 1 | Michael Olson 2 | Adil Fulara 3 | Desmond Brand 4 | Ishi Ruy 5 | Richard Fung 6 | Andrew Meredith 7 | Gustav Ahlberg 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015-2016 Michael Olson 4 | Copyright (c) 2015 Ticketmaster® & Live Nation Entertainment® 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # jest-webpack-alias 2 | 3 | [![Build Status][travis-image]][travis-url] 4 | [![Coverage Status][coveralls-image]][coveralls-url] 5 | [![NPM][npm-image]][npm-url] 6 | 7 | Preprocessor for Jest that is able to resolve `require()` statements using webpack aliases. 8 | 9 | > :warning: 10 | > 11 | > **Consider using [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver) for new projects instead of `jest-webpack-alias`. An example setup can be seen at [the Next.js repo](https://github.com/zeit/next.js).** 12 | 13 | ## Install 14 | 15 | ```sh 16 | npm install --save-dev jest-webpack-alias 17 | ``` 18 | 19 | ## Setup 20 | 21 | File `__tests__/preprocessor.js`: 22 | 23 | ```js 24 | var babelJest = require('babel-jest'); 25 | require('babel-register'); // support ES6 'import' statements 26 | var webpackAlias = require('jest-webpack-alias'); 27 | 28 | module.exports = { 29 | process: function(src, filename) { 30 | if (filename.indexOf('node_modules') === -1) { 31 | src = babelJest.process(src, filename); 32 | src = webpackAlias.process(src, filename); 33 | } 34 | return src; 35 | } 36 | }; 37 | ``` 38 | 39 | File `package.json`: 40 | 41 | ``` 42 | { 43 | ... 44 | "jest": { 45 | ... 46 | "scriptPreprocessor": "/__tests__/preprocessor.js", 47 | }, 48 | "jest-webpack-alias": { 49 | "profile": "dev" 50 | } 51 | } 52 | ``` 53 | 54 | ## Common problems 55 | 56 | ### Importing CSS and SCSS files 57 | 58 | In order to use statements like `require('some-styles.css')` in a testing environment, it's best to use an npm module like [ignore-styles](https://www.npmjs.com/package/ignore-styles) to ignore files that match certain file extensions in `require()` statements. 59 | 60 | ### Manual package resolution 61 | 62 | Code like this will not work, because an AST parser is not smart enough to evaluate variables into strings. 63 | 64 | ```js 65 | var moduleName = 'myModName'; 66 | var computed = require(moduleName); 67 | ``` 68 | 69 | It can be rewritten like this, using the `resolve` function: 70 | 71 | ```js 72 | var resolve = require('jest-webpack-alias').resolve; 73 | var moduleName = 'myModName'; 74 | var computed = require(resolve(moduleName, __filename)); 75 | ``` 76 | 77 | ## Non-javascript package resolution. 78 | 79 | Code like this will fail, because it is resolved by webpack loader. 80 | 81 | File: `main.js` 82 | ```js 83 | require('./style.css'); 84 | ... 85 | ``` 86 | 87 | File: `__tests__/main.js` 88 | ```js 89 | jest.dontMock('../main.js'); 90 | require('../main.js'); 91 | ... 92 | ``` 93 | 94 | The workaround for this is to use [Manual Mocks](https://github.com/facebook/jest/blob/master/docs/ManualMocks.md). 95 | 96 | #### Example 97 | 98 | Project structure: 99 | ``` 100 | --+ / 101 | +- src / 102 | | +- main.js 103 | | +- style.css 104 | | +- __tests__ / main.js 105 | | +- __mocks__ / style.css 106 | +- __tests__ / 107 | | +- preprocessor.js 108 | +- node_modules / 109 | +- package.json 110 | +- webpack.config.js 111 | 112 | ``` 113 | 114 | File: `src/main.js` 115 | ``` 116 | ... 117 | require('style.css'); 118 | ... 119 | ``` 120 | 121 | File: `src/__tests__/main.js` (`__tests__` can actually be anywhere, not only next to tested files) 122 | ``` 123 | jest.dontMock('../main'); 124 | var main = require('../main'); 125 | ... 126 | ``` 127 | 128 | File: `src/__mocks__/style.css` (`__mocks__` __must__ be next to mocked files) 129 | ``` 130 | module.exports = 'src/style.css'; 131 | ``` 132 | 133 | ## package.json options 134 | 135 | - `jest-webpack-alias.configFile`: Optional, default is `"webpack.config.js"`. If provided, this should be a path 136 | fragment relative to your `package.json` file. Example: `"webpack/config.dev.js"`. 137 | 138 | - `jest-webpack-alias.profile`: Optional. If provided, will expect your webpack config to be an array of profiles, and 139 | will match against the `name` field of each to choose a webpack config that applies to your Jest tests. See 140 | https://github.com/webpack/webpack/tree/master/examples/multi-compiler for an example of this kind of setup. 141 | 142 | ## Known issues 143 | 144 | - `resolve.modulesDirectories` only searches the directory containing your package.json file, not all ancestors of current file 145 | 146 | ## License 147 | 148 | MIT 149 | 150 | [travis-image]: https://travis-ci.org/mwolson/jest-webpack-alias.svg?branch=master 151 | [travis-url]: https://travis-ci.org/mwolson/jest-webpack-alias 152 | 153 | [coveralls-image]: https://coveralls.io/repos/github/mwolson/jest-webpack-alias/badge.svg?branch=master 154 | [coveralls-url]: https://coveralls.io/github/mwolson/jest-webpack-alias?branch=master 155 | 156 | [npm-image]: https://img.shields.io/npm/v/jest-webpack-alias.svg?style=flat 157 | [npm-url]: https://www.npmjs.com/package/jest-webpack-alias 158 | -------------------------------------------------------------------------------- /lib/cacheize.js: -------------------------------------------------------------------------------- 1 | 2 | module.exports = function(dirList) { 3 | var dirTree = {}; 4 | dirList.forEach(function(dir) { dirTree[dir] = true; }); 5 | return dirTree; 6 | }; 7 | -------------------------------------------------------------------------------- /lib/dirHas.js: -------------------------------------------------------------------------------- 1 | var _ = require('lodash'); 2 | var cacheize = require('./cacheize'); 3 | var fs = require('fs'); 4 | var has = _.has; 5 | 6 | var cache = {}; 7 | 8 | function readdir(dirname) { 9 | if (has(cache, dirname)) { 10 | return cache[dirname]; 11 | } else { 12 | var dirList; 13 | try { dirList = fs.readdirSync(dirname); } catch(e) { dirList = []; } 14 | var dirTree = cache[dirname] = cacheize(dirList); 15 | return dirTree; 16 | } 17 | } 18 | 19 | module.exports = function(dir, entry) { 20 | return has(readdir(dir), entry); 21 | }; 22 | -------------------------------------------------------------------------------- /lib/preprocessor.js: -------------------------------------------------------------------------------- 1 | var _ = require('lodash'); 2 | var dirHas = require('./dirHas'); 3 | var fs = require('fs'); 4 | var path = require('path'); 5 | var stringOrArray = require('./stringOrArray'); 6 | var transformDeps = require('transform-jest-deps'); 7 | var unwin = require('unwin'); 8 | var webpackInfo = require('./webpackInfo'); 9 | 10 | var defaultAliases = {}; 11 | var defaultFallbackDirs = []; 12 | var defaultFileExtensions = ['', '.webpack.js', '.web.js', '.js', '.json']; 13 | var defaultModules = ['node_modules']; 14 | var defaultModulesDirs = ['node_modules', 'web_modules']; 15 | 16 | var aliases; 17 | var fileExtensions; 18 | var moduleDirs; 19 | var webpackSettings; 20 | 21 | function ensureWebpackInfo(filename) { 22 | if (webpackSettings) { 23 | return; 24 | } 25 | 26 | webpackSettings = webpackInfo.read({filename: filename}); 27 | var resolveConfig = webpackSettings.config.resolve; 28 | var webpackDir = path.dirname(webpackSettings.file); 29 | aliases = resolveConfig.alias || defaultAliases; 30 | fileExtensions = resolveConfig.extensions || defaultFileExtensions; 31 | moduleDirs = resolveConfig.modules || defaultModules; 32 | 33 | if (!resolveConfig.modules && resolveConfig.root) { 34 | // webpack 1.x path names 35 | var rootDirs = stringOrArray(resolveConfig.root); 36 | var modDirs = stringOrArray(resolveConfig.modulesDirectories) || defaultModulesDirs; 37 | var fallbackDirs = stringOrArray(resolveConfig.fallback) || defaultFallbackDirs; 38 | moduleDirs = _.union(rootDirs, modDirs, fallbackDirs); 39 | } 40 | 41 | moduleDirs = moduleDirs.map(function(dir) { 42 | return path.resolve(webpackDir, dir); 43 | }) 44 | .filter(function(dir) { 45 | return fs.existsSync(dir); 46 | }); 47 | } 48 | 49 | function firstDir(filename) { 50 | var segments; 51 | 52 | if (path.isAbsolute(filename)) { 53 | return filename; 54 | } else { 55 | return filename.split('/')[0]; 56 | } 57 | } 58 | 59 | function matchAlias(dependency) { 60 | var alias = aliases[dependency]; 61 | if (alias) { 62 | var dirname = firstDir(alias); 63 | return { 64 | dirname: dirname, 65 | rest: alias.slice(dirname.length + 1), 66 | path: alias 67 | }; 68 | } else { 69 | return undefined; 70 | } 71 | } 72 | 73 | function resolveExtension(matchingFirstDir, afterFirstDir) { 74 | var absMatch = afterFirstDir ? path.join(matchingFirstDir, afterFirstDir) : matchingFirstDir; 75 | var dirname = path.dirname(absMatch); 76 | var ext = _.find(fileExtensions, function(ext) { 77 | return dirHas(dirname, path.basename(absMatch + ext)); 78 | }); 79 | return ext; 80 | } 81 | 82 | function locate(dirname) { 83 | var matchingDir, matchingExt; 84 | 85 | if (path.isAbsolute(dirname)) { 86 | matchingDir = dirname; 87 | matchingExt = resolveExtension(dirname); 88 | } else { 89 | matchingDir = _.find(moduleDirs, function(candidate) { 90 | matchingExt = resolveExtension(candidate, dirname); 91 | return matchingExt !== undefined; 92 | }); 93 | } 94 | 95 | return { 96 | dir: matchingDir, 97 | ext: matchingDir ? (matchingExt || '') : '' 98 | }; 99 | } 100 | 101 | function resolveRelativeDependency(dependency, filename) { 102 | var absMatch = path.resolve(path.dirname(filename), dependency); 103 | var ext = resolveExtension(absMatch) || ''; 104 | return dependency + ext; 105 | } 106 | 107 | function resolveDependencyToMatch(matchingFirstDir, afterFirstDir, filename) { 108 | var absMatch = afterFirstDir ? path.join(matchingFirstDir, afterFirstDir) : matchingFirstDir; 109 | var srcDir = path.dirname(filename); 110 | var relPath = unwin(path.relative(srcDir, absMatch)); 111 | if (relPath.slice(0, 1) != '.') { 112 | relPath = './' + relPath; 113 | } 114 | return relPath; 115 | } 116 | 117 | function resolve(dependency, filename) { 118 | ensureWebpackInfo(filename); 119 | 120 | if (!dependency) { 121 | return undefined; 122 | } 123 | 124 | if (dependency.slice(0, 1) === '.') { 125 | return resolveRelativeDependency(dependency, filename); 126 | } 127 | 128 | var dirname = firstDir(dependency); 129 | var rest = dependency.slice(dirname.length + 1); 130 | 131 | var alias = matchAlias(dirname); 132 | if (alias) { 133 | // We want to get something relative to the alias 134 | if (rest) { 135 | dirname = alias.path; 136 | } else { 137 | dirname = alias.dirname; 138 | rest = alias.rest; 139 | } 140 | dependency = dirname + (rest ? '/' + rest : ''); 141 | } 142 | 143 | var match = locate(dependency); 144 | if (!match.dir) { 145 | return dependency; 146 | } 147 | 148 | var matchingDir; 149 | if (path.isAbsolute(dirname)) { 150 | matchingDir = dirname; 151 | } else { 152 | matchingDir = path.join(match.dir, dirname); 153 | } 154 | var relative = resolveDependencyToMatch(matchingDir, rest, filename); 155 | var ext = match.ext || ''; 156 | 157 | if (_.includes(relative, '/node_modules/')) { 158 | return dependency; 159 | } 160 | 161 | return relative + ext; 162 | } 163 | 164 | function process(src, filename) { 165 | ensureWebpackInfo(filename); 166 | var transformed = transformDeps(src, function(dependency) { 167 | return resolve(dependency, filename); 168 | }); 169 | return transformed; 170 | } 171 | 172 | exports.process = process; 173 | exports.resolve = resolve; 174 | -------------------------------------------------------------------------------- /lib/stringOrArray.js: -------------------------------------------------------------------------------- 1 | function stringOrArray(thing) { 2 | if (thing === undefined || thing === null) { 3 | return thing; 4 | } else if (Array.isArray(thing)) { 5 | return thing; 6 | } else { 7 | return [thing]; 8 | } 9 | } 10 | 11 | module.exports = stringOrArray; 12 | -------------------------------------------------------------------------------- /lib/webpackInfo.js: -------------------------------------------------------------------------------- 1 | var _ = require('lodash'); 2 | var path = require('path'); 3 | var pkginfo = require('pkginfo'); 4 | 5 | function genProfileError(profile, rest) { 6 | return 'Specified jest-webpack-alias.webpackProfile = "' + profile + '", but ' + rest; 7 | } 8 | 9 | function extractES6DefaultExportsObject(inExports) { 10 | return typeof _.get(inExports, 'default') === 'object' ? inExports.default : inExports; 11 | } 12 | 13 | function read(pmodule, dir) { 14 | var packageJson = pkginfo.read(pmodule, dir); 15 | var pkgJsonFile = packageJson.dir; // misleading name from pkginfo library 16 | var pkgJsonDir = path.dirname(pkgJsonFile); 17 | 18 | var profile = _.get(packageJson['package'], 'jest-webpack-alias.profile'); 19 | var configFile = _.get(packageJson['package'], 'jest-webpack-alias.configFile', 'webpack.config.js'); 20 | var webpackFile = path.join(pkgJsonDir, configFile); 21 | var webpackSettings = extractES6DefaultExportsObject(require(webpackFile)); 22 | 23 | if (profile) { 24 | if (!_.isArray(webpackSettings)) { 25 | throw new Error(genProfileError(profile, webpackFile + ' does not export an array')); 26 | } 27 | webpackSettings = _.find(webpackSettings, ['name', profile]); 28 | if (!webpackSettings) { 29 | throw new Error(genProfileError(profile, webpackFile + ' does not contain this profile')); 30 | } 31 | } else { 32 | if (_.isArray(webpackSettings)) { 33 | throw new Error('jest-webpack-alias.webpackProfile not specified, but ' + webpackFile + ' exports an array'); 34 | } 35 | } 36 | 37 | if (!_.get(webpackSettings, 'resolve.modules') && !_.get(webpackSettings, 'resolve.root')) { 38 | throw new Error('Missing setting "resolve.modules" (webpack v2) or "resolve.root" (webpack v1) in ' + webpackFile); 39 | } 40 | 41 | return { 42 | config: webpackSettings, 43 | file: webpackFile 44 | }; 45 | } 46 | 47 | exports.read = read; 48 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jest-webpack-alias", 3 | "version": "3.3.4", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "acorn": { 8 | "version": "2.7.0", 9 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", 10 | "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" 11 | }, 12 | "acorn-jsx": { 13 | "version": "2.0.1", 14 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-2.0.1.tgz", 15 | "integrity": "sha1-Dt+YeKWGa8piX1KVWh7Z59jFEX4=", 16 | "requires": { 17 | "acorn": "^2.0.1" 18 | } 19 | }, 20 | "ajv": { 21 | "version": "6.10.2", 22 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 23 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 24 | "dev": true, 25 | "requires": { 26 | "fast-deep-equal": "^2.0.1", 27 | "fast-json-stable-stringify": "^2.0.0", 28 | "json-schema-traverse": "^0.4.1", 29 | "uri-js": "^4.2.2" 30 | } 31 | }, 32 | "ansi-colors": { 33 | "version": "3.2.3", 34 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", 35 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", 36 | "dev": true 37 | }, 38 | "ansi-regex": { 39 | "version": "3.0.0", 40 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 41 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 42 | "dev": true 43 | }, 44 | "ansi-styles": { 45 | "version": "3.2.1", 46 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 47 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 48 | "dev": true, 49 | "requires": { 50 | "color-convert": "^1.9.0" 51 | } 52 | }, 53 | "argparse": { 54 | "version": "1.0.10", 55 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 56 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 57 | "dev": true, 58 | "requires": { 59 | "sprintf-js": "~1.0.2" 60 | } 61 | }, 62 | "asn1": { 63 | "version": "0.2.4", 64 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 65 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 66 | "dev": true, 67 | "requires": { 68 | "safer-buffer": "~2.1.0" 69 | } 70 | }, 71 | "assert-plus": { 72 | "version": "1.0.0", 73 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 74 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 75 | "dev": true 76 | }, 77 | "assertion-error": { 78 | "version": "1.1.0", 79 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 80 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 81 | "dev": true 82 | }, 83 | "asynckit": { 84 | "version": "0.4.0", 85 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 86 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 87 | "dev": true 88 | }, 89 | "aws-sign2": { 90 | "version": "0.7.0", 91 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 92 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 93 | "dev": true 94 | }, 95 | "aws4": { 96 | "version": "1.8.0", 97 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 98 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 99 | "dev": true 100 | }, 101 | "balanced-match": { 102 | "version": "1.0.0", 103 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 104 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 105 | "dev": true 106 | }, 107 | "bcrypt-pbkdf": { 108 | "version": "1.0.2", 109 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 110 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 111 | "dev": true, 112 | "requires": { 113 | "tweetnacl": "^0.14.3" 114 | } 115 | }, 116 | "blanket": { 117 | "version": "1.2.3", 118 | "resolved": "https://registry.npmjs.org/blanket/-/blanket-1.2.3.tgz", 119 | "integrity": "sha1-FRtJh8O9hFUrtfA7kO9fflkx5HM=", 120 | "dev": true, 121 | "requires": { 122 | "acorn": "^1.0.3", 123 | "falafel": "~1.2.0", 124 | "foreach": "^2.0.5", 125 | "isarray": "0.0.1", 126 | "object-keys": "^1.0.6", 127 | "xtend": "~4.0.0" 128 | }, 129 | "dependencies": { 130 | "acorn": { 131 | "version": "1.2.2", 132 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", 133 | "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=", 134 | "dev": true 135 | } 136 | } 137 | }, 138 | "brace-expansion": { 139 | "version": "1.1.11", 140 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 141 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 142 | "dev": true, 143 | "requires": { 144 | "balanced-match": "^1.0.0", 145 | "concat-map": "0.0.1" 146 | } 147 | }, 148 | "browser-stdout": { 149 | "version": "1.3.1", 150 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 151 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 152 | "dev": true 153 | }, 154 | "camelcase": { 155 | "version": "5.3.1", 156 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 157 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 158 | "dev": true 159 | }, 160 | "caseless": { 161 | "version": "0.12.0", 162 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 163 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 164 | "dev": true 165 | }, 166 | "chai": { 167 | "version": "3.5.0", 168 | "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz", 169 | "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", 170 | "dev": true, 171 | "requires": { 172 | "assertion-error": "^1.0.1", 173 | "deep-eql": "^0.1.3", 174 | "type-detect": "^1.0.0" 175 | } 176 | }, 177 | "chalk": { 178 | "version": "2.4.2", 179 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 180 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 181 | "dev": true, 182 | "requires": { 183 | "ansi-styles": "^3.2.1", 184 | "escape-string-regexp": "^1.0.5", 185 | "supports-color": "^5.3.0" 186 | }, 187 | "dependencies": { 188 | "supports-color": { 189 | "version": "5.5.0", 190 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 191 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 192 | "dev": true, 193 | "requires": { 194 | "has-flag": "^3.0.0" 195 | } 196 | } 197 | } 198 | }, 199 | "cliui": { 200 | "version": "5.0.0", 201 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 202 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 203 | "dev": true, 204 | "requires": { 205 | "string-width": "^3.1.0", 206 | "strip-ansi": "^5.2.0", 207 | "wrap-ansi": "^5.1.0" 208 | }, 209 | "dependencies": { 210 | "ansi-regex": { 211 | "version": "4.1.0", 212 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 213 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 214 | "dev": true 215 | }, 216 | "string-width": { 217 | "version": "3.1.0", 218 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 219 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 220 | "dev": true, 221 | "requires": { 222 | "emoji-regex": "^7.0.1", 223 | "is-fullwidth-code-point": "^2.0.0", 224 | "strip-ansi": "^5.1.0" 225 | } 226 | }, 227 | "strip-ansi": { 228 | "version": "5.2.0", 229 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 230 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 231 | "dev": true, 232 | "requires": { 233 | "ansi-regex": "^4.1.0" 234 | } 235 | } 236 | } 237 | }, 238 | "color-convert": { 239 | "version": "1.9.3", 240 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 241 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 242 | "dev": true, 243 | "requires": { 244 | "color-name": "1.1.3" 245 | } 246 | }, 247 | "color-name": { 248 | "version": "1.1.3", 249 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 250 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 251 | "dev": true 252 | }, 253 | "combined-stream": { 254 | "version": "1.0.8", 255 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 256 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 257 | "dev": true, 258 | "requires": { 259 | "delayed-stream": "~1.0.0" 260 | } 261 | }, 262 | "concat-map": { 263 | "version": "0.0.1", 264 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 265 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 266 | "dev": true 267 | }, 268 | "core-util-is": { 269 | "version": "1.0.2", 270 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 271 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 272 | "dev": true 273 | }, 274 | "coveralls": { 275 | "version": "3.0.7", 276 | "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-3.0.7.tgz", 277 | "integrity": "sha512-mUuH2MFOYB2oBaA4D4Ykqi9LaEYpMMlsiOMJOrv358yAjP6enPIk55fod2fNJ8AvwoYXStWQls37rA+s5e7boA==", 278 | "dev": true, 279 | "requires": { 280 | "growl": "~> 1.10.0", 281 | "js-yaml": "^3.13.1", 282 | "lcov-parse": "^0.0.10", 283 | "log-driver": "^1.2.7", 284 | "minimist": "^1.2.0", 285 | "request": "^2.86.0" 286 | } 287 | }, 288 | "dashdash": { 289 | "version": "1.14.1", 290 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 291 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 292 | "dev": true, 293 | "requires": { 294 | "assert-plus": "^1.0.0" 295 | } 296 | }, 297 | "debug": { 298 | "version": "3.2.6", 299 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 300 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 301 | "dev": true, 302 | "requires": { 303 | "ms": "^2.1.1" 304 | } 305 | }, 306 | "decamelize": { 307 | "version": "1.2.0", 308 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 309 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 310 | "dev": true 311 | }, 312 | "deep-eql": { 313 | "version": "0.1.3", 314 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", 315 | "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=", 316 | "dev": true, 317 | "requires": { 318 | "type-detect": "0.1.1" 319 | }, 320 | "dependencies": { 321 | "type-detect": { 322 | "version": "0.1.1", 323 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", 324 | "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=", 325 | "dev": true 326 | } 327 | } 328 | }, 329 | "define-properties": { 330 | "version": "1.1.3", 331 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 332 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 333 | "dev": true, 334 | "requires": { 335 | "object-keys": "^1.0.12" 336 | } 337 | }, 338 | "delayed-stream": { 339 | "version": "1.0.0", 340 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 341 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 342 | "dev": true 343 | }, 344 | "diff": { 345 | "version": "3.5.0", 346 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 347 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 348 | "dev": true 349 | }, 350 | "ecc-jsbn": { 351 | "version": "0.1.2", 352 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 353 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 354 | "dev": true, 355 | "requires": { 356 | "jsbn": "~0.1.0", 357 | "safer-buffer": "^2.1.0" 358 | } 359 | }, 360 | "emoji-regex": { 361 | "version": "7.0.3", 362 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 363 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 364 | "dev": true 365 | }, 366 | "es-abstract": { 367 | "version": "1.16.0", 368 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.0.tgz", 369 | "integrity": "sha512-xdQnfykZ9JMEiasTAJZJdMWCQ1Vm00NBw79/AWi7ELfZuuPCSOMDZbT9mkOfSctVtfhb+sAAzrm+j//GjjLHLg==", 370 | "dev": true, 371 | "requires": { 372 | "es-to-primitive": "^1.2.0", 373 | "function-bind": "^1.1.1", 374 | "has": "^1.0.3", 375 | "has-symbols": "^1.0.0", 376 | "is-callable": "^1.1.4", 377 | "is-regex": "^1.0.4", 378 | "object-inspect": "^1.6.0", 379 | "object-keys": "^1.1.1", 380 | "string.prototype.trimleft": "^2.1.0", 381 | "string.prototype.trimright": "^2.1.0" 382 | } 383 | }, 384 | "es-to-primitive": { 385 | "version": "1.2.0", 386 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 387 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 388 | "dev": true, 389 | "requires": { 390 | "is-callable": "^1.1.4", 391 | "is-date-object": "^1.0.1", 392 | "is-symbol": "^1.0.2" 393 | } 394 | }, 395 | "escape-string-regexp": { 396 | "version": "1.0.5", 397 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 398 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 399 | "dev": true 400 | }, 401 | "esprima": { 402 | "version": "4.0.1", 403 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 404 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 405 | "dev": true 406 | }, 407 | "extend": { 408 | "version": "3.0.2", 409 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 410 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 411 | "dev": true 412 | }, 413 | "extsprintf": { 414 | "version": "1.3.0", 415 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 416 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 417 | "dev": true 418 | }, 419 | "falafel": { 420 | "version": "1.2.0", 421 | "resolved": "https://registry.npmjs.org/falafel/-/falafel-1.2.0.tgz", 422 | "integrity": "sha1-wY0k71CRF0pJfzGM0ksCaiXN2rQ=", 423 | "requires": { 424 | "acorn": "^1.0.3", 425 | "foreach": "^2.0.5", 426 | "isarray": "0.0.1", 427 | "object-keys": "^1.0.6" 428 | }, 429 | "dependencies": { 430 | "acorn": { 431 | "version": "1.2.2", 432 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", 433 | "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" 434 | } 435 | } 436 | }, 437 | "fast-deep-equal": { 438 | "version": "2.0.1", 439 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 440 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 441 | "dev": true 442 | }, 443 | "fast-json-stable-stringify": { 444 | "version": "2.0.0", 445 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 446 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 447 | "dev": true 448 | }, 449 | "find-up": { 450 | "version": "3.0.0", 451 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 452 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 453 | "dev": true, 454 | "requires": { 455 | "locate-path": "^3.0.0" 456 | } 457 | }, 458 | "flat": { 459 | "version": "4.1.0", 460 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 461 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 462 | "dev": true, 463 | "requires": { 464 | "is-buffer": "~2.0.3" 465 | } 466 | }, 467 | "foreach": { 468 | "version": "2.0.5", 469 | "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", 470 | "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=" 471 | }, 472 | "forever-agent": { 473 | "version": "0.6.1", 474 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 475 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 476 | "dev": true 477 | }, 478 | "form-data": { 479 | "version": "2.3.3", 480 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 481 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 482 | "dev": true, 483 | "requires": { 484 | "asynckit": "^0.4.0", 485 | "combined-stream": "^1.0.6", 486 | "mime-types": "^2.1.12" 487 | } 488 | }, 489 | "formatio": { 490 | "version": "1.1.1", 491 | "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", 492 | "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", 493 | "dev": true, 494 | "requires": { 495 | "samsam": "~1.1" 496 | } 497 | }, 498 | "fs.realpath": { 499 | "version": "1.0.0", 500 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 501 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 502 | "dev": true 503 | }, 504 | "function-bind": { 505 | "version": "1.1.1", 506 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 507 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 508 | "dev": true 509 | }, 510 | "get-caller-file": { 511 | "version": "2.0.5", 512 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 513 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 514 | "dev": true 515 | }, 516 | "getpass": { 517 | "version": "0.1.7", 518 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 519 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 520 | "dev": true, 521 | "requires": { 522 | "assert-plus": "^1.0.0" 523 | } 524 | }, 525 | "glob": { 526 | "version": "7.1.3", 527 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 528 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 529 | "dev": true, 530 | "requires": { 531 | "fs.realpath": "^1.0.0", 532 | "inflight": "^1.0.4", 533 | "inherits": "2", 534 | "minimatch": "^3.0.4", 535 | "once": "^1.3.0", 536 | "path-is-absolute": "^1.0.0" 537 | } 538 | }, 539 | "growl": { 540 | "version": "1.10.5", 541 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 542 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 543 | "dev": true 544 | }, 545 | "har-schema": { 546 | "version": "2.0.0", 547 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 548 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 549 | "dev": true 550 | }, 551 | "har-validator": { 552 | "version": "5.1.3", 553 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 554 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 555 | "dev": true, 556 | "requires": { 557 | "ajv": "^6.5.5", 558 | "har-schema": "^2.0.0" 559 | } 560 | }, 561 | "has": { 562 | "version": "1.0.3", 563 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 564 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 565 | "dev": true, 566 | "requires": { 567 | "function-bind": "^1.1.1" 568 | } 569 | }, 570 | "has-flag": { 571 | "version": "3.0.0", 572 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 573 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 574 | "dev": true 575 | }, 576 | "has-symbols": { 577 | "version": "1.0.0", 578 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 579 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 580 | "dev": true 581 | }, 582 | "he": { 583 | "version": "1.2.0", 584 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 585 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 586 | "dev": true 587 | }, 588 | "http-signature": { 589 | "version": "1.2.0", 590 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 591 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 592 | "dev": true, 593 | "requires": { 594 | "assert-plus": "^1.0.0", 595 | "jsprim": "^1.2.2", 596 | "sshpk": "^1.7.0" 597 | } 598 | }, 599 | "inflight": { 600 | "version": "1.0.6", 601 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 602 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 603 | "dev": true, 604 | "requires": { 605 | "once": "^1.3.0", 606 | "wrappy": "1" 607 | } 608 | }, 609 | "inherits": { 610 | "version": "2.0.4", 611 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 612 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 613 | "dev": true 614 | }, 615 | "is-arguments": { 616 | "version": "1.0.4", 617 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz", 618 | "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==", 619 | "dev": true 620 | }, 621 | "is-buffer": { 622 | "version": "2.0.4", 623 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 624 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", 625 | "dev": true 626 | }, 627 | "is-callable": { 628 | "version": "1.1.4", 629 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 630 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 631 | "dev": true 632 | }, 633 | "is-date-object": { 634 | "version": "1.0.1", 635 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 636 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 637 | "dev": true 638 | }, 639 | "is-fullwidth-code-point": { 640 | "version": "2.0.0", 641 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 642 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 643 | "dev": true 644 | }, 645 | "is-generator-function": { 646 | "version": "1.0.7", 647 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.7.tgz", 648 | "integrity": "sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==", 649 | "dev": true 650 | }, 651 | "is-regex": { 652 | "version": "1.0.4", 653 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 654 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 655 | "dev": true, 656 | "requires": { 657 | "has": "^1.0.1" 658 | } 659 | }, 660 | "is-symbol": { 661 | "version": "1.0.2", 662 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 663 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 664 | "dev": true, 665 | "requires": { 666 | "has-symbols": "^1.0.0" 667 | } 668 | }, 669 | "is-typedarray": { 670 | "version": "1.0.0", 671 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 672 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 673 | "dev": true 674 | }, 675 | "isarray": { 676 | "version": "0.0.1", 677 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", 678 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" 679 | }, 680 | "isexe": { 681 | "version": "2.0.0", 682 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 683 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 684 | "dev": true 685 | }, 686 | "isstream": { 687 | "version": "0.1.2", 688 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 689 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 690 | "dev": true 691 | }, 692 | "js-yaml": { 693 | "version": "3.13.1", 694 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 695 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 696 | "dev": true, 697 | "requires": { 698 | "argparse": "^1.0.7", 699 | "esprima": "^4.0.0" 700 | } 701 | }, 702 | "jsbn": { 703 | "version": "0.1.1", 704 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 705 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 706 | "dev": true 707 | }, 708 | "json-schema": { 709 | "version": "0.2.3", 710 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 711 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 712 | "dev": true 713 | }, 714 | "json-schema-traverse": { 715 | "version": "0.4.1", 716 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 717 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 718 | "dev": true 719 | }, 720 | "json-stringify-safe": { 721 | "version": "5.0.1", 722 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 723 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 724 | "dev": true 725 | }, 726 | "jsprim": { 727 | "version": "1.4.1", 728 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 729 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 730 | "dev": true, 731 | "requires": { 732 | "assert-plus": "1.0.0", 733 | "extsprintf": "1.3.0", 734 | "json-schema": "0.2.3", 735 | "verror": "1.10.0" 736 | } 737 | }, 738 | "lcov-parse": { 739 | "version": "0.0.10", 740 | "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", 741 | "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=", 742 | "dev": true 743 | }, 744 | "locate-path": { 745 | "version": "3.0.0", 746 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 747 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 748 | "dev": true, 749 | "requires": { 750 | "p-locate": "^3.0.0", 751 | "path-exists": "^3.0.0" 752 | } 753 | }, 754 | "lodash": { 755 | "version": "4.17.15", 756 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 757 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 758 | }, 759 | "log-driver": { 760 | "version": "1.2.7", 761 | "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.7.tgz", 762 | "integrity": "sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==", 763 | "dev": true 764 | }, 765 | "log-symbols": { 766 | "version": "2.2.0", 767 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", 768 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", 769 | "dev": true, 770 | "requires": { 771 | "chalk": "^2.0.1" 772 | } 773 | }, 774 | "lolex": { 775 | "version": "1.3.2", 776 | "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", 777 | "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", 778 | "dev": true 779 | }, 780 | "mime-db": { 781 | "version": "1.40.0", 782 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 783 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", 784 | "dev": true 785 | }, 786 | "mime-types": { 787 | "version": "2.1.24", 788 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 789 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 790 | "dev": true, 791 | "requires": { 792 | "mime-db": "1.40.0" 793 | } 794 | }, 795 | "minimatch": { 796 | "version": "3.0.4", 797 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 798 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 799 | "dev": true, 800 | "requires": { 801 | "brace-expansion": "^1.1.7" 802 | } 803 | }, 804 | "minimist": { 805 | "version": "1.2.0", 806 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 807 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", 808 | "dev": true 809 | }, 810 | "mkdirp": { 811 | "version": "0.5.1", 812 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 813 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 814 | "dev": true, 815 | "requires": { 816 | "minimist": "0.0.8" 817 | }, 818 | "dependencies": { 819 | "minimist": { 820 | "version": "0.0.8", 821 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 822 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 823 | "dev": true 824 | } 825 | } 826 | }, 827 | "mocha": { 828 | "version": "6.2.2", 829 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", 830 | "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", 831 | "dev": true, 832 | "requires": { 833 | "ansi-colors": "3.2.3", 834 | "browser-stdout": "1.3.1", 835 | "debug": "3.2.6", 836 | "diff": "3.5.0", 837 | "escape-string-regexp": "1.0.5", 838 | "find-up": "3.0.0", 839 | "glob": "7.1.3", 840 | "growl": "1.10.5", 841 | "he": "1.2.0", 842 | "js-yaml": "3.13.1", 843 | "log-symbols": "2.2.0", 844 | "minimatch": "3.0.4", 845 | "mkdirp": "0.5.1", 846 | "ms": "2.1.1", 847 | "node-environment-flags": "1.0.5", 848 | "object.assign": "4.1.0", 849 | "strip-json-comments": "2.0.1", 850 | "supports-color": "6.0.0", 851 | "which": "1.3.1", 852 | "wide-align": "1.1.3", 853 | "yargs": "13.3.0", 854 | "yargs-parser": "13.1.1", 855 | "yargs-unparser": "1.6.0" 856 | } 857 | }, 858 | "mocha-lcov-reporter": { 859 | "version": "1.3.0", 860 | "resolved": "https://registry.npmjs.org/mocha-lcov-reporter/-/mocha-lcov-reporter-1.3.0.tgz", 861 | "integrity": "sha1-Rpve9PivyaEWBW8HnfYYLQr7A4Q=", 862 | "dev": true 863 | }, 864 | "ms": { 865 | "version": "2.1.1", 866 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 867 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 868 | "dev": true 869 | }, 870 | "node-environment-flags": { 871 | "version": "1.0.5", 872 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", 873 | "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", 874 | "dev": true, 875 | "requires": { 876 | "object.getownpropertydescriptors": "^2.0.3", 877 | "semver": "^5.7.0" 878 | } 879 | }, 880 | "oauth-sign": { 881 | "version": "0.9.0", 882 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 883 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 884 | "dev": true 885 | }, 886 | "object-inspect": { 887 | "version": "1.6.0", 888 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.6.0.tgz", 889 | "integrity": "sha512-GJzfBZ6DgDAmnuaM3104jR4s1Myxr3Y3zfIyN4z3UdqN69oSRacNK8UhnobDdC+7J2AHCjGwxQubNJfE70SXXQ==", 890 | "dev": true 891 | }, 892 | "object-keys": { 893 | "version": "1.1.1", 894 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 895 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 896 | }, 897 | "object.assign": { 898 | "version": "4.1.0", 899 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 900 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 901 | "dev": true, 902 | "requires": { 903 | "define-properties": "^1.1.2", 904 | "function-bind": "^1.1.1", 905 | "has-symbols": "^1.0.0", 906 | "object-keys": "^1.0.11" 907 | } 908 | }, 909 | "object.entries": { 910 | "version": "1.1.0", 911 | "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.0.tgz", 912 | "integrity": "sha512-l+H6EQ8qzGRxbkHOd5I/aHRhHDKoQXQ8g0BYt4uSweQU1/J6dZUOyWh9a2Vky35YCKjzmgxOzta2hH6kf9HuXA==", 913 | "dev": true, 914 | "requires": { 915 | "define-properties": "^1.1.3", 916 | "es-abstract": "^1.12.0", 917 | "function-bind": "^1.1.1", 918 | "has": "^1.0.3" 919 | } 920 | }, 921 | "object.getownpropertydescriptors": { 922 | "version": "2.0.3", 923 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", 924 | "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", 925 | "dev": true, 926 | "requires": { 927 | "define-properties": "^1.1.2", 928 | "es-abstract": "^1.5.1" 929 | } 930 | }, 931 | "once": { 932 | "version": "1.4.0", 933 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 934 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 935 | "dev": true, 936 | "requires": { 937 | "wrappy": "1" 938 | } 939 | }, 940 | "p-limit": { 941 | "version": "2.2.1", 942 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", 943 | "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", 944 | "dev": true, 945 | "requires": { 946 | "p-try": "^2.0.0" 947 | } 948 | }, 949 | "p-locate": { 950 | "version": "3.0.0", 951 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 952 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 953 | "dev": true, 954 | "requires": { 955 | "p-limit": "^2.0.0" 956 | } 957 | }, 958 | "p-try": { 959 | "version": "2.2.0", 960 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 961 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 962 | "dev": true 963 | }, 964 | "path-exists": { 965 | "version": "3.0.0", 966 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 967 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 968 | "dev": true 969 | }, 970 | "path-is-absolute": { 971 | "version": "1.0.1", 972 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 973 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 974 | "dev": true 975 | }, 976 | "performance-now": { 977 | "version": "2.1.0", 978 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 979 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 980 | "dev": true 981 | }, 982 | "pkginfo": { 983 | "version": "0.3.1", 984 | "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", 985 | "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" 986 | }, 987 | "psl": { 988 | "version": "1.4.0", 989 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", 990 | "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", 991 | "dev": true 992 | }, 993 | "punycode": { 994 | "version": "2.1.1", 995 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 996 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 997 | "dev": true 998 | }, 999 | "qs": { 1000 | "version": "6.5.2", 1001 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1002 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 1003 | "dev": true 1004 | }, 1005 | "request": { 1006 | "version": "2.88.0", 1007 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 1008 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 1009 | "dev": true, 1010 | "requires": { 1011 | "aws-sign2": "~0.7.0", 1012 | "aws4": "^1.8.0", 1013 | "caseless": "~0.12.0", 1014 | "combined-stream": "~1.0.6", 1015 | "extend": "~3.0.2", 1016 | "forever-agent": "~0.6.1", 1017 | "form-data": "~2.3.2", 1018 | "har-validator": "~5.1.0", 1019 | "http-signature": "~1.2.0", 1020 | "is-typedarray": "~1.0.0", 1021 | "isstream": "~0.1.2", 1022 | "json-stringify-safe": "~5.0.1", 1023 | "mime-types": "~2.1.19", 1024 | "oauth-sign": "~0.9.0", 1025 | "performance-now": "^2.1.0", 1026 | "qs": "~6.5.2", 1027 | "safe-buffer": "^5.1.2", 1028 | "tough-cookie": "~2.4.3", 1029 | "tunnel-agent": "^0.6.0", 1030 | "uuid": "^3.3.2" 1031 | } 1032 | }, 1033 | "require-directory": { 1034 | "version": "2.1.1", 1035 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1036 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1037 | "dev": true 1038 | }, 1039 | "require-main-filename": { 1040 | "version": "2.0.0", 1041 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1042 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 1043 | "dev": true 1044 | }, 1045 | "rewire": { 1046 | "version": "2.5.2", 1047 | "resolved": "https://registry.npmjs.org/rewire/-/rewire-2.5.2.tgz", 1048 | "integrity": "sha1-ZCfee3/u+n02QBUH62SlOFvFjcc=", 1049 | "dev": true 1050 | }, 1051 | "safe-buffer": { 1052 | "version": "5.2.0", 1053 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 1054 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", 1055 | "dev": true 1056 | }, 1057 | "safer-buffer": { 1058 | "version": "2.1.2", 1059 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1060 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 1061 | "dev": true 1062 | }, 1063 | "samsam": { 1064 | "version": "1.1.2", 1065 | "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", 1066 | "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", 1067 | "dev": true 1068 | }, 1069 | "semver": { 1070 | "version": "5.7.1", 1071 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1072 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 1073 | "dev": true 1074 | }, 1075 | "set-blocking": { 1076 | "version": "2.0.0", 1077 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1078 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1079 | "dev": true 1080 | }, 1081 | "sinon": { 1082 | "version": "1.17.7", 1083 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", 1084 | "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", 1085 | "dev": true, 1086 | "requires": { 1087 | "formatio": "1.1.1", 1088 | "lolex": "1.3.2", 1089 | "samsam": "1.1.2", 1090 | "util": ">=0.10.3 <1" 1091 | } 1092 | }, 1093 | "sinon-chai": { 1094 | "version": "2.14.0", 1095 | "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.14.0.tgz", 1096 | "integrity": "sha512-9stIF1utB0ywNHNT7RgiXbdmen8QDCRsrTjw+G9TgKt1Yexjiv8TOWZ6WHsTPz57Yky3DIswZvEqX8fpuHNDtQ==", 1097 | "dev": true 1098 | }, 1099 | "sprintf-js": { 1100 | "version": "1.0.3", 1101 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1102 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1103 | "dev": true 1104 | }, 1105 | "sshpk": { 1106 | "version": "1.16.1", 1107 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1108 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1109 | "dev": true, 1110 | "requires": { 1111 | "asn1": "~0.2.3", 1112 | "assert-plus": "^1.0.0", 1113 | "bcrypt-pbkdf": "^1.0.0", 1114 | "dashdash": "^1.12.0", 1115 | "ecc-jsbn": "~0.1.1", 1116 | "getpass": "^0.1.1", 1117 | "jsbn": "~0.1.0", 1118 | "safer-buffer": "^2.0.2", 1119 | "tweetnacl": "~0.14.0" 1120 | } 1121 | }, 1122 | "string-width": { 1123 | "version": "2.1.1", 1124 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1125 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1126 | "dev": true, 1127 | "requires": { 1128 | "is-fullwidth-code-point": "^2.0.0", 1129 | "strip-ansi": "^4.0.0" 1130 | } 1131 | }, 1132 | "string.prototype.trimleft": { 1133 | "version": "2.1.0", 1134 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 1135 | "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 1136 | "dev": true, 1137 | "requires": { 1138 | "define-properties": "^1.1.3", 1139 | "function-bind": "^1.1.1" 1140 | } 1141 | }, 1142 | "string.prototype.trimright": { 1143 | "version": "2.1.0", 1144 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 1145 | "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 1146 | "dev": true, 1147 | "requires": { 1148 | "define-properties": "^1.1.3", 1149 | "function-bind": "^1.1.1" 1150 | } 1151 | }, 1152 | "strip-ansi": { 1153 | "version": "4.0.0", 1154 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1155 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1156 | "dev": true, 1157 | "requires": { 1158 | "ansi-regex": "^3.0.0" 1159 | } 1160 | }, 1161 | "strip-json-comments": { 1162 | "version": "2.0.1", 1163 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1164 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1165 | "dev": true 1166 | }, 1167 | "supports-color": { 1168 | "version": "6.0.0", 1169 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", 1170 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", 1171 | "dev": true, 1172 | "requires": { 1173 | "has-flag": "^3.0.0" 1174 | } 1175 | }, 1176 | "tough-cookie": { 1177 | "version": "2.4.3", 1178 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1179 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 1180 | "dev": true, 1181 | "requires": { 1182 | "psl": "^1.1.24", 1183 | "punycode": "^1.4.1" 1184 | }, 1185 | "dependencies": { 1186 | "punycode": { 1187 | "version": "1.4.1", 1188 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1189 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 1190 | "dev": true 1191 | } 1192 | } 1193 | }, 1194 | "transform-jest-deps": { 1195 | "version": "2.2.2", 1196 | "resolved": "https://registry.npmjs.org/transform-jest-deps/-/transform-jest-deps-2.2.2.tgz", 1197 | "integrity": "sha512-DRs6+N0lYrRaYuoMOr8yYEZKSKruMyVXw0QZxs1zerJyCcTfwQXMt7xP3/eDzv+j0wikv45HPRREC5ppqYpVVQ==", 1198 | "requires": { 1199 | "acorn-jsx": "^2.0.0", 1200 | "falafel": "^1.2.0", 1201 | "lodash": "^4.17.15" 1202 | } 1203 | }, 1204 | "tunnel-agent": { 1205 | "version": "0.6.0", 1206 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1207 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1208 | "dev": true, 1209 | "requires": { 1210 | "safe-buffer": "^5.0.1" 1211 | } 1212 | }, 1213 | "tweetnacl": { 1214 | "version": "0.14.5", 1215 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1216 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1217 | "dev": true 1218 | }, 1219 | "type-detect": { 1220 | "version": "1.0.0", 1221 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz", 1222 | "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=", 1223 | "dev": true 1224 | }, 1225 | "unwin": { 1226 | "version": "1.0.2", 1227 | "resolved": "https://registry.npmjs.org/unwin/-/unwin-1.0.2.tgz", 1228 | "integrity": "sha1-w7b/kysqjatk1uQd4no5HyWxdiw=" 1229 | }, 1230 | "uri-js": { 1231 | "version": "4.2.2", 1232 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1233 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1234 | "dev": true, 1235 | "requires": { 1236 | "punycode": "^2.1.0" 1237 | } 1238 | }, 1239 | "util": { 1240 | "version": "0.12.1", 1241 | "resolved": "https://registry.npmjs.org/util/-/util-0.12.1.tgz", 1242 | "integrity": "sha512-MREAtYOp+GTt9/+kwf00IYoHZyjM8VU4aVrkzUlejyqaIjd2GztVl5V9hGXKlvBKE3gENn/FMfHE5v6hElXGcQ==", 1243 | "dev": true, 1244 | "requires": { 1245 | "inherits": "^2.0.3", 1246 | "is-arguments": "^1.0.4", 1247 | "is-generator-function": "^1.0.7", 1248 | "object.entries": "^1.1.0", 1249 | "safe-buffer": "^5.1.2" 1250 | } 1251 | }, 1252 | "uuid": { 1253 | "version": "3.3.3", 1254 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 1255 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", 1256 | "dev": true 1257 | }, 1258 | "verror": { 1259 | "version": "1.10.0", 1260 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1261 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1262 | "dev": true, 1263 | "requires": { 1264 | "assert-plus": "^1.0.0", 1265 | "core-util-is": "1.0.2", 1266 | "extsprintf": "^1.2.0" 1267 | } 1268 | }, 1269 | "which": { 1270 | "version": "1.3.1", 1271 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1272 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1273 | "dev": true, 1274 | "requires": { 1275 | "isexe": "^2.0.0" 1276 | } 1277 | }, 1278 | "which-module": { 1279 | "version": "2.0.0", 1280 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1281 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 1282 | "dev": true 1283 | }, 1284 | "wide-align": { 1285 | "version": "1.1.3", 1286 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1287 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1288 | "dev": true, 1289 | "requires": { 1290 | "string-width": "^1.0.2 || 2" 1291 | } 1292 | }, 1293 | "wrap-ansi": { 1294 | "version": "5.1.0", 1295 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 1296 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 1297 | "dev": true, 1298 | "requires": { 1299 | "ansi-styles": "^3.2.0", 1300 | "string-width": "^3.0.0", 1301 | "strip-ansi": "^5.0.0" 1302 | }, 1303 | "dependencies": { 1304 | "ansi-regex": { 1305 | "version": "4.1.0", 1306 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1307 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1308 | "dev": true 1309 | }, 1310 | "string-width": { 1311 | "version": "3.1.0", 1312 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1313 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1314 | "dev": true, 1315 | "requires": { 1316 | "emoji-regex": "^7.0.1", 1317 | "is-fullwidth-code-point": "^2.0.0", 1318 | "strip-ansi": "^5.1.0" 1319 | } 1320 | }, 1321 | "strip-ansi": { 1322 | "version": "5.2.0", 1323 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1324 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1325 | "dev": true, 1326 | "requires": { 1327 | "ansi-regex": "^4.1.0" 1328 | } 1329 | } 1330 | } 1331 | }, 1332 | "wrappy": { 1333 | "version": "1.0.2", 1334 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1335 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1336 | "dev": true 1337 | }, 1338 | "xtend": { 1339 | "version": "4.0.2", 1340 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1341 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 1342 | "dev": true 1343 | }, 1344 | "y18n": { 1345 | "version": "4.0.0", 1346 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1347 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 1348 | "dev": true 1349 | }, 1350 | "yargs": { 1351 | "version": "13.3.0", 1352 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", 1353 | "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", 1354 | "dev": true, 1355 | "requires": { 1356 | "cliui": "^5.0.0", 1357 | "find-up": "^3.0.0", 1358 | "get-caller-file": "^2.0.1", 1359 | "require-directory": "^2.1.1", 1360 | "require-main-filename": "^2.0.0", 1361 | "set-blocking": "^2.0.0", 1362 | "string-width": "^3.0.0", 1363 | "which-module": "^2.0.0", 1364 | "y18n": "^4.0.0", 1365 | "yargs-parser": "^13.1.1" 1366 | }, 1367 | "dependencies": { 1368 | "ansi-regex": { 1369 | "version": "4.1.0", 1370 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1371 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1372 | "dev": true 1373 | }, 1374 | "string-width": { 1375 | "version": "3.1.0", 1376 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1377 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1378 | "dev": true, 1379 | "requires": { 1380 | "emoji-regex": "^7.0.1", 1381 | "is-fullwidth-code-point": "^2.0.0", 1382 | "strip-ansi": "^5.1.0" 1383 | } 1384 | }, 1385 | "strip-ansi": { 1386 | "version": "5.2.0", 1387 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1388 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1389 | "dev": true, 1390 | "requires": { 1391 | "ansi-regex": "^4.1.0" 1392 | } 1393 | } 1394 | } 1395 | }, 1396 | "yargs-parser": { 1397 | "version": "13.1.1", 1398 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", 1399 | "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", 1400 | "dev": true, 1401 | "requires": { 1402 | "camelcase": "^5.0.0", 1403 | "decamelize": "^1.2.0" 1404 | } 1405 | }, 1406 | "yargs-unparser": { 1407 | "version": "1.6.0", 1408 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 1409 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", 1410 | "dev": true, 1411 | "requires": { 1412 | "flat": "^4.1.0", 1413 | "lodash": "^4.17.15", 1414 | "yargs": "^13.3.0" 1415 | } 1416 | } 1417 | } 1418 | } 1419 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "jest-webpack-alias", 3 | "version": "3.3.4", 4 | "description": "Preprocessor for Jest that is able to resolve require() statements using webpack aliases.", 5 | "main": "lib/preprocessor.js", 6 | "scripts": { 7 | "test": "mocha --reporter tap test", 8 | "coverage": "mocha test --require blanket -R mocha-lcov-reporter | ./node_modules/coveralls/bin/coveralls.js" 9 | }, 10 | "config": { 11 | "blanket": { 12 | "pattern": [ 13 | "lib" 14 | ], 15 | "data-cover-never": [ 16 | "node_modules", 17 | "test" 18 | ] 19 | } 20 | }, 21 | "repository": { 22 | "type": "git", 23 | "url": "https://github.com/mwolson/jest-webpack-alias.git" 24 | }, 25 | "author": "Michael Olson ", 26 | "license": "MIT", 27 | "keywords": [ 28 | "jest", 29 | "webpack", 30 | "require", 31 | "resolve", 32 | "alias" 33 | ], 34 | "dependencies": { 35 | "lodash": "^4.17.15", 36 | "pkginfo": "^0.3.0", 37 | "transform-jest-deps": "^2.2.2", 38 | "unwin": "^1.0.1" 39 | }, 40 | "devDependencies": { 41 | "blanket": "^1.2.1", 42 | "chai": "^3.2.0", 43 | "coveralls": "^3.0.7", 44 | "mocha": "^6.2.2", 45 | "mocha-lcov-reporter": "^1.0.0", 46 | "rewire": "^2.3.4", 47 | "sinon": "^1.16.1", 48 | "sinon-chai": "^2.8.0" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /test/dirHas.test.js: -------------------------------------------------------------------------------- 1 | var expect = require('./lib/expect'); 2 | var basicFixture = require('./fixture/basic'); 3 | var cacheize = require('../lib/cacheize'); 4 | 5 | describe('dirHas lib', function() { 6 | var cache, dirHas, fs, readdir; 7 | 8 | function setup() { 9 | var setup = basicFixture.getDirHas(); 10 | cache = setup.cache; 11 | dirHas = setup.dirHas; 12 | fs = setup.fs; 13 | readdir = setup.readdir; 14 | } 15 | 16 | beforeEach(setup); 17 | 18 | describe('with file hit in first dir', function() { 19 | it('resolves to first dir with caching', function() { 20 | var firstDir = '/top/src'; 21 | var output = dirHas(firstDir, 'dir1'); 22 | 23 | expect(fs.readdirSync).to.be.calledOnce; 24 | expect(fs.readdirSync.args[0][0]).to.eq('/top/src'); 25 | expect(cache[firstDir]).to.eql(cacheize(readdir[firstDir])); 26 | expect(output).to.be.ok; 27 | }); 28 | }); 29 | 30 | describe('with nonexistent directory', function() { 31 | it('returns false without throwing error', function() { 32 | var firstDir = '/top/src/bogus/directory'; 33 | var output = dirHas(firstDir, 'dir1'); 34 | 35 | expect(fs.readdirSync).to.be.calledOnce; 36 | expect(fs.readdirSync.args[0][0]).to.eq('/top/src/bogus/directory'); 37 | expect(cache[firstDir]).to.eql(cacheize([])); 38 | expect(output).to.not.be.ok; 39 | }); 40 | }); 41 | }); 42 | -------------------------------------------------------------------------------- /test/fixture/basic.js: -------------------------------------------------------------------------------- 1 | var Setup = require('./setup'); 2 | var fixture = new Setup(); 3 | 4 | fixture.readdir = { 5 | '/top': ['node_modules', 'package.json', 'src', 'test', 'web_modules', 'webpack.config.js'], 6 | '/top/node_modules': ['aliasNodeFileDest.js', 'node1', 'node2'], 7 | '/top/node_modules/node1': ['lib'], 8 | '/top/node_modules/node1/lib': ['submodule.js'], 9 | '/top/web_modules': ['web1', 'web2.jsx'], 10 | '/top/src': ['aliasRelative.js', 'dir1', 'dir2'], 11 | '/top/src/dir1': ['lib1a.js', 'lib1b-2b.js', 'dir1-1'], 12 | '/top/src/dir1/dir1-1': ['lib1-1a.js'], 13 | '/top/src/dir2': ['lib2a.js', 'lib1b-2b.js'], 14 | '/top/src/dir3': ['dir3-1'], 15 | '/top/src/dir3/dir3-1': ['mocked.js'], 16 | '/top/test': ['file1.test.js', 'file2.test.js', '__mocks__'], 17 | '/top/test/__mocks__': ['dir3'], 18 | '/top/test/__mocks__/dir3': ['dir3-1'], 19 | '/top/test/__mocks__/dir3/dir3-1': ['mocked.js'] 20 | }; 21 | 22 | var webpackProfile = fixture.webpackProfile = 'dev'; 23 | 24 | var webpackSettings = fixture.webpackSettings = [ 25 | { 26 | name: 'wrongProfile' 27 | }, 28 | { 29 | otherField: 'nope' 30 | }, 31 | { 32 | name: webpackProfile, 33 | resolve: { 34 | modules: ['/top/test/__mocks__', '/top/src', '/top/bogus_dir', 'node_modules', 'web_modules'], 35 | extensions: ["", ".js", ".jsx"], 36 | // omitted: fallback 37 | alias: { 38 | aliasNodeSubdir1Src: 'node1', 39 | aliasNodeSubdir2Src: 'node1/lib/submodule', 40 | aliasNodeFileSrc: 'aliasNodeFileDest', 41 | aliasPlainSubdirSrc: 'dir1/lib1a', 42 | aliasAbsoluteSubdirSrc: '/top/src/dir1', 43 | aliasAbsoluteFileSrc: '/top/src/dir1/lib1a', 44 | aliasSubRelative: 'dir1/dir1-1', 45 | } 46 | } 47 | } 48 | ]; 49 | 50 | fixture.requireContents = { 51 | '/top/webpack.config.js': webpackSettings 52 | }; 53 | 54 | fixture.readFile = { 55 | '/top/package.json': JSON.stringify({ 56 | 'jest-webpack-alias': { 57 | profile: webpackProfile 58 | } 59 | }) 60 | }; 61 | 62 | module.exports = fixture.getExports(); 63 | -------------------------------------------------------------------------------- /test/fixture/setup.js: -------------------------------------------------------------------------------- 1 | var rewire = require('rewire'); 2 | var sinon = require('sinon'); 3 | var unwin = require('unwin'); 4 | 5 | function Setup() {} 6 | 7 | Setup.prototype.getDirHas = function getDirHas() { 8 | var dirHas = rewire('../../lib/dirHas'); 9 | 10 | var fs = { 11 | readdirSync: sinon.spy(function(inPath) { 12 | inPath = unwin(inPath); 13 | var dirList = this.readdir[inPath]; 14 | if (!dirList) { 15 | throw new Error('unmocked readdirSync for path ' + inPath); 16 | } 17 | return dirList; 18 | }.bind(this)) 19 | }; 20 | dirHas.__set__('fs', fs); 21 | 22 | return { 23 | cache: dirHas.__get__('cache'), 24 | dirHas: dirHas, 25 | fs: fs, 26 | readdir: this.readdir 27 | }; 28 | }; 29 | 30 | Setup.prototype.getWebpackInfo = function getWebpackInfo() { 31 | var webpackInfo = rewire('../../lib/webpackInfo'); 32 | 33 | var fakeRequire = sinon.spy(function(inPath) { 34 | return this.requireContents[unwin(inPath)] || require(inPath); 35 | }.bind(this)); 36 | webpackInfo.__set__('require', fakeRequire); 37 | 38 | var pkginfo = { 39 | read: sinon.spy(function(pmodule, dir) { 40 | return { 41 | dir: '/top/package.json', // misleading key name. lame. 42 | 'package': JSON.parse(this.readFile['/top/package.json']) 43 | }; 44 | }.bind(this)) 45 | }; 46 | webpackInfo.__set__('pkginfo', pkginfo); 47 | 48 | return { 49 | pkginfo: pkginfo, 50 | readFile: this.readFile, 51 | require: fakeRequire, 52 | requireContents: this.requireContents, 53 | webpackInfo: webpackInfo, 54 | webpackProfile: this.webpackProfile 55 | }; 56 | }; 57 | 58 | Setup.prototype.getWebpackAlias = function getWebpackAlias() { 59 | var webpackAlias = rewire('../../lib/preprocessor'); 60 | 61 | var fs = { 62 | existsSync: sinon.spy(function(inPath) { 63 | return !!this.readdir[unwin(inPath)]; 64 | }.bind(this)) 65 | }; 66 | webpackAlias.__set__('fs', fs); 67 | 68 | var setup = this.getDirHas(); 69 | var dirHas = sinon.spy(setup.dirHas); 70 | webpackAlias.__set__('dirHas', dirHas); 71 | 72 | setup = this.getWebpackInfo(); 73 | var webpackInfo = setup.webpackInfo; 74 | webpackInfo.read = sinon.spy(webpackInfo.read); 75 | webpackAlias.__set__('webpackInfo', webpackInfo); 76 | 77 | return { 78 | dirHas: dirHas, 79 | fs: fs, 80 | webpackAlias: webpackAlias, 81 | webpackInfo: webpackInfo 82 | }; 83 | }; 84 | 85 | Setup.prototype.getExports = function getExports() { 86 | return { 87 | getDirHas: this.getDirHas.bind(this), 88 | getWebpackAlias: this.getWebpackAlias.bind(this), 89 | getWebpackInfo: this.getWebpackInfo.bind(this) 90 | }; 91 | }; 92 | 93 | module.exports = Setup; 94 | -------------------------------------------------------------------------------- /test/fixture/webpackInfo/alt-config-location.js: -------------------------------------------------------------------------------- 1 | var Setup = require('../setup'); 2 | var fixture = new Setup(); 3 | 4 | fixture.readdir = { 5 | '/top': ['node_modules', 'package.json', 'src', 'test', 'webpack'], 6 | '/top/test': ['file1.test.js'], 7 | '/top/src': ['dir1'], 8 | '/top/src/dir1': ['lib1a.js'], 9 | '/top/webpack': ['dev.config.js'] 10 | }; 11 | 12 | var webpackProfile = fixture.webpackProfile = 'dev'; 13 | 14 | var webpackSettings = fixture.webpackSettings = [ 15 | { 16 | name: webpackProfile, 17 | resolve: { 18 | modules: ['/top/src', '/top/bogus_dir'], 19 | extensions: ["", ".js", ".jsx"], 20 | // omitted: fallback 21 | alias: { 22 | aliasNodeSubdir1Src: 'node1', 23 | aliasNodeSubdir2Src: 'node1/lib/submodule', 24 | aliasNodeFileSrc: 'aliasNodeFileDest', 25 | aliasPlainSubdirSrc: 'dir1/lib1a' 26 | } 27 | } 28 | } 29 | ]; 30 | 31 | fixture.requireContents = { 32 | '/top/webpack/dev.config.js': webpackSettings 33 | }; 34 | 35 | fixture.readFile = { 36 | '/top/package.json': JSON.stringify({ 37 | 'jest-webpack-alias': { 38 | configFile: 'webpack/dev.config.js', 39 | profile: webpackProfile 40 | } 41 | }) 42 | }; 43 | 44 | module.exports = fixture.getExports(); 45 | -------------------------------------------------------------------------------- /test/fixture/webpackInfo/es6-default-exports.js: -------------------------------------------------------------------------------- 1 | var Setup = require('../setup'); 2 | var fixture = new Setup(); 3 | 4 | fixture.readdir = { 5 | '/top': ['node_modules', 'package.json', 'src', 'test', 'webpack'], 6 | '/top/test': ['file1.test.js'], 7 | '/top/src': ['dir1'], 8 | '/top/src/dir1': ['lib1a.js'], 9 | '/top/webpack': ['dev.config.js'] 10 | }; 11 | 12 | var webpackProfile = fixture.webpackProfile = 'dev'; 13 | 14 | var webpackSettings = fixture.webpackSettings = [ 15 | { 16 | name: webpackProfile, 17 | resolve: { 18 | modules: ['/top/src', '/top/bogus_dir'], 19 | extensions: ["", ".js", ".jsx"], 20 | // omitted: fallback 21 | alias: { 22 | aliasNodeSubdir1Src: 'node1', 23 | aliasNodeSubdir2Src: 'node1/lib/submodule', 24 | aliasNodeFileSrc: 'aliasNodeFileDest', 25 | aliasPlainSubdirSrc: 'dir1/lib1a' 26 | } 27 | } 28 | } 29 | ]; 30 | 31 | fixture.requireContents = { 32 | '/top/webpack/dev.config.js': { 33 | __esModule: true, 34 | 'default': webpackSettings 35 | } 36 | }; 37 | 38 | fixture.readFile = { 39 | '/top/package.json': JSON.stringify({ 40 | 'jest-webpack-alias': { 41 | configFile: 'webpack/dev.config.js', 42 | profile: webpackProfile 43 | } 44 | }) 45 | }; 46 | 47 | module.exports = fixture.getExports(); 48 | -------------------------------------------------------------------------------- /test/fixture/webpackInfo/no-profile.js: -------------------------------------------------------------------------------- 1 | var Setup = require('../setup'); 2 | var fixture = new Setup(); 3 | 4 | fixture.readdir = { 5 | '/top': ['node_modules', 'package.json', 'src', 'test', 'webpack'], 6 | '/top/test': ['file1.test.js'], 7 | '/top/src': ['dir1'], 8 | '/top/src/dir1': ['lib1a.js'], 9 | '/top/webpack': ['dev.config.js'] 10 | }; 11 | 12 | var webpackProfile = fixture.webpackProfile = null; 13 | 14 | var webpackSettings = fixture.webpackSettings = { 15 | resolve: { 16 | modules: ['/top/src', '/top/bogus_dir'], 17 | extensions: ["", ".js", ".jsx"], 18 | // omitted: fallback 19 | alias: { 20 | aliasNodeSubdir1Src: 'node1', 21 | aliasNodeSubdir2Src: 'node1/lib/submodule', 22 | aliasNodeFileSrc: 'aliasNodeFileDest', 23 | aliasPlainSubdirSrc: 'dir1/lib1a' 24 | } 25 | } 26 | }; 27 | 28 | fixture.requireContents = { 29 | '/top/webpack/dev.config.js': webpackSettings 30 | }; 31 | 32 | fixture.readFile = { 33 | '/top/package.json': JSON.stringify({ 34 | 'jest-webpack-alias': { 35 | configFile: 'webpack/dev.config.js', 36 | profile: webpackProfile 37 | } 38 | }) 39 | }; 40 | 41 | module.exports = fixture.getExports(); 42 | -------------------------------------------------------------------------------- /test/fixture/webpackInfo/profile-missing-resolve-root.js: -------------------------------------------------------------------------------- 1 | var Setup = require('../setup'); 2 | var fixture = new Setup(); 3 | 4 | fixture.readdir = { 5 | '/top': ['node_modules', 'package.json', 'src', 'test', 'webpack'], 6 | '/top/test': ['file1.test.js'], 7 | '/top/src': ['dir1'], 8 | '/top/src/dir1': ['lib1a.js'], 9 | '/top/webpack': ['dev.config.js'] 10 | }; 11 | 12 | var webpackProfile = fixture.webpackProfile = 'dev'; 13 | 14 | var webpackSettings = fixture.webpackSettings = [ 15 | { 16 | name: webpackProfile 17 | } 18 | ]; 19 | 20 | fixture.requireContents = { 21 | '/top/webpack/dev.config.js': webpackSettings 22 | }; 23 | 24 | fixture.readFile = { 25 | '/top/package.json': JSON.stringify({ 26 | 'jest-webpack-alias': { 27 | configFile: 'webpack/dev.config.js', 28 | profile: webpackProfile 29 | } 30 | }) 31 | }; 32 | 33 | module.exports = fixture.getExports(); 34 | -------------------------------------------------------------------------------- /test/fixture/webpackInfo/profile-not-array.js: -------------------------------------------------------------------------------- 1 | var Setup = require('../setup'); 2 | var fixture = new Setup(); 3 | 4 | fixture.readdir = { 5 | '/top': ['node_modules', 'package.json', 'src', 'test', 'webpack'], 6 | '/top/test': ['file1.test.js'], 7 | '/top/src': ['dir1'], 8 | '/top/src/dir1': ['lib1a.js'], 9 | '/top/webpack': ['dev.config.js'] 10 | }; 11 | 12 | var webpackProfile = fixture.webpackProfile = 'dev'; 13 | 14 | var webpackSettings = fixture.webpackSettings = { 15 | name: webpackProfile, 16 | resolve: { 17 | modules: ['/top/src', '/top/bogus_dir'], 18 | extensions: ["", ".js", ".jsx"], 19 | // omitted: fallback 20 | alias: { 21 | aliasNodeSubdir1Src: 'node1', 22 | aliasNodeSubdir2Src: 'node1/lib/submodule', 23 | aliasNodeFileSrc: 'aliasNodeFileDest', 24 | aliasPlainSubdirSrc: 'dir1/lib1a' 25 | } 26 | } 27 | }; 28 | 29 | fixture.requireContents = { 30 | '/top/webpack/dev.config.js': webpackSettings 31 | }; 32 | 33 | fixture.readFile = { 34 | '/top/package.json': JSON.stringify({ 35 | 'jest-webpack-alias': { 36 | configFile: 'webpack/dev.config.js', 37 | profile: webpackProfile 38 | } 39 | }) 40 | }; 41 | 42 | module.exports = fixture.getExports(); 43 | -------------------------------------------------------------------------------- /test/fixture/webpackInfo/profile-not-found.js: -------------------------------------------------------------------------------- 1 | var Setup = require('../setup'); 2 | var fixture = new Setup(); 3 | 4 | fixture.readdir = { 5 | '/top': ['node_modules', 'package.json', 'src', 'test', 'webpack'], 6 | '/top/test': ['file1.test.js'], 7 | '/top/src': ['dir1'], 8 | '/top/src/dir1': ['lib1a.js'], 9 | '/top/webpack': ['dev.config.js'] 10 | }; 11 | 12 | var webpackProfile = fixture.webpackProfile = 'dev'; 13 | 14 | var webpackSettings = fixture.webpackSettings = [ 15 | { 16 | name: 'notFound', 17 | resolve: { 18 | modules: ['/top/src', '/top/bogus_dir'], 19 | extensions: ["", ".js", ".jsx"], 20 | // omitted: fallback 21 | alias: { 22 | aliasNodeSubdir1Src: 'node1', 23 | aliasNodeSubdir2Src: 'node1/lib/submodule', 24 | aliasNodeFileSrc: 'aliasNodeFileDest', 25 | aliasPlainSubdirSrc: 'dir1/lib1a' 26 | } 27 | } 28 | } 29 | ]; 30 | 31 | fixture.requireContents = { 32 | '/top/webpack/dev.config.js': webpackSettings 33 | }; 34 | 35 | fixture.readFile = { 36 | '/top/package.json': JSON.stringify({ 37 | 'jest-webpack-alias': { 38 | configFile: 'webpack/dev.config.js', 39 | profile: webpackProfile 40 | } 41 | }) 42 | }; 43 | 44 | module.exports = fixture.getExports(); 45 | -------------------------------------------------------------------------------- /test/fixture/webpackInfo/profile-not-specified.js: -------------------------------------------------------------------------------- 1 | var Setup = require('../setup'); 2 | var fixture = new Setup(); 3 | 4 | fixture.readdir = { 5 | '/top': ['node_modules', 'package.json', 'src', 'test', 'webpack'], 6 | '/top/test': ['file1.test.js'], 7 | '/top/src': ['dir1'], 8 | '/top/src/dir1': ['lib1a.js'], 9 | '/top/webpack': ['dev.config.js'] 10 | }; 11 | 12 | var webpackProfile = fixture.webpackProfile = null; 13 | 14 | var webpackSettings = fixture.webpackSettings = [ 15 | { 16 | name: webpackProfile, 17 | resolve: { 18 | modules: ['/top/src', '/top/bogus_dir'], 19 | extensions: ["", ".js", ".jsx"], 20 | // omitted: fallback 21 | alias: { 22 | aliasNodeSubdir1Src: 'node1', 23 | aliasNodeSubdir2Src: 'node1/lib/submodule', 24 | aliasNodeFileSrc: 'aliasNodeFileDest', 25 | aliasPlainSubdirSrc: 'dir1/lib1a' 26 | } 27 | } 28 | } 29 | ]; 30 | 31 | fixture.requireContents = { 32 | '/top/webpack/dev.config.js': webpackSettings 33 | }; 34 | 35 | fixture.readFile = { 36 | '/top/package.json': JSON.stringify({ 37 | 'jest-webpack-alias': { 38 | configFile: 'webpack/dev.config.js', 39 | profile: webpackProfile 40 | } 41 | }) 42 | }; 43 | 44 | module.exports = fixture.getExports(); 45 | -------------------------------------------------------------------------------- /test/lib/expect.js: -------------------------------------------------------------------------------- 1 | var expect = require('chai').expect; 2 | var chai = require('chai'); 3 | 4 | chai.config.includeStack = true; 5 | chai.config.showDiff = false; 6 | chai.use(require('sinon-chai')); 7 | 8 | module.exports = chai.expect; 9 | -------------------------------------------------------------------------------- /test/preprocessor.test.js: -------------------------------------------------------------------------------- 1 | var expect = require('./lib/expect'); 2 | var path = require('path'); 3 | var rewire = require('rewire'); 4 | var sinon = require('sinon'); 5 | var unwin = require('unwin'); 6 | var basicFixture = require('./fixture/basic'); 7 | var cacheize = require('../lib/cacheize'); 8 | 9 | describe('jest-webpack-alias module', function() { 10 | var dirHas, filename, fs, webpackAlias, webpackInfo; 11 | 12 | function setup() { 13 | var setup = basicFixture.getWebpackAlias(); 14 | dirHas = setup.dirHas; 15 | fs = setup.fs; 16 | webpackAlias = setup.webpackAlias; 17 | webpackInfo = setup.webpackInfo; 18 | } 19 | 20 | function verifyDirHas(expected) { 21 | expect(dirHas).to.be.called; 22 | for (var i = 0; i < expected.length; i++) { 23 | if (dirHas.args[i] && expected[i]) { 24 | expect(unwin(dirHas.args[i][0]), 'call ' + i).to.eq(expected[i][0]); 25 | expect(dirHas.args[i][1], 'call ' + i).to.eq(expected[i][1]); 26 | } 27 | } 28 | expect(dirHas.args).to.have.length(expected.length); 29 | } 30 | 31 | function verifyExistsSync(expected) { 32 | expect(fs.existsSync).to.be.called; 33 | for (var i = 0; i < expected.length; i++) { 34 | if (fs.existsSync.args[i] && expected[i]) { 35 | expect(unwin(fs.existsSync.args[i][0]), 'call ' + i).to.eq(expected[i][0]); 36 | } 37 | } 38 | expect(fs.existsSync.args).to.have.length(expected.length); 39 | } 40 | 41 | beforeEach(setup); 42 | 43 | describe('with file in first dir', function() { 44 | beforeEach(function() { 45 | filename = '/top/test/file1.test.js'; 46 | }); 47 | 48 | it('resolves with file extension', function() { 49 | var src = "var lib1a = require('dir1/lib1a');"; 50 | var output = webpackAlias.process(src, filename); 51 | 52 | verifyExistsSync([ 53 | ['/top/test/__mocks__'], ['/top/src'], ['/top/bogus_dir'], ['/top/node_modules'], ['/top/web_modules'] 54 | ]); 55 | verifyDirHas([ 56 | ['/top/test/__mocks__/dir1', 'lib1a'], 57 | ['/top/test/__mocks__/dir1', 'lib1a.js'], 58 | ['/top/test/__mocks__/dir1', 'lib1a.jsx'], 59 | ['/top/src/dir1', 'lib1a'], 60 | ['/top/src/dir1', 'lib1a.js'] 61 | ]); 62 | expect(webpackInfo.read).to.be.calledOnce; 63 | expect(output).to.eq("var lib1a = require('../src/dir1/lib1a.js');"); 64 | }); 65 | 66 | it('if no exact match found, does not modify dependency', function() { 67 | var src = "var lib1a = require('dir1/lib1a.noext');"; 68 | var output = webpackAlias.process(src, filename); 69 | 70 | verifyDirHas([ 71 | ['/top/test/__mocks__/dir1', 'lib1a.noext'], 72 | ['/top/test/__mocks__/dir1', 'lib1a.noext.js'], 73 | ['/top/test/__mocks__/dir1', 'lib1a.noext.jsx'], 74 | ['/top/src/dir1', 'lib1a.noext'], 75 | ['/top/src/dir1', 'lib1a.noext.js'], 76 | ['/top/src/dir1', 'lib1a.noext.jsx'], 77 | ['/top/node_modules/dir1', 'lib1a.noext'], 78 | ['/top/node_modules/dir1', 'lib1a.noext.js'], 79 | ['/top/node_modules/dir1', 'lib1a.noext.jsx'], 80 | ['/top/web_modules/dir1', 'lib1a.noext'], 81 | ['/top/web_modules/dir1', 'lib1a.noext.js'], 82 | ['/top/web_modules/dir1', 'lib1a.noext.jsx'] 83 | ]); 84 | expect(output).to.eq("var lib1a = require('dir1/lib1a.noext');"); 85 | }); 86 | 87 | it('operates on jest.dontMock statements', function() { 88 | var src = "jest.dontMock('dir1/lib1a');"; 89 | var output = webpackAlias.process(src, filename); 90 | 91 | verifyDirHas([ 92 | ['/top/test/__mocks__/dir1', 'lib1a'], 93 | ['/top/test/__mocks__/dir1', 'lib1a.js'], 94 | ['/top/test/__mocks__/dir1', 'lib1a.jsx'], 95 | ['/top/src/dir1', 'lib1a'], 96 | ['/top/src/dir1', 'lib1a.js'] 97 | ]); 98 | expect(webpackInfo.read).to.be.calledOnce; 99 | expect(output).to.eq("jest.dontMock('../src/dir1/lib1a.js');"); 100 | }); 101 | }); 102 | 103 | describe('with file in same dir', function() { 104 | beforeEach(function() { 105 | filename = '/top/src/dir1/lib1b-2b.js'; 106 | }); 107 | 108 | it('uses ./ in relative path', function() { 109 | var src = "var lib1a = require('dir1/lib1a');"; 110 | var output = webpackAlias.process(src, filename); 111 | 112 | verifyDirHas([ 113 | ['/top/test/__mocks__/dir1', 'lib1a'], 114 | ['/top/test/__mocks__/dir1', 'lib1a.js'], 115 | ['/top/test/__mocks__/dir1', 'lib1a.jsx'], 116 | ['/top/src/dir1', 'lib1a'], 117 | ['/top/src/dir1', 'lib1a.js'] 118 | ]); 119 | expect(output).to.eq("var lib1a = require('./lib1a.js');"); 120 | }); 121 | }); 122 | 123 | describe('with file in node_modules', function() { 124 | beforeEach(function() { 125 | filename = '/top/test/file1.test.js'; 126 | }); 127 | 128 | it('resolves top-level dir, but leaves dependency alone', function() { 129 | var src = "var lib1a = require('node1');"; 130 | var output = webpackAlias.process(src, filename); 131 | 132 | verifyDirHas([ 133 | ['/top/test/__mocks__', 'node1'], 134 | ['/top/test/__mocks__', 'node1.js'], 135 | ['/top/test/__mocks__', 'node1.jsx'], 136 | ['/top/src', 'node1'], 137 | ['/top/src', 'node1.js'], 138 | ['/top/src', 'node1.jsx'], 139 | ['/top/node_modules', 'node1'] 140 | ]); 141 | expect(output).to.eq("var lib1a = require('node1');"); 142 | }); 143 | 144 | it('resolves submodule, trying first at file level, but leaves dependency alone', function() { 145 | var src = "var lib1a = require('node1/lib/submodule');"; 146 | var output = webpackAlias.process(src, filename); 147 | 148 | verifyDirHas([ 149 | ['/top/test/__mocks__/node1/lib', 'submodule'], 150 | ['/top/test/__mocks__/node1/lib', 'submodule.js'], 151 | ['/top/test/__mocks__/node1/lib', 'submodule.jsx'], 152 | ['/top/src/node1/lib', 'submodule'], 153 | ['/top/src/node1/lib', 'submodule.js'], 154 | ['/top/src/node1/lib', 'submodule.jsx'], 155 | ['/top/node_modules/node1/lib', 'submodule'], 156 | ['/top/node_modules/node1/lib', 'submodule.js'] 157 | ]); 158 | expect(output).to.eq("var lib1a = require('node1/lib/submodule');"); 159 | }); 160 | }); 161 | 162 | describe('with file in web_modules', function() { 163 | beforeEach(function() { 164 | filename = '/top/test/file1.test.js'; 165 | }); 166 | 167 | it('resolves top-level file, adding file extension', function() { 168 | var src = "var lib1a = require('web2');"; 169 | var output = webpackAlias.process(src, filename); 170 | 171 | verifyDirHas([ 172 | ['/top/test/__mocks__', 'web2'], 173 | ['/top/test/__mocks__', 'web2.js'], 174 | ['/top/test/__mocks__', 'web2.jsx'], 175 | ['/top/src', 'web2'], 176 | ['/top/src', 'web2.js'], 177 | ['/top/src', 'web2.jsx'], 178 | ['/top/node_modules', 'web2'], 179 | ['/top/node_modules', 'web2.js'], 180 | ['/top/node_modules', 'web2.jsx'], 181 | ['/top/web_modules', 'web2'], 182 | ['/top/web_modules', 'web2.js'], 183 | ['/top/web_modules', 'web2.jsx'] 184 | ]); 185 | expect(output).to.eq("var lib1a = require('../web_modules/web2.jsx');"); 186 | }); 187 | }); 188 | 189 | describe('with nonexistent file', function() { 190 | beforeEach(function() { 191 | filename = '/top/test/file1.test.js'; 192 | }); 193 | 194 | it('resolves top-level file, adding file extension', function() { 195 | var src = "var lib1a = require('bogus1');"; 196 | var output = webpackAlias.process(src, filename); 197 | 198 | verifyDirHas([ 199 | ['/top/test/__mocks__', 'bogus1'], 200 | ['/top/test/__mocks__', 'bogus1.js'], 201 | ['/top/test/__mocks__', 'bogus1.jsx'], 202 | ['/top/src', 'bogus1'], 203 | ['/top/src', 'bogus1.js'], 204 | ['/top/src', 'bogus1.jsx'], 205 | ['/top/node_modules', 'bogus1'], 206 | ['/top/node_modules', 'bogus1.js'], 207 | ['/top/node_modules', 'bogus1.jsx'], 208 | ['/top/web_modules', 'bogus1'], 209 | ['/top/web_modules', 'bogus1.js'], 210 | ['/top/web_modules', 'bogus1.jsx'] 211 | ]); 212 | expect(output).to.eq("var lib1a = require('bogus1');"); 213 | }); 214 | }); 215 | 216 | describe('with relative file', function() { 217 | beforeEach(function() { 218 | filename = '/top/src/dir1/lib1b-2b.js'; 219 | }); 220 | 221 | it('adds extension on ./', function() { 222 | var src = "var lib1a = require('./lib1a');"; 223 | var output = webpackAlias.process(src, filename); 224 | 225 | verifyDirHas([ 226 | ['/top/src/dir1', 'lib1a'], 227 | ['/top/src/dir1', 'lib1a.js'] 228 | ]); 229 | expect(output).to.eq("var lib1a = require('./lib1a.js');"); 230 | }); 231 | 232 | it('adds extension on ../', function() { 233 | filename = '/top/src/dir1/dir1-1/lib1-1a.js'; 234 | var src = "var lib1a = require('../lib1a');"; 235 | var output = webpackAlias.process(src, filename); 236 | 237 | verifyDirHas([ 238 | ['/top/src/dir1', 'lib1a'], 239 | ['/top/src/dir1', 'lib1a.js'] 240 | ]); 241 | expect(output).to.eq("var lib1a = require('../lib1a.js');"); 242 | }); 243 | 244 | it('uses no extension if no match found', function() { 245 | var src = "var lib1a = require('./bogus');"; 246 | var output = webpackAlias.process(src, filename); 247 | 248 | verifyDirHas([ 249 | ['/top/src/dir1', 'bogus'], 250 | ['/top/src/dir1', 'bogus.js'], 251 | ['/top/src/dir1', 'bogus.jsx'] 252 | ]); 253 | expect(output).to.eq("var lib1a = require('./bogus');"); 254 | }); 255 | }); 256 | 257 | describe('with alias', function() { 258 | beforeEach(function() { 259 | filename = '/top/test/file1.test.js'; 260 | }); 261 | 262 | describe('with destination of node_modules', function() { 263 | it('applies alias to top-level paths with no extension change', function() { 264 | var src = "var lib1a = require('aliasNodeFileSrc');"; 265 | var output = webpackAlias.process(src, filename); 266 | 267 | verifyDirHas([ 268 | ['/top/test/__mocks__', 'aliasNodeFileDest'], 269 | ['/top/test/__mocks__', 'aliasNodeFileDest.js'], 270 | ['/top/test/__mocks__', 'aliasNodeFileDest.jsx'], 271 | ['/top/src', 'aliasNodeFileDest'], 272 | ['/top/src', 'aliasNodeFileDest.js'], 273 | ['/top/src', 'aliasNodeFileDest.jsx'], 274 | ['/top/node_modules', 'aliasNodeFileDest'], 275 | ['/top/node_modules', 'aliasNodeFileDest.js'] 276 | ]); 277 | expect(output).to.eq("var lib1a = require('aliasNodeFileDest');"); 278 | }); 279 | 280 | it('applies alias to subdir paths', function() { 281 | var src = "var lib1a = require('aliasNodeSubdir1Src/lib/submodule');"; 282 | var output = webpackAlias.process(src, filename); 283 | 284 | verifyDirHas([ 285 | ['/top/test/__mocks__/node1/lib', 'submodule'], 286 | ['/top/test/__mocks__/node1/lib', 'submodule.js'], 287 | ['/top/test/__mocks__/node1/lib', 'submodule.jsx'], 288 | ['/top/src/node1/lib', 'submodule'], 289 | ['/top/src/node1/lib', 'submodule.js'], 290 | ['/top/src/node1/lib', 'submodule.jsx'], 291 | ['/top/node_modules/node1/lib', 'submodule'], 292 | ['/top/node_modules/node1/lib', 'submodule.js'] 293 | ]); 294 | expect(output).to.eq("var lib1a = require('node1/lib/submodule');"); 295 | }); 296 | 297 | it('applies alias definitions that contain subdirs', function() { 298 | var src = "var lib1a = require('aliasNodeSubdir2Src');"; 299 | var output = webpackAlias.process(src, filename); 300 | 301 | verifyDirHas([ 302 | ['/top/test/__mocks__/node1/lib', 'submodule'], 303 | ['/top/test/__mocks__/node1/lib', 'submodule.js'], 304 | ['/top/test/__mocks__/node1/lib', 'submodule.jsx'], 305 | ['/top/src/node1/lib', 'submodule'], 306 | ['/top/src/node1/lib', 'submodule.js'], 307 | ['/top/src/node1/lib', 'submodule.jsx'], 308 | ['/top/node_modules/node1/lib', 'submodule'], 309 | ['/top/node_modules/node1/lib', 'submodule.js'] 310 | ]); 311 | expect(output).to.eq("var lib1a = require('node1/lib/submodule');"); 312 | }); 313 | }); 314 | 315 | it('applies alias to subdir paths', function() { 316 | var src = "var lib1a = require('aliasPlainSubdirSrc');"; 317 | var output = webpackAlias.process(src, filename); 318 | 319 | verifyDirHas([ 320 | ['/top/test/__mocks__/dir1', 'lib1a'], 321 | ['/top/test/__mocks__/dir1', 'lib1a.js'], 322 | ['/top/test/__mocks__/dir1', 'lib1a.jsx'], 323 | ['/top/src/dir1', 'lib1a'], 324 | ['/top/src/dir1', 'lib1a.js'] 325 | ]); 326 | expect(output).to.eq("var lib1a = require('../src/dir1/lib1a.js');"); 327 | }); 328 | 329 | it('does not apply alias transformation to relative paths', function() { 330 | var src = "var lib1a = require('../src/aliasRelative');"; 331 | var output = webpackAlias.process(src, filename); 332 | 333 | verifyDirHas([ 334 | ['/top/src', 'aliasRelative'], 335 | ['/top/src', 'aliasRelative.js'] 336 | ]); 337 | expect(output).to.eq("var lib1a = require('../src/aliasRelative.js');"); 338 | }); 339 | 340 | it('applies alias to absolute subdir paths', function () { 341 | var src = "var lib1a = require('aliasAbsoluteSubdirSrc/lib1a');"; 342 | var output = webpackAlias.process(src, filename); 343 | 344 | verifyDirHas([ 345 | ['/top/src/dir1', 'lib1a'], 346 | ['/top/src/dir1', 'lib1a.js'], 347 | ]); 348 | 349 | expect(output).to.eq("var lib1a = require('../src/dir1/lib1a.js');"); 350 | }); 351 | 352 | it('applies alias to absolute path to a file', function() { 353 | var src = "var lib1a = require('aliasAbsoluteFileSrc');"; 354 | var output = webpackAlias.process(src, filename); 355 | 356 | verifyDirHas([ 357 | ['/top/src/dir1', 'lib1a'], 358 | ['/top/src/dir1', 'lib1a.js'], 359 | ]); 360 | 361 | expect(output).to.eq("var lib1a = require('../src/dir1/lib1a.js');"); 362 | }); 363 | 364 | it('applies alias when wanted file is relative to alias', function() { 365 | var src = "var lib11a = require('aliasSubRelative/lib1-1a');"; 366 | var output = webpackAlias.process(src, filename); 367 | 368 | verifyDirHas([ 369 | [ '/top/test/__mocks__/dir1/dir1-1', 'lib1-1a' ], 370 | [ '/top/test/__mocks__/dir1/dir1-1', 'lib1-1a.js' ], 371 | [ '/top/test/__mocks__/dir1/dir1-1', 'lib1-1a.jsx' ], 372 | [ '/top/src/dir1/dir1-1', 'lib1-1a' ], 373 | [ '/top/src/dir1/dir1-1', 'lib1-1a.js' ] 374 | ]); 375 | 376 | expect(output).to.eq("var lib11a = require('../src/dir1/dir1-1/lib1-1a.js');"); 377 | }); 378 | }); 379 | 380 | describe('resolve', function() { 381 | beforeEach(function() { 382 | filename = '/top/test/file1.test.js'; 383 | }); 384 | 385 | it('resolves with file extension', function() { 386 | var resolved = webpackAlias.resolve('dir1/lib1a', filename); 387 | 388 | verifyExistsSync([ 389 | ['/top/test/__mocks__'], ['/top/src'], ['/top/bogus_dir'], ['/top/node_modules'], ['/top/web_modules'] 390 | ]); 391 | verifyDirHas([ 392 | ['/top/test/__mocks__/dir1', 'lib1a'], 393 | ['/top/test/__mocks__/dir1', 'lib1a.js'], 394 | ['/top/test/__mocks__/dir1', 'lib1a.jsx'], 395 | ['/top/src/dir1', 'lib1a'], 396 | ['/top/src/dir1', 'lib1a.js'] 397 | ]); 398 | expect(webpackInfo.read).to.be.calledOnce; 399 | expect(resolved).to.eq('../src/dir1/lib1a.js'); 400 | }); 401 | }); 402 | }); 403 | -------------------------------------------------------------------------------- /test/stringOrArray.test.js: -------------------------------------------------------------------------------- 1 | var expect = require('./lib/expect'); 2 | 3 | describe('stringOrArray', function() { 4 | var stringOrArray = require('../lib/stringOrArray'); 5 | 6 | it('given an array, returns the array', function() { 7 | var input = ['arr']; 8 | expect(stringOrArray(input)).to.eq(input); 9 | }); 10 | 11 | it('given a string, returns an array containing that string', function() { 12 | var input = 'aString'; 13 | expect(stringOrArray(input)).to.deep.equal([input]); 14 | }); 15 | 16 | it('given undefined, returns undefined', function() { 17 | var input = undefined; 18 | expect(stringOrArray(input)).to.be.undefined; 19 | }); 20 | 21 | it('given null, returns null', function() { 22 | var input = null; 23 | expect(stringOrArray(input)).to.be.null; 24 | }); 25 | }); 26 | -------------------------------------------------------------------------------- /test/webpackInfo.test.js: -------------------------------------------------------------------------------- 1 | var _ = require('lodash'); 2 | var expect = require('./lib/expect'); 3 | var unwin = require('unwin'); 4 | 5 | describe('webpackInfo lib', function() { 6 | var fakeRequire, pkginfo, readFile, requireContents, webpackInfo, webpackProfile; 7 | var filename, output, webpackFile; 8 | 9 | function setup(fixture) { 10 | filename = null; output = null; webpackFile = null; 11 | 12 | var setup = fixture.getWebpackInfo(); 13 | fakeRequire = setup.require; 14 | pkginfo = setup.pkginfo; 15 | requireContents = setup.requireContents, 16 | webpackInfo = setup.webpackInfo; 17 | webpackProfile = setup.webpackProfile; 18 | } 19 | 20 | function expectContainsProfile(profileContents) { 21 | expect(pkginfo.read).to.be.calledOnce; 22 | expect(pkginfo.read.args[0][0]).to.eql({filename: filename}); 23 | expect(fakeRequire).to.be.calledOnce; 24 | expect(unwin(fakeRequire.args[0][0])).to.eql(webpackFile); 25 | expect(output).to.have.deep.property('config', _.find(profileContents, ['name', webpackProfile])) 26 | .and.to.have.property('name', webpackProfile); 27 | expect(unwin(output.file)).to.eql(webpackFile); 28 | } 29 | 30 | function expectNoProfile() { 31 | expect(pkginfo.read).to.be.calledOnce; 32 | expect(pkginfo.read.args[0][0]).to.eql({filename: filename}); 33 | expect(fakeRequire).to.be.calledOnce; 34 | expect(unwin(fakeRequire.args[0][0])).to.eql(webpackFile); 35 | expect(output).to.have.deep.property('config', requireContents[webpackFile]); 36 | expect(unwin(output.file)).to.eql(webpackFile); 37 | } 38 | 39 | describe('with default config file and package.json in top dir', function() { 40 | beforeEach(function() { 41 | setup(require('./fixture/basic')); 42 | }); 43 | 44 | it('finds webpack.config.js and gets profile', function() { 45 | filename = '/top/test/file1.test.js'; 46 | webpackFile = '/top/webpack.config.js'; 47 | output = webpackInfo.read({filename: filename}); 48 | 49 | expectContainsProfile(requireContents[webpackFile]); 50 | }); 51 | 52 | describe('but wrong profile name', function() { 53 | beforeEach(function() { 54 | setup(require('./fixture/webpackInfo/profile-not-found')); 55 | }); 56 | 57 | it('throws an error', function() { 58 | filename = '/top/test/file1.test.js'; 59 | webpackFile = '/top/webpack/dev.config.js'; 60 | var expectedMsg = 'Specified jest-webpack-alias.webpackProfile = "dev", ' 61 | + 'but /top/webpack/dev.config.js does not contain this profile'; 62 | 63 | expect(webpackInfo.read.bind(null, {filename: filename})).to.throw(expectedMsg); 64 | }); 65 | }); 66 | 67 | describe('but profile setting omitted', function() { 68 | beforeEach(function() { 69 | setup(require('./fixture/webpackInfo/profile-not-specified')); 70 | }); 71 | 72 | it('throws an error', function() { 73 | filename = '/top/test/file1.test.js'; 74 | webpackFile = '/top/webpack/dev.config.js'; 75 | var expectedMsg = 'jest-webpack-alias.webpackProfile not specified, ' 76 | + 'but /top/webpack/dev.config.js exports an array'; 77 | 78 | expect(webpackInfo.read.bind(null, {filename: filename})).to.throw(expectedMsg); 79 | }); 80 | }); 81 | 82 | describe('but missing resolve.modules and resolve.root', function() { 83 | beforeEach(function() { 84 | setup(require('./fixture/webpackInfo/profile-missing-resolve-root')); 85 | }); 86 | 87 | it('throws an error', function() { 88 | filename = '/top/test/file1.test.js'; 89 | webpackFile = '/top/webpack/dev.config.js'; 90 | var expectedMsg = [ 91 | 'Missing setting "resolve.modules" (webpack v2) or "resolve.root" (webpack v1)', 92 | ' in /top/webpack/dev.config.js' 93 | ].join(''); 94 | 95 | expect(webpackInfo.read.bind(null, {filename: filename})).to.throw(expectedMsg); 96 | }); 97 | }); 98 | }); 99 | 100 | describe('with alternate webpack config file', function() { 101 | beforeEach(function() { 102 | setup(require('./fixture/webpackInfo/alt-config-location')); 103 | }); 104 | 105 | it('finds profile', function() { 106 | filename = '/top/test/file1.test.js'; 107 | webpackFile = '/top/webpack/dev.config.js'; 108 | output = webpackInfo.read({filename: filename}); 109 | 110 | expectContainsProfile(requireContents[webpackFile]); 111 | }); 112 | }); 113 | 114 | describe('with ES6 default exports', function() { 115 | beforeEach(function() { 116 | setup(require('./fixture/webpackInfo/es6-default-exports')); 117 | }); 118 | 119 | it('finds profile', function() { 120 | filename = '/top/test/file1.test.js'; 121 | webpackFile = '/top/webpack/dev.config.js'; 122 | output = webpackInfo.read({filename: filename}); 123 | 124 | expectContainsProfile(requireContents[webpackFile].default); 125 | }); 126 | }); 127 | 128 | describe('with no profile in webpack config', function() { 129 | beforeEach(function() { 130 | setup(require('./fixture/webpackInfo/no-profile')); 131 | }); 132 | 133 | it('returns entire config file', function() { 134 | filename = '/top/test/file1.test.js'; 135 | webpackFile = '/top/webpack/dev.config.js'; 136 | output = webpackInfo.read({filename: filename}); 137 | 138 | expectNoProfile(); 139 | }); 140 | 141 | describe('but profile specified', function() { 142 | beforeEach(function() { 143 | setup(require('./fixture/webpackInfo/profile-not-array')); 144 | }); 145 | 146 | it('throws an error', function() { 147 | filename = '/top/test/file1.test.js'; 148 | webpackFile = '/top/webpack/dev.config.js'; 149 | var expectedMsg = 'Specified jest-webpack-alias.webpackProfile = "dev", ' 150 | + 'but /top/webpack/dev.config.js does not export an array'; 151 | 152 | expect(webpackInfo.read.bind(null, {filename: filename})).to.throw(expectedMsg); 153 | }); 154 | }); 155 | }); 156 | }); 157 | --------------------------------------------------------------------------------