Merge pull request #265 from javascript-obfuscator/object-keys-member-expressions

Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/…
This commit is contained in:
Timofey Kachalov
2018-05-23 22:24:20 +03:00
committed by GitHub
11 changed files with 393 additions and 162 deletions
+1
View File
@@ -3,6 +3,7 @@ Change Log
v0.17.0
---
* **Browser version**: Added browser version dist
* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/264
* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/260
* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/252
* Fixed https://github.com/javascript-obfuscator/javascript-obfuscator/issues/247
+2 -2
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+5 -5
View File
@@ -1,6 +1,6 @@
{
"name": "javascript-obfuscator",
"version": "0.17.0-dev.0",
"version": "0.17.0-dev.1",
"description": "JavaScript obfuscator",
"keywords": [
"obfuscator",
@@ -54,17 +54,17 @@
"@types/mkdirp": "0.5.2",
"@types/mocha": "5.2.0",
"@types/multimatch": "2.1.2",
"@types/node": "10.1.1",
"@types/node": "10.1.2",
"@types/rimraf": "2.0.2",
"@types/sinon": "4.3.3",
"@types/string-template": "1.0.2",
"@types/webpack-env": "1.13.6",
"awesome-typescript-loader": "5.0.0",
"babel-loader": "8.0.0-beta.2",
"babel-loader": "8.0.0-beta.3",
"chai": "4.1.2",
"coveralls": "3.0.1",
"istanbul": "1.1.0-alpha.1",
"mocha": "5.1.1",
"mocha": "5.2.0",
"pjson": "1.0.9",
"pre-commit": "1.2.2",
"rimraf": "2.6.2",
@@ -78,7 +78,7 @@
"tslint-webpack-plugin": "1.2.2",
"typescript": "2.8.3",
"webpack": "4.8.3",
"webpack-cli": "2.1.3",
"webpack-cli": "2.1.4",
"webpack-node-externals": "1.7.2"
},
"repository": {
@@ -20,9 +20,9 @@ import { NodeUtils } from '../../node/NodeUtils';
@injectable()
export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
/**
* @type {Map<VariableDeclarator, TNodeWithScope>}
* @type {Map<Node, TNodeWithScope>}
*/
private readonly cachedScopeNodesMap: Map <ESTree.VariableDeclarator, TNodeWithScope> = new Map();
private readonly cachedScopeNodesMap: Map <ESTree.Node, TNodeWithScope> = new Map();
/**
* @param {IRandomGenerator} randomGenerator
@@ -36,22 +36,23 @@ export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
}
/**
* @param {TNodeWithScope} scopeNode
* @param {ExpressionStatement[]} expressionStatements
* @param {Node} variableDeclarator
* Returns host statement of object expression node
*
* @param {NodeGuards} node
* @returns {Node}
*/
private static appendExpressionStatements (
scopeNode: TNodeWithScope,
expressionStatements: ESTree.ExpressionStatement[],
variableDeclarator: ESTree.Node
): void {
const variableDeclaration: ESTree.Node | undefined = variableDeclarator.parentNode;
public static getHostStatement (node: ESTree.Node): ESTree.Statement {
const parentNode: ESTree.Node | undefined = node.parentNode;
if (!variableDeclaration || !NodeGuards.isVariableDeclarationNode(variableDeclaration)) {
throw new Error('Cannot find variable declaration for variable declarator');
if (!parentNode) {
throw new ReferenceError('`parentNode` property of given node is `undefined`');
}
NodeAppender.insertNodeAfter(scopeNode, expressionStatements, variableDeclaration);
if (!NodeGuards.isNodeHasScope(parentNode)) {
return ObjectExpressionKeysTransformer.getHostStatement(parentNode);
}
return <ESTree.Statement>node;
}
/**
@@ -63,6 +64,21 @@ export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
return properties.filter((property: ESTree.Property, index: number) => !removablePropertyIds.includes(index));
}
/**
* @param {TNodeWithScope} scopeNode
* @param {Node} hostNode
* @param {ExpressionStatement[]} expressionStatements
*/
private static appendExpressionStatements (
scopeNode: TNodeWithScope,
hostNode: ESTree.Node,
expressionStatements: ESTree.ExpressionStatement[]
): void {
const hostNodeScope: ESTree.Node = ObjectExpressionKeysTransformer.getHostStatement(hostNode);
NodeAppender.insertNodeAfter(scopeNode, expressionStatements, hostNodeScope);
}
/**
* @param {Property} propertyNode
* @returns {string | null}
@@ -85,13 +101,13 @@ export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
/**
* @param {Expression | Pattern} propertyValueNode
* @returns {boolean}
* @returns {propertyValueNode is Expression}
*/
private static isValidPropertyValueNode (propertyValueNode: ESTree.Expression | ESTree.Pattern): propertyValueNode is ESTree.Expression {
private static isValidExpressionNode (propertyValueNode: ESTree.Expression | ESTree.Pattern): propertyValueNode is ESTree.Expression {
return !NodeGuards.isObjectPatternNode(propertyValueNode)
&& !NodeGuards.isArrayPatternNode(propertyValueNode)
&& !NodeGuards.isAssignmentPatternNode(propertyValueNode)
&& !NodeGuards.isRestElementNode(propertyValueNode);
&& !NodeGuards.isArrayPatternNode(propertyValueNode)
&& !NodeGuards.isAssignmentPatternNode(propertyValueNode)
&& !NodeGuards.isRestElementNode(propertyValueNode);
}
/**
@@ -107,7 +123,6 @@ export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
this.options.transformObjectKeys
&& parentNode
&& NodeGuards.isObjectExpressionNode(node)
&& NodeGuards.isVariableDeclaratorNode(parentNode)
) {
return this.transformNode(node, parentNode);
}
@@ -132,40 +147,90 @@ export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
* object['bar'] = 2;
*
* @param {MemberExpression} objectExpressionNode
* @param {NodeGuards} variableDeclarator
* @param {Node} parentNode
* @returns {NodeGuards}
*/
public transformNode (objectExpressionNode: ESTree.ObjectExpression, variableDeclarator: ESTree.VariableDeclarator): ESTree.Node {
public transformNode (objectExpressionNode: ESTree.ObjectExpression, parentNode: ESTree.Node): ESTree.Node {
if (NodeGuards.isVariableDeclaratorNode(parentNode)) {
return this.transformVariableDeclaratorHostObjectExpression(objectExpressionNode, parentNode);
}
if (NodeGuards.isAssignmentExpressionNode(parentNode)) {
return this.transformAssignmentExpressionHostObjectExpression(objectExpressionNode, parentNode);
}
return objectExpressionNode;
}
/**
* @param {ObjectExpression} objectExpressionNode
* @param {VariableDeclarator} variableDeclaratorNode
* @returns {Node}
*/
private transformVariableDeclaratorHostObjectExpression(
objectExpressionNode: ESTree.ObjectExpression,
variableDeclaratorNode: ESTree.VariableDeclarator
): ESTree.Node {
// should pass only Expression nodes as MemberExpression.object value
if (!NodeGuards.isIdentifierNode(variableDeclarator.id)) {
if (!NodeGuards.isIdentifierNode(variableDeclaratorNode.id)) {
return objectExpressionNode;
}
const scopeNode: TNodeWithScope | null = NodeUtils.getScopeOfNode(variableDeclarator);
const scopeNode: TNodeWithScope | null = NodeUtils.getScopeOfNode(variableDeclaratorNode);
if (!scopeNode || !NodeGuards.isNodeHasScope(scopeNode)) {
return objectExpressionNode;
}
this.cachedScopeNodesMap.set(variableDeclarator, scopeNode);
this.cachedScopeNodesMap.set(variableDeclaratorNode, scopeNode);
return this.transformObjectExpressionNode(
objectExpressionNode,
variableDeclarator.id,
variableDeclarator
variableDeclaratorNode.id,
variableDeclaratorNode
);
}
/**
* @param {ObjectExpression} objectExpressionNode
* @param {AssignmentExpression} assignmentExpressionNode
* @returns {Node}
*/
private transformAssignmentExpressionHostObjectExpression(
objectExpressionNode: ESTree.ObjectExpression,
assignmentExpressionNode: ESTree.AssignmentExpression
): ESTree.Node {
const leftNode: ESTree.MemberExpression | ESTree.Pattern = assignmentExpressionNode.left;
if (!ObjectExpressionKeysTransformer.isValidExpressionNode(leftNode)) {
return objectExpressionNode;
}
const scopeNode: TNodeWithScope | null = NodeUtils.getScopeOfNode(assignmentExpressionNode);
if (!scopeNode || !NodeGuards.isNodeHasScope(scopeNode)) {
return objectExpressionNode;
}
this.cachedScopeNodesMap.set(assignmentExpressionNode, scopeNode);
return this.transformObjectExpressionNode(
objectExpressionNode,
leftNode,
assignmentExpressionNode
);
}
/**
* @param {Property[]} properties
* @param {Expression} memberExpressionObject
* @param {VariableDeclarator} variableDeclarator
* @param {Node} hostNode
* @returns {[ExpressionStatement[] , number[]]}
*/
private extractPropertiesToExpressionStatements (
properties: ESTree.Property[],
memberExpressionObject: ESTree.Expression,
variableDeclarator: ESTree.VariableDeclarator
hostNode: ESTree.Node
): [ESTree.ExpressionStatement[], number[]] {
const propertiesLength: number = properties.length;
const expressionStatements: ESTree.ExpressionStatement[] = [];
@@ -176,7 +241,7 @@ export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
const propertyValue: ESTree.Expression | ESTree.Pattern = property.value;
// invalid property nodes
if (!ObjectExpressionKeysTransformer.isValidPropertyValueNode(propertyValue)) {
if (!ObjectExpressionKeysTransformer.isValidExpressionNode(propertyValue)) {
continue;
}
@@ -207,7 +272,7 @@ export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
* Stage 3: recursively processing nested object expressions
*/
if (NodeGuards.isObjectExpressionNode(property.value)) {
this.transformObjectExpressionNode(property.value, memberExpressionNode, variableDeclarator);
this.transformObjectExpressionNode(property.value, memberExpressionNode, hostNode);
}
/**
@@ -223,13 +288,13 @@ export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
/**
* @param {ObjectExpression} objectExpressionNode
* @param {Expression} memberExpressionObjectNode
* @param {VariableDeclarator} variableDeclarator
* @param {Node} hostNode
* @returns {Node}
*/
private transformObjectExpressionNode (
objectExpressionNode: ESTree.ObjectExpression,
memberExpressionObjectNode: ESTree.Expression,
variableDeclarator: ESTree.VariableDeclarator
hostNode: ESTree.Node
): ESTree.Node {
const properties: ESTree.Property[] = objectExpressionNode.properties;
@@ -237,19 +302,19 @@ export class ObjectExpressionKeysTransformer extends AbstractNodeTransformer {
return objectExpressionNode;
}
const scopeNode: TNodeWithScope | undefined = this.cachedScopeNodesMap.get(variableDeclarator);
const scopeNode: TNodeWithScope | undefined = this.cachedScopeNodesMap.get(hostNode);
if (!scopeNode) {
return objectExpressionNode;
}
const [expressionStatements, removablePropertyIds]: [ESTree.ExpressionStatement[], number[]] = this
.extractPropertiesToExpressionStatements(properties, memberExpressionObjectNode, variableDeclarator);
.extractPropertiesToExpressionStatements(properties, memberExpressionObjectNode, hostNode);
objectExpressionNode.properties = ObjectExpressionKeysTransformer
.filterObjectExpressionProperties(properties, removablePropertyIds);
ObjectExpressionKeysTransformer
.appendExpressionStatements(scopeNode, expressionStatements, variableDeclarator);
.appendExpressionStatements(scopeNode, objectExpressionNode, expressionStatements);
return objectExpressionNode;
}
+8
View File
@@ -32,6 +32,14 @@ export class NodeGuards {
return node.type === NodeType.ArrowFunctionExpression;
}
/**
* @param {Node} node
* @returns {boolean}
*/
public static isAssignmentExpressionNode (node: ESTree.Node): node is ESTree.AssignmentExpression {
return node.type === NodeType.AssignmentExpression;
}
/**
* @param {Node} node
* @returns {boolean}
@@ -134,6 +134,93 @@ describe('ObjectExpressionKeysTransformer', () => {
assert.match(obfuscatedCode, regExp);
});
});
describe('Variant #5: variable declaration without initialization', () => {
const match: string = `` +
`var *${variableMatch};` +
`${variableMatch} *= *{};` +
`${variableMatch}\\['foo'] *= *'bar';` +
`${variableMatch}\\['baz'] *= *'bark';` +
``;
const regExp: RegExp = new RegExp(match);
let obfuscatedCode: string;
before(() => {
const code: string = readFileAsString(__dirname + '/fixtures/variable-declaration-without-initialization.js');
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
code,
{
...NO_ADDITIONAL_NODES_PRESET,
transformObjectKeys: true
}
);
obfuscatedCode = obfuscationResult.getObfuscatedCode();
});
it('shouldn\'t transform object keys', () => {
assert.match(obfuscatedCode, regExp);
});
});
});
describe('member expression as host of object expression', () => {
describe('Variant #1: simple', () => {
const match: string = `` +
`this\\['state'] *= *{};` +
`this\\['state']\\['foo'] *= *'bar';` +
`this\\['state']\\['baz'] *= *'bark';` +
``;
const regExp: RegExp = new RegExp(match);
let obfuscatedCode: string;
before(() => {
const code: string = readFileAsString(__dirname + '/fixtures/member-expression-host-1.js');
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
code,
{
...NO_ADDITIONAL_NODES_PRESET,
transformObjectKeys: true
}
);
obfuscatedCode = obfuscationResult.getObfuscatedCode();
});
it('should correctly transform object keys', () => {
assert.match(obfuscatedCode, regExp);
});
});
describe('Variant #2: long members chain', () => {
const match: string = `` +
`this\\['state']\\['foo'] *= *{};` +
`this\\['state']\\['foo']\\['foo'] *= *'bar';` +
`this\\['state']\\['foo']\\['baz'] *= *'bark';` +
``;
const regExp: RegExp = new RegExp(match);
let obfuscatedCode: string;
before(() => {
const code: string = readFileAsString(__dirname + '/fixtures/member-expression-host-2.js');
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
code,
{
...NO_ADDITIONAL_NODES_PRESET,
transformObjectKeys: true
}
);
obfuscatedCode = obfuscationResult.getObfuscatedCode();
});
it('should correctly transform object keys', () => {
assert.match(obfuscatedCode, regExp);
});
});
});
describe('correct placement of expression statements', () => {
@@ -285,35 +372,5 @@ describe('ObjectExpressionKeysTransformer', () => {
assert.match(obfuscatedCode, regExp);
});
});
describe('Variant #2: variable declaration without initialization', () => {
const match: string = `` +
`var *${variableMatch};` +
`${variableMatch} *= *{` +
`'foo': *'bar',` +
`'baz': *'bark'` +
`}` +
``;
const regExp: RegExp = new RegExp(match);
let obfuscatedCode: string;
before(() => {
const code: string = readFileAsString(__dirname + '/fixtures/variable-declaration-without-initialization.js');
const obfuscationResult: IObfuscationResult = JavaScriptObfuscator.obfuscate(
code,
{
...NO_ADDITIONAL_NODES_PRESET,
transformObjectKeys: true
}
);
obfuscatedCode = obfuscationResult.getObfuscatedCode();
});
it('shouldn\'t transform object keys', () => {
assert.match(obfuscatedCode, regExp);
});
});
});
});
@@ -0,0 +1,6 @@
(function(){
this.state = {
foo: 'bar',
baz: 'bark'
};
})();
@@ -0,0 +1,7 @@
(function(){
this.state.foo = {
foo: 'bar',
baz: 'bark'
};
var foo = 1;
})();
+174 -87
View File
@@ -540,6 +540,12 @@
call-me-maybe "^1.0.1"
glob-to-regexp "^0.3.0"
"@samverschueren/stream-to-observable@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f"
dependencies:
any-observable "^0.3.0"
"@sindresorhus/is@^0.7.0":
version "0.7.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
@@ -612,9 +618,9 @@
version "10.0.3"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.0.3.tgz#1f89840c7aac2406cc43a2ecad98fc02a8e130e4"
"@types/node@10.1.1":
version "10.1.1"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.1.1.tgz#ca39d8607fa1fcb146b0530420b93f1dd4802f6c"
"@types/node@10.1.2":
version "10.1.2"
resolved "https://registry.yarnpkg.com/@types/node/-/node-10.1.2.tgz#1b928a0baa408fc8ae3ac012cc81375addc147c6"
"@types/rimraf@2.0.2":
version "2.0.2"
@@ -839,9 +845,9 @@ ansi-styles@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.0.0.tgz#cb102df1c56f5123eab8b67cd7b98027a0279178"
any-observable@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242"
any-observable@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.3.0.tgz#af933475e5806a67d0d7df090dd5e8bef65d119b"
anymatch@^2.0.0:
version "2.0.0"
@@ -1160,13 +1166,14 @@ babel-helpers@^6.24.1:
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-loader@8.0.0-beta.2:
version "8.0.0-beta.2"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.0-beta.2.tgz#4d5b67c964dc8c9cba866fd13d6b90df3acf8723"
babel-loader@8.0.0-beta.3:
version "8.0.0-beta.3"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.0-beta.3.tgz#49efeea6e8058d5af860a18a6de88b8c1450645b"
dependencies:
find-cache-dir "^1.0.0"
loader-utils "^1.0.2"
mkdirp "^0.5.1"
util.promisify "^1.0.0"
babel-messages@^6.23.0:
version "6.23.0"
@@ -1882,7 +1889,7 @@ chalk@1.1.3, chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3:
strip-ansi "^3.0.0"
supports-color "^2.0.0"
chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.3.2:
chalk@2.4.1, chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.3.1, chalk@^2.4.1:
version "2.4.1"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e"
dependencies:
@@ -2084,10 +2091,6 @@ combined-stream@1.0.6, combined-stream@~1.0.5:
dependencies:
delayed-stream "~1.0.0"
commander@2.11.0:
version "2.11.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
commander@2.15.1, commander@^2.12.1, commander@^2.8.1:
version "2.15.1"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
@@ -2316,6 +2319,13 @@ default-require-extensions@^1.0.0:
dependencies:
strip-bom "^2.0.0"
define-properties@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94"
dependencies:
foreach "^2.0.5"
object-keys "^1.0.8"
define-property@^0.2.5:
version "0.2.5"
resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
@@ -2465,9 +2475,9 @@ enhanced-resolve@^4.0.0:
memory-fs "^0.4.0"
tapable "^1.0.0"
envinfo@^4.4.2:
version "4.4.2"
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-4.4.2.tgz#472c49f3a8b9bca73962641ce7cb692bf623cd1c"
envinfo@^5.7.0:
version "5.7.0"
resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-5.7.0.tgz#690e5fdf30aa75dda19c0c5338d0a48a48f1e998"
errno@^0.1.3, errno@~0.1.7:
version "0.1.7"
@@ -2488,6 +2498,24 @@ error@^7.0.2:
string-template "~0.2.1"
xtend "~4.0.0"
es-abstract@^1.5.1:
version "1.11.0"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.11.0.tgz#cce87d518f0496893b1a30cd8461835535480681"
dependencies:
es-to-primitive "^1.1.1"
function-bind "^1.1.1"
has "^1.0.1"
is-callable "^1.1.3"
is-regex "^1.0.4"
es-to-primitive@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d"
dependencies:
is-callable "^1.1.1"
is-date-object "^1.0.1"
is-symbol "^1.0.1"
escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
@@ -2766,6 +2794,10 @@ for-own@^0.1.4:
dependencies:
for-in "^1.0.1"
foreach@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
@@ -2821,6 +2853,10 @@ fsevents@^1.1.2:
nan "^2.9.2"
node-pre-gyp "^0.9.0"
function-bind@^1.0.2, function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
gauge@~2.7.3:
version "2.7.4"
resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7"
@@ -2947,7 +2983,7 @@ globby@^6.1.0:
pify "^2.0.0"
pinkie-promise "^2.0.0"
globby@^8.0.0:
globby@^8.0.0, globby@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/globby/-/globby-8.0.1.tgz#b5ad48b8aa80b35b814fc1281ecc851f1d2b5b50"
dependencies:
@@ -2978,7 +3014,7 @@ got@^7.0.0:
url-parse-lax "^1.0.0"
url-to-options "^1.0.1"
got@^8.2.0:
got@^8.3.1:
version "8.3.1"
resolved "https://registry.yarnpkg.com/got/-/got-8.3.1.tgz#093324403d4d955f5a16a7a8d39955d055ae10ed"
dependencies:
@@ -3010,9 +3046,9 @@ grouped-queue@^0.3.3:
dependencies:
lodash "^4.17.2"
growl@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f"
growl@1.10.5:
version "1.10.5"
resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
handlebars@^4.0.3:
version "4.0.11"
@@ -3049,10 +3085,6 @@ has-flag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
has-flag@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -3098,6 +3130,12 @@ has-values@^1.0.0:
is-number "^3.0.0"
kind-of "^4.0.0"
has@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28"
dependencies:
function-bind "^1.0.2"
hash-base@^3.0.0:
version "3.0.4"
resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918"
@@ -3275,7 +3313,7 @@ inquirer@^3.3.0:
strip-ansi "^4.0.0"
through "^2.3.6"
inquirer@^5.1.0:
inquirer@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-5.2.0.tgz#db350c2b73daca77ff1243962e9f22f099685726"
dependencies:
@@ -3293,7 +3331,7 @@ inquirer@^5.1.0:
strip-ansi "^4.0.0"
through "^2.3.6"
interpret@^1.0.0, interpret@^1.0.4:
interpret@^1.0.0, interpret@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
@@ -3350,6 +3388,10 @@ is-builtin-module@^1.0.0:
dependencies:
builtin-modules "^1.0.0"
is-callable@^1.1.1, is-callable@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2"
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@@ -3362,6 +3404,10 @@ is-data-descriptor@^1.0.0:
dependencies:
kind-of "^6.0.0"
is-date-object@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
is-descriptor@^0.1.0:
version "0.1.6"
resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
@@ -3460,11 +3506,11 @@ is-object@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
is-observable@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2"
is-observable@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e"
dependencies:
symbol-observable "^0.2.2"
symbol-observable "^1.1.0"
is-odd@^2.0.0:
version "2.0.0"
@@ -3494,6 +3540,12 @@ is-promise@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
is-regex@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491"
dependencies:
has "^1.0.1"
is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34"
@@ -3508,6 +3560,10 @@ is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
is-symbol@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572"
is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@@ -3827,15 +3883,15 @@ listr-verbose-renderer@^0.4.0:
date-fns "^1.27.2"
figures "^1.7.0"
listr@^0.13.0:
version "0.13.0"
resolved "https://registry.yarnpkg.com/listr/-/listr-0.13.0.tgz#20bb0ba30bae660ee84cc0503df4be3d5623887d"
listr@^0.14.1:
version "0.14.1"
resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.1.tgz#8a7afa4a7135cee4c921d128e0b7dfc6e522d43d"
dependencies:
chalk "^1.1.3"
"@samverschueren/stream-to-observable" "^0.3.0"
cli-truncate "^0.2.1"
figures "^1.7.0"
indent-string "^2.1.0"
is-observable "^0.2.0"
is-observable "^1.1.0"
is-promise "^2.1.0"
is-stream "^1.1.0"
listr-silent-renderer "^1.1.1"
@@ -3845,8 +3901,7 @@ listr@^0.13.0:
log-update "^1.0.2"
ora "^0.2.3"
p-map "^1.1.1"
rxjs "^5.4.2"
stream-to-observable "^0.2.0"
rxjs "^6.1.0"
strip-ansi "^3.0.1"
load-json-file@^4.0.0:
@@ -4149,21 +4204,21 @@ mkdirp@0.5.1, mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.0:
dependencies:
minimist "0.0.8"
mocha@5.1.1:
version "5.1.1"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.1.1.tgz#b774c75609dac05eb48f4d9ba1d827b97fde8a7b"
mocha@5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
dependencies:
browser-stdout "1.3.1"
commander "2.11.0"
commander "2.15.1"
debug "3.1.0"
diff "3.5.0"
escape-string-regexp "1.0.5"
glob "7.1.2"
growl "1.10.3"
growl "1.10.5"
he "1.1.1"
minimatch "3.0.4"
mkdirp "0.5.1"
supports-color "4.4.0"
supports-color "5.4.0"
mock-require@^2.0.2:
version "2.0.2"
@@ -4393,12 +4448,23 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
object-keys@^1.0.8:
version "1.0.11"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
object-visit@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
dependencies:
isobject "^3.0.0"
object.getownpropertydescriptors@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16"
dependencies:
define-properties "^1.1.2"
es-abstract "^1.5.1"
object.omit@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
@@ -4730,7 +4796,7 @@ preserve@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
prettier@^1.5.3:
prettier@^1.12.1:
version "1.12.1"
resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.12.1.tgz#c1ad20e803e7749faf905a409d2367e06bbe7325"
@@ -5196,12 +5262,18 @@ rx@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782"
rxjs@^5.4.2, rxjs@^5.5.2:
rxjs@^5.5.2:
version "5.5.10"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.10.tgz#fde02d7a614f6c8683d0d1957827f492e09db045"
dependencies:
symbol-observable "1.0.1"
rxjs@^6.1.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.0.tgz#e024d0e180b72756a83c2aaea8f25423751ba978"
dependencies:
tslib "^1.9.0"
safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@@ -5521,12 +5593,6 @@ stream-shift@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952"
stream-to-observable@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.2.0.tgz#59d6ea393d87c2c0ddac10aa0d561bc6ba6f0e10"
dependencies:
any-observable "^0.2.0"
strict-uri-encode@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
@@ -5605,11 +5671,11 @@ strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
supports-color@4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e"
supports-color@5.4.0, supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0:
version "5.4.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
dependencies:
has-flag "^2.0.0"
has-flag "^3.0.0"
supports-color@^2.0.0:
version "2.0.0"
@@ -5621,19 +5687,13 @@ supports-color@^3.1.2:
dependencies:
has-flag "^1.0.0"
supports-color@^5.1.0, supports-color@^5.3.0:
version "5.4.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
dependencies:
has-flag "^3.0.0"
symbol-observable@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4"
symbol-observable@^0.2.2:
version "0.2.4"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40"
symbol-observable@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
tapable@^1.0.0:
version "1.0.0"
@@ -5765,7 +5825,7 @@ tslib@1.9.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1:
version "1.9.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8"
tslib@1.9.1:
tslib@1.9.1, tslib@^1.9.0:
version "1.9.1"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.1.tgz#a5d1f0532a49221c87755cfcc89ca37197242ba7"
@@ -5991,6 +6051,13 @@ util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
util.promisify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030"
dependencies:
define-properties "^1.1.2"
object.getownpropertydescriptors "^2.0.3"
util@0.10.3, util@^0.10.3:
version "0.10.3"
resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9"
@@ -6001,9 +6068,9 @@ uuid@^3.1.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14"
v8-compile-cache@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-1.1.2.tgz#8d32e4f16974654657e676e0e467a348e89b0dc4"
v8-compile-cache@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.0.0.tgz#526492e35fc616864284700b7043e01baee09f0a"
validate-npm-package-license@^3.0.1:
version "3.0.3"
@@ -6084,36 +6151,36 @@ webpack-addons@^1.1.5:
dependencies:
jscodeshift "^0.4.0"
webpack-cli@2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-2.1.3.tgz#65d166851abaa56067ef3f716b02a97ba6bbe84d"
webpack-cli@2.1.4:
version "2.1.4"
resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-2.1.4.tgz#cab81e79249127384fb69b2fdfe2055f9c771b76"
dependencies:
chalk "^2.3.2"
chalk "^2.4.1"
cross-spawn "^6.0.5"
diff "^3.5.0"
enhanced-resolve "^4.0.0"
envinfo "^4.4.2"
envinfo "^5.7.0"
glob-all "^3.1.0"
global-modules "^1.0.0"
got "^8.2.0"
got "^8.3.1"
import-local "^1.0.0"
inquirer "^5.1.0"
interpret "^1.0.4"
inquirer "^5.2.0"
interpret "^1.1.0"
jscodeshift "^0.5.0"
listr "^0.13.0"
listr "^0.14.1"
loader-utils "^1.1.0"
lodash "^4.17.5"
lodash "^4.17.10"
log-symbols "^2.2.0"
mkdirp "^0.5.1"
p-each-series "^1.0.0"
p-lazy "^1.0.0"
prettier "^1.5.3"
supports-color "^5.3.0"
v8-compile-cache "^1.1.2"
prettier "^1.12.1"
supports-color "^5.4.0"
v8-compile-cache "^2.0.0"
webpack-addons "^1.1.5"
yargs "^11.1.0"
yeoman-environment "^2.0.0"
yeoman-generator "^2.0.4"
yeoman-environment "^2.1.1"
yeoman-generator "^2.0.5"
webpack-node-externals@1.7.2:
version "1.7.2"
@@ -6274,7 +6341,7 @@ yargs@~3.10.0:
decamelize "^1.0.0"
window-size "0.1.0"
yeoman-environment@^2.0.0, yeoman-environment@^2.0.5:
yeoman-environment@^2.0.5:
version "2.0.6"
resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.0.6.tgz#ae1b21d826b363f3d637f88a7fc9ea7414cb5377"
dependencies:
@@ -6292,7 +6359,27 @@ yeoman-environment@^2.0.0, yeoman-environment@^2.0.5:
text-table "^0.2.0"
untildify "^3.0.2"
yeoman-generator@^2.0.4:
yeoman-environment@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/yeoman-environment/-/yeoman-environment-2.1.1.tgz#10a045f7fc4397873764882eae055a33e56ee1c5"
dependencies:
chalk "^2.1.0"
cross-spawn "^6.0.5"
debug "^3.1.0"
diff "^3.3.1"
escape-string-regexp "^1.0.2"
globby "^8.0.1"
grouped-queue "^0.3.3"
inquirer "^5.2.0"
is-scoped "^1.0.0"
lodash "^4.17.10"
log-symbols "^2.1.0"
mem-fs "^1.1.0"
strip-ansi "^4.0.0"
text-table "^0.2.0"
untildify "^3.0.2"
yeoman-generator@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/yeoman-generator/-/yeoman-generator-2.0.5.tgz#57b0b3474701293cc9ec965288f3400b00887c81"
dependencies: