Javascript-obfuscator: AssignmentRestProperty does not work without AssignmentPropertyList

Created on 19 May 2020  路  5Comments  路  Source: javascript-obfuscator/javascript-obfuscator


I've created an issue as a bug as partial ECMAScript 2019 support is declared on web site.

Expected Behavior

const { ...fields } = req.body; should be obfuscated

Current Behavior

For now seems like many features of ECMAScript 2018 is supported except at least one when AssignmentRestProperty alone is used at the LeftHandSideExpression of destructuring assignment.
Example:
const { ...fields } = req.body;
Runing javascript-obfuscator against that string gives:

[javascript-obfuscator-cli] Error in file: playground/test.js... 

Although it works well when AssignmentPropertyList is present before the rest.
This string will not cause an error:
const { foo, ...fields } = req.body;

Steps to Reproduce


  1. create test.js file with a content from example below
  2. run javascript-obfuscator against it
    javascript-obfuscator ./test.js --output ./
  3. experience an error

Your Environment

  • Obfuscator version used: 0.28.1
  • Node version used: 12.13.1

Stack trace

/Users/lonedone/.nvm/versions/node/v12.13.1/lib/node_modules/javascript-obfuscator/node_modules/escodegen/escodegen.js:2226
                if (property.value.type !== Syntax.Identifier) {
                                   ^
TypeError: Cannot read property 'type' of undefined
    at CodeGenerator.ObjectPattern (/Users/lonedone/.nvm/versions/node/v12.13.1/lib/node_modules/javascript-obfuscator/node_modules/escodegen/escodegen.js:2226:36)
    at CodeGenerator.generateExpression (/Users/lonedone/.nvm/versions/node/v12.13.1/lib/node_modules/javascript-obfuscator/node_modules/escodegen/escodegen.js:2469:28)
    at CodeGenerator.VariableDeclarator (/Users/lonedone/.nvm/versions/node/v12.13.1/lib/node_modules/javascript-obfuscator/node_modules/escodegen/escodegen.js:1438:26)
    at CodeGenerator.generateStatement (/Users/lonedone/.nvm/versions/node/v12.13.1/lib/node_modules/javascript-obfuscator/node_modules/escodegen/escodegen.js:2482:33)
    at block (/Users/lonedone/.nvm/versions/node/v12.13.1/lib/node_modules/javascript-obfuscator/node_modules/escodegen/escodegen.js:1465:38)
    at CodeGenerator.VariableDeclaration (/Users/lonedone/.nvm/versions/node/v12.13.1/lib/node_modules/javascript-obfuscator/node_modules/escodegen/escodegen.js:1483:17)
    at CodeGenerator.generateStatement (/Users/lonedone/.nvm/versions/node/v12.13.1/lib/node_modules/javascript-obfuscator/node_modules/escodegen/escodegen.js:2482:33)
    at /Users/lonedone/.nvm/versions/node/v12.13.1/lib/node_modules/javascript-obfuscator/node_modules/escodegen/escodegen.js:1075:51
    at withIndent (/Users/lonedone/.nvm/versions/node/v12.13.1/lib/node_modules/javascript-obfuscator/node_modules/escodegen/escodegen.js:576:9)
    at CodeGenerator.BlockStatement (/Users/lonedone/.nvm/versions/node/v12.13.1/lib/node_modules/javascript-obfuscator/node_modules/escodegen/escodegen.js:1025:13)

Minimal working example that will help to reproduce issue

const req = {
  foo: 'foo_str',
  bar: 'bar_str',
};

const { ...fields } = req;
console.log(fields);

3rd party library bug

Most helpful comment

I created PR with fix some time ago. Please ping this PR
https://github.com/estools/escodegen/pull/408

All 5 comments

This is a bug in escodegen
If you changes it to

const { foo, ...fields } = req;

it will work

I created PR with fix some time ago. Please ping this PR
https://github.com/estools/escodegen/pull/408

thx, just mailed maintainer.

Expect the release in an hour or so.

Fixed and released as 0.28.5

Was this page helpful?
0 / 5 - 0 ratings

Related issues

BlackYuzia picture BlackYuzia  路  6Comments

invertedvisuals picture invertedvisuals  路  3Comments

elderapo picture elderapo  路  3Comments

psabharwal123 picture psabharwal123  路  7Comments

madprops picture madprops  路  5Comments