Skip to content

Commit

Permalink
Have rollup emit `let $safeClassName = class $originalClassName { ...…
Browse files Browse the repository at this point in the history
…` instead of

`class $safeClassName { ...`, which changes the runtime behavior when MyClass.name
is accessed.

Added corresponding tests.
  • Loading branch information
NaridaL committed Mar 6, 2018
1 parent 440eacc commit 9e91088
Show file tree
Hide file tree
Showing 13 changed files with 112 additions and 1 deletion.
6 changes: 6 additions & 0 deletions src/ast/nodes/ClassDeclaration.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,12 @@ export default class ClassDeclaration extends ClassNode {
if (options.systemBindings && this.id && this.id.variable.exportName) {
code.appendLeft(this.end, ` exports('${this.id.variable.exportName}', ${this.id.variable.getName()});`);
}
if (this.id) {
const name = this.id.variable.getName()
if (name !== this.id.variable.name) {
code.appendRight(this.start, `let ${this.id.variable.safeName} = `)
}
}
super.render(code, options);
}
}
3 changes: 2 additions & 1 deletion src/ast/nodes/Identifier.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { ExpressionEntity, ForEachReturnExpressionCallback, SomeReturnExpression
import { NodeType } from './NodeType';
import AssignmentExpression from './AssignmentExpression';
import UpdateExpression from './UpdateExpression';
import ClassDeclaration from './ClassDeclaration';
import { RenderOptions } from '../../utils/renderHelpers';

export function isIdentifier (node: Node): node is Identifier {
Expand Down Expand Up @@ -159,7 +160,7 @@ export default class Identifier extends NodeBase {
if (this.variable) {
const name = this.variable.getName();

if (name !== this.name) {
if (name !== this.name && !(this.parent.type === NodeType.ClassDeclaration && (<ClassDeclaration>this.parent).id === this)) {
code.overwrite(this.start, this.end, name, {
storeName: true,
contentOnly: false
Expand Down
3 changes: 3 additions & 0 deletions test/form/samples/class-name-not-changed/MyClass.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export class MyClass {
constructor() { }
}
4 changes: 4 additions & 0 deletions test/form/samples/class-name-not-changed/_config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module.exports = {
description: 'class name should not be changed, even if symbol is renamed',
options: { output: { name: 'myBundle' } }
};
17 changes: 17 additions & 0 deletions test/form/samples/class-name-not-changed/_expected/amd.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
define(['exports'], function (exports) { 'use strict';

class MyClass {
constructor() { }
}

let MyClass$1 = class MyClass {
constructor() { }
}
assert.equal(MyClass$1.name, "MyClass"); // oops

exports.MyClass = MyClass$1;
exports.MyClass2 = MyClass;

Object.defineProperty(exports, '__esModule', { value: true });

});
15 changes: 15 additions & 0 deletions test/form/samples/class-name-not-changed/_expected/cjs.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
'use strict';

Object.defineProperty(exports, '__esModule', { value: true });

class MyClass {
constructor() { }
}

let MyClass$1 = class MyClass {
constructor() { }
}
assert.equal(MyClass$1.name, "MyClass"); // oops

exports.MyClass = MyClass$1;
exports.MyClass2 = MyClass;
10 changes: 10 additions & 0 deletions test/form/samples/class-name-not-changed/_expected/es.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
class MyClass {
constructor() { }
}

let MyClass$1 = class MyClass {
constructor() { }
}
assert.equal(MyClass$1.name, "MyClass"); // oops

export { MyClass$1 as MyClass, MyClass as MyClass2 };
18 changes: 18 additions & 0 deletions test/form/samples/class-name-not-changed/_expected/iife.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
var myBundle = (function (exports) {
'use strict';

class MyClass {
constructor() { }
}

let MyClass$1 = class MyClass {
constructor() { }
}
assert.equal(MyClass$1.name, "MyClass"); // oops

exports.MyClass = MyClass$1;
exports.MyClass2 = MyClass;

return exports;

}({}));
21 changes: 21 additions & 0 deletions test/form/samples/class-name-not-changed/_expected/umd.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(factory((global.myBundle = {})));
}(this, (function (exports) { 'use strict';

class MyClass {
constructor() { }
}

let MyClass$1 = class MyClass {
constructor() { }
}
assert.equal(MyClass$1.name, "MyClass"); // oops

exports.MyClass = MyClass$1;
exports.MyClass2 = MyClass;

Object.defineProperty(exports, '__esModule', { value: true });

})));
5 changes: 5 additions & 0 deletions test/form/samples/class-name-not-changed/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export class MyClass {
constructor() { }
}
assert.equal(MyClass.name, "MyClass") // oops
export { MyClass as MyClass2 } from "./MyClass"
3 changes: 3 additions & 0 deletions test/function/samples/class-name-not-changed/MyClass.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export class MyClass {
constructor() { }
}
3 changes: 3 additions & 0 deletions test/function/samples/class-name-not-changed/_config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module.exports = {
description: 'class name should not be changed, even if symbol is renamed'
};
5 changes: 5 additions & 0 deletions test/function/samples/class-name-not-changed/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export class MyClass {
constructor() { }
}
assert.equal(MyClass.name, "MyClass") // oops
export { MyClass as MyClass2 } from "./MyClass"

0 comments on commit 9e91088

Please sign in to comment.