aboutsummaryrefslogtreecommitdiff
path: root/node_modules/call-matcher
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-28 00:38:50 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-28 00:40:43 +0200
commit7fff4499fd915bcea3fa93b1aa8b35f4fe7a6027 (patch)
tree6de9a1aebd150a23b7f8c273ec657a5d0a18fe3e /node_modules/call-matcher
parent963b7a41feb29cc4be090a2446bdfe0c1f1bcd81 (diff)
downloadwallet-core-7fff4499fd915bcea3fa93b1aa8b35f4fe7a6027.tar.xz
add linting (and some initial fixes)
Diffstat (limited to 'node_modules/call-matcher')
-rw-r--r--node_modules/call-matcher/CHANGELOG.md22
-rw-r--r--node_modules/call-matcher/MIT-LICENSE.txt20
-rw-r--r--node_modules/call-matcher/README.md197
-rw-r--r--node_modules/call-matcher/dist/call-matcher.js1989
-rw-r--r--node_modules/call-matcher/index.js195
-rw-r--r--node_modules/call-matcher/package.json55
6 files changed, 2478 insertions, 0 deletions
diff --git a/node_modules/call-matcher/CHANGELOG.md b/node_modules/call-matcher/CHANGELOG.md
new file mode 100644
index 000000000..3342ad1f3
--- /dev/null
+++ b/node_modules/call-matcher/CHANGELOG.md
@@ -0,0 +1,22 @@
+### [1.0.1](https://github.com/twada/call-matcher/releases/tag/v1.0.1) (2016-12-31)
+
+
+#### Bug Fixes
+
+ * make options argument optional ([271451cb](https://github.com/twada/call-matcher/commit/271451cb037832ff2f1bc8d950847c60761178c2))
+
+
+## [1.0.0](https://github.com/twada/call-matcher/releases/tag/v1.0.0) (2016-05-28)
+
+
+#### Features
+
+ * consolidate ponyfills into core-js ([a083946c](https://github.com/twada/call-matcher/commit/a083946c26cfd236122b5298c3ea5c1facb0baca))
+
+
+## [0.1.0](https://github.com/twada/call-matcher/releases/tag/v0.1.0) (2015-12-23)
+
+
+#### Features
+
+ * initial release (extract call-matcher from escallmatch)
diff --git a/node_modules/call-matcher/MIT-LICENSE.txt b/node_modules/call-matcher/MIT-LICENSE.txt
new file mode 100644
index 000000000..2efbb29eb
--- /dev/null
+++ b/node_modules/call-matcher/MIT-LICENSE.txt
@@ -0,0 +1,20 @@
+Copyright (c) 2015-2016 Takuto Wada, https://github.com/twada/call-matcher
+
+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.
diff --git a/node_modules/call-matcher/README.md b/node_modules/call-matcher/README.md
new file mode 100644
index 000000000..b7ee0b28a
--- /dev/null
+++ b/node_modules/call-matcher/README.md
@@ -0,0 +1,197 @@
+call-matcher
+================================
+
+ECMAScript CallExpression matcher made from function/method signature
+
+[![Build Status][travis-image]][travis-url]
+[![NPM version][npm-image]][npm-url]
+[![Dependency Status][depstat-image]][depstat-url]
+[![License][license-image]][license-url]
+
+
+EXAMPLE
+---------------------------------------
+
+Creating CallExpression matcher for method signature `'assert.equal(actual, expected, [message])'`.
+
+Then match against `path/to/some_test.js`.
+
+```javascript
+var CallMatcher = require('call-matcher');
+var esprima = require('esprima');
+var estraverse = require('estraverse');
+var fs = require('fs');
+
+var ast = esprima.parse('assert.equal(actual, expected, [message])');
+var expression = ast.body[0].expression;
+var matcher = new CallMatcher(expression);
+
+estraverse.traverse(esprima.parse(fs.readFileSync('path/to/some_test.js')), {
+ enter: function (currentNode, parentNode) {
+ if (matcher.test(currentNode)) {
+ // currentNode is a CallExpression that matches to the signature
+ }
+ var argMatched = matcher.matchArgument(currentNode, parentNode);
+ if (argMatched) {
+ if (argMatched.kind === 'mandatory') {
+ // mandatory arg (in this case, `actual` or `expected`)
+ } else if (argMatched.kind === 'optional') {
+ // optional arg (in this case, `message`)
+ }
+ }
+ }
+});
+```
+
+where content of `path/to/some_test.js` is:
+
+```javascript
+var assert = require('assert');
+var anotherAssert = assert;
+var equal = assert.equal.bind(assert);
+var foo = '2';
+var bar = 2;
+
+assert.equal(foo, bar); // matches
+assert.equal(bar, foo); // matches
+assert.equal(foo, bar, 'foo shoule be equal to bar'); // matches (with optional arg)
+
+assert.equal(); // does not match (less args)
+assert.equal(foo); // does not match (less args)
+assert.equal(foo, bar, 'hoge', 'fuga'); // does not match (too much args)
+
+assert.notEqual(foo, bar); // does not match (callee method name differs)
+anotherAssert.equal(foo, bar); // does not match (callee object name differs)
+equal(foo, bar); // does not match (callee does not match)
+```
+
+`call-matcher` is a spin-off product of [power-assert](https://github.com/twada/power-assert) project.
+
+Pull-requests, issue reports and patches are always welcomed.
+
+
+API
+---------------------------------------
+
+### var matcher = new CallMatcher(signatureAst, [options])
+
+Create matcher object for a given expression.
+
+```javascript
+var ast = esprima.parse('assert.equal(actual, expected, [message])');
+var expression = ast.body[0].expression;
+var matcher = new CallMatcher(expression);
+```
+
+Any signature string enclosed in bracket (for example, `[message]`) means optional parameters. Without bracket means mandatory parameters.
+
+Returns `matcher` object having four methods, `test`, `matchArgument`, `calleeAst`, and `argumentSignatures`.
+
+
+#### options
+
+an `object` for configuration options. If not passed, default options will be used.
+
+
+#### options.visitorKeys
+
+| type | default value |
+|:---------|:--------------|
+| `object` | (return value of `estraverse.VisitorKeys`) |
+
+VisitorKeys for AST traversal. See [estraverse.VisitorKeys](https://github.com/estools/estraverse/blob/4.0.0/estraverse.js#L217-L288) and [babel.types.VISITOR_KEYS](https://github.com/babel/babel/blob/v5.1.11/src/babel/types/visitor-keys.json).
+
+
+#### options.astWhiteList
+
+| type | default value |
+|:---------|:--------------|
+| `object` | N/A |
+
+Type and property whitelist on creating AST clone. `astWhiteList` is an object containing NodeType as keys and properties as values.
+
+```js
+{
+ ArrayExpression: ['type', 'elements'],
+ ArrayPattern: ['type', 'elements'],
+ ArrowFunctionExpression: ['type', 'id', 'params', 'body', 'generator', 'expression'],
+ AssignmentExpression: ['type', 'operator', 'left', 'right'],
+ ...
+```
+
+
+### var isMatched = matcher.test(node)
+
+Tests whether `node` matches the signature or not.
+
+ - Returns `true` if matched.
+ - Returns `false` if not matched.
+
+`node` should be an AST node object defined in [The ESTree Spec](https://github.com/estree/estree) (formerly known as [Mozilla SpiderMonkey Parser API](https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API)).
+
+
+### var argMatched = matcher.matchArgument(node, parentNode)
+
+Returns match result object representing whether `node` (and its `parentNode`) matches some argument of the signature or not.
+
+ - Returns `null` if not matched.
+ - If matched, returns object like `{name: 'actual', kind: 'mandatory'}`, whose `name` is an argument name in the signature and `kind` is `'mandatory'` or `'optional'`.
+
+`node` and `parentNode` should be AST node objects defined in [The ESTree Spec](https://github.com/estree/estree) (formerly known as [Mozilla SpiderMonkey Parser API](https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API)).
+
+
+### var calleeAst = matcher.calleeAst()
+
+Returns clone of callee AST object based on signature passed to `CallMatcher` function. Returned tree is one of AST node objects defined in [The ESTree Spec](https://github.com/estree/estree) (formerly known as [Mozilla SpiderMonkey Parser API](https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API)) (in most cases, `Identifier` or `MemberExpression`).
+
+
+### var argSigs = matcher.argumentSignatures()
+
+Returns array of argument signature objects based on signature passed to `CallMatcher` function. Returns array of objects like `[{name: 'actual', kind: 'mandatory'}]`, whose `name` is an argument name in the signature and `kind` is `'mandatory'` or `'optional'`.
+
+
+
+INSTALL
+---------------------------------------
+
+### via npm
+
+Install
+
+ $ npm install --save call-matcher
+
+
+#### use call-matcher module on browser
+
+`CallMatcher` function is exported
+
+ <script type="text/javascript" src="./path/to/node_modules/call-matcher/dist/call-matcher.js"></script>
+
+
+
+CHANGELOG
+---------------------------------------
+See [CHANGELOG](https://github.com/twada/call-matcher/blob/master/CHANGELOG.md)
+
+
+AUTHOR
+---------------------------------------
+* [Takuto Wada](https://github.com/twada)
+
+
+LICENSE
+---------------------------------------
+Licensed under the [MIT](https://github.com/twada/call-matcher/blob/master/MIT-LICENSE.txt) license.
+
+
+[npm-url]: https://npmjs.org/package/call-matcher
+[npm-image]: https://badge.fury.io/js/call-matcher.svg
+
+[travis-url]: https://travis-ci.org/twada/call-matcher
+[travis-image]: https://secure.travis-ci.org/twada/call-matcher.svg?branch=master
+
+[depstat-url]: https://gemnasium.com/twada/call-matcher
+[depstat-image]: https://gemnasium.com/twada/call-matcher.svg
+
+[license-url]: https://github.com/twada/call-matcher/blob/master/MIT-LICENSE.txt
+[license-image]: https://img.shields.io/badge/license-MIT-brightgreen.svg
diff --git a/node_modules/call-matcher/dist/call-matcher.js b/node_modules/call-matcher/dist/call-matcher.js
new file mode 100644
index 000000000..bcda83672
--- /dev/null
+++ b/node_modules/call-matcher/dist/call-matcher.js
@@ -0,0 +1,1989 @@
+/**
+ * Modules in this bundle
+ * @license
+ *
+ * call-matcher:
+ * license: MIT (http://opensource.org/licenses/MIT)
+ * author: Takuto Wada <takuto.wada@gmail.com>
+ * homepage: https://github.com/twada/call-matcher
+ * version: 1.0.1
+ *
+ * core-js:
+ * license: MIT (http://opensource.org/licenses/MIT)
+ * maintainers: zloirock <zloirock@zloirock.ru>
+ * homepage: https://github.com/zloirock/core-js#readme
+ * version: 2.4.1
+ *
+ * deep-equal:
+ * license: MIT (http://opensource.org/licenses/MIT)
+ * author: James Halliday <mail@substack.net>
+ * maintainers: substack <mail@substack.net>
+ * homepage: https://github.com/substack/node-deep-equal#readme
+ * version: 1.0.1
+ *
+ * espurify:
+ * license: MIT (http://opensource.org/licenses/MIT)
+ * author: Takuto Wada <takuto.wada@gmail.com>
+ * maintainers: twada <takuto.wada@gmail.com>
+ * homepage: https://github.com/estools/espurify
+ * version: 1.6.0
+ *
+ * estraverse:
+ * license: BSD-2-Clause (http://opensource.org/licenses/BSD-2-Clause)
+ * maintainers: constellation <utatane.tea@gmail.com>, michaelficarra <npm@michael.ficarra.me>, nzakas <nicholas@nczconsulting.com>
+ * homepage: https://github.com/estools/estraverse
+ * version: 4.2.0
+ *
+ * This header is generated by licensify (https://github.com/twada/licensify)
+ */
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.CallMatcher = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw (f.code="MODULE_NOT_FOUND", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
+/**
+ * call-matcher:
+ * ECMAScript CallExpression matcher made from function/method signature
+ *
+ * https://github.com/twada/call-matcher
+ *
+ * Copyright (c) 2015-2016 Takuto Wada
+ * Licensed under the MIT license.
+ * https://github.com/twada/call-matcher/blob/master/MIT-LICENSE.txt
+ */
+'use strict';
+/* jshint -W024 */
+
+var estraverse = _dereq_('estraverse');
+var espurify = _dereq_('espurify');
+var syntax = estraverse.Syntax;
+var hasOwn = Object.prototype.hasOwnProperty;
+var forEach = _dereq_('core-js/library/fn/array/for-each');
+var map = _dereq_('core-js/library/fn/array/map');
+var filter = _dereq_('core-js/library/fn/array/filter');
+var reduce = _dereq_('core-js/library/fn/array/reduce');
+var indexOf = _dereq_('core-js/library/fn/array/index-of');
+var deepEqual = _dereq_('deep-equal');
+var notCallExprMessage = 'Argument should be in the form of CallExpression';
+var duplicatedArgMessage = 'Duplicate argument name: ';
+var invalidFormMessage = 'Argument should be in the form of `name` or `[name]`';
+
+function CallMatcher (signatureAst, options) {
+ validateApiExpression(signatureAst);
+ options = options || {};
+ this.visitorKeys = options.visitorKeys || estraverse.VisitorKeys;
+ if (options.astWhiteList) {
+ this.purifyAst = espurify.cloneWithWhitelist(options.astWhiteList);
+ } else {
+ this.purifyAst = espurify;
+ }
+ this.signatureAst = signatureAst;
+ this.signatureCalleeDepth = astDepth(signatureAst.callee, this.visitorKeys);
+ this.numMaxArgs = this.signatureAst.arguments.length;
+ this.numMinArgs = filter(this.signatureAst.arguments, identifiers).length;
+}
+
+CallMatcher.prototype.test = function (currentNode) {
+ var calleeMatched = this.isCalleeMatched(currentNode);
+ var numArgs;
+ if (calleeMatched) {
+ numArgs = currentNode.arguments.length;
+ return this.numMinArgs <= numArgs && numArgs <= this.numMaxArgs;
+ }
+ return false;
+};
+
+CallMatcher.prototype.matchArgument = function (currentNode, parentNode) {
+ if (isCalleeOfParent(currentNode, parentNode)) {
+ return null;
+ }
+ if (this.test(parentNode)) {
+ var indexOfCurrentArg = indexOf(parentNode.arguments, currentNode);
+ var numOptional = parentNode.arguments.length - this.numMinArgs;
+ var matchedSignatures = reduce(this.argumentSignatures(), function (accum, argSig) {
+ if (argSig.kind === 'mandatory') {
+ accum.push(argSig);
+ }
+ if (argSig.kind === 'optional' && 0 < numOptional) {
+ numOptional -= 1;
+ accum.push(argSig);
+ }
+ return accum;
+ }, []);
+ return matchedSignatures[indexOfCurrentArg];
+ }
+ return null;
+};
+
+CallMatcher.prototype.calleeAst = function () {
+ return this.purifyAst(this.signatureAst.callee);
+};
+
+CallMatcher.prototype.argumentSignatures = function () {
+ return map(this.signatureAst.arguments, toArgumentSignature);
+};
+
+CallMatcher.prototype.isCalleeMatched = function (node) {
+ if (!isCallExpression(node)) {
+ return false;
+ }
+ if (!this.isSameDepthAsSignatureCallee(node.callee)) {
+ return false;
+ }
+ return deepEqual(this.purifyAst(this.signatureAst.callee), this.purifyAst(node.callee));
+};
+
+CallMatcher.prototype.isSameDepthAsSignatureCallee = function (ast) {
+ var depth = this.signatureCalleeDepth;
+ var currentDepth = 0;
+ estraverse.traverse(ast, {
+ keys: this.visitorKeys,
+ enter: function (currentNode, parentNode) {
+ var path = this.path();
+ var pathDepth = path ? path.length : 0;
+ if (currentDepth < pathDepth) {
+ currentDepth = pathDepth;
+ }
+ if (depth < currentDepth) {
+ this['break']();
+ }
+ }
+ });
+ return (depth === currentDepth);
+};
+
+function toArgumentSignature (argSignatureNode) {
+ switch(argSignatureNode.type) {
+ case syntax.Identifier:
+ return {
+ name: argSignatureNode.name,
+ kind: 'mandatory'
+ };
+ case syntax.ArrayExpression:
+ return {
+ name: argSignatureNode.elements[0].name,
+ kind: 'optional'
+ };
+ default:
+ return null;
+ }
+}
+
+function astDepth (ast, visitorKeys) {
+ var maxDepth = 0;
+ estraverse.traverse(ast, {
+ keys: visitorKeys,
+ enter: function (currentNode, parentNode) {
+ var path = this.path();
+ var pathDepth = path ? path.length : 0;
+ if (maxDepth < pathDepth) {
+ maxDepth = pathDepth;
+ }
+ }
+ });
+ return maxDepth;
+}
+
+function isCallExpression (node) {
+ return node && node.type === syntax.CallExpression;
+}
+
+function isCalleeOfParent(currentNode, parentNode) {
+ return parentNode && currentNode &&
+ parentNode.type === syntax.CallExpression &&
+ parentNode.callee === currentNode;
+}
+
+function identifiers (node) {
+ return node.type === syntax.Identifier;
+}
+
+function validateApiExpression (callExpression) {
+ if (!callExpression || !callExpression.type) {
+ throw new Error(notCallExprMessage);
+ }
+ if (callExpression.type !== syntax.CallExpression) {
+ throw new Error(notCallExprMessage);
+ }
+ var names = {};
+ forEach(callExpression.arguments, function (arg) {
+ var name = validateArg(arg);
+ if (hasOwn.call(names, name)) {
+ throw new Error(duplicatedArgMessage + name);
+ } else {
+ names[name] = name;
+ }
+ });
+}
+
+function validateArg (arg) {
+ var inner;
+ switch(arg.type) {
+ case syntax.Identifier:
+ return arg.name;
+ case syntax.ArrayExpression:
+ if (arg.elements.length !== 1) {
+ throw new Error(invalidFormMessage);
+ }
+ inner = arg.elements[0];
+ if (inner.type !== syntax.Identifier) {
+ throw new Error(invalidFormMessage);
+ }
+ return inner.name;
+ default:
+ throw new Error(invalidFormMessage);
+ }
+}
+
+module.exports = CallMatcher;
+
+},{"core-js/library/fn/array/filter":2,"core-js/library/fn/array/for-each":3,"core-js/library/fn/array/index-of":4,"core-js/library/fn/array/map":6,"core-js/library/fn/array/reduce":7,"deep-equal":60,"espurify":63,"estraverse":67}],2:[function(_dereq_,module,exports){
+_dereq_('../../modules/es6.array.filter');
+module.exports = _dereq_('../../modules/_core').Array.filter;
+},{"../../modules/_core":18,"../../modules/es6.array.filter":52}],3:[function(_dereq_,module,exports){
+_dereq_('../../modules/es6.array.for-each');
+module.exports = _dereq_('../../modules/_core').Array.forEach;
+},{"../../modules/_core":18,"../../modules/es6.array.for-each":53}],4:[function(_dereq_,module,exports){
+_dereq_('../../modules/es6.array.index-of');
+module.exports = _dereq_('../../modules/_core').Array.indexOf;
+},{"../../modules/_core":18,"../../modules/es6.array.index-of":54}],5:[function(_dereq_,module,exports){
+_dereq_('../../modules/es6.array.is-array');
+module.exports = _dereq_('../../modules/_core').Array.isArray;
+},{"../../modules/_core":18,"../../modules/es6.array.is-array":55}],6:[function(_dereq_,module,exports){
+_dereq_('../../modules/es6.array.map');
+module.exports = _dereq_('../../modules/_core').Array.map;
+},{"../../modules/_core":18,"../../modules/es6.array.map":56}],7:[function(_dereq_,module,exports){
+_dereq_('../../modules/es6.array.reduce');
+module.exports = _dereq_('../../modules/_core').Array.reduce;
+},{"../../modules/_core":18,"../../modules/es6.array.reduce":57}],8:[function(_dereq_,module,exports){
+_dereq_('../../modules/es6.object.assign');
+module.exports = _dereq_('../../modules/_core').Object.assign;
+},{"../../modules/_core":18,"../../modules/es6.object.assign":58}],9:[function(_dereq_,module,exports){
+_dereq_('../../modules/es6.object.keys');
+module.exports = _dereq_('../../modules/_core').Object.keys;
+},{"../../modules/_core":18,"../../modules/es6.object.keys":59}],10:[function(_dereq_,module,exports){
+module.exports = function(it){
+ if(typeof it != 'function')throw TypeError(it + ' is not a function!');
+ return it;
+};
+},{}],11:[function(_dereq_,module,exports){
+var isObject = _dereq_('./_is-object');
+module.exports = function(it){
+ if(!isObject(it))throw TypeError(it + ' is not an object!');
+ return it;
+};
+},{"./_is-object":32}],12:[function(_dereq_,module,exports){
+// false -> Array#indexOf
+// true -> Array#includes
+var toIObject = _dereq_('./_to-iobject')
+ , toLength = _dereq_('./_to-length')
+ , toIndex = _dereq_('./_to-index');
+module.exports = function(IS_INCLUDES){
+ return function($this, el, fromIndex){
+ var O = toIObject($this)
+ , length = toLength(O.length)
+ , index = toIndex(fromIndex, length)
+ , value;
+ // Array#includes uses SameValueZero equality algorithm
+ if(IS_INCLUDES && el != el)while(length > index){
+ value = O[index++];
+ if(value != value)return true;
+ // Array#toIndex ignores holes, Array#includes - not
+ } else for(;length > index; index++)if(IS_INCLUDES || index in O){
+ if(O[index] === el)return IS_INCLUDES || index || 0;
+ } return !IS_INCLUDES && -1;
+ };
+};
+},{"./_to-index":44,"./_to-iobject":46,"./_to-length":47}],13:[function(_dereq_,module,exports){
+// 0 -> Array#forEach
+// 1 -> Array#map
+// 2 -> Array#filter
+// 3 -> Array#some
+// 4 -> Array#every
+// 5 -> Array#find
+// 6 -> Array#findIndex
+var ctx = _dereq_('./_ctx')
+ , IObject = _dereq_('./_iobject')
+ , toObject = _dereq_('./_to-object')
+ , toLength = _dereq_('./_to-length')
+ , asc = _dereq_('./_array-species-create');
+module.exports = function(TYPE, $create){
+ var IS_MAP = TYPE == 1
+ , IS_FILTER = TYPE == 2
+ , IS_SOME = TYPE == 3
+ , IS_EVERY = TYPE == 4
+ , IS_FIND_INDEX = TYPE == 6
+ , NO_HOLES = TYPE == 5 || IS_FIND_INDEX
+ , create = $create || asc;
+ return function($this, callbackfn, that){
+ var O = toObject($this)
+ , self = IObject(O)
+ , f = ctx(callbackfn, that, 3)
+ , length = toLength(self.length)
+ , index = 0
+ , result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined
+ , val, res;
+ for(;length > index; index++)if(NO_HOLES || index in self){
+ val = self[index];
+ res = f(val, index, O);
+ if(TYPE){
+ if(IS_MAP)result[index] = res; // map
+ else if(res)switch(TYPE){
+ case 3: return true; // some
+ case 5: return val; // find
+ case 6: return index; // findIndex
+ case 2: result.push(val); // filter
+ } else if(IS_EVERY)return false; // every
+ }
+ }
+ return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;
+ };
+};
+},{"./_array-species-create":16,"./_ctx":19,"./_iobject":30,"./_to-length":47,"./_to-object":48}],14:[function(_dereq_,module,exports){
+var aFunction = _dereq_('./_a-function')
+ , toObject = _dereq_('./_to-object')
+ , IObject = _dereq_('./_iobject')
+ , toLength = _dereq_('./_to-length');
+
+module.exports = function(that, callbackfn, aLen, memo, isRight){
+ aFunction(callbackfn);
+ var O = toObject(that)
+ , self = IObject(O)
+ , length = toLength(O.length)
+ , index = isRight ? length - 1 : 0
+ , i = isRight ? -1 : 1;
+ if(aLen < 2)for(;;){
+ if(index in self){
+ memo = self[index];
+ index += i;
+ break;
+ }
+ index += i;
+ if(isRight ? index < 0 : length <= index){
+ throw TypeError('Reduce of empty array with no initial value');
+ }
+ }
+ for(;isRight ? index >= 0 : length > index; index += i)if(index in self){
+ memo = callbackfn(memo, self[index], index, O);
+ }
+ return memo;
+};
+},{"./_a-function":10,"./_iobject":30,"./_to-length":47,"./_to-object":48}],15:[function(_dereq_,module,exports){
+var isObject = _dereq_('./_is-object')
+ , isArray = _dereq_('./_is-array')
+ , SPECIES = _dereq_('./_wks')('species');
+
+module.exports = function(original){
+ var C;
+ if(isArray(original)){
+ C = original.constructor;
+ // cross-realm fallback
+ if(typeof C == 'function' && (C === Array || isArray(C.prototype)))C = undefined;
+ if(isObject(C)){
+ C = C[SPECIES];
+ if(C === null)C = undefined;
+ }
+ } return C === undefined ? Array : C;
+};
+},{"./_is-array":31,"./_is-object":32,"./_wks":51}],16:[function(_dereq_,module,exports){
+// 9.4.2.3 ArraySpeciesCreate(originalArray, length)
+var speciesConstructor = _dereq_('./_array-species-constructor');
+
+module.exports = function(original, length){
+ return new (speciesConstructor(original))(length);
+};
+},{"./_array-species-constructor":15}],17:[function(_dereq_,module,exports){
+var toString = {}.toString;
+
+module.exports = function(it){
+ return toString.call(it).slice(8, -1);
+};
+},{}],18:[function(_dereq_,module,exports){
+var core = module.exports = {version: '2.4.0'};
+if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef
+},{}],19:[function(_dereq_,module,exports){
+// optional / simple context binding
+var aFunction = _dereq_('./_a-function');
+module.exports = function(fn, that, length){
+ aFunction(fn);
+ if(that === undefined)return fn;
+ switch(length){
+ case 1: return function(a){
+ return fn.call(that, a);
+ };
+ case 2: return function(a, b){
+ return fn.call(that, a, b);
+ };
+ case 3: return function(a, b, c){
+ return fn.call(that, a, b, c);
+ };
+ }
+ return function(/* ...args */){
+ return fn.apply(that, arguments);
+ };
+};
+},{"./_a-function":10}],20:[function(_dereq_,module,exports){
+// 7.2.1 RequireObjectCoercible(argument)
+module.exports = function(it){
+ if(it == undefined)throw TypeError("Can't call method on " + it);
+ return it;
+};
+},{}],21:[function(_dereq_,module,exports){
+// Thank's IE8 for his funny defineProperty
+module.exports = !_dereq_('./_fails')(function(){
+ return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7;
+});
+},{"./_fails":25}],22:[function(_dereq_,module,exports){
+var isObject = _dereq_('./_is-object')
+ , document = _dereq_('./_global').document
+ // in old IE typeof document.createElement is 'object'
+ , is = isObject(document) && isObject(document.createElement);
+module.exports = function(it){
+ return is ? document.createElement(it) : {};
+};
+},{"./_global":26,"./_is-object":32}],23:[function(_dereq_,module,exports){
+// IE 8- don't enum bug keys
+module.exports = (
+ 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'
+).split(',');
+},{}],24:[function(_dereq_,module,exports){
+var global = _dereq_('./_global')
+ , core = _dereq_('./_core')
+ , ctx = _dereq_('./_ctx')
+ , hide = _dereq_('./_hide')
+ , PROTOTYPE = 'prototype';
+
+var $export = function(type, name, source){
+ var IS_FORCED = type & $export.F
+ , IS_GLOBAL = type & $export.G
+ , IS_STATIC = type & $export.S
+ , IS_PROTO = type & $export.P
+ , IS_BIND = type & $export.B
+ , IS_WRAP = type & $export.W
+ , exports = IS_GLOBAL ? core : core[name] || (core[name] = {})
+ , expProto = exports[PROTOTYPE]
+ , target = IS_GLOBAL ? global : IS_STATIC ? global[name] : (global[name] || {})[PROTOTYPE]
+ , key, own, out;
+ if(IS_GLOBAL)source = name;
+ for(key in source){
+ // contains in native
+ own = !IS_FORCED && target && target[key] !== undefined;
+ if(own && key in exports)continue;
+ // export native or passed
+ out = own ? target[key] : source[key];
+ // prevent global pollution for namespaces
+ exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]
+ // bind timers to global for call from export context
+ : IS_BIND && own ? ctx(out, global)
+ // wrap global constructors for prevent change them in library
+ : IS_WRAP && target[key] == out ? (function(C){
+ var F = function(a, b, c){
+ if(this instanceof C){
+ switch(arguments.length){
+ case 0: return new C;
+ case 1: return new C(a);
+ case 2: return new C(a, b);
+ } return new C(a, b, c);
+ } return C.apply(this, arguments);
+ };
+ F[PROTOTYPE] = C[PROTOTYPE];
+ return F;
+ // make static versions for prototype methods
+ })(out) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;
+ // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%
+ if(IS_PROTO){
+ (exports.virtual || (exports.virtual = {}))[key] = out;
+ // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%
+ if(type & $export.R && expProto && !expProto[key])hide(expProto, key, out);
+ }
+ }
+};
+// type bitmap
+$export.F = 1; // forced
+$export.G = 2; // global
+$export.S = 4; // static
+$export.P = 8; // proto
+$export.B = 16; // bind
+$export.W = 32; // wrap
+$export.U = 64; // safe
+$export.R = 128; // real proto method for `library`
+module.exports = $export;
+},{"./_core":18,"./_ctx":19,"./_global":26,"./_hide":28}],25:[function(_dereq_,module,exports){
+module.exports = function(exec){
+ try {
+ return !!exec();
+ } catch(e){
+ return true;
+ }
+};
+},{}],26:[function(_dereq_,module,exports){
+// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028
+var global = module.exports = typeof window != 'undefined' && window.Math == Math
+ ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();
+if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef
+},{}],27:[function(_dereq_,module,exports){
+var hasOwnProperty = {}.hasOwnProperty;
+module.exports = function(it, key){
+ return hasOwnProperty.call(it, key);
+};
+},{}],28:[function(_dereq_,module,exports){
+var dP = _dereq_('./_object-dp')
+ , createDesc = _dereq_('./_property-desc');
+module.exports = _dereq_('./_descriptors') ? function(object, key, value){
+ return dP.f(object, key, createDesc(1, value));
+} : function(object, key, value){
+ object[key] = value;
+ return object;
+};
+},{"./_descriptors":21,"./_object-dp":34,"./_property-desc":40}],29:[function(_dereq_,module,exports){
+module.exports = !_dereq_('./_descriptors') && !_dereq_('./_fails')(function(){
+ return Object.defineProperty(_dereq_('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7;
+});
+},{"./_descriptors":21,"./_dom-create":22,"./_fails":25}],30:[function(_dereq_,module,exports){
+// fallback for non-array-like ES3 and non-enumerable old V8 strings
+var cof = _dereq_('./_cof');
+module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){
+ return cof(it) == 'String' ? it.split('') : Object(it);
+};
+},{"./_cof":17}],31:[function(_dereq_,module,exports){
+// 7.2.2 IsArray(argument)
+var cof = _dereq_('./_cof');
+module.exports = Array.isArray || function isArray(arg){
+ return cof(arg) == 'Array';
+};
+},{"./_cof":17}],32:[function(_dereq_,module,exports){
+module.exports = function(it){
+ return typeof it === 'object' ? it !== null : typeof it === 'function';
+};
+},{}],33:[function(_dereq_,module,exports){
+'use strict';
+// 19.1.2.1 Object.assign(target, source, ...)
+var getKeys = _dereq_('./_object-keys')
+ , gOPS = _dereq_('./_object-gops')
+ , pIE = _dereq_('./_object-pie')
+ , toObject = _dereq_('./_to-object')
+ , IObject = _dereq_('./_iobject')
+ , $assign = Object.assign;
+
+// should work with symbols and should have deterministic property order (V8 bug)
+module.exports = !$assign || _dereq_('./_fails')(function(){
+ var A = {}
+ , B = {}
+ , S = Symbol()
+ , K = 'abcdefghijklmnopqrst';
+ A[S] = 7;
+ K.split('').forEach(function(k){ B[k] = k; });
+ return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;
+}) ? function assign(target, source){ // eslint-disable-line no-unused-vars
+ var T = toObject(target)
+ , aLen = arguments.length
+ , index = 1
+ , getSymbols = gOPS.f
+ , isEnum = pIE.f;
+ while(aLen > index){
+ var S = IObject(arguments[index++])
+ , keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S)
+ , length = keys.length
+ , j = 0
+ , key;
+ while(length > j)if(isEnum.call(S, key = keys[j++]))T[key] = S[key];
+ } return T;
+} : $assign;
+},{"./_fails":25,"./_iobject":30,"./_object-gops":35,"./_object-keys":37,"./_object-pie":38,"./_to-object":48}],34:[function(_dereq_,module,exports){
+var anObject = _dereq_('./_an-object')
+ , IE8_DOM_DEFINE = _dereq_('./_ie8-dom-define')
+ , toPrimitive = _dereq_('./_to-primitive')
+ , dP = Object.defineProperty;
+
+exports.f = _dereq_('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){
+ anObject(O);
+ P = toPrimitive(P, true);
+ anObject(Attributes);
+ if(IE8_DOM_DEFINE)try {
+ return dP(O, P, Attributes);
+ } catch(e){ /* empty */ }
+ if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!');
+ if('value' in Attributes)O[P] = Attributes.value;
+ return O;
+};
+},{"./_an-object":11,"./_descriptors":21,"./_ie8-dom-define":29,"./_to-primitive":49}],35:[function(_dereq_,module,exports){
+exports.f = Object.getOwnPropertySymbols;
+},{}],36:[function(_dereq_,module,exports){
+var has = _dereq_('./_has')
+ , toIObject = _dereq_('./_to-iobject')
+ , arrayIndexOf = _dereq_('./_array-includes')(false)
+ , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO');
+
+module.exports = function(object, names){
+ var O = toIObject(object)
+ , i = 0
+ , result = []
+ , key;
+ for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key);
+ // Don't enum bug & hidden keys
+ while(names.length > i)if(has(O, key = names[i++])){
+ ~arrayIndexOf(result, key) || result.push(key);
+ }
+ return result;
+};
+},{"./_array-includes":12,"./_has":27,"./_shared-key":41,"./_to-iobject":46}],37:[function(_dereq_,module,exports){
+// 19.1.2.14 / 15.2.3.14 Object.keys(O)
+var $keys = _dereq_('./_object-keys-internal')
+ , enumBugKeys = _dereq_('./_enum-bug-keys');
+
+module.exports = Object.keys || function keys(O){
+ return $keys(O, enumBugKeys);
+};
+},{"./_enum-bug-keys":23,"./_object-keys-internal":36}],38:[function(_dereq_,module,exports){
+exports.f = {}.propertyIsEnumerable;
+},{}],39:[function(_dereq_,module,exports){
+// most Object methods by ES6 should accept primitives
+var $export = _dereq_('./_export')
+ , core = _dereq_('./_core')
+ , fails = _dereq_('./_fails');
+module.exports = function(KEY, exec){
+ var fn = (core.Object || {})[KEY] || Object[KEY]
+ , exp = {};
+ exp[KEY] = exec(fn);
+ $export($export.S + $export.F * fails(function(){ fn(1); }), 'Object', exp);
+};
+},{"./_core":18,"./_export":24,"./_fails":25}],40:[function(_dereq_,module,exports){
+module.exports = function(bitmap, value){
+ return {
+ enumerable : !(bitmap & 1),
+ configurable: !(bitmap & 2),
+ writable : !(bitmap & 4),
+ value : value
+ };
+};
+},{}],41:[function(_dereq_,module,exports){
+var shared = _dereq_('./_shared')('keys')
+ , uid = _dereq_('./_uid');
+module.exports = function(key){
+ return shared[key] || (shared[key] = uid(key));
+};
+},{"./_shared":42,"./_uid":50}],42:[function(_dereq_,module,exports){
+var global = _dereq_('./_global')
+ , SHARED = '__core-js_shared__'
+ , store = global[SHARED] || (global[SHARED] = {});
+module.exports = function(key){
+ return store[key] || (store[key] = {});
+};
+},{"./_global":26}],43:[function(_dereq_,module,exports){
+var fails = _dereq_('./_fails');
+
+module.exports = function(method, arg){
+ return !!method && fails(function(){
+ arg ? method.call(null, function(){}, 1) : method.call(null);
+ });
+};
+},{"./_fails":25}],44:[function(_dereq_,module,exports){
+var toInteger = _dereq_('./_to-integer')
+ , max = Math.max
+ , min = Math.min;
+module.exports = function(index, length){
+ index = toInteger(index);
+ return index < 0 ? max(index + length, 0) : min(index, length);
+};
+},{"./_to-integer":45}],45:[function(_dereq_,module,exports){
+// 7.1.4 ToInteger
+var ceil = Math.ceil
+ , floor = Math.floor;
+module.exports = function(it){
+ return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);
+};
+},{}],46:[function(_dereq_,module,exports){
+// to indexed object, toObject with fallback for non-array-like ES3 strings
+var IObject = _dereq_('./_iobject')
+ , defined = _dereq_('./_defined');
+module.exports = function(it){
+ return IObject(defined(it));
+};
+},{"./_defined":20,"./_iobject":30}],47:[function(_dereq_,module,exports){
+// 7.1.15 ToLength
+var toInteger = _dereq_('./_to-integer')
+ , min = Math.min;
+module.exports = function(it){
+ return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991
+};
+},{"./_to-integer":45}],48:[function(_dereq_,module,exports){
+// 7.1.13 ToObject(argument)
+var defined = _dereq_('./_defined');
+module.exports = function(it){
+ return Object(defined(it));
+};
+},{"./_defined":20}],49:[function(_dereq_,module,exports){
+// 7.1.1 ToPrimitive(input [, PreferredType])
+var isObject = _dereq_('./_is-object');
+// instead of the ES6 spec version, we didn't implement @@toPrimitive case
+// and the second argument - flag - preferred type is a string
+module.exports = function(it, S){
+ if(!isObject(it))return it;
+ var fn, val;
+ if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
+ if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val;
+ if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val;
+ throw TypeError("Can't convert object to primitive value");
+};
+},{"./_is-object":32}],50:[function(_dereq_,module,exports){
+var id = 0
+ , px = Math.random();
+module.exports = function(key){
+ return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));
+};
+},{}],51:[function(_dereq_,module,exports){
+var store = _dereq_('./_shared')('wks')
+ , uid = _dereq_('./_uid')
+ , Symbol = _dereq_('./_global').Symbol
+ , USE_SYMBOL = typeof Symbol == 'function';
+
+var $exports = module.exports = function(name){
+ return store[name] || (store[name] =
+ USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));
+};
+
+$exports.store = store;
+},{"./_global":26,"./_shared":42,"./_uid":50}],52:[function(_dereq_,module,exports){
+'use strict';
+var $export = _dereq_('./_export')
+ , $filter = _dereq_('./_array-methods')(2);
+
+$export($export.P + $export.F * !_dereq_('./_strict-method')([].filter, true), 'Array', {
+ // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])
+ filter: function filter(callbackfn /* , thisArg */){
+ return $filter(this, callbackfn, arguments[1]);
+ }
+});
+},{"./_array-methods":13,"./_export":24,"./_strict-method":43}],53:[function(_dereq_,module,exports){
+'use strict';
+var $export = _dereq_('./_export')
+ , $forEach = _dereq_('./_array-methods')(0)
+ , STRICT = _dereq_('./_strict-method')([].forEach, true);
+
+$export($export.P + $export.F * !STRICT, 'Array', {
+ // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])
+ forEach: function forEach(callbackfn /* , thisArg */){
+ return $forEach(this, callbackfn, arguments[1]);
+ }
+});
+},{"./_array-methods":13,"./_export":24,"./_strict-method":43}],54:[function(_dereq_,module,exports){
+'use strict';
+var $export = _dereq_('./_export')
+ , $indexOf = _dereq_('./_array-includes')(false)
+ , $native = [].indexOf
+ , NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;
+
+$export($export.P + $export.F * (NEGATIVE_ZERO || !_dereq_('./_strict-method')($native)), 'Array', {
+ // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])
+ indexOf: function indexOf(searchElement /*, fromIndex = 0 */){
+ return NEGATIVE_ZERO
+ // convert -0 to +0
+ ? $native.apply(this, arguments) || 0
+ : $indexOf(this, searchElement, arguments[1]);
+ }
+});
+},{"./_array-includes":12,"./_export":24,"./_strict-method":43}],55:[function(_dereq_,module,exports){
+// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)
+var $export = _dereq_('./_export');
+
+$export($export.S, 'Array', {isArray: _dereq_('./_is-array')});
+},{"./_export":24,"./_is-array":31}],56:[function(_dereq_,module,exports){
+'use strict';
+var $export = _dereq_('./_export')
+ , $map = _dereq_('./_array-methods')(1);
+
+$export($export.P + $export.F * !_dereq_('./_strict-method')([].map, true), 'Array', {
+ // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])
+ map: function map(callbackfn /* , thisArg */){
+ return $map(this, callbackfn, arguments[1]);
+ }
+});
+},{"./_array-methods":13,"./_export":24,"./_strict-method":43}],57:[function(_dereq_,module,exports){
+'use strict';
+var $export = _dereq_('./_export')
+ , $reduce = _dereq_('./_array-reduce');
+
+$export($export.P + $export.F * !_dereq_('./_strict-method')([].reduce, true), 'Array', {
+ // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])
+ reduce: function reduce(callbackfn /* , initialValue */){
+ return $reduce(this, callbackfn, arguments.length, arguments[1], false);
+ }
+});
+},{"./_array-reduce":14,"./_export":24,"./_strict-method":43}],58:[function(_dereq_,module,exports){
+// 19.1.3.1 Object.assign(target, source)
+var $export = _dereq_('./_export');
+
+$export($export.S + $export.F, 'Object', {assign: _dereq_('./_object-assign')});
+},{"./_export":24,"./_object-assign":33}],59:[function(_dereq_,module,exports){
+// 19.1.2.14 Object.keys(O)
+var toObject = _dereq_('./_to-object')
+ , $keys = _dereq_('./_object-keys');
+
+_dereq_('./_object-sap')('keys', function(){
+ return function keys(it){
+ return $keys(toObject(it));
+ };
+});
+},{"./_object-keys":37,"./_object-sap":39,"./_to-object":48}],60:[function(_dereq_,module,exports){
+var pSlice = Array.prototype.slice;
+var objectKeys = _dereq_('./lib/keys.js');
+var isArguments = _dereq_('./lib/is_arguments.js');
+
+var deepEqual = module.exports = function (actual, expected, opts) {
+ if (!opts) opts = {};
+ // 7.1. All identical values are equivalent, as determined by ===.
+ if (actual === expected) {
+ return true;
+
+ } else if (actual instanceof Date && expected instanceof Date) {
+ return actual.getTime() === expected.getTime();
+
+ // 7.3. Other pairs that do not both pass typeof value == 'object',
+ // equivalence is determined by ==.
+ } else if (!actual || !expected || typeof actual != 'object' && typeof expected != 'object') {
+ return opts.strict ? actual === expected : actual == expected;
+
+ // 7.4. For all other Object pairs, including Array objects, equivalence is
+ // determined by having the same number of owned properties (as verified
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
+ // (although not necessarily the same order), equivalent values for every
+ // corresponding key, and an identical 'prototype' property. Note: this
+ // accounts for both named and indexed properties on Arrays.
+ } else {
+ return objEquiv(actual, expected, opts);
+ }
+}
+
+function isUndefinedOrNull(value) {
+ return value === null || value === undefined;
+}
+
+function isBuffer (x) {
+ if (!x || typeof x !== 'object' || typeof x.length !== 'number') return false;
+ if (typeof x.copy !== 'function' || typeof x.slice !== 'function') {
+ return false;
+ }
+ if (x.length > 0 && typeof x[0] !== 'number') return false;
+ return true;
+}
+
+function objEquiv(a, b, opts) {
+ var i, key;
+ if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
+ return false;
+ // an identical 'prototype' property.
+ if (a.prototype !== b.prototype) return false;
+ //~~~I've managed to break Object.keys through screwy arguments passing.
+ // Converting to array solves the problem.
+ if (isArguments(a)) {
+ if (!isArguments(b)) {
+ return false;
+ }
+ a = pSlice.call(a);
+ b = pSlice.call(b);
+ return deepEqual(a, b, opts);
+ }
+ if (isBuffer(a)) {
+ if (!isBuffer(b)) {
+ return false;
+ }
+ if (a.length !== b.length) return false;
+ for (i = 0; i < a.length; i++) {
+ if (a[i] !== b[i]) return false;
+ }
+ return true;
+ }
+ try {
+ var ka = objectKeys(a),
+ kb = objectKeys(b);
+ } catch (e) {//happens when one is a string literal and the other isn't
+ return false;
+ }
+ // having the same number of owned properties (keys incorporates
+ // hasOwnProperty)
+ if (ka.length != kb.length)
+ return false;
+ //the same set of keys (although not necessarily the same order),
+ ka.sort();
+ kb.sort();
+ //~~~cheap key test
+ for (i = ka.length - 1; i >= 0; i--) {
+ if (ka[i] != kb[i])
+ return false;
+ }
+ //equivalent values for every corresponding key, and
+ //~~~possibly expensive deep test
+ for (i = ka.length - 1; i >= 0; i--) {
+ key = ka[i];
+ if (!deepEqual(a[key], b[key], opts)) return false;
+ }
+ return typeof a === typeof b;
+}
+
+},{"./lib/is_arguments.js":61,"./lib/keys.js":62}],61:[function(_dereq_,module,exports){
+var supportsArgumentsClass = (function(){
+ return Object.prototype.toString.call(arguments)
+})() == '[object Arguments]';
+
+exports = module.exports = supportsArgumentsClass ? supported : unsupported;
+
+exports.supported = supported;
+function supported(object) {
+ return Object.prototype.toString.call(object) == '[object Arguments]';
+};
+
+exports.unsupported = unsupported;
+function unsupported(object){
+ return object &&
+ typeof object == 'object' &&
+ typeof object.length == 'number' &&
+ Object.prototype.hasOwnProperty.call(object, 'callee') &&
+ !Object.prototype.propertyIsEnumerable.call(object, 'callee') ||
+ false;
+};
+
+},{}],62:[function(_dereq_,module,exports){
+exports = module.exports = typeof Object.keys === 'function'
+ ? Object.keys : shim;
+
+exports.shim = shim;
+function shim (obj) {
+ var keys = [];
+ for (var key in obj) keys.push(key);
+ return keys;
+}
+
+},{}],63:[function(_dereq_,module,exports){
+/**
+ * espurify - Clone new AST without extra properties
+ *
+ * https://github.com/estools/espurify
+ *
+ * Copyright (c) 2014-2016 Takuto Wada
+ * Licensed under the MIT license.
+ * https://github.com/estools/espurify/blob/master/MIT-LICENSE.txt
+ */
+'use strict';
+
+var createWhitelist = _dereq_('./lib/create-whitelist');
+var cloneWithWhitelist = _dereq_('./lib/clone-ast');
+
+function createCloneFunction (options) {
+ return cloneWithWhitelist(createWhitelist(options));
+}
+
+var espurify = createCloneFunction();
+espurify.customize = createCloneFunction;
+espurify.cloneWithWhitelist = cloneWithWhitelist;
+module.exports = espurify;
+
+},{"./lib/clone-ast":65,"./lib/create-whitelist":66}],64:[function(_dereq_,module,exports){
+module.exports = {
+ ArrayExpression: ['type', 'elements'],
+ ArrayPattern: ['type', 'elements'],
+ ArrowFunctionExpression: ['type', 'id', 'params', 'body', 'generator', 'expression'],
+ AssignmentExpression: ['type', 'operator', 'left', 'right'],
+ AssignmentPattern: ['type', 'left', 'right'],
+ BinaryExpression: ['type', 'operator', 'left', 'right'],
+ BlockStatement: ['type', 'body'],
+ BreakStatement: ['type', 'label'],
+ CallExpression: ['type', 'callee', 'arguments'],
+ CatchClause: ['type', 'param', 'guard', 'body'],
+ ClassBody: ['type', 'body'],
+ ClassDeclaration: ['type', 'id', 'superClass', 'body'],
+ ClassExpression: ['type', 'id', 'superClass', 'body'],
+ ConditionalExpression: ['type', 'test', 'alternate', 'consequent'],
+ ContinueStatement: ['type', 'label'],
+ DebuggerStatement: ['type'],
+ DoWhileStatement: ['type', 'body', 'test'],
+ EmptyStatement: ['type'],
+ ExportAllDeclaration: ['type', 'source'],
+ ExportDefaultDeclaration: ['type', 'declaration'],
+ ExportNamedDeclaration: ['type', 'declaration', 'specifiers', 'source'],
+ ExportSpecifier: ['type', 'exported', 'local'],
+ ExpressionStatement: ['type', 'expression'],
+ ForInStatement: ['type', 'left', 'right', 'body'],
+ ForOfStatement: ['type', 'left', 'right', 'body'],
+ ForStatement: ['type', 'init', 'test', 'update', 'body'],
+ FunctionDeclaration: ['type', 'id', 'params', 'body', 'generator'],
+ FunctionExpression: ['type', 'id', 'params', 'body', 'generator'],
+ Identifier: ['type', 'name'],
+ IfStatement: ['type', 'test', 'consequent', 'alternate'],
+ ImportDeclaration: ['type', 'specifiers', 'source'],
+ ImportDefaultSpecifier: ['type', 'local'],
+ ImportNamespaceSpecifier: ['type', 'local'],
+ ImportSpecifier: ['type', 'imported', 'local'],
+ LabeledStatement: ['type', 'label', 'body'],
+ Literal: ['type', 'value', 'regex'],
+ LogicalExpression: ['type', 'operator', 'left', 'right'],
+ MemberExpression: ['type', 'object', 'property', 'computed'],
+ MetaProperty: ['type', 'meta', 'property'],
+ MethodDefinition: ['type', 'key', 'value', 'kind', 'computed', 'static'],
+ NewExpression: ['type', 'callee', 'arguments'],
+ ObjectExpression: ['type', 'properties'],
+ ObjectPattern: ['type', 'properties'],
+ Program: ['type', 'body', 'sourceType'],
+ Property: ['type', 'key', 'value', 'kind', 'method', 'shorthand', 'computed'],
+ RestElement: ['type', 'argument'],
+ ReturnStatement: ['type', 'argument'],
+ SequenceExpression: ['type', 'expressions'],
+ SpreadElement: ['type', 'argument'],
+ Super: ['type'],
+ SwitchCase: ['type', 'test', 'consequent'],
+ SwitchStatement: ['type', 'discriminant', 'cases', 'lexical'],
+ TaggedTemplateExpression: ['type', 'tag', 'quasi'],
+ TemplateElement: ['type', 'tail', 'value'],
+ TemplateLiteral: ['type', 'quasis', 'expressions'],
+ ThisExpression: ['type'],
+ ThrowStatement: ['type', 'argument'],
+ TryStatement: ['type', 'block', 'handler', 'finalizer'],
+ UnaryExpression: ['type', 'operator', 'prefix', 'argument'],
+ UpdateExpression: ['type', 'operator', 'argument', 'prefix'],
+ VariableDeclaration: ['type', 'declarations', 'kind'],
+ VariableDeclarator: ['type', 'id', 'init'],
+ WhileStatement: ['type', 'test', 'body'],
+ WithStatement: ['type', 'object', 'body'],
+ YieldExpression: ['type', 'argument', 'delegate']
+};
+
+},{}],65:[function(_dereq_,module,exports){
+'use strict';
+
+var isArray = _dereq_('core-js/library/fn/array/is-array');
+var objectKeys = _dereq_('core-js/library/fn/object/keys');
+var indexOf = _dereq_('core-js/library/fn/array/index-of');
+var reduce = _dereq_('core-js/library/fn/array/reduce');
+
+module.exports = function cloneWithWhitelist (astWhiteList) {
+ var whitelist = reduce(objectKeys(astWhiteList), function (props, key) {
+ var propNames = astWhiteList[key];
+ var prepend = (indexOf(propNames, 'type') === -1) ? ['type'] : [];
+ props[key] = prepend.concat(propNames);
+ return props;
+ }, {});
+
+ function cloneNodeOrObject (obj) {
+ var props = obj.type ? whitelist[obj.type] : null;
+ if (props) {
+ return cloneNode(obj, props);
+ } else {
+ return cloneObject(obj);
+ }
+ }
+
+ function cloneArray (ary) {
+ var i = ary.length, clone = [];
+ while (i--) {
+ clone[i] = cloneOf(ary[i]);
+ }
+ return clone;
+ }
+
+ function cloneNode (node, props) {
+ var i, len, key, clone = {};
+ for (i = 0, len = props.length; i < len; i += 1) {
+ key = props[i];
+ if (node.hasOwnProperty(key)) {
+ clone[key] = cloneOf(node[key]);
+ }
+ }
+ return clone;
+ }
+
+ function cloneObject (obj) {
+ var props = objectKeys(obj);
+ var i, len, key, clone = {};
+ for (i = 0, len = props.length; i < len; i += 1) {
+ key = props[i];
+ clone[key] = cloneOf(obj[key]);
+ }
+ return clone;
+ }
+
+ function cloneOf (val) {
+ if (typeof val === 'object' && val !== null) {
+ if (val instanceof RegExp) {
+ return new RegExp(val);
+ } else if (isArray(val)) {
+ return cloneArray(val);
+ } else {
+ return cloneNodeOrObject(val);
+ }
+ } else {
+ return val;
+ }
+ }
+
+ return cloneNodeOrObject;
+};
+
+},{"core-js/library/fn/array/index-of":4,"core-js/library/fn/array/is-array":5,"core-js/library/fn/array/reduce":7,"core-js/library/fn/object/keys":9}],66:[function(_dereq_,module,exports){
+'use strict';
+
+var defaultProps = _dereq_('./ast-properties');
+var objectKeys = _dereq_('core-js/library/fn/object/keys');
+var assign = _dereq_('core-js/library/fn/object/assign');
+
+module.exports = function createWhitelist (options) {
+ var opts = assign({}, options);
+ var typeName, i, len;
+ var keys = objectKeys(defaultProps);
+ var result = {};
+ for (i = 0, len = keys.length; i < len; i += 1) {
+ typeName = keys[i];
+ result[typeName] = defaultProps[typeName].concat(opts.extra);
+ }
+ return result;
+};
+
+},{"./ast-properties":64,"core-js/library/fn/object/assign":8,"core-js/library/fn/object/keys":9}],67:[function(_dereq_,module,exports){
+/*
+ Copyright (C) 2012-2013 Yusuke Suzuki <utatane.tea@gmail.com>
+ Copyright (C) 2012 Ariya Hidayat <ariya.hidayat@gmail.com>
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+/*jslint vars:false, bitwise:true*/
+/*jshint indent:4*/
+/*global exports:true*/
+(function clone(exports) {
+ 'use strict';
+
+ var Syntax,
+ isArray,
+ VisitorOption,
+ VisitorKeys,
+ objectCreate,
+ objectKeys,
+ BREAK,
+ SKIP,
+ REMOVE;
+
+ function ignoreJSHintError() { }
+
+ isArray = Array.isArray;
+ if (!isArray) {
+ isArray = function isArray(array) {
+ return Object.prototype.toString.call(array) === '[object Array]';
+ };
+ }
+
+ function deepCopy(obj) {
+ var ret = {}, key, val;
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ val = obj[key];
+ if (typeof val === 'object' && val !== null) {
+ ret[key] = deepCopy(val);
+ } else {
+ ret[key] = val;
+ }
+ }
+ }
+ return ret;
+ }
+
+ function shallowCopy(obj) {
+ var ret = {}, key;
+ for (key in obj) {
+ if (obj.hasOwnProperty(key)) {
+ ret[key] = obj[key];
+ }
+ }
+ return ret;
+ }
+ ignoreJSHintError(shallowCopy);
+
+ // based on LLVM libc++ upper_bound / lower_bound
+ // MIT License
+
+ function upperBound(array, func) {
+ var diff, len, i, current;
+
+ len = array.length;
+ i = 0;
+
+ while (len) {
+ diff = len >>> 1;
+ current = i + diff;
+ if (func(array[current])) {
+ len = diff;
+ } else {
+ i = current + 1;
+ len -= diff + 1;
+ }
+ }
+ return i;
+ }
+
+ function lowerBound(array, func) {
+ var diff, len, i, current;
+
+ len = array.length;
+ i = 0;
+
+ while (len) {
+ diff = len >>> 1;
+ current = i + diff;
+ if (func(array[current])) {
+ i = current + 1;
+ len -= diff + 1;
+ } else {
+ len = diff;
+ }
+ }
+ return i;
+ }
+ ignoreJSHintError(lowerBound);
+
+ objectCreate = Object.create || (function () {
+ function F() { }
+
+ return function (o) {
+ F.prototype = o;
+ return new F();
+ };
+ })();
+
+ objectKeys = Object.keys || function (o) {
+ var keys = [], key;
+ for (key in o) {
+ keys.push(key);
+ }
+ return keys;
+ };
+
+ function extend(to, from) {
+ var keys = objectKeys(from), key, i, len;
+ for (i = 0, len = keys.length; i < len; i += 1) {
+ key = keys[i];
+ to[key] = from[key];
+ }
+ return to;
+ }
+
+ Syntax = {
+ AssignmentExpression: 'AssignmentExpression',
+ AssignmentPattern: 'AssignmentPattern',
+ ArrayExpression: 'ArrayExpression',
+ ArrayPattern: 'ArrayPattern',
+ ArrowFunctionExpression: 'ArrowFunctionExpression',
+ AwaitExpression: 'AwaitExpression', // CAUTION: It's deferred to ES7.
+ BlockStatement: 'BlockStatement',
+ BinaryExpression: 'BinaryExpression',
+ BreakStatement: 'BreakStatement',
+ CallExpression: 'CallExpression',
+ CatchClause: 'CatchClause',
+ ClassBody: 'ClassBody',
+ ClassDeclaration: 'ClassDeclaration',
+ ClassExpression: 'ClassExpression',
+ ComprehensionBlock: 'ComprehensionBlock', // CAUTION: It's deferred to ES7.
+ ComprehensionExpression: 'ComprehensionExpression', // CAUTION: It's deferred to ES7.
+ ConditionalExpression: 'ConditionalExpression',
+ ContinueStatement: 'ContinueStatement',
+ DebuggerStatement: 'DebuggerStatement',
+ DirectiveStatement: 'DirectiveStatement',
+ DoWhileStatement: 'DoWhileStatement',
+ EmptyStatement: 'EmptyStatement',
+ ExportAllDeclaration: 'ExportAllDeclaration',
+ ExportDefaultDeclaration: 'ExportDefaultDeclaration',
+ ExportNamedDeclaration: 'ExportNamedDeclaration',
+ ExportSpecifier: 'ExportSpecifier',
+ ExpressionStatement: 'ExpressionStatement',
+ ForStatement: 'ForStatement',
+ ForInStatement: 'ForInStatement',
+ ForOfStatement: 'ForOfStatement',
+ FunctionDeclaration: 'FunctionDeclaration',
+ FunctionExpression: 'FunctionExpression',
+ GeneratorExpression: 'GeneratorExpression', // CAUTION: It's deferred to ES7.
+ Identifier: 'Identifier',
+ IfStatement: 'IfStatement',
+ ImportDeclaration: 'ImportDeclaration',
+ ImportDefaultSpecifier: 'ImportDefaultSpecifier',
+ ImportNamespaceSpecifier: 'ImportNamespaceSpecifier',
+ ImportSpecifier: 'ImportSpecifier',
+ Literal: 'Literal',
+ LabeledStatement: 'LabeledStatement',
+ LogicalExpression: 'LogicalExpression',
+ MemberExpression: 'MemberExpression',
+ MetaProperty: 'MetaProperty',
+ MethodDefinition: 'MethodDefinition',
+ ModuleSpecifier: 'ModuleSpecifier',
+ NewExpression: 'NewExpression',
+ ObjectExpression: 'ObjectExpression',
+ ObjectPattern: 'ObjectPattern',
+ Program: 'Program',
+ Property: 'Property',
+ RestElement: 'RestElement',
+ ReturnStatement: 'ReturnStatement',
+ SequenceExpression: 'SequenceExpression',
+ SpreadElement: 'SpreadElement',
+ Super: 'Super',
+ SwitchStatement: 'SwitchStatement',
+ SwitchCase: 'SwitchCase',
+ TaggedTemplateExpression: 'TaggedTemplateExpression',
+ TemplateElement: 'TemplateElement',
+ TemplateLiteral: 'TemplateLiteral',
+ ThisExpression: 'ThisExpression',
+ ThrowStatement: 'ThrowStatement',
+ TryStatement: 'TryStatement',
+ UnaryExpression: 'UnaryExpression',
+ UpdateExpression: 'UpdateExpression',
+ VariableDeclaration: 'VariableDeclaration',
+ VariableDeclarator: 'VariableDeclarator',
+ WhileStatement: 'WhileStatement',
+ WithStatement: 'WithStatement',
+ YieldExpression: 'YieldExpression'
+ };
+
+ VisitorKeys = {
+ AssignmentExpression: ['left', 'right'],
+ AssignmentPattern: ['left', 'right'],
+ ArrayExpression: ['elements'],
+ ArrayPattern: ['elements'],
+ ArrowFunctionExpression: ['params', 'body'],
+ AwaitExpression: ['argument'], // CAUTION: It's deferred to ES7.
+ BlockStatement: ['body'],
+ BinaryExpression: ['left', 'right'],
+ BreakStatement: ['label'],
+ CallExpression: ['callee', 'arguments'],
+ CatchClause: ['param', 'body'],
+ ClassBody: ['body'],
+ ClassDeclaration: ['id', 'superClass', 'body'],
+ ClassExpression: ['id', 'superClass', 'body'],
+ ComprehensionBlock: ['left', 'right'], // CAUTION: It's deferred to ES7.
+ ComprehensionExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.
+ ConditionalExpression: ['test', 'consequent', 'alternate'],
+ ContinueStatement: ['label'],
+ DebuggerStatement: [],
+ DirectiveStatement: [],
+ DoWhileStatement: ['body', 'test'],
+ EmptyStatement: [],
+ ExportAllDeclaration: ['source'],
+ ExportDefaultDeclaration: ['declaration'],
+ ExportNamedDeclaration: ['declaration', 'specifiers', 'source'],
+ ExportSpecifier: ['exported', 'local'],
+ ExpressionStatement: ['expression'],
+ ForStatement: ['init', 'test', 'update', 'body'],
+ ForInStatement: ['left', 'right', 'body'],
+ ForOfStatement: ['left', 'right', 'body'],
+ FunctionDeclaration: ['id', 'params', 'body'],
+ FunctionExpression: ['id', 'params', 'body'],
+ GeneratorExpression: ['blocks', 'filter', 'body'], // CAUTION: It's deferred to ES7.
+ Identifier: [],
+ IfStatement: ['test', 'consequent', 'alternate'],
+ ImportDeclaration: ['specifiers', 'source'],
+ ImportDefaultSpecifier: ['local'],
+ ImportNamespaceSpecifier: ['local'],
+ ImportSpecifier: ['imported', 'local'],
+ Literal: [],
+ LabeledStatement: ['label', 'body'],
+ LogicalExpression: ['left', 'right'],
+ MemberExpression: ['object', 'property'],
+ MetaProperty: ['meta', 'property'],
+ MethodDefinition: ['key', 'value'],
+ ModuleSpecifier: [],
+ NewExpression: ['callee', 'arguments'],
+ ObjectExpression: ['properties'],
+ ObjectPattern: ['properties'],
+ Program: ['body'],
+ Property: ['key', 'value'],
+ RestElement: [ 'argument' ],
+ ReturnStatement: ['argument'],
+ SequenceExpression: ['expressions'],
+ SpreadElement: ['argument'],
+ Super: [],
+ SwitchStatement: ['discriminant', 'cases'],
+ SwitchCase: ['test', 'consequent'],
+ TaggedTemplateExpression: ['tag', 'quasi'],
+ TemplateElement: [],
+ TemplateLiteral: ['quasis', 'expressions'],
+ ThisExpression: [],
+ ThrowStatement: ['argument'],
+ TryStatement: ['block', 'handler', 'finalizer'],
+ UnaryExpression: ['argument'],
+ UpdateExpression: ['argument'],
+ VariableDeclaration: ['declarations'],
+ VariableDeclarator: ['id', 'init'],
+ WhileStatement: ['test', 'body'],
+ WithStatement: ['object', 'body'],
+ YieldExpression: ['argument']
+ };
+
+ // unique id
+ BREAK = {};
+ SKIP = {};
+ REMOVE = {};
+
+ VisitorOption = {
+ Break: BREAK,
+ Skip: SKIP,
+ Remove: REMOVE
+ };
+
+ function Reference(parent, key) {
+ this.parent = parent;
+ this.key = key;
+ }
+
+ Reference.prototype.replace = function replace(node) {
+ this.parent[this.key] = node;
+ };
+
+ Reference.prototype.remove = function remove() {
+ if (isArray(this.parent)) {
+ this.parent.splice(this.key, 1);
+ return true;
+ } else {
+ this.replace(null);
+ return false;
+ }
+ };
+
+ function Element(node, path, wrap, ref) {
+ this.node = node;
+ this.path = path;
+ this.wrap = wrap;
+ this.ref = ref;
+ }
+
+ function Controller() { }
+
+ // API:
+ // return property path array from root to current node
+ Controller.prototype.path = function path() {
+ var i, iz, j, jz, result, element;
+
+ function addToPath(result, path) {
+ if (isArray(path)) {
+ for (j = 0, jz = path.length; j < jz; ++j) {
+ result.push(path[j]);
+ }
+ } else {
+ result.push(path);
+ }
+ }
+
+ // root node
+ if (!this.__current.path) {
+ return null;
+ }
+
+ // first node is sentinel, second node is root element
+ result = [];
+ for (i = 2, iz = this.__leavelist.length; i < iz; ++i) {
+ element = this.__leavelist[i];
+ addToPath(result, element.path);
+ }
+ addToPath(result, this.__current.path);
+ return result;
+ };
+
+ // API:
+ // return type of current node
+ Controller.prototype.type = function () {
+ var node = this.current();
+ return node.type || this.__current.wrap;
+ };
+
+ // API:
+ // return array of parent elements
+ Controller.prototype.parents = function parents() {
+ var i, iz, result;
+
+ // first node is sentinel
+ result = [];
+ for (i = 1, iz = this.__leavelist.length; i < iz; ++i) {
+ result.push(this.__leavelist[i].node);
+ }
+
+ return result;
+ };
+
+ // API:
+ // return current node
+ Controller.prototype.current = function current() {
+ return this.__current.node;
+ };
+
+ Controller.prototype.__execute = function __execute(callback, element) {
+ var previous, result;
+
+ result = undefined;
+
+ previous = this.__current;
+ this.__current = element;
+ this.__state = null;
+ if (callback) {
+ result = callback.call(this, element.node, this.__leavelist[this.__leavelist.length - 1].node);
+ }
+ this.__current = previous;
+
+ return result;
+ };
+
+ // API:
+ // notify control skip / break
+ Controller.prototype.notify = function notify(flag) {
+ this.__state = flag;
+ };
+
+ // API:
+ // skip child nodes of current node
+ Controller.prototype.skip = function () {
+ this.notify(SKIP);
+ };
+
+ // API:
+ // break traversals
+ Controller.prototype['break'] = function () {
+ this.notify(BREAK);
+ };
+
+ // API:
+ // remove node
+ Controller.prototype.remove = function () {
+ this.notify(REMOVE);
+ };
+
+ Controller.prototype.__initialize = function(root, visitor) {
+ this.visitor = visitor;
+ this.root = root;
+ this.__worklist = [];
+ this.__leavelist = [];
+ this.__current = null;
+ this.__state = null;
+ this.__fallback = null;
+ if (visitor.fallback === 'iteration') {
+ this.__fallback = objectKeys;
+ } else if (typeof visitor.fallback === 'function') {
+ this.__fallback = visitor.fallback;
+ }
+
+ this.__keys = VisitorKeys;
+ if (visitor.keys) {
+ this.__keys = extend(objectCreate(this.__keys), visitor.keys);
+ }
+ };
+
+ function isNode(node) {
+ if (node == null) {
+ return false;
+ }
+ return typeof node === 'object' && typeof node.type === 'string';
+ }
+
+ function isProperty(nodeType, key) {
+ return (nodeType === Syntax.ObjectExpression || nodeType === Syntax.ObjectPattern) && 'properties' === key;
+ }
+
+ Controller.prototype.traverse = function traverse(root, visitor) {
+ var worklist,
+ leavelist,
+ element,
+ node,
+ nodeType,
+ ret,
+ key,
+ current,
+ current2,
+ candidates,
+ candidate,
+ sentinel;
+
+ this.__initialize(root, visitor);
+
+ sentinel = {};
+
+ // reference
+ worklist = this.__worklist;
+ leavelist = this.__leavelist;
+
+ // initialize
+ worklist.push(new Element(root, null, null, null));
+ leavelist.push(new Element(null, null, null, null));
+
+ while (worklist.length) {
+ element = worklist.pop();
+
+ if (element === sentinel) {
+ element = leavelist.pop();
+
+ ret = this.__execute(visitor.leave, element);
+
+ if (this.__state === BREAK || ret === BREAK) {
+ return;
+ }
+ continue;
+ }
+
+ if (element.node) {
+
+ ret = this.__execute(visitor.enter, element);
+
+ if (this.__state === BREAK || ret === BREAK) {
+ return;
+ }
+
+ worklist.push(sentinel);
+ leavelist.push(element);
+
+ if (this.__state === SKIP || ret === SKIP) {
+ continue;
+ }
+
+ node = element.node;
+ nodeType = node.type || element.wrap;
+ candidates = this.__keys[nodeType];
+ if (!candidates) {
+ if (this.__fallback) {
+ candidates = this.__fallback(node);
+ } else {
+ throw new Error('Unknown node type ' + nodeType + '.');
+ }
+ }
+
+ current = candidates.length;
+ while ((current -= 1) >= 0) {
+ key = candidates[current];
+ candidate = node[key];
+ if (!candidate) {
+ continue;
+ }
+
+ if (isArray(candidate)) {
+ current2 = candidate.length;
+ while ((current2 -= 1) >= 0) {
+ if (!candidate[current2]) {
+ continue;
+ }
+ if (isProperty(nodeType, candidates[current])) {
+ element = new Element(candidate[current2], [key, current2], 'Property', null);
+ } else if (isNode(candidate[current2])) {
+ element = new Element(candidate[current2], [key, current2], null, null);
+ } else {
+ continue;
+ }
+ worklist.push(element);
+ }
+ } else if (isNode(candidate)) {
+ worklist.push(new Element(candidate, key, null, null));
+ }
+ }
+ }
+ }
+ };
+
+ Controller.prototype.replace = function replace(root, visitor) {
+ var worklist,
+ leavelist,
+ node,
+ nodeType,
+ target,
+ element,
+ current,
+ current2,
+ candidates,
+ candidate,
+ sentinel,
+ outer,
+ key;
+
+ function removeElem(element) {
+ var i,
+ key,
+ nextElem,
+ parent;
+
+ if (element.ref.remove()) {
+ // When the reference is an element of an array.
+ key = element.ref.key;
+ parent = element.ref.parent;
+
+ // If removed from array, then decrease following items' keys.
+ i = worklist.length;
+ while (i--) {
+ nextElem = worklist[i];
+ if (nextElem.ref && nextElem.ref.parent === parent) {
+ if (nextElem.ref.key < key) {
+ break;
+ }
+ --nextElem.ref.key;
+ }
+ }
+ }
+ }
+
+ this.__initialize(root, visitor);
+
+ sentinel = {};
+
+ // reference
+ worklist = this.__worklist;
+ leavelist = this.__leavelist;
+
+ // initialize
+ outer = {
+ root: root
+ };
+ element = new Element(root, null, null, new Reference(outer, 'root'));
+ worklist.push(element);
+ leavelist.push(element);
+
+ while (worklist.length) {
+ element = worklist.pop();
+
+ if (element === sentinel) {
+ element = leavelist.pop();
+
+ target = this.__execute(visitor.leave, element);
+
+ // node may be replaced with null,
+ // so distinguish between undefined and null in this place
+ if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
+ // replace
+ element.ref.replace(target);
+ }
+
+ if (this.__state === REMOVE || target === REMOVE) {
+ removeElem(element);
+ }
+
+ if (this.__state === BREAK || target === BREAK) {
+ return outer.root;
+ }
+ continue;
+ }
+
+ target = this.__execute(visitor.enter, element);
+
+ // node may be replaced with null,
+ // so distinguish between undefined and null in this place
+ if (target !== undefined && target !== BREAK && target !== SKIP && target !== REMOVE) {
+ // replace
+ element.ref.replace(target);
+ element.node = target;
+ }
+
+ if (this.__state === REMOVE || target === REMOVE) {
+ removeElem(element);
+ element.node = null;
+ }
+
+ if (this.__state === BREAK || target === BREAK) {
+ return outer.root;
+ }
+
+ // node may be null
+ node = element.node;
+ if (!node) {
+ continue;
+ }
+
+ worklist.push(sentinel);
+ leavelist.push(element);
+
+ if (this.__state === SKIP || target === SKIP) {
+ continue;
+ }
+
+ nodeType = node.type || element.wrap;
+ candidates = this.__keys[nodeType];
+ if (!candidates) {
+ if (this.__fallback) {
+ candidates = this.__fallback(node);
+ } else {
+ throw new Error('Unknown node type ' + nodeType + '.');
+ }
+ }
+
+ current = candidates.length;
+ while ((current -= 1) >= 0) {
+ key = candidates[current];
+ candidate = node[key];
+ if (!candidate) {
+ continue;
+ }
+
+ if (isArray(candidate)) {
+ current2 = candidate.length;
+ while ((current2 -= 1) >= 0) {
+ if (!candidate[current2]) {
+ continue;
+ }
+ if (isProperty(nodeType, candidates[current])) {
+ element = new Element(candidate[current2], [key, current2], 'Property', new Reference(candidate, current2));
+ } else if (isNode(candidate[current2])) {
+ element = new Element(candidate[current2], [key, current2], null, new Reference(candidate, current2));
+ } else {
+ continue;
+ }
+ worklist.push(element);
+ }
+ } else if (isNode(candidate)) {
+ worklist.push(new Element(candidate, key, null, new Reference(node, key)));
+ }
+ }
+ }
+
+ return outer.root;
+ };
+
+ function traverse(root, visitor) {
+ var controller = new Controller();
+ return controller.traverse(root, visitor);
+ }
+
+ function replace(root, visitor) {
+ var controller = new Controller();
+ return controller.replace(root, visitor);
+ }
+
+ function extendCommentRange(comment, tokens) {
+ var target;
+
+ target = upperBound(tokens, function search(token) {
+ return token.range[0] > comment.range[0];
+ });
+
+ comment.extendedRange = [comment.range[0], comment.range[1]];
+
+ if (target !== tokens.length) {
+ comment.extendedRange[1] = tokens[target].range[0];
+ }
+
+ target -= 1;
+ if (target >= 0) {
+ comment.extendedRange[0] = tokens[target].range[1];
+ }
+
+ return comment;
+ }
+
+ function attachComments(tree, providedComments, tokens) {
+ // At first, we should calculate extended comment ranges.
+ var comments = [], comment, len, i, cursor;
+
+ if (!tree.range) {
+ throw new Error('attachComments needs range information');
+ }
+
+ // tokens array is empty, we attach comments to tree as 'leadingComments'
+ if (!tokens.length) {
+ if (providedComments.length) {
+ for (i = 0, len = providedComments.length; i < len; i += 1) {
+ comment = deepCopy(providedComments[i]);
+ comment.extendedRange = [0, tree.range[0]];
+ comments.push(comment);
+ }
+ tree.leadingComments = comments;
+ }
+ return tree;
+ }
+
+ for (i = 0, len = providedComments.length; i < len; i += 1) {
+ comments.push(extendCommentRange(deepCopy(providedComments[i]), tokens));
+ }
+
+ // This is based on John Freeman's implementation.
+ cursor = 0;
+ traverse(tree, {
+ enter: function (node) {
+ var comment;
+
+ while (cursor < comments.length) {
+ comment = comments[cursor];
+ if (comment.extendedRange[1] > node.range[0]) {
+ break;
+ }
+
+ if (comment.extendedRange[1] === node.range[0]) {
+ if (!node.leadingComments) {
+ node.leadingComments = [];
+ }
+ node.leadingComments.push(comment);
+ comments.splice(cursor, 1);
+ } else {
+ cursor += 1;
+ }
+ }
+
+ // already out of owned node
+ if (cursor === comments.length) {
+ return VisitorOption.Break;
+ }
+
+ if (comments[cursor].extendedRange[0] > node.range[1]) {
+ return VisitorOption.Skip;
+ }
+ }
+ });
+
+ cursor = 0;
+ traverse(tree, {
+ leave: function (node) {
+ var comment;
+
+ while (cursor < comments.length) {
+ comment = comments[cursor];
+ if (node.range[1] < comment.extendedRange[0]) {
+ break;
+ }
+
+ if (node.range[1] === comment.extendedRange[0]) {
+ if (!node.trailingComments) {
+ node.trailingComments = [];
+ }
+ node.trailingComments.push(comment);
+ comments.splice(cursor, 1);
+ } else {
+ cursor += 1;
+ }
+ }
+
+ // already out of owned node
+ if (cursor === comments.length) {
+ return VisitorOption.Break;
+ }
+
+ if (comments[cursor].extendedRange[0] > node.range[1]) {
+ return VisitorOption.Skip;
+ }
+ }
+ });
+
+ return tree;
+ }
+
+ exports.version = _dereq_('./package.json').version;
+ exports.Syntax = Syntax;
+ exports.traverse = traverse;
+ exports.replace = replace;
+ exports.attachComments = attachComments;
+ exports.VisitorKeys = VisitorKeys;
+ exports.VisitorOption = VisitorOption;
+ exports.Controller = Controller;
+ exports.cloneEnvironment = function () { return clone({}); };
+
+ return exports;
+}(exports));
+/* vim: set sw=4 ts=4 et tw=80 : */
+
+},{"./package.json":68}],68:[function(_dereq_,module,exports){
+module.exports={"name":"estraverse","version":"4.2.0"}
+},{}]},{},[1])(1)
+});
diff --git a/node_modules/call-matcher/index.js b/node_modules/call-matcher/index.js
new file mode 100644
index 000000000..24163e354
--- /dev/null
+++ b/node_modules/call-matcher/index.js
@@ -0,0 +1,195 @@
+/**
+ * call-matcher:
+ * ECMAScript CallExpression matcher made from function/method signature
+ *
+ * https://github.com/twada/call-matcher
+ *
+ * Copyright (c) 2015-2016 Takuto Wada
+ * Licensed under the MIT license.
+ * https://github.com/twada/call-matcher/blob/master/MIT-LICENSE.txt
+ */
+'use strict';
+/* jshint -W024 */
+
+var estraverse = require('estraverse');
+var espurify = require('espurify');
+var syntax = estraverse.Syntax;
+var hasOwn = Object.prototype.hasOwnProperty;
+var forEach = require('core-js/library/fn/array/for-each');
+var map = require('core-js/library/fn/array/map');
+var filter = require('core-js/library/fn/array/filter');
+var reduce = require('core-js/library/fn/array/reduce');
+var indexOf = require('core-js/library/fn/array/index-of');
+var deepEqual = require('deep-equal');
+var notCallExprMessage = 'Argument should be in the form of CallExpression';
+var duplicatedArgMessage = 'Duplicate argument name: ';
+var invalidFormMessage = 'Argument should be in the form of `name` or `[name]`';
+
+function CallMatcher (signatureAst, options) {
+ validateApiExpression(signatureAst);
+ options = options || {};
+ this.visitorKeys = options.visitorKeys || estraverse.VisitorKeys;
+ if (options.astWhiteList) {
+ this.purifyAst = espurify.cloneWithWhitelist(options.astWhiteList);
+ } else {
+ this.purifyAst = espurify;
+ }
+ this.signatureAst = signatureAst;
+ this.signatureCalleeDepth = astDepth(signatureAst.callee, this.visitorKeys);
+ this.numMaxArgs = this.signatureAst.arguments.length;
+ this.numMinArgs = filter(this.signatureAst.arguments, identifiers).length;
+}
+
+CallMatcher.prototype.test = function (currentNode) {
+ var calleeMatched = this.isCalleeMatched(currentNode);
+ var numArgs;
+ if (calleeMatched) {
+ numArgs = currentNode.arguments.length;
+ return this.numMinArgs <= numArgs && numArgs <= this.numMaxArgs;
+ }
+ return false;
+};
+
+CallMatcher.prototype.matchArgument = function (currentNode, parentNode) {
+ if (isCalleeOfParent(currentNode, parentNode)) {
+ return null;
+ }
+ if (this.test(parentNode)) {
+ var indexOfCurrentArg = indexOf(parentNode.arguments, currentNode);
+ var numOptional = parentNode.arguments.length - this.numMinArgs;
+ var matchedSignatures = reduce(this.argumentSignatures(), function (accum, argSig) {
+ if (argSig.kind === 'mandatory') {
+ accum.push(argSig);
+ }
+ if (argSig.kind === 'optional' && 0 < numOptional) {
+ numOptional -= 1;
+ accum.push(argSig);
+ }
+ return accum;
+ }, []);
+ return matchedSignatures[indexOfCurrentArg];
+ }
+ return null;
+};
+
+CallMatcher.prototype.calleeAst = function () {
+ return this.purifyAst(this.signatureAst.callee);
+};
+
+CallMatcher.prototype.argumentSignatures = function () {
+ return map(this.signatureAst.arguments, toArgumentSignature);
+};
+
+CallMatcher.prototype.isCalleeMatched = function (node) {
+ if (!isCallExpression(node)) {
+ return false;
+ }
+ if (!this.isSameDepthAsSignatureCallee(node.callee)) {
+ return false;
+ }
+ return deepEqual(this.purifyAst(this.signatureAst.callee), this.purifyAst(node.callee));
+};
+
+CallMatcher.prototype.isSameDepthAsSignatureCallee = function (ast) {
+ var depth = this.signatureCalleeDepth;
+ var currentDepth = 0;
+ estraverse.traverse(ast, {
+ keys: this.visitorKeys,
+ enter: function (currentNode, parentNode) {
+ var path = this.path();
+ var pathDepth = path ? path.length : 0;
+ if (currentDepth < pathDepth) {
+ currentDepth = pathDepth;
+ }
+ if (depth < currentDepth) {
+ this['break']();
+ }
+ }
+ });
+ return (depth === currentDepth);
+};
+
+function toArgumentSignature (argSignatureNode) {
+ switch(argSignatureNode.type) {
+ case syntax.Identifier:
+ return {
+ name: argSignatureNode.name,
+ kind: 'mandatory'
+ };
+ case syntax.ArrayExpression:
+ return {
+ name: argSignatureNode.elements[0].name,
+ kind: 'optional'
+ };
+ default:
+ return null;
+ }
+}
+
+function astDepth (ast, visitorKeys) {
+ var maxDepth = 0;
+ estraverse.traverse(ast, {
+ keys: visitorKeys,
+ enter: function (currentNode, parentNode) {
+ var path = this.path();
+ var pathDepth = path ? path.length : 0;
+ if (maxDepth < pathDepth) {
+ maxDepth = pathDepth;
+ }
+ }
+ });
+ return maxDepth;
+}
+
+function isCallExpression (node) {
+ return node && node.type === syntax.CallExpression;
+}
+
+function isCalleeOfParent(currentNode, parentNode) {
+ return parentNode && currentNode &&
+ parentNode.type === syntax.CallExpression &&
+ parentNode.callee === currentNode;
+}
+
+function identifiers (node) {
+ return node.type === syntax.Identifier;
+}
+
+function validateApiExpression (callExpression) {
+ if (!callExpression || !callExpression.type) {
+ throw new Error(notCallExprMessage);
+ }
+ if (callExpression.type !== syntax.CallExpression) {
+ throw new Error(notCallExprMessage);
+ }
+ var names = {};
+ forEach(callExpression.arguments, function (arg) {
+ var name = validateArg(arg);
+ if (hasOwn.call(names, name)) {
+ throw new Error(duplicatedArgMessage + name);
+ } else {
+ names[name] = name;
+ }
+ });
+}
+
+function validateArg (arg) {
+ var inner;
+ switch(arg.type) {
+ case syntax.Identifier:
+ return arg.name;
+ case syntax.ArrayExpression:
+ if (arg.elements.length !== 1) {
+ throw new Error(invalidFormMessage);
+ }
+ inner = arg.elements[0];
+ if (inner.type !== syntax.Identifier) {
+ throw new Error(invalidFormMessage);
+ }
+ return inner.name;
+ default:
+ throw new Error(invalidFormMessage);
+ }
+}
+
+module.exports = CallMatcher;
diff --git a/node_modules/call-matcher/package.json b/node_modules/call-matcher/package.json
new file mode 100644
index 000000000..f4d392f1d
--- /dev/null
+++ b/node_modules/call-matcher/package.json
@@ -0,0 +1,55 @@
+{
+ "name": "call-matcher",
+ "description": "ECMAScript CallExpression matcher made from function/method signature",
+ "version": "1.0.1",
+ "author": {
+ "name": "Takuto Wada",
+ "email": "takuto.wada@gmail.com",
+ "url": "https://github.com/twada"
+ },
+ "bugs": "https://github.com/twada/call-matcher/issues",
+ "dependencies": {
+ "core-js": "^2.0.0",
+ "deep-equal": "^1.0.0",
+ "espurify": "^1.6.0",
+ "estraverse": "^4.0.0"
+ },
+ "devDependencies": {
+ "babel-types": "^6.3.21",
+ "babylon": "^6.3.21",
+ "browserify": "^13.0.0",
+ "derequire": "^2.0.2",
+ "dereserve": "^1.0.0",
+ "esprima": "^3.0.0",
+ "jshint": "^2.8.0",
+ "licensify": "^3.1.1",
+ "mocha": "^3.0.0",
+ "package-json-filterify": "^1.0.4"
+ },
+ "files": [
+ "CHANGELOG.md",
+ "MIT-LICENSE.txt",
+ "README.md",
+ "index.js",
+ "dist/call-matcher.js"
+ ],
+ "homepage": "https://github.com/twada/call-matcher",
+ "keywords": [
+ "ast",
+ "estree",
+ "ecmascript"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "repository": {
+ "type": "git",
+ "url": "git://github.com/twada/call-matcher.git"
+ },
+ "scripts": {
+ "dist": "mkdir -p dist && browserify index.js --plugin licensify --global-transform package-json-filterify --standalone CallMatcher | dereserve | derequire > ./dist/call-matcher.js",
+ "lint": "jshint index.js",
+ "preversion": "npm test",
+ "test": "npm run lint && mocha test",
+ "version": "npm run dist && git add -A dist"
+ }
+}