Added logging, changed some directory structure

This commit is contained in:
2018-01-13 21:33:40 -05:00
parent f079a5f067
commit 8e72ffb917
73656 changed files with 35284 additions and 53718 deletions

View File

@@ -0,0 +1,78 @@
0.4.3 / 2017-04-15
==================
* Docs - Document new features. #26
0.4.2 / 2017-04-12
==================
* Chore - Fix readme link formatting. #25
0.4.1 / 2017-04-05
==================
* Chore - Note that cheap source maps don't work with the plugin. #22
0.4.0 / 2017-03-30
==================
* Chore - Update to *webpack-sources* ^0.2.3. #22
0.3.1 / 2017-03-22
==================
* Chore - Improve readme wording. #19
0.3.0 / 2017-03-04
==================
* Chore - Update to UglifyJS 2.8.0 API internally. #16
0.2.2 / 2017-03-02
==================
* Bug fix - Fix `postinstall` script. Now it works if you install the packagre from repository in Node 6+.
0.2.1 / 2017-02-20
==================
* Docs - Fix typo at readme. #10
0.2.0 / 2017-02-19
==================
* Feature - Allow to extract comments to separate file [webpack/webpack#4134](https://github.com/webpack/webpack/pull/4134)
* Feature - Allow to supress uglifyjs warnings [webpack/webpack#4200](https://github.com/webpack/webpack/pull/4200)
* Chore - Use `const` where applicable [1d78f99](https://github.com/webpack/webpack/commit/1d78f990a6af1a5b85e45b345b4f7861b03bb12b)
* Chore - Avoid reassigning stream with different value [92364dc](https://github.com/webpack/webpack/commit/92364dc0f72ad8c3ac0bdc74e46766658086d83a)
* Chore - Avoid reassigning files with different value [104398f](https://github.com/webpack/webpack/commit/104398f87a707a601427e666ed318d2338e8a003)
0.1.5 / 2017-02-15
==================
* Docs - Add `extractComments` documentation. #7
0.1.4 / 2017-02-06
==================
* Docs - Simplify example.
0.1.3 / 2017-02-02
==================
* Docs - Fix table syntax. #6
0.1.2 / 2017-01-25
==================
* Docs - Add note about the plugin embedded to webpack.
0.1.1 / 2017-01-25
==================
* Docs - Update installation instructions.
0.1.0 / 2017-01-24
==================
* Initial port from webpack source.

View File

@@ -0,0 +1,20 @@
Copyright JS Foundation and other contributors
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
'Software'), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

View File

@@ -0,0 +1,172 @@
[![npm][npm]][npm-url]
[![deps][deps]][deps-url]
[![test][test]][test-url]
[![coverage][cover]][cover-url]
[![quality][quality]][quality-url]
[![chat][chat]][chat-url]
<div align="center">
<!-- replace with accurate logo e.g from https://worldvectorlogo.com/ -->
<a href="https://github.com/webpack/webpack">
<img width="200" height="200" vspace="" hspace="25"
src="https://cdn.rawgit.com/webpack/media/e7485eb2/logo/icon.svg">
</a>
<h1>UglifyJS Webpack Plugin</h1>
<p>This plugin uses <a href="https://github.com/mishoo/UglifyJS2/tree/v2.x">UglifyJS v2</a> to minify your JavaScript.<p>
</div>
> Note that webpack contains the same plugin under `webpack.optimize.UglifyJsPlugin`. This is a standalone version for those that want to control the version of UglifyJS. The documentation is valid apart from the installation instructions in that case.
<h2 align="center">Install</h2>
With [Yarn](https://yarnpkg.com):
```bash
yarn add uglifyjs-webpack-plugin --dev
```
With npm:
```bash
npm install uglifyjs-webpack-plugin --save-dev
```
**Important!** The plugin has a peer dependency to uglify-js, so in order to use the plugin, also uglify-js has to be installed. The currently (2017/1/25) available uglify-js npm packages; however, do not support minification of ES6 code. In order to support ES6, an ES6-capable, a.k.a. _harmony_, version of UglifyJS has to be provided.
If your minification target is ES6:
```bash
yarn add git://github.com/mishoo/UglifyJS2#harmony-v2.8.22 --dev
```
If your minification target is ES5:
```bash
yarn add uglify-js --dev
```
<h2 align="center">Usage</h2>
```javascript
const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
module.exports = {
entry: {...},
output: {...},
module: {...},
plugins: [
new UglifyJSPlugin()
]
};
```
<h2 align="center">Options</h2>
This plugin supports UglifyJS features as discussed below:
| Property | Type | Default | Description |
| --- | --- | --- | --- |
| compress | boolean, object | true | See [UglifyJS documentation](http://lisperator.net/uglifyjs/compress). |
| mangle | boolean, object | true | See below. |
| beautify | boolean | false | Beautify output. |
| output | An object providing options for UglifyJS [OutputStream](https://github.com/mishoo/UglifyJS2/blob/v2.x/lib/output.js) | | Lower level access to UglifyJS output. |
| comments | boolean, RegExp, function(astNode, comment) -> boolean | Defaults to preserving comments containing `/*!`, `/**!`, `@preserve` or `@license`. | Comment related configuration. |
| extractComments | boolean, RegExp, function (astNode, comment) -> boolean, object | false | Whether comments shall be extracted to a separate file, see below. |
| sourceMap | boolean | false | Use SourceMaps to map error message locations to modules. This slows down the compilation. **Important!** `cheap` source map options don't work with the plugin! |
| test | RegExp, Array<RegExp> | <code>/\.js($&#124;\?)/i</code> | Test to match files against. |
| include | RegExp, Array<RegExp> | | Test only `include` files. |
| exclude | RegExp, Array<RegExp> | | Files to `exclude` from testing. |
| extractComments | boolean, RegExp, object | | Extract comments to separate file (see [details](https://github.com/webpack/webpack/commit/71933e979e51c533b432658d5e37917f9e71595a), since webpack 2.3.0) |
| warningsFilter | function(source) -> boolean | | Allow to filter uglify warnings (since webpack 2.3.0) |
<h2 align="center">Mangling</h2>
`mangle (boolean|object)` - Passing `true` or an object enables and provides options for UglifyJS name mangling. See [UglifyJS documentation](https://github.com/mishoo/UglifyJS2/tree/v2.x#mangle) for mangle options. Example configuration, this will **not** mangle properties (see below):
```javascript
new UglifyJsPlugin({
mangle: {
// Skip mangling these
except: ['$super', '$', 'exports', 'require']
}
})
```
`mangle.props (boolean|object)` - Passing `true` or an object enables and provides options for UglifyJS property mangling - see [UglifyJS documentation](https://github.com/mishoo/UglifyJS2/tree/v2.x#mangleproperties-options) for mangleProperties options.
> Note: the UglifyJS docs warn that [you will probably break your source if you use property mangling](https://github.com/mishoo/UglifyJS2/tree/v2.x#mangling-property-names---mangle-props), so if you arent sure why youd need this feature, you most likely shouldnt be using it! This is **not** enabled by default.
Example configuration, this will mangle both names and properties:
```javascript
new UglifyJsPlugin({
mangle: {
props: true
}
})
```
<h2 align="center">Extracting Comments</h2>
The `extractComments` option can be
- `true`: All comments that normally would be preserved by the `comments` option will be moved to a separate file. If the original file is named `foo.js`, then the comments will be stored to `foo.js.LICENSE`
- regular expression (given as `RegExp` or `string`) or a `function (astNode, comment) -> boolean`:
All comments that match the given expression (resp. are evaluated to `true` by the function) will be extracted to the separate file. The `comments` option specifies whether the comment will be preserved, i.e. it is possible to preserve some comments (e.g. annotations) while extracting others or even preserving comments that have been extracted.
- an `object` consisting of the following keys, all optional:
- `condition`: regular expression or function (see previous point)
- `filename`: The file where the extracted comments will be stored. Can be either a `string` or `function (string) -> string` which will be given the original filename. Default is to append the suffix `.LICENSE` to the original filename.
- `banner`: The banner text that points to the extracted file and will be added on top of the original file. will be added to the original file. Can be `false` (no banner), a `string`, or a `function (string) -> string` that will be called with the filename where extracted comments have been stored. Will be wrapped into comment.
Default: `/*! For license information please see foo.js.LICENSE */`
<h2 align="center">Maintainers</h2>
<table>
<tbody>
<tr>
<td align="center">
<img width="150" height="150"
src="https://avatars3.githubusercontent.com/u/166921?v=3&s=150">
</br>
<a href="https://github.com/bebraw">Juho Vepsäläinen</a>
</td>
<td align="center">
<img width="150" height="150"
src="https://avatars2.githubusercontent.com/u/8420490?v=3&s=150">
</br>
<a href="https://github.com/d3viant0ne">Joshua Wiens</a>
</td>
<td align="center">
<img width="150" height="150"
src="https://avatars3.githubusercontent.com/u/533616?v=3&s=150">
</br>
<a href="https://github.com/SpaceK33z">Kees Kluskens</a>
</td>
<td align="center">
<img width="150" height="150"
src="https://avatars3.githubusercontent.com/u/3408176?v=3&s=150">
</br>
<a href="https://github.com/TheLarkInn">Sean Larkin</a>
</td>
</tr>
<tbody>
</table>
[npm]: https://img.shields.io/npm/v/uglifyjs-webpack-plugin.svg
[npm-url]: https://npmjs.com/package/uglifyjs-webpack-plugin
[deps]: https://david-dm.org/webpack-contrib/uglifyjs-webpack-plugin.svg
[deps-url]: https://david-dm.org/webpack-contrib/uglifyjs-webpack-plugin
[chat]: https://img.shields.io/badge/gitter-webpack%2Fwebpack-brightgreen.svg
[chat-url]: https://gitter.im/webpack/webpack
[test]: https://secure.travis-ci.org/webpack-contrib/uglifyjs-webpack-plugin.svg
[test-url]: http://travis-ci.org/webpack-contrib/uglifyjs-webpack-plugin
[cover]: https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin/branch/master/graph/badge.svg
[cover-url]: https://codecov.io/gh/webpack-contrib/uglifyjs-webpack-plugin
[quality]: https://www.bithound.io/github/webpack-contrib/uglifyjs-webpack-plugin/badges/score.svg
[quality-url]: https://www.bithound.io/github/webpack-contrib/uglifyjs-webpack-plugin

View File

@@ -0,0 +1,253 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var SourceMapConsumer = require("source-map").SourceMapConsumer;
var SourceMapSource = require("webpack-sources").SourceMapSource;
var RawSource = require("webpack-sources").RawSource;
var ConcatSource = require("webpack-sources").ConcatSource;
var RequestShortener = require("webpack/lib/RequestShortener");
var ModuleFilenameHelpers = require("webpack/lib/ModuleFilenameHelpers");
var uglify = require("uglify-js");
var UglifyJsPlugin = function () {
function UglifyJsPlugin(options) {
_classCallCheck(this, UglifyJsPlugin);
if ((typeof options === "undefined" ? "undefined" : _typeof(options)) !== "object" || Array.isArray(options)) options = {};
if (typeof options.compressor !== "undefined") options.compress = options.compressor;
this.options = options;
}
_createClass(UglifyJsPlugin, [{
key: "apply",
value: function apply(compiler) {
var options = this.options;
options.test = options.test || /\.js($|\?)/i;
var warningsFilter = options.warningsFilter || function () {
return true;
};
var requestShortener = new RequestShortener(compiler.context);
compiler.plugin("compilation", function (compilation) {
if (options.sourceMap) {
compilation.plugin("build-module", function (module) {
// to get detailed location info about errors
module.useSourceMap = true;
});
}
compilation.plugin("optimize-chunk-assets", function (chunks, callback) {
var files = [];
chunks.forEach(function (chunk) {
return files.push.apply(files, chunk.files);
});
files.push.apply(files, compilation.additionalChunkAssets);
var filteredFiles = files.filter(ModuleFilenameHelpers.matchObject.bind(undefined, options));
filteredFiles.forEach(function (file) {
var oldWarnFunction = uglify.AST_Node.warn_function;
var warnings = [];
var sourceMap = void 0;
try {
var asset = compilation.assets[file];
if (asset.__UglifyJsPlugin) {
compilation.assets[file] = asset.__UglifyJsPlugin;
return;
}
var input = void 0;
var inputSourceMap = void 0;
if (options.sourceMap) {
if (asset.sourceAndMap) {
var sourceAndMap = asset.sourceAndMap();
inputSourceMap = sourceAndMap.map;
input = sourceAndMap.source;
} else {
inputSourceMap = asset.map();
input = asset.source();
}
sourceMap = new SourceMapConsumer(inputSourceMap);
uglify.AST_Node.warn_function = function (warning) {
// eslint-disable-line camelcase
var match = /\[.+:([0-9]+),([0-9]+)\]/.exec(warning);
var line = +match[1];
var column = +match[2];
var original = sourceMap.originalPositionFor({
line: line,
column: column
});
if (!original || !original.source || original.source === file) return;
if (!warningsFilter(original.source)) return;
warnings.push(warning.replace(/\[.+:([0-9]+),([0-9]+)\]/, "") + "[" + requestShortener.shorten(original.source) + ":" + original.line + "," + original.column + "]");
};
} else {
input = asset.source();
uglify.AST_Node.warn_function = function (warning) {
// eslint-disable-line camelcase
warnings.push(warning);
};
}
uglify.base54.reset();
var ast = uglify.parse(input, {
filename: file
});
if (options.compress !== false) {
ast.figure_out_scope();
var compress = uglify.Compressor(options.compress || {
warnings: false
}); // eslint-disable-line new-cap
ast = compress.compress(ast);
}
if (options.mangle !== false) {
ast.figure_out_scope(options.mangle || {});
ast.compute_char_frequency(options.mangle || {});
ast.mangle_names(options.mangle || {});
if (options.mangle && options.mangle.props) {
uglify.mangle_properties(ast, options.mangle.props);
}
}
var output = {};
output.comments = Object.prototype.hasOwnProperty.call(options, "comments") ? options.comments : /^\**!|@preserve|@license/;
output.beautify = options.beautify;
for (var k in options.output) {
output[k] = options.output[k];
}
var extractedComments = [];
if (options.extractComments) {
var condition = {};
if (typeof options.extractComments === "string" || options.extractComments instanceof RegExp) {
// extractComments specifies the extract condition and output.comments specifies the preserve condition
condition.preserve = output.comments;
condition.extract = options.extractComments;
} else if (Object.prototype.hasOwnProperty.call(options.extractComments, "condition")) {
// Extract condition is given in extractComments.condition
condition.preserve = output.comments;
condition.extract = options.extractComments.condition;
} else {
// No extract condition is given. Extract comments that match output.comments instead of preserving them
condition.preserve = false;
condition.extract = output.comments;
}
// Ensure that both conditions are functions
["preserve", "extract"].forEach(function (key) {
switch (_typeof(condition[key])) {
case "boolean":
var b = condition[key];
condition[key] = function () {
return b;
};
break;
case "function":
break;
case "string":
if (condition[key] === "all") {
condition[key] = function () {
return true;
};
break;
}
var regex = new RegExp(condition[key]);
condition[key] = function (astNode, comment) {
return regex.test(comment.value);
};
break;
default:
regex = condition[key];
condition[key] = function (astNode, comment) {
return regex.test(comment.value);
};
}
});
// Redefine the comments function to extract and preserve
// comments according to the two conditions
output.comments = function (astNode, comment) {
if (condition.extract(astNode, comment)) {
extractedComments.push(comment.type === "comment2" ? "/*" + comment.value + "*/" : "//" + comment.value);
}
return condition.preserve(astNode, comment);
};
}
var map = void 0;
if (options.sourceMap) {
map = uglify.SourceMap({ // eslint-disable-line new-cap
file: file,
root: ""
});
output.source_map = map; // eslint-disable-line camelcase
}
var stream = uglify.OutputStream(output); // eslint-disable-line new-cap
ast.print(stream);
if (map) map = map + "";
var stringifiedStream = stream + "";
var outputSource = map ? new SourceMapSource(stringifiedStream, file, JSON.parse(map), input, inputSourceMap) : new RawSource(stringifiedStream);
if (extractedComments.length > 0) {
var commentsFile = options.extractComments.filename || file + ".LICENSE";
if (typeof commentsFile === "function") {
commentsFile = commentsFile(file);
}
// Write extracted comments to commentsFile
var commentsSource = new RawSource(extractedComments.join("\n\n") + "\n");
if (commentsFile in compilation.assets) {
// commentsFile already exists, append new comments...
if (compilation.assets[commentsFile] instanceof ConcatSource) {
compilation.assets[commentsFile].add("\n");
compilation.assets[commentsFile].add(commentsSource);
} else {
compilation.assets[commentsFile] = new ConcatSource(compilation.assets[commentsFile], "\n", commentsSource);
}
} else {
compilation.assets[commentsFile] = commentsSource;
}
// Add a banner to the original file
if (options.extractComments.banner !== false) {
var banner = options.extractComments.banner || "For license information please see " + commentsFile;
if (typeof banner === "function") {
banner = banner(commentsFile);
}
if (banner) {
outputSource = new ConcatSource("/*! " + banner + " */\n", outputSource);
}
}
}
asset.__UglifyJsPlugin = compilation.assets[file] = outputSource;
if (warnings.length > 0) {
compilation.warnings.push(new Error(file + " from UglifyJs\n" + warnings.join("\n")));
}
} catch (err) {
if (err.line) {
var original = sourceMap && sourceMap.originalPositionFor({
line: err.line,
column: err.col
});
if (original && original.source) {
compilation.errors.push(new Error(file + " from UglifyJs\n" + err.message + " [" + requestShortener.shorten(original.source) + ":" + original.line + "," + original.column + "][" + file + ":" + err.line + "," + err.col + "]"));
} else {
compilation.errors.push(new Error(file + " from UglifyJs\n" + err.message + " [" + file + ":" + err.line + "," + err.col + "]"));
}
} else if (err.msg) {
compilation.errors.push(new Error(file + " from UglifyJs\n" + err.msg));
} else compilation.errors.push(new Error(file + " from UglifyJs\n" + err.stack));
} finally {
uglify.AST_Node.warn_function = oldWarnFunction; // eslint-disable-line camelcase
}
});
callback();
});
});
}
}]);
return UglifyJsPlugin;
}();
module.exports = UglifyJsPlugin;

View File

@@ -0,0 +1,31 @@
/* eslint-disable */
// adapted based on rackt/history (MIT)
// Node 0.10+
var execSync = require('child_process').execSync;
var fs = require('fs');
// Node 0.10 check
if (!execSync) {
execSync = require('sync-exec');
}
function exec(command) {
execSync(command, {
stdio: [0, 1, 2]
});
}
fs.stat('dist', function(error, stat) {
// Skip building on Travis
if (process.env.TRAVIS) {
return;
}
if (error || !stat.isDirectory()) {
// Create a directory to avoid getting stuck
// in postinstall loop
fs.mkdirSync('dist');
exec('npm install --only=dev');
exec('npm run build');
}
});

View File

@@ -0,0 +1,105 @@
{
"_args": [
[
"uglifyjs-webpack-plugin@0.4.6",
"C:\\Users\\deranjer\\go\\src\\github.com\\deranjer\\goTorrent\\torrent-project"
]
],
"_from": "uglifyjs-webpack-plugin@0.4.6",
"_id": "uglifyjs-webpack-plugin@0.4.6",
"_inBundle": false,
"_integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=",
"_location": "/webpack/uglifyjs-webpack-plugin",
"_phantomChildren": {},
"_requested": {
"type": "version",
"registry": true,
"raw": "uglifyjs-webpack-plugin@0.4.6",
"name": "uglifyjs-webpack-plugin",
"escapedName": "uglifyjs-webpack-plugin",
"rawSpec": "0.4.6",
"saveSpec": null,
"fetchSpec": "0.4.6"
},
"_requiredBy": [
"/webpack"
],
"_resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz",
"_spec": "0.4.6",
"_where": "C:\\Users\\deranjer\\go\\src\\github.com\\deranjer\\goTorrent\\torrent-project",
"author": "",
"bugs": {
"url": "https://github.com/webpack-contrib/uglifyjs-webpack-plugin/issues"
},
"dependencies": {
"source-map": "^0.5.6",
"uglify-js": "^2.8.29",
"webpack-sources": "^1.0.1"
},
"description": "UglifyJS plugin for webpack",
"devDependencies": {
"babel-cli": "^6.18.0",
"babel-core": "^6.21.0",
"babel-eslint": "^7.1.1",
"babel-jest": "^18.0.0",
"babel-plugin-syntax-object-rest-spread": "^6.13.0",
"babel-plugin-transform-object-rest-spread": "^6.20.2",
"babel-preset-es2015": "^6.18.0",
"eslint": "^3.13.1",
"eslint-config-airbnb": "^14.0.0",
"eslint-plugin-import": "^2.2.0",
"eslint-plugin-jsx-a11y": "^3.0.2",
"eslint-plugin-node": "^4.0.1",
"eslint-plugin-react": "^6.9.0",
"git-prepush-hook": "^1.0.1",
"jest": "^18.1.0",
"sync-exec": "^0.6.2",
"webpack": "^2.2.0"
},
"engines": {
"node": ">=4.3.0 <5.0.0 || >=5.10"
},
"files": [
"dist",
"lib"
],
"homepage": "https://github.com/webpack-contrib/uglifyjs-webpack-plugin",
"jest": {
"collectCoverage": true,
"moduleFileExtensions": [
"js"
],
"moduleDirectories": [
"node_modules"
]
},
"keywords": [
"webpack",
"uglifyjs",
"plugin"
],
"license": "MIT",
"main": "./dist",
"name": "uglifyjs-webpack-plugin",
"peerDependencies": {
"webpack": "^1.9 || ^2 || ^2.1.0-beta || ^2.2.0-rc || ^3.0.0"
},
"pre-push": [
"test:all"
],
"repository": {
"type": "git",
"url": "git+https://github.com/webpack-contrib/uglifyjs-webpack-plugin.git"
},
"scripts": {
"build": "babel src -d dist",
"postinstall": "node lib/post_install.js",
"preversion": "npm run test:all && npm run build && git commit --allow-empty -am \"Update dist\"",
"test": "jest --",
"test:all": "npm run test:coverage && npm run test:lint",
"test:coverage": "jest --coverage --",
"test:lint": "eslint . --ext .js --ignore-path .gitignore --cache",
"test:watch": "jest --watch --"
},
"version": "0.4.6"
}