Skip to content

Commit

Permalink
Add toStringTag to dynamic entries and interop helpers
Browse files Browse the repository at this point in the history
  • Loading branch information
lukastaegert committed Oct 15, 2020
1 parent 0b2390a commit 20cbac1
Show file tree
Hide file tree
Showing 49 changed files with 617 additions and 48 deletions.
9 changes: 8 additions & 1 deletion src/Chunk.ts
Expand Up @@ -707,6 +707,12 @@ export default class Chunk {
});
}

// console.log(this.facadeModule?.id);
if (this.outputOptions.preserveModules) {
if (this.facadeModule === null) {
throw new Error(String(this.facadeModule === null));
}
}
const magicString = finalise(
this.renderedSource!,
{
Expand All @@ -716,9 +722,10 @@ export default class Chunk {
hasExports,
indentString: this.indentString,
intro: addons.intro!,
isEntryModuleFacade:
isEntryFacade:
this.outputOptions.preserveModules ||
(this.facadeModule !== null && this.facadeModule.info.isEntry),
isModuleFacade: this.facadeModule !== null,
namedExportsMode: this.exportMode !== 'default',
outro: addons.outro!,
usesTopLevelAwait,
Expand Down
21 changes: 13 additions & 8 deletions src/finalisers/amd.ts
Expand Up @@ -24,7 +24,8 @@ export default function amd(
hasExports,
indentString: t,
intro,
isEntryModuleFacade,
isEntryFacade,
isModuleFacade,
namedExportsMode,
outro,
varOrConst,
Expand Down Expand Up @@ -74,6 +75,7 @@ export default function amd(
interop,
externalLiveBindings,
freeze,
namespaceToStringTag,
accessedGlobals,
_,
n,
Expand All @@ -91,14 +93,17 @@ export default function amd(
t,
externalLiveBindings
);
magicString.append(
`${exportBlock}${
namedExportsMode && hasExports && isEntryModuleFacade && esModule
? `${n}${n}${getNamespaceMarkers(namespaceToStringTag, _, n)}`
: ''
}${outro}`
let namespaceMarkers = getNamespaceMarkers(
namedExportsMode && hasExports,
isEntryFacade && esModule,
isModuleFacade && namespaceToStringTag,
_,
n
);

if (namespaceMarkers) {
namespaceMarkers = n + n + namespaceMarkers;
}
magicString.append(`${exportBlock}${namespaceMarkers}${outro}`);
return magicString
.indent(t)
.prepend(`${amdDefine}(${params}function${_}(${args.join(`,${_}`)})${_}{${useStrict}${n}${n}`)
Expand Down
18 changes: 13 additions & 5 deletions src/finalisers/cjs.ts
Expand Up @@ -14,7 +14,8 @@ export default function cjs(
hasExports,
indentString: t,
intro,
isEntryModuleFacade,
isEntryFacade,
isModuleFacade,
namedExportsMode,
outro,
varOrConst
Expand All @@ -34,17 +35,24 @@ export default function cjs(
const _ = compact ? '' : ' ';

const useStrict = strict ? `'use strict';${n}${n}` : '';
const namespaceMarkers =
namedExportsMode && hasExports && isEntryModuleFacade && esModule
? `${getNamespaceMarkers(namespaceToStringTag, _, n)}${n}${n}`
: '';
let namespaceMarkers = getNamespaceMarkers(
namedExportsMode && hasExports,
isEntryFacade && esModule,
isModuleFacade && namespaceToStringTag,
_,
n
);
if (namespaceMarkers) {
namespaceMarkers += n + n;
}
const importBlock = getImportBlock(dependencies, compact, varOrConst, n, _);
const interopBlock = getInteropBlock(
dependencies,
varOrConst,
interop,
externalLiveBindings,
freeze,
namespaceToStringTag,
accessedGlobals,
_,
n,
Expand Down
17 changes: 11 additions & 6 deletions src/finalisers/iife.ts
Expand Up @@ -83,6 +83,7 @@ export default function iife(
interop,
externalLiveBindings,
freeze,
namespaceToStringTag,
accessedGlobals,
_,
n,
Expand Down Expand Up @@ -117,12 +118,16 @@ export default function iife(
t,
externalLiveBindings
);
magicString.append(
`${exportBlock}${
namedExportsMode && hasExports && esModule
? `${n}${n}${getNamespaceMarkers(namespaceToStringTag, _, n)}`
: ''
}${outro}`
let namespaceMarkers = getNamespaceMarkers(
namedExportsMode && hasExports,
esModule,
namespaceToStringTag,
_,
n
);
if (namespaceMarkers) {
namespaceMarkers = n + n + namespaceMarkers;
}
magicString.append(`${exportBlock}${namespaceMarkers}${outro}`);
return magicString.indent(t).prepend(wrapperIntro).append(wrapperOutro);
}
3 changes: 2 additions & 1 deletion src/finalisers/index.ts
Expand Up @@ -15,7 +15,8 @@ export interface FinaliserOptions {
hasExports: boolean;
indentString: string;
intro: string;
isEntryModuleFacade: boolean;
isEntryFacade: boolean;
isModuleFacade: boolean;
namedExportsMode: boolean;
outro: string;
usesTopLevelAwait: boolean;
Expand Down
32 changes: 28 additions & 4 deletions src/finalisers/shared/getExportBlock.ts
Expand Up @@ -175,8 +175,32 @@ function getReexportedImportName(
return `${moduleVariableName}.${imported}`;
}

export function getNamespaceMarkers(namespaceToStringTag: boolean, _: string, n: string): string {
return `Object.defineProperty(exports,${_}'__esModule',${_}{${_}value:${_}true${_}});${
namespaceToStringTag ? `${n}exports[Symbol.toStringTag]${_}=${_}'Module';` : ''
}`;
function getEsModuleExport(_: string): string {
return `Object.defineProperty(exports,${_}'__esModule',${_}{${_}value:${_}true${_}});`;
}

function getNamespaceToStringExport(_: string): string {
return `exports[Symbol.toStringTag]${_}=${_}'Module';`;
}

export function getNamespaceMarkers(
hasNamedExports: boolean,
addEsModule: boolean,
addNamespaceToStringTag: boolean,
_: string,
n: string
): string {
let namespaceMarkers = '';
if (hasNamedExports) {
if (addEsModule) {
namespaceMarkers += getEsModuleExport(_);
}
if (addNamespaceToStringTag) {
if (namespaceMarkers) {
namespaceMarkers += n;
}
namespaceMarkers += getNamespaceToStringExport(_);
}
}
return namespaceMarkers;
}
4 changes: 3 additions & 1 deletion src/finalisers/shared/getInteropBlock.ts
Expand Up @@ -13,6 +13,7 @@ export default function getInteropBlock(
interop: GetInterop,
externalLiveBindings: boolean,
freeze: boolean,
namespaceToStringTag: boolean,
accessedGlobals: Set<string>,
_: string,
n: string,
Expand Down Expand Up @@ -92,6 +93,7 @@ export default function getInteropBlock(
s,
t,
externalLiveBindings,
freeze
freeze,
namespaceToStringTag
)}${interopStatements.length > 0 ? `${interopStatements.join(n)}${n}${n}` : ''}`;
}
18 changes: 11 additions & 7 deletions src/finalisers/umd.ts
Expand Up @@ -161,6 +161,7 @@ export default function umd(
interop,
externalLiveBindings,
freeze,
namespaceToStringTag,
accessedGlobals,
_,
n,
Expand All @@ -178,13 +179,16 @@ export default function umd(
t,
externalLiveBindings
);
magicString.append(
`${exportBlock}${
namedExportsMode && hasExports && esModule
? `${n}${n}${getNamespaceMarkers(namespaceToStringTag, _, n)}`
: ''
}${outro}`
let namespaceMarkers = getNamespaceMarkers(
namedExportsMode && hasExports,
esModule,
namespaceToStringTag,
_,
n
);

if (namespaceMarkers) {
namespaceMarkers = n + n + namespaceMarkers;
}
magicString.append(`${exportBlock}${namespaceMarkers}${outro}`);
return magicString.trim().indent(t).append(wrapperOutro).prepend(wrapperIntro);
}
51 changes: 41 additions & 10 deletions src/utils/interopHelpers.ts
Expand Up @@ -48,11 +48,21 @@ export function getHelpersBlock(
s: string,
t: string,
liveBindings: boolean,
freeze: boolean
freeze: boolean,
namespaceToStringTag: boolean
): string {
return HELPER_NAMES.map(variable =>
usedHelpers.has(variable) || accessedGlobals.has(variable)
? HELPER_GENERATORS[variable](_, n, s, t, liveBindings, freeze, usedHelpers)
? HELPER_GENERATORS[variable](
_,
n,
s,
t,
liveBindings,
freeze,
namespaceToStringTag,
usedHelpers
)
: ''
).join('');
}
Expand All @@ -65,6 +75,7 @@ const HELPER_GENERATORS: {
t: string,
liveBindings: boolean,
freeze: boolean,
namespaceToStringTag: boolean,
usedHelpers: Set<string>
) => string;
} = {
Expand All @@ -76,27 +87,42 @@ const HELPER_GENERATORS: {
`function ${INTEROP_DEFAULT_LEGACY_VARIABLE}${_}(e)${_}{${_}return ` +
`e${_}&&${_}typeof e${_}===${_}'object'${_}&&${_}'default'${_}in e${_}?${_}` +
`${liveBindings ? getDefaultLiveBinding(_) : getDefaultStatic(_)}${s}${_}}${n}${n}`,
[INTEROP_NAMESPACE_VARIABLE]: (_, n, s, t, liveBindings, freeze, usedHelpers) =>
[INTEROP_NAMESPACE_VARIABLE]: (
_,
n,
s,
t,
liveBindings,
freeze,
namespaceToStringTag,
usedHelpers
) =>
`function ${INTEROP_NAMESPACE_VARIABLE}(e)${_}{${n}` +
(usedHelpers.has(INTEROP_NAMESPACE_DEFAULT_VARIABLE)
? `${t}return e${_}&&${_}e.__esModule${_}?${_}e${_}:${_}${INTEROP_NAMESPACE_DEFAULT_VARIABLE}(e)${s}${n}`
: `${t}if${_}(e${_}&&${_}e.__esModule)${_}return e;${n}` +
createNamespaceObject(_, n, t, t, liveBindings, freeze)) +
createNamespaceObject(_, n, t, t, liveBindings, freeze, namespaceToStringTag)) +
`}${n}${n}`,
[INTEROP_NAMESPACE_DEFAULT_VARIABLE]: (_, n, _s, t, liveBindings, freeze) =>
[INTEROP_NAMESPACE_DEFAULT_VARIABLE]: (_, n, _s, t, liveBindings, freeze, namespaceToStringTag) =>
`function ${INTEROP_NAMESPACE_DEFAULT_VARIABLE}(e)${_}{${n}` +
createNamespaceObject(_, n, t, t, liveBindings, freeze) +
createNamespaceObject(_, n, t, t, liveBindings, freeze, namespaceToStringTag) +
`}${n}${n}`,
[INTEROP_NAMESPACE_DEFAULT_ONLY_VARIABLE]: (
_: string,
n: string,
_s: string,
t: string,
_liveBindings: boolean,
freeze: boolean
freeze: boolean,
namespaceToStringTag: boolean
) =>
`function ${INTEROP_NAMESPACE_DEFAULT_ONLY_VARIABLE}(e)${_}{${n}` +
`${t}return ${getFrozen(`{__proto__: null,${_}'default':${_}e}`, freeze)};${n}` +
`${t}return ${getFrozen(
`{__proto__: null,${
namespaceToStringTag ? `${_}[Symbol.toStringTag]:${_}'Module',` : ''
}${_}'default':${_}e}`,
freeze
)};${n}` +
`}${n}${n}`
};

Expand All @@ -114,10 +140,15 @@ function createNamespaceObject(
t: string,
i: string,
liveBindings: boolean,
freeze: boolean
freeze: boolean,
namespaceToStringTag: boolean
) {
return (
`${i}var n${_}=${_}Object.create(null);${n}` +
`${i}var n${_}=${_}${
namespaceToStringTag
? `{__proto__:${_}null,${_}[Symbol.toStringTag]:${_}'Module'}`
: 'Object.create(null)'
};${n}` +
`${i}if${_}(e)${_}{${n}` +
`${i}${t}Object.keys(e).forEach(function${_}(k)${_}{${n}` +
(liveBindings ? copyPropertyLiveBinding : copyPropertyStatic)(_, n, t, i + t + t) +
Expand Down
@@ -0,0 +1,10 @@
module.exports = {
description:
'adds Symbol.toStringTag property to dynamic imports of entry chunks with default export mode',
options: {
input: ['main', 'foo'],
output: {
namespaceToStringTag: true
}
}
};
@@ -0,0 +1,7 @@
define(function () { 'use strict';

var foo = 42;

return foo;

});
@@ -0,0 +1,9 @@
define(['require'], function (require) { 'use strict';

function _interopNamespaceDefaultOnly(e) {
return Object.freeze({__proto__: null, [Symbol.toStringTag]: 'Module', 'default': e});
}

new Promise(function (resolve, reject) { require(['./foo'], function (m) { resolve(/*#__PURE__*/_interopNamespaceDefaultOnly(m)); }, reject) }).then(console.log);

});
@@ -0,0 +1,5 @@
'use strict';

var foo = 42;

module.exports = foo;
@@ -0,0 +1,7 @@
'use strict';

function _interopNamespaceDefaultOnly(e) {
return Object.freeze({__proto__: null, [Symbol.toStringTag]: 'Module', 'default': e});
}

Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./foo.js')); }).then(console.log);
@@ -0,0 +1,3 @@
var foo = 42;

export default foo;
@@ -0,0 +1 @@
import('./foo.js').then(console.log);
@@ -0,0 +1,10 @@
System.register([], function (exports) {
'use strict';
return {
execute: function () {

var foo = exports('default', 42);

}
};
});

0 comments on commit 20cbac1

Please sign in to comment.