jstransform
Advanced tools
Comparing version 6.2.0 to 6.3.0
{ | ||
"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); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
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
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
188494
33
5280
95