Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Properly deconflict synthetic named exports #3747

Merged
merged 1 commit into from
Aug 27, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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);
}