Socket
Socket
Sign inDemoInstall

jstransform

Package Overview
Dependencies
Maintainers
3
Versions
29
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

jstransform - npm Package Compare versions

Comparing version 6.2.0 to 6.3.0

visitors/__tests__/reserved-words-test.js

2

package.json
{
"name": "jstransform",
"version": "6.2.0",
"version": "6.3.0",
"description": "A simple AST visitor-based JS transformer",

@@ -5,0 +5,0 @@ "contributors": [

@@ -1030,8 +1030,157 @@ /**

// TODO: Support this with an option
// There isn't a simple way to support both this and IE8 at the same
// time, so for now we're not supporting it at all. That said, if
// someone should feel so inclined to build non-ie8 support for it,
// feel free to do so and just make it possible to enable/disable
// this functionality via a transform option
it('preserves generators', function() {
var code = transform([
'class Foo {',
' static *title() {',
' yield 21;',
' }',
'',
' *gen() {',
' yield 42;',
' }',
'}'
].join('\n'));
expect(code).toMatch(/Foo.title\s*=\s*function\*\(/);
expect(code).toMatch(/Foo.prototype.gen\s*=\s*function\*\(/);
});
it('properly handles getter methods in ES5 compat mode', function() {
var code = transform([
'class Foo {',
' get title() {',
' return 42;',
' }',
' get "foo bar"() {',
' return 21;',
' }',
'}'
].join('\n'), {es5: true});
eval(code);
var fooInst = new Foo();
var descriptor =
Object.getOwnPropertyDescriptor(Foo.prototype, 'title');
expect(fooInst.title).toBe(42);
expect(descriptor.enumerable).toBe(true);
expect(descriptor.configurable).toBe(true);
expect(fooInst['foo bar']).toBe(21);
});
it('properly handles setter methods in ES5 compat mode', function() {
var code = transform([
'class Foo {',
' set title(value) {',
' this.__title = 42;',
' }',
' set "foo bar"(value) {',
' this.__fooBar = 21;',
' }',
'}'
].join('\n'), {es5: true});
eval(code);
var fooInst = new Foo();
fooInst.title = 42;
fooInst['foo bar'] = 21;
var descriptor =
Object.getOwnPropertyDescriptor(Foo.prototype, 'title');
expect(fooInst.__title).toBe(42);
expect(descriptor.enumerable).toBe(true);
expect(descriptor.configurable).toBe(true);
expect(fooInst.__fooBar).toBe(21);
});
it('properly handles getters and setters in ES5 compat mode', function() {
var code = transform([
'class Foo {',
' get title() {',
' return this.__title;',
' }',
'',
' set title(value) {',
' this.__title = value;',
' }',
'}'
].join('\n'), {es5: true});
eval(code);
var fooInst = new Foo();
var descriptor =
Object.getOwnPropertyDescriptor(Foo.prototype, 'title');
fooInst.title = 42;
expect(fooInst.__title).toBe(42);
expect(fooInst.title).toBe(42);
expect(descriptor.enumerable).toBe(true);
expect(descriptor.configurable).toBe(true);
});
it('properly handles static and non-static getters and setters ' +
'with the same name in ES5 compat mode', function() {
var code = transform([
'class Foo {',
' static get title() {',
' return this._title;',
' }',
'',
' static set title(value) {',
' this._title = value;',
' }',
'',
' get title() {',
' return this.__title;',
' }',
'',
' set title(value) {',
' this.__title = value;',
' }',
'}'
].join('\n'), {es5: true});
eval(code);
var fooInst = new Foo();
Foo.title = 21;
fooInst.title = 42;
expect(Foo.title).toBe(21);
expect(fooInst.title).toBe(42);
});
it('properly handles private getters and setters in ES5 compat mode',
function() {
var code = transform([
'class Foo {',
' get title() {',
' return this._private;',
' }',
'',
' set title(value) {',
' this._private = value;',
' }',
'',
' get _private() {',
' return this.__superPrivate;',
' }',
'',
' set _private(value) {',
' this.__superPrivate = value;',
' }',
'}'
].join('\n'), {es5: true});
eval(code);
var fooInst = new Foo();
fooInst.title = 42;
expect(fooInst.__superPrivate).toBe(42);
});
it('throws upon encountering getter methods', function() {

@@ -1275,2 +1424,20 @@ expect(function() {

});
describe('handles reserved words', function() {
it('handles reserved words', function() {
expect(transform([
'class Foo {',
' delete(x, y) {',
' bar();',
' }',
'}'
].join('\n'))).toBe([
'function Foo(){"use strict";}',
' Foo.prototype["delete"]=function(x, y) {"use strict";',
' bar();',
' };',
''
].join('\n'))
});
});
});

@@ -15,2 +15,3 @@ /**

var shortObjectsVisitors;
var reservedWordsVisitors;
var restParamVisitors;

@@ -29,2 +30,3 @@ var classVisitorsVisitors;

shortObjectsVisitors = require('../es6-object-short-notation-visitors').visitorList;
reservedWordsVisitors = require('../reserved-words-visitors').visitorList;
restParamVisitors = require('../es6-rest-param-visitors').visitorList;

@@ -39,3 +41,4 @@ classVisitorsVisitors = require('../es6-class-visitors').visitorList;

classVisitorsVisitors,
arrowFunctionVisitors
arrowFunctionVisitors,
reservedWordsVisitors
);

@@ -249,4 +252,10 @@ });

it('should handle reserved words', function() {
expectTransform(
'var {delete: x} = {delete: 1};',
'var $__0= {"delete": 1},x=$__0["delete"];'
);
});
});

@@ -104,4 +104,30 @@ /**

it('should preserve generators', function() {
// Identifier properties
expectTransform(
'var foo = {*bar(x) {yield x;}};',
'var foo = {bar:function*(x) {yield x;}};'
);
// Literal properties
expectTransform(
'var foo = {*"abc"(x) {yield x;}, *42(x) {yield x;}};',
'var foo = {"abc":function*(x) {yield x;}, 42:function*(x) {yield x;}};'
);
// Dynamic properties
expectTransform(
'var foo = {*[a+b](x) {yield x;}}',
'var foo = {[a+b]:function*(x) {yield x;}}'
);
});
it('should handle reserved words', function() {
expectTransform(
'({delete(x) {}})',
'({"delete":function(x) {}})'
);
});
});

@@ -27,2 +27,3 @@ /**

var utils = require('../src/utils');
var reservedWordsHelper = require('./reserved-words-helper');

@@ -146,3 +147,3 @@ var declareIdentInLocalScope = utils.declareIdentInLocalScope;

function visitClassMethod(traverse, node, path, state) {
if (node.kind === 'get' || node.kind === 'set') {
if (!state.g.opts.es5 && (node.kind === 'get' || node.kind === 'set')) {
throw new Error(

@@ -175,2 +176,4 @@ 'This transform does not support ' + node.kind + 'ter methods for ES6 ' +

var methodNode = path[0];
var isGetter = methodNode.kind === 'get';
var isSetter = methodNode.kind === 'set';

@@ -186,2 +189,3 @@ state = utils.updateState(state, {

var prototypeOrStatic = methodNode.static ? '' : '.prototype';
var objectAccessor = state.className + prototypeOrStatic;

@@ -194,13 +198,34 @@ if (methodNode.key.type === Syntax.Identifier) {

}
methodAccessor = '.' + methodAccessor;
if (isGetter || isSetter) {
methodAccessor = JSON.stringify(methodAccessor);
} else if (!state.g.opts.es5 &&
reservedWordsHelper.isReservedWord(methodAccessor)) {
methodAccessor = '[' + JSON.stringify(methodAccessor) + ']';
} else {
methodAccessor = '.' + methodAccessor;
}
} else if (methodNode.key.type === Syntax.Literal) {
// 'foo bar'() {}
methodAccessor = '[' + JSON.stringify(methodNode.key.value) + ']';
// 'foo bar'() {} | get 'foo bar'() {} | set 'foo bar'() {}
methodAccessor = JSON.stringify(methodNode.key.value);
if (!(isGetter || isSetter)) {
methodAccessor = '[' + methodAccessor + ']';
}
}
utils.append(
state.className + prototypeOrStatic +
methodAccessor + '=function',
state
);
if (isSetter || isGetter) {
utils.append(
'Object.defineProperty(' +
objectAccessor + ',' +
methodAccessor + ',' +
'{enumerable:true,configurable:true,' +
methodNode.kind + ':function',
state
);
} else {
utils.append(
objectAccessor +
methodAccessor + '=function' + (node.generator ? '*' : ''),
state
);
}
}

@@ -237,2 +262,5 @@ utils.move(methodNode.key.range[1], state);

if (methodNode.key.name !== 'constructor') {
if (isGetter || isSetter) {
utils.append('})', state);
}
utils.append(';', state);

@@ -239,0 +267,0 @@ }

@@ -43,2 +43,3 @@ /**

var reservedWordsHelper = require('./reserved-words-helper');
var restParamVisitors = require('./es6-rest-param-visitors');

@@ -137,5 +138,11 @@ var restPropertyHelpers = require('./es7-rest-property-helpers');

var tmpName = getTmpVar(tmpIndex);
return node.type === Syntax.ObjectPattern
? tmpName + '.' + patternItem.key.name
: tmpName + '[' + idx + ']';
if (node.type === Syntax.ObjectPattern) {
if (reservedWordsHelper.isReservedWord(patternItem.key.name)) {
return tmpName + '["' + patternItem.key.name + '"]';
} else {
return tmpName + '.' + patternItem.key.name;
}
} else {
return tmpName + '[' + idx + ']';
}
}

@@ -142,0 +149,0 @@

@@ -20,3 +20,3 @@ /**

/**
* Desugars concise methods of objects to ES3 function expressions.
* Desugars concise methods of objects to function expressions.
*

@@ -35,6 +35,24 @@ * var foo = {

var utils = require('../src/utils');
var reservedWordsHelper = require('./reserved-words-helper');
function visitObjectConciseMethod(traverse, node, path, state) {
var isGenerator = node.value.generator;
if (isGenerator) {
utils.catchupWhiteSpace(node.range[0] + 1, state);
}
if (node.computed) { // [<expr>]() { ...}
utils.catchup(node.key.range[1] + 1, state);
} else if (!state.g.opts.es5 &&
reservedWordsHelper.isReservedWord(node.key.name)) {
utils.catchup(node.key.range[0], state);
utils.append('"', state);
utils.catchup(node.key.range[1], state);
utils.append('"', state);
}
utils.catchup(node.key.range[1], state);
utils.append(':function', state);
utils.append(
':function' + (isGenerator ? '*' : ''),
state
);
path.unshift(node);

@@ -41,0 +59,0 @@ traverse(node.value, path, state);

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc