Comparing version 0.1.1 to 0.2.0
478
index.js
@@ -8,3 +8,5 @@ /** | ||
, escodegen = require('escodegen') | ||
, util = require('util'); | ||
, path = require('path') | ||
, util = require('util') | ||
, support = require('./support'); | ||
@@ -28,90 +30,149 @@ | ||
*/ | ||
module.exports = function (file) { | ||
module.exports = function (file, options) { | ||
var data = ''; | ||
var ext = path.extname(file); | ||
options = options || {}; | ||
var stream = through(write, end); | ||
return stream; | ||
function write(buf) { data += buf } | ||
function end() { | ||
var ast = esprima.parse(data) | ||
var ast | ||
, tast | ||
, isAMD = false; | ||
//console.log('-- ORIGINAL AST --'); | ||
//console.log(util.inspect(ast, false, null)); | ||
//console.log('------------------'); | ||
// TODO: Ensure that define is a free variable. | ||
// TODO: Implement support for amdWeb UMD modules. | ||
estraverse.replace(ast, { | ||
enter: function(node) { | ||
if (isDefine(node)) { | ||
var parents = this.parents(); | ||
// Check that this module is an AMD module, as evidenced by invoking | ||
// `define` at the top-level. Any CommonJS or UMD modules are pass | ||
// through unmodified. | ||
if (parents.length == 2 && parents[0].type == 'Program' && parents[1].type == 'ExpressionStatement') { | ||
isAMD = true; | ||
, isAMD = false | ||
, isUMD = false | ||
, supportsCommonJs = false; | ||
if (ext.toLowerCase() === '.js') { | ||
try { | ||
ast = esprima.parse(data) | ||
} catch (error) { | ||
throw new Error('Error deamdifying ' + file + ': ' + error); | ||
} | ||
//console.log('-- ORIGINAL AST --'); | ||
//console.log(util.inspect(ast, false, null)); | ||
//console.log('------------------'); | ||
// TODO: Ensure that define is a free variable. | ||
estraverse.replace(ast, { | ||
enter: function(node) { | ||
if (isCommonJsCheck(node)) { | ||
supportsCommonJs = true; | ||
} | ||
} | ||
}, | ||
leave: function(node) { | ||
if (isDefine(node)) { | ||
if (node.arguments.length == 1 && node.arguments[0].type == 'FunctionExpression') { | ||
var factory = node.arguments[0]; | ||
if (factory.params.length == 0) { | ||
tast = createProgram(factory.body.body); | ||
else if (!supportsCommonJs && isAMDCheck(node)) { | ||
node.test = { type: 'Literal', value: true, raw: 'true' }; | ||
node.alternate = null; | ||
isUMD = true; | ||
} | ||
else if (isDefine(node) || isAMDRequire(node)) { | ||
if (isUMD) { | ||
isAMD = true; | ||
return; | ||
} | ||
var parents = this.parents(); | ||
// Check that this module is an AMD module, as evidenced by invoking | ||
// `define` or `require([], fn)` at the top-level. Any CommonJS or | ||
// UMD modules are pass through unmodified.` | ||
if (parents.length == 2 && parents[0].type == 'Program' && parents[1].type == 'ExpressionStatement') { | ||
isAMD = true; | ||
} | ||
} | ||
}, | ||
leave: function(node) { | ||
if (isAMD && (isDefine(node) || isAMDRequire(node))) { | ||
//define({}) | ||
if (node.arguments.length == 1 && | ||
node.arguments[0].type == 'ObjectExpression') { | ||
// object literal | ||
var obj = node.arguments[0]; | ||
tast = generateCommonJsModuleForObject(obj); | ||
this.break(); | ||
} else if (factory.params.length > 0) { | ||
// simplified CommonJS wrapper | ||
tast = createProgram(factory.body.body); | ||
} else | ||
//define(function(){}) | ||
if (node.arguments.length == 1 && | ||
node.arguments[0].type == 'FunctionExpression') { | ||
var dependenciesIds = extractDependencyIdsFromFactory(node.arguments[0]), | ||
factory = node.arguments[0]; | ||
tast = generateCommonJsModuleForFactory(dependenciesIds, factory); | ||
this.break(); | ||
} else | ||
//define(variableName) | ||
if (node.arguments.length == 1 && | ||
node.arguments[0].type == 'Identifier') { | ||
// reference | ||
var obj = node.arguments[0]; | ||
return generateCommonJsModuleForObject(obj).expression; | ||
} else | ||
//define([],function(){}) | ||
if (node.arguments.length == 2 && | ||
node.arguments[0].type == 'ArrayExpression' && | ||
node.arguments[1].type == 'FunctionExpression') { | ||
var dependenciesIds = extractDependencyIdsFromArrayExpression(node.arguments[0], options.paths) | ||
, factory = node.arguments[1]; | ||
tast = generateCommonJsModuleForFactory(dependenciesIds, factory); | ||
this.break(); | ||
} else | ||
//define("a b c".split(' '), function(){}) | ||
if (node.arguments.length == 2 && | ||
node.arguments[0].type == 'CallExpression' && | ||
node.arguments[1].type == 'FunctionExpression') { | ||
try { | ||
var dependenciesCode = node.arguments[0] | ||
, dependenciesIds = extractDependencyIdsFromCallExpression(dependenciesCode, options.paths) | ||
, factory = node.arguments[1]; | ||
tast = generateCommonJsModuleForFactory(dependenciesIds, factory); | ||
this.break(); | ||
} catch(e) { | ||
console.log("failed to evaluate dependencies:", dependenciesCode, e) | ||
} | ||
} else | ||
//define('modulename',function(){}) | ||
if (node.arguments.length == 2 && | ||
node.arguments[0].type == 'Literal' && | ||
node.arguments[1].type == 'FunctionExpression') { | ||
var dependenciesIds = extractDependencyIdsFromFactory(node.arguments[1]) | ||
, factory = node.arguments[1]; | ||
tast = generateCommonJsModuleForFactory(dependenciesIds, factory); | ||
this.break(); | ||
} else | ||
//define('modulename', [], function(){}) | ||
if (node.arguments.length == 3 && | ||
node.arguments[0].type == 'Literal' && | ||
node.arguments[1].type == 'ArrayExpression' && | ||
node.arguments[2].type == 'FunctionExpression') { | ||
var dependenciesIds = extractDependencyIdsFromArrayExpression(node.arguments[1], options.paths) | ||
, factory = node.arguments[2]; | ||
tast = generateCommonJsModuleForFactory(dependenciesIds, factory); | ||
this.break(); | ||
} else | ||
//define('modulename', "a b c".split(' '), function(){}) | ||
if (node.arguments.length == 3 && | ||
node.arguments[0].type == 'Literal' && | ||
node.arguments[1].type == 'CallExpression' && | ||
node.arguments[2].type == 'FunctionExpression') { | ||
try { | ||
var dependenciesCode = node.arguments[1] | ||
, dependenciesIds = extractDependencyIdsFromCallExpression(dependenciesCode, options.paths) | ||
, factory = node.arguments[2]; | ||
tast = generateCommonJsModuleForFactory(dependenciesIds, factory); | ||
this.break(); | ||
} catch(e) { | ||
console.log("failed to evaluate dependencies:", dependenciesCode, e) | ||
} | ||
} | ||
} else if (node.arguments.length == 1 && node.arguments[0].type == 'ObjectExpression') { | ||
// object literal | ||
var obj = node.arguments[0]; | ||
tast = createModuleExport(obj); | ||
this.break(); | ||
} else if (node.arguments.length == 2 && node.arguments[0].type == 'ArrayExpression' && node.arguments[1].type == 'FunctionExpression') { | ||
var dependencies = node.arguments[0] | ||
, factory = node.arguments[1]; | ||
var ids = dependencies.elements.map(function(el) { return el.value }); | ||
var vars = factory.params.map(function(el) { return el.name }); | ||
var reqs = createRequires(ids, vars); | ||
if (reqs) { | ||
tast = createProgram([reqs].concat(factory.body.body)); | ||
} else { | ||
tast = createProgram(factory.body.body); | ||
} | ||
this.break(); | ||
} else if (node.arguments.length == 3 && node.arguments[0].type == 'Literal' && node.arguments[1].type == 'ArrayExpression' && node.arguments[2].type == 'FunctionExpression') { | ||
var dependencies = node.arguments[1] | ||
, factory = node.arguments[2]; | ||
var ids = dependencies.elements.map(function(el) { return el.value }); | ||
var vars = factory.params.map(function(el) { return el.name }); | ||
var reqs = createRequires(ids, vars); | ||
if (reqs) { | ||
tast = createProgram([reqs].concat(factory.body.body)); | ||
} else { | ||
tast = createProgram(factory.body.body); | ||
} | ||
this.break(); | ||
} | ||
} else if (isReturn(node)) { | ||
var parents = this.parents(); | ||
if (parents.length == 5 && isDefine(parents[2]) && isAMD) { | ||
return createModuleExport(node.argument); | ||
} | ||
} | ||
} | ||
}); | ||
}); | ||
} | ||
if (!isAMD) { | ||
@@ -122,9 +183,9 @@ stream.queue(data); | ||
} | ||
tast = tast || ast; | ||
//console.log('-- TRANSFORMED AST --'); | ||
//console.log(util.inspect(tast, false, null)); | ||
//console.log('---------------------'); | ||
var out = escodegen.generate(tast); | ||
@@ -136,3 +197,175 @@ stream.queue(out); | ||
function generateCommonJsModuleForObject(obj) { | ||
return { type: 'ExpressionStatement', | ||
expression: | ||
{ type: 'AssignmentExpression', | ||
operator: '=', | ||
left: | ||
{ type: 'MemberExpression', | ||
computed: false, | ||
object: { type: 'Identifier', name: 'module' }, | ||
property: { type: 'Identifier', name: 'exports' } }, | ||
right: obj } }; | ||
} | ||
function extractDependencyIdsFromArrayExpression(dependencies, paths) { | ||
return dependencies.elements.map(function(el) { return rewriteRequire(el.value, paths); }); | ||
} | ||
function extractDependencyIdsFromCallExpression(callExpression, paths) { | ||
var ids = eval(escodegen.generate(callExpression)); | ||
return ids.map(function(id) { return rewriteRequire(id, paths); }); | ||
} | ||
function rewriteRequire(path, paths) { | ||
var parts = path.split("/"); | ||
var module = parts[0]; | ||
if(paths && module in paths) { | ||
var rest = parts.slice(1, parts.length); | ||
var rewrittenModule = paths[module]; | ||
return [rewrittenModule].concat(rest).join("/") | ||
} else { | ||
return path; | ||
} | ||
} | ||
function extractDependencyIdsFromFactory(factory) { | ||
var parameters = factory.params.map(function(param){ | ||
if(param.type === 'Identifier') { | ||
return param.name; | ||
} | ||
}); | ||
if(isCommonJsWrappingParameters(parameters)) { | ||
return []; | ||
} else { | ||
return commonJsSpecialDependencies.slice(0, parameters.length); | ||
} | ||
} | ||
function isCommonJsWrappingParameters(parameters) { | ||
return parameters.length === commonJsSpecialDependencies.length | ||
&& parameters[0] === commonJsSpecialDependencies[0] | ||
&& parameters[1] === commonJsSpecialDependencies[1] | ||
&& parameters[2] === commonJsSpecialDependencies[2]; | ||
} | ||
function generateCommonJsModuleForFactory(dependenciesIds, factory) { | ||
var program, | ||
exportResult = support.doesFactoryHaveReturn(factory); | ||
if(dependenciesIds.length === 0 && !exportResult) { | ||
program = factory.body.body; | ||
} else { | ||
var importExpressions = []; | ||
//build imports | ||
var imports; | ||
if(dependenciesIds.length > 0) { | ||
buildDependencyExpressions(dependenciesIds).forEach(function(expressions){ | ||
importExpressions.push(expressions.importExpression); | ||
}); | ||
} | ||
var callFactoryWithImports = { | ||
"type": "CallExpression", | ||
"callee": factory, | ||
"arguments": importExpressions | ||
}; | ||
var body; | ||
if(exportResult) { | ||
//wrap with assignment | ||
body = { | ||
"type": "ExpressionStatement", | ||
"expression":{ | ||
"type": "AssignmentExpression", | ||
"operator": "=", | ||
"left": { | ||
"type": "MemberExpression", | ||
"computed": false, | ||
"object": { | ||
"type": "Identifier", | ||
"name": "module" | ||
}, | ||
"property": { | ||
"type": "Identifier", | ||
"name": "exports" | ||
} | ||
}, | ||
"right": callFactoryWithImports | ||
} | ||
}; | ||
} else { | ||
body = { | ||
"type": "ExpressionStatement", | ||
"expression": callFactoryWithImports | ||
}; | ||
} | ||
//program | ||
program = [body]; | ||
} | ||
return { type: 'Program', | ||
body: program }; | ||
} | ||
//NOTE: this is the order as specified in RequireJS docs; don't changes | ||
var commonJsSpecialDependencies = ['require', 'exports', 'module']; | ||
function commonJsSpecialDependencyExpressionBuilder(dependencyId) { | ||
if(commonJsSpecialDependencies.indexOf(dependencyId) !== -1) { | ||
return {importExpression:{ | ||
"type": "Identifier", | ||
"name": dependencyId | ||
} | ||
}; | ||
} | ||
} | ||
function defaultRequireDependencyExpressionBuilder(dependencyId) { | ||
return {importExpression: { | ||
"type": "CallExpression", | ||
"callee": { | ||
"type": "Identifier", | ||
"name": "require" | ||
}, | ||
"arguments": [ | ||
{ | ||
"type": "Literal", | ||
"value": dependencyId | ||
} | ||
] | ||
}}; | ||
} | ||
function buildDependencyExpressions(dependencyIdList) { | ||
var dependencyExpressionBuilders = [ | ||
commonJsSpecialDependencyExpressionBuilder, | ||
defaultRequireDependencyExpressionBuilder | ||
]; | ||
return dependencyIdList.map(function(dependencyId){ | ||
return dependencyExpressionBuilders.reduce(function(currentExpression, builder){ | ||
return currentExpression || builder(dependencyId); | ||
}, null); | ||
}); | ||
} | ||
function buildVariableDeclaration(imports, loader) { | ||
var declarations = []; | ||
if (imports) { | ||
declarations.push(imports); | ||
} | ||
declarations.push(loader); | ||
return { | ||
"type": "VariableDeclaration", | ||
"declarations": declarations, | ||
"kind": "var" | ||
}; | ||
} | ||
function isDefine(node) { | ||
@@ -147,43 +380,58 @@ var callee = node.callee; | ||
function isReturn(node) { | ||
return node.type == 'ReturnStatement'; | ||
} | ||
function isCommonJsCheck(node) { | ||
if (typeof exports === 'object') | ||
return node.type === 'IfStatement' && | ||
isTypeCheck(node.test); | ||
function createProgram(body) { | ||
return { type: 'Program', | ||
body: body }; | ||
function isTypeCheck(node) { | ||
return node.type === 'BinaryExpression' && | ||
(node.operator === '===' || node.operator === '==') && | ||
isTypeof(node.left) && | ||
node.right.type === 'Literal' && | ||
node.right.value === 'object'; | ||
} | ||
function isTypeof(node) { | ||
return node.type === 'UnaryExpression' && | ||
node.operator === 'typeof' && | ||
node.argument.type === 'Identifier' && | ||
node.argument.name === 'exports'; | ||
} | ||
} | ||
function createRequires(ids, vars) { | ||
var decls = []; | ||
for (var i = 0, len = ids.length; i < len; ++i) { | ||
if (['require', 'module', 'exports'].indexOf(ids[i]) != -1) { continue; } | ||
decls.push({ type: 'VariableDeclarator', | ||
id: { type: 'Identifier', name: vars[i] }, | ||
init: | ||
{ type: 'CallExpression', | ||
callee: { type: 'Identifier', name: 'require' }, | ||
arguments: [ { type: 'Literal', value: ids[i] } ] } }); | ||
function isAMDCheck(node) { | ||
return node.type === 'IfStatement' && | ||
node.test.type === 'LogicalExpression' && | ||
isTypeCheck(node.test.left) && | ||
isAmdPropertyCheck(node.test.right); | ||
function isTypeCheck(node) { | ||
return node.type === 'BinaryExpression' && | ||
(node.operator === '===' || node.operator === '==') && | ||
isTypeof(node.left) && | ||
node.right.type === 'Literal' && | ||
node.right.value === 'function'; | ||
} | ||
if (decls.length == 0) { return null; } | ||
return { type: 'VariableDeclaration', | ||
declarations: decls, | ||
kind: 'var' }; | ||
function isTypeof(node) { | ||
return node.type === 'UnaryExpression' && | ||
node.operator === 'typeof' && | ||
node.argument.type === 'Identifier' && | ||
node.argument.name === 'define'; | ||
} | ||
function isAmdPropertyCheck(node) { | ||
return node.type === 'MemberExpression' && | ||
node.object.name === 'define' && | ||
node.property.name === 'amd'; | ||
} | ||
} | ||
function createModuleExport(obj) { | ||
return { type: 'ExpressionStatement', | ||
expression: | ||
{ type: 'AssignmentExpression', | ||
operator: '=', | ||
left: | ||
{ type: 'MemberExpression', | ||
computed: false, | ||
object: { type: 'Identifier', name: 'module' }, | ||
property: { type: 'Identifier', name: 'exports' } }, | ||
right: obj } }; | ||
function isAMDRequire(node) { | ||
var callee = node.callee; | ||
return callee | ||
&& node.type == 'CallExpression' | ||
&& callee.type == 'Identifier' | ||
&& callee.name == 'require' | ||
; | ||
} |
{ | ||
"name": "deamdify", | ||
"version": "0.1.1", | ||
"version": "0.2.0", | ||
"description": "Browserify transform that converts AMD to CommonJS.", | ||
@@ -31,13 +31,18 @@ "keywords": [ | ||
"dependencies": { | ||
"through": "2.x.x", | ||
"esprima": "1.x.x", | ||
"estraverse": "1.x.x", | ||
"escodegen": "0.0.x" | ||
"through": "^2.3.7", | ||
"esprima": "^2.1.0", | ||
"estraverse": "^3.1.0", | ||
"escodegen": "^1.6.1" | ||
}, | ||
"devDependencies": { | ||
"mocha": "1.x.x", | ||
"chai": "1.x.x" | ||
"chai": "^2.2.0", | ||
"mocha": "^2.2.4", | ||
"test-peer-range": "^1.0.1" | ||
}, | ||
"peerDependencies": { | ||
"browserify": ">= 2" | ||
}, | ||
"scripts": { | ||
"test": "NODE_PATH=.. node_modules/.bin/mocha --reporter spec --require test/bootstrap/node test/*.test.js" | ||
"test": "test-peer-range browserify", | ||
"test-main": "mocha --reporter spec --require test/bootstrap/node test/*.test.js" | ||
}, | ||
@@ -44,0 +49,0 @@ "engines": { |
# deAMDify | ||
[![Build Status](https://secure.travis-ci.org/jaredhanson/deamdify.png)](http://travis-ci.org/jaredhanson/deamdify) [![David DM](https://david-dm.org/jaredhanson/deamdify.png)](http://david-dm.org/jaredhanson/deamdify) | ||
This module is a [browserify](http://browserify.org/) plugin that will transform | ||
@@ -11,5 +14,11 @@ [AMD](https://github.com/amdjs) modules into [Node.js](http://nodejs.org/)-style | ||
**For when you're stuck and need help:** | ||
[![Join the chat at https://gitter.im/jaredhanson/deamdify](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jaredhanson/deamdify?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) | ||
## Install | ||
$ npm install deamdify | ||
```sh | ||
$ npm install deamdify | ||
``` | ||
@@ -23,3 +32,5 @@ ## Usage | ||
browserify -t deamdify main.js -o bundle.js | ||
```sh | ||
browserify -t deamdify main.js -o bundle.js | ||
``` | ||
@@ -38,9 +49,28 @@ #### API | ||
#### package.json | ||
For packages that are written as AMD modules, add a browserify transform field | ||
to `package.json` and browserify will apply the transform to all modules in the | ||
package as it builds a bundle. | ||
``` | ||
{ | ||
"name": "anchor", | ||
"main": "main", | ||
"browserify": { | ||
"transform": "deamdify" | ||
} | ||
} | ||
``` | ||
## Tests | ||
$ npm install | ||
$ make test | ||
```sh | ||
$ npm install | ||
# fast run | ||
$ npm run test-main | ||
# test all browserify major versions | ||
$ npm test | ||
``` | ||
[![Build Status](https://secure.travis-ci.org/jaredhanson/deamdify.png)](http://travis-ci.org/jaredhanson/deamdify) [![David DM](https://david-dm.org/jaredhanson/deamdify.png)](http://david-dm.org/jaredhanson/deamdify) | ||
## Credits | ||
@@ -54,2 +84,2 @@ | ||
Copyright (c) 2013 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> | ||
Copyright (c) 2015 Jared Hanson <[http://jaredhanson.net/](http://jaredhanson.net/)> |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
18406
6
405
82
5
3
3
+ AddedJSONStream@1.3.5(transitive)
+ Addedacorn@7.4.1(transitive)
+ Addedacorn-node@1.8.2(transitive)
+ Addedacorn-walk@7.2.0(transitive)
+ Addedasn1.js@4.10.1(transitive)
+ Addedassert@1.5.1(transitive)
+ Addedavailable-typed-arrays@1.0.7(transitive)
+ Addedbalanced-match@1.0.2(transitive)
+ Addedbase64-js@1.5.1(transitive)
+ Addedbn.js@4.12.15.2.1(transitive)
+ Addedbrace-expansion@1.1.11(transitive)
+ Addedbrorand@1.1.0(transitive)
+ Addedbrowser-pack@6.1.0(transitive)
+ Addedbrowser-resolve@2.0.0(transitive)
+ Addedbrowserify@17.0.1(transitive)
+ Addedbrowserify-aes@1.2.0(transitive)
+ Addedbrowserify-cipher@1.0.1(transitive)
+ Addedbrowserify-des@1.0.2(transitive)
+ Addedbrowserify-rsa@4.1.1(transitive)
+ Addedbrowserify-sign@4.2.3(transitive)
+ Addedbrowserify-zlib@0.2.0(transitive)
+ Addedbuffer@5.2.1(transitive)
+ Addedbuffer-from@1.1.2(transitive)
+ Addedbuffer-xor@1.0.3(transitive)
+ Addedbuiltin-status-codes@3.0.0(transitive)
+ Addedcached-path-relative@1.1.0(transitive)
+ Addedcall-bind@1.0.8(transitive)
+ Addedcall-bind-apply-helpers@1.0.1(transitive)
+ Addedcall-bound@1.0.3(transitive)
+ Addedcipher-base@1.0.6(transitive)
+ Addedcombine-source-map@0.8.0(transitive)
+ Addedconcat-map@0.0.1(transitive)
+ Addedconcat-stream@1.6.2(transitive)
+ Addedconsole-browserify@1.2.0(transitive)
+ Addedconstants-browserify@1.0.0(transitive)
+ Addedconvert-source-map@1.1.3(transitive)
+ Addedcore-util-is@1.0.3(transitive)
+ Addedcreate-ecdh@4.0.4(transitive)
+ Addedcreate-hash@1.2.0(transitive)
+ Addedcreate-hmac@1.1.7(transitive)
+ Addedcrypto-browserify@3.12.1(transitive)
+ Addeddash-ast@1.0.0(transitive)
+ Addeddeep-is@0.1.4(transitive)
+ Addeddefine-data-property@1.1.4(transitive)
+ Addeddefine-properties@1.2.1(transitive)
+ Addeddefined@1.0.1(transitive)
+ Addeddeps-sort@2.0.1(transitive)
+ Addeddes.js@1.1.0(transitive)
+ Addeddetective@5.2.1(transitive)
+ Addeddiffie-hellman@5.0.3(transitive)
+ Addeddomain-browser@1.2.0(transitive)
+ Addeddunder-proto@1.0.1(transitive)
+ Addedduplexer2@0.1.4(transitive)
+ Addedelliptic@6.6.1(transitive)
+ Addedes-define-property@1.0.1(transitive)
+ Addedes-errors@1.3.0(transitive)
+ Addedes-object-atoms@1.1.1(transitive)
+ Addedescodegen@1.14.3(transitive)
+ Addedesprima@2.7.34.0.1(transitive)
+ Addedestraverse@3.1.04.3.0(transitive)
+ Addedesutils@2.0.3(transitive)
+ Addedevents@3.3.0(transitive)
+ Addedevp_bytestokey@1.0.3(transitive)
+ Addedfast-levenshtein@2.0.6(transitive)
+ Addedfast-safe-stringify@2.1.1(transitive)
+ Addedfor-each@0.3.3(transitive)
+ Addedfs.realpath@1.0.0(transitive)
+ Addedfunction-bind@1.1.2(transitive)
+ Addedget-assigned-identifiers@1.2.0(transitive)
+ Addedget-intrinsic@1.2.7(transitive)
+ Addedget-proto@1.0.1(transitive)
+ Addedglob@7.2.3(transitive)
+ Addedgopd@1.2.0(transitive)
+ Addedhas-property-descriptors@1.0.2(transitive)
+ Addedhas-symbols@1.1.0(transitive)
+ Addedhas-tostringtag@1.0.2(transitive)
+ Addedhash-base@3.0.5(transitive)
+ Addedhash.js@1.1.7(transitive)
+ Addedhasown@2.0.2(transitive)
+ Addedhmac-drbg@1.0.1(transitive)
+ Addedhtmlescape@1.1.1(transitive)
+ Addedhttps-browserify@1.0.0(transitive)
+ Addedieee754@1.2.1(transitive)
+ Addedinflight@1.0.6(transitive)
+ Addedinherits@2.0.32.0.4(transitive)
+ Addedinline-source-map@0.6.3(transitive)
+ Addedinsert-module-globals@7.2.1(transitive)
+ Addedis-arguments@1.2.0(transitive)
+ Addedis-buffer@1.1.6(transitive)
+ Addedis-callable@1.2.7(transitive)
+ Addedis-core-module@2.16.1(transitive)
+ Addedis-generator-function@1.1.0(transitive)
+ Addedis-regex@1.2.1(transitive)
+ Addedis-typed-array@1.1.15(transitive)
+ Addedisarray@1.0.0(transitive)
+ Addedjsonparse@1.3.1(transitive)
+ Addedlabeled-stream-splicer@2.0.2(transitive)
+ Addedlevn@0.3.0(transitive)
+ Addedlodash.memoize@3.0.4(transitive)
+ Addedmath-intrinsics@1.1.0(transitive)
+ Addedmd5.js@1.3.5(transitive)
+ Addedmiller-rabin@4.0.1(transitive)
+ Addedminimalistic-assert@1.0.1(transitive)
+ Addedminimalistic-crypto-utils@1.0.1(transitive)
+ Addedminimatch@3.1.2(transitive)
+ Addedminimist@1.2.8(transitive)
+ Addedmkdirp-classic@0.5.3(transitive)
+ Addedmodule-deps@6.2.3(transitive)
+ Addedobject-inspect@1.13.3(transitive)
+ Addedobject-keys@1.1.1(transitive)
+ Addedobject.assign@4.1.7(transitive)
+ Addedonce@1.4.0(transitive)
+ Addedoptionator@0.8.3(transitive)
+ Addedos-browserify@0.3.0(transitive)
+ Addedpako@1.0.11(transitive)
+ Addedparents@1.0.1(transitive)
+ Addedparse-asn1@5.1.7(transitive)
+ Addedpath-browserify@1.0.1(transitive)
+ Addedpath-is-absolute@1.0.1(transitive)
+ Addedpath-parse@1.0.7(transitive)
+ Addedpath-platform@0.11.15(transitive)
+ Addedpbkdf2@3.1.2(transitive)
+ Addedpossible-typed-array-names@1.0.0(transitive)
+ Addedprelude-ls@1.1.2(transitive)
+ Addedprocess@0.11.10(transitive)
+ Addedprocess-nextick-args@2.0.1(transitive)
+ Addedpublic-encrypt@4.0.3(transitive)
+ Addedpunycode@1.4.1(transitive)
+ Addedqs@6.14.0(transitive)
+ Addedquerystring-es3@0.2.1(transitive)
+ Addedrandombytes@2.1.0(transitive)
+ Addedrandomfill@1.0.4(transitive)
+ Addedread-only-stream@2.0.0(transitive)
+ Addedreadable-stream@2.3.83.6.2(transitive)
+ Addedresolve@1.22.10(transitive)
+ Addedripemd160@2.0.2(transitive)
+ Addedsafe-buffer@5.1.25.2.1(transitive)
+ Addedsafe-regex-test@1.1.0(transitive)
+ Addedset-function-length@1.2.2(transitive)
+ Addedsha.js@2.4.11(transitive)
+ Addedshasum-object@1.0.0(transitive)
+ Addedshell-quote@1.8.2(transitive)
+ Addedside-channel@1.1.0(transitive)
+ Addedside-channel-list@1.0.0(transitive)
+ Addedside-channel-map@1.0.1(transitive)
+ Addedside-channel-weakmap@1.0.2(transitive)
+ Addedsimple-concat@1.0.1(transitive)
+ Addedsource-map@0.5.70.6.1(transitive)
+ Addedstream-browserify@3.0.0(transitive)
+ Addedstream-combiner2@1.1.1(transitive)
+ Addedstream-http@3.2.0(transitive)
+ Addedstream-splicer@2.0.1(transitive)
+ Addedstring_decoder@1.1.11.3.0(transitive)
+ Addedsubarg@1.0.0(transitive)
+ Addedsupports-preserve-symlinks-flag@1.0.0(transitive)
+ Addedsyntax-error@1.4.0(transitive)
+ Addedthrough2@2.0.5(transitive)
+ Addedtimers-browserify@1.4.2(transitive)
+ Addedtty-browserify@0.0.1(transitive)
+ Addedtype-check@0.3.2(transitive)
+ Addedtypedarray@0.0.6(transitive)
+ Addedumd@3.0.3(transitive)
+ Addedundeclared-identifiers@1.1.3(transitive)
+ Addedurl@0.11.4(transitive)
+ Addedutil@0.10.40.12.5(transitive)
+ Addedutil-deprecate@1.0.2(transitive)
+ Addedvm-browserify@1.1.2(transitive)
+ Addedwhich-typed-array@1.1.18(transitive)
+ Addedword-wrap@1.2.5(transitive)
+ Addedwrappy@1.0.2(transitive)
+ Addedxtend@4.0.2(transitive)
- Removedescodegen@0.0.28(transitive)
- Removedesprima@1.0.41.2.5(transitive)
- Removedestraverse@1.3.21.9.3(transitive)
- Removedsource-map@0.7.4(transitive)
Updatedescodegen@^1.6.1
Updatedesprima@^2.1.0
Updatedestraverse@^3.1.0
Updatedthrough@^2.3.7