Skip to content

Commit

Permalink
Properly deconflict synthetic named exports (#3747)
Browse files Browse the repository at this point in the history
  • Loading branch information
lukastaegert committed Aug 27, 2020
1 parent b2bb960 commit da9195d
Show file tree
Hide file tree
Showing 26 changed files with 88 additions and 32 deletions.
16 changes: 13 additions & 3 deletions src/ast/variables/SyntheticNamedExportVariable.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import Module, { AstContext } from '../../Module';
import { RESERVED_NAMES } from '../../utils/reservedNames';
import ExportDefaultVariable from './ExportDefaultVariable';
import Variable from './Variable';

Expand All @@ -25,10 +26,13 @@ export default class SyntheticNamedExportVariable extends Variable {
return baseVariable;
}

getBaseVariableName(): string {
return this.syntheticNamespace.getBaseVariableName();
}

getName(): string {
const name = this.name;
const renderBaseName = this.syntheticNamespace.getName();
return `${renderBaseName}${getPropertyAccess(name)}`;
return `${this.syntheticNamespace.getName()}${getPropertyAccess(name)}`;
}

include() {
Expand All @@ -37,8 +41,14 @@ export default class SyntheticNamedExportVariable extends Variable {
this.context.includeVariable(this.syntheticNamespace);
}
}

setRenderNames(baseName: string | null, name: string | null) {
super.setRenderNames(baseName, name);
}
}

const getPropertyAccess = (name: string) => {
return /^(?!\d)[\w$]+$/.test(name) ? `.${name}` : `[${JSON.stringify(name)}]`;
return !RESERVED_NAMES[name] && /^(?!\d)[\w$]+$/.test(name)
? `.${name}`
: `[${JSON.stringify(name)}]`;
};
4 changes: 1 addition & 3 deletions src/ast/variables/Variable.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,7 @@ export default class Variable implements ExpressionEntity {
getName(): string {
const name = this.renderName || this.name;
return this.renderBaseName
? RESERVED_NAMES[this.name]
? `${this.renderBaseName}['${name}']`
: `${this.renderBaseName}.${name}`
? `${this.renderBaseName}${RESERVED_NAMES[name] ? `['${name}']` : `.${name}`}`
: name;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
define(['exports', './sub/index'], function (exports, index) { 'use strict';

const baz = { bar: index.default };
const baz = { bar: index['default'] };

exports.foo = index.foo;
exports.baz = baz;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });

var index = require('./sub/index.js');

const baz = { bar: index.default };
const baz = { bar: index['default'] };

exports.foo = index.foo;
exports.baz = baz;
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ define(['external', './other'], function (external, other) { 'use strict';

var external__default = /*#__PURE__*/_interopDefaultLegacy(external);

const { value } = other.default;
const { value } = other['default'];

console.log(external__default['default'], value);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau

var external__default = /*#__PURE__*/_interopDefaultLegacy(external);

const { value } = other.default;
const { value } = other['default'];

console.log(external__default['default'], value);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
define(['require', 'exports', './default', './named'], function (require, exports, _default, named) { 'use strict';

console.log(_default.default, named.value);
console.log(_default['default'], named.value);

new Promise(function (resolve, reject) { require(['./default'], resolve, reject) }).then(result => console.log(result.default));
new Promise(function (resolve, reject) { require(['./named'], resolve, reject) }).then(result => console.log(result.value));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
var _default = require('./default.js');
var named = require('./named.js');

console.log(_default.default, named.value);
console.log(_default['default'], named.value);

Promise.resolve().then(function () { return require('./default.js'); }).then(result => console.log(result.default));
Promise.resolve().then(function () { return require('./named.js'); }).then(result => console.log(result.value));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
define(['exports', './sub/index'], function (exports, index) { 'use strict';

const baz = { bar: index.default };
const baz = { bar: index['default'] };

exports.foo = index.foo;
exports.baz = baz;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });

var index = require('./sub/index.js');

const baz = { bar: index.default };
const baz = { bar: index['default'] };

exports.foo = index.foo;
exports.baz = baz;
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ define(['exports', './hsl2hsv'], function (exports, hsl2hsv$1) { 'use strict';

var lib = /*#__PURE__*/Object.freeze({
__proto__: null,
hsl2hsv: hsl2hsv$1.default
hsl2hsv: hsl2hsv$1['default']
});

exports.lib = lib;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ console.log(hsl2hsv);

var lib = /*#__PURE__*/Object.freeze({
__proto__: null,
hsl2hsv: hsl2hsv$1.default
hsl2hsv: hsl2hsv$1['default']
});

exports.lib = lib;
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ define(['external', './other'], function (external, other) { 'use strict';

var external__default = /*#__PURE__*/_interopDefaultLegacy(external);

const { value } = other.default;
const { value } = other['default'];

console.log(external__default['default'], value);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau

var external__default = /*#__PURE__*/_interopDefaultLegacy(external);

const { value } = other.default;
const { value } = other['default'];

console.log(external__default['default'], value);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
define(['require', 'exports', './default', './named'], function (require, exports, _default, named) { 'use strict';

console.log(_default.default, named.value);
console.log(_default['default'], named.value);

new Promise(function (resolve, reject) { require(['./default'], resolve, reject) }).then(result => console.log(result.default));
new Promise(function (resolve, reject) { require(['./named'], resolve, reject) }).then(result => console.log(result.value));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
var _default = require('./default.js');
var named = require('./named.js');

console.log(_default.default, named.value);
console.log(_default['default'], named.value);

Promise.resolve().then(function () { return require('./default.js'); }).then(result => console.log(result.default));
Promise.resolve().then(function () { return require('./named.js'); }).then(result => console.log(result.value));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ define(['module', 'require', 'external'], function (module, require, external) {
console.log(_interopDefault$1, _interopNamespace$1, module$1, require$1, exports$1, document$1, URL$1);

new Promise(function (resolve, reject) { require(['external'], function (m) { resolve(/*#__PURE__*/_interopNamespace(m)); }, reject) }).then(console.log);
exports.default = 0;
exports['default'] = 0;
console.log(new URL(module.uri, document.baseURI).href);

function nested1() {
Expand All @@ -51,7 +51,7 @@ define(['module', 'require', 'external'], function (module, require, external) {
console.log(_interopDefault, _interopNamespace$1, module$1, require$1, exports$1, document$1, URL$1);

new Promise(function (resolve, reject) { require(['external'], function (m) { resolve(/*#__PURE__*/_interopNamespace(m)); }, reject) }).then(console.log);
exports.default = 1;
exports['default'] = 1;
console.log(new URL(module.uri, document.baseURI).href);
}

Expand All @@ -70,6 +70,6 @@ define(['module', 'require', 'external'], function (module, require, external) {

nested2();

return exports.default;
return exports['default'];

});
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ const URL$1 = 1;
console.log(_interopDefault$1, _interopNamespace$1, module$1, require$1, exports$1, document$1, URL$1);

Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('external')); }).then(console.log);
exports.default = 0;
exports['default'] = 0;
console.log((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('cjs.js', document.baseURI).href)));

function nested1() {
Expand All @@ -53,7 +53,7 @@ function nested1() {
console.log(_interopDefault, _interopNamespace$1, module, require$1, exports$1, document$1, URL$1);

Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('external')); }).then(console.log);
exports.default = 1;
exports['default'] = 1;
console.log((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('cjs.js', document.baseURI).href)));
}

Expand All @@ -72,4 +72,4 @@ function nested2() {

nested2();

module.exports = exports.default;
module.exports = exports['default'];
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ var bundle = (function (external) {
console.log(_interopDefault$1, _interopNamespace$1, module, require, exports$1, document$1, URL$1);

import('external').then(console.log);
exports.default = 0;
exports['default'] = 0;
console.log((document.currentScript && document.currentScript.src || new URL('iife.js', document.baseURI).href));

function nested1() {
Expand All @@ -31,7 +31,7 @@ var bundle = (function (external) {
console.log(_interopDefault, _interopNamespace, module, require, exports$1, document$1, URL$1);

import('external').then(console.log);
exports.default = 1;
exports['default'] = 1;
console.log((document.currentScript && document.currentScript.src || new URL('iife.js', document.baseURI).href));
}

Expand All @@ -50,6 +50,6 @@ var bundle = (function (external) {

nested2();

return exports.default;
return exports['default'];

}(external));
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
console.log(_interopDefault$1, _interopNamespace$1, module, require$1, exports$1, document$1, URL$1);

import('external').then(console.log);
exports.default = 0;
exports['default'] = 0;
console.log((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('umd.js', document.baseURI).href)));

function nested1() {
Expand All @@ -34,7 +34,7 @@
console.log(_interopDefault, _interopNamespace, module, require$1, exports$1, document$1, URL$1);

import('external').then(console.log);
exports.default = 1;
exports['default'] = 1;
console.log((typeof document === 'undefined' ? new (require('u' + 'rl').URL)('file:' + __filename).href : (document.currentScript && document.currentScript.src || new URL('umd.js', document.baseURI).href)));
}

Expand All @@ -53,6 +53,6 @@

nested2();

return exports.default;
return exports['default'];

})));
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
const assert = require('assert');

module.exports = {
description: 'deconflicts synthetic named exports across chunks',
options: {
input: ['main', 'foo'],
preserveEntrySignatures: 'allow-extension',
plugins: [
{
transform(code) {
return { code, syntheticNamedExports: 'bar' };
}
}
]
},
exports(exports) {
assert.strictEqual(exports(2), 4);
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const bar = { double: x => x * x };
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { double } from './foo.js';

export default function (foo) {
return double(foo);
}
17 changes: 17 additions & 0 deletions test/function/samples/deconflict-synthetic-named-export/_config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
const assert = require('assert');

module.exports = {
description: 'deconflicts synthetic named exports',
options: {
plugins: [
{
transform(code) {
return { code, syntheticNamedExports: 'foo' };
}
}
]
},
exports(exports) {
assert.strictEqual(exports(2), 4);
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export const foo = { double: x => x * x };
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { double } from './foo.js';

export default function (foo) {
return double(foo);
}

0 comments on commit da9195d

Please sign in to comment.