Skip to content

Commit

Permalink
Add module toStringTag to entries and interop namespaces (#3822)
Browse files Browse the repository at this point in the history
* Add __esModule marker to IIFE, add namespaceToStringTag to entry points

* Add toStringTag to dynamic entries and interop helpers
  • Loading branch information
lukastaegert committed Oct 15, 2020
1 parent 84e4e09 commit 05d578a
Show file tree
Hide file tree
Showing 161 changed files with 1,031 additions and 166 deletions.
3 changes: 2 additions & 1 deletion src/Chunk.ts
Expand Up @@ -716,9 +716,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
24 changes: 16 additions & 8 deletions src/finalisers/amd.ts
@@ -1,8 +1,7 @@
import { Bundle as MagicStringBundle } from 'magic-string';
import { NormalizedOutputOptions } from '../rollup/types';
import { FinaliserOptions } from './index';
import { compactEsModuleExport, esModuleExport } from './shared/esModuleExport';
import getExportBlock from './shared/getExportBlock';
import { getExportBlock, getNamespaceMarkers } from './shared/getExportBlock';
import getInteropBlock from './shared/getInteropBlock';
import warnOnBuiltins from './shared/warnOnBuiltins';

Expand All @@ -25,7 +24,8 @@ export default function amd(
hasExports,
indentString: t,
intro,
isEntryModuleFacade,
isEntryFacade,
isModuleFacade,
namedExportsMode,
outro,
varOrConst,
Expand All @@ -38,6 +38,7 @@ export default function amd(
externalLiveBindings,
freeze,
interop,
namespaceToStringTag,
strict
}: NormalizedOutputOptions
) {
Expand Down Expand Up @@ -74,6 +75,7 @@ export default function amd(
interop,
externalLiveBindings,
freeze,
namespaceToStringTag,
accessedGlobals,
_,
n,
Expand All @@ -91,11 +93,17 @@ export default function amd(
t,
externalLiveBindings
);
if (exportBlock) magicString.append(exportBlock);
if (namedExportsMode && hasExports && isEntryModuleFacade && esModule)
magicString.append(`${n}${n}${compact ? compactEsModuleExport : esModuleExport}`);
if (outro) magicString.append(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
33 changes: 24 additions & 9 deletions src/finalisers/cjs.ts
Expand Up @@ -2,8 +2,7 @@ import { Bundle as MagicStringBundle } from 'magic-string';
import { ChunkDependencies } from '../Chunk';
import { NormalizedOutputOptions } from '../rollup/types';
import { FinaliserOptions } from './index';
import { compactEsModuleExport, esModuleExport } from './shared/esModuleExport';
import getExportBlock from './shared/getExportBlock';
import { getExportBlock, getNamespaceMarkers } from './shared/getExportBlock';
import getInteropBlock from './shared/getInteropBlock';

export default function cjs(
Expand All @@ -15,37 +14,53 @@ export default function cjs(
hasExports,
indentString: t,
intro,
isEntryModuleFacade,
isEntryFacade,
isModuleFacade,
namedExportsMode,
outro,
varOrConst
}: FinaliserOptions,
{ compact, esModule, externalLiveBindings, freeze, interop, strict }: NormalizedOutputOptions
{
compact,
esModule,
externalLiveBindings,
freeze,
interop,
namespaceToStringTag,
strict
}: NormalizedOutputOptions
) {
const n = compact ? '' : '\n';
const s = compact ? '' : ';';
const _ = compact ? '' : ' ';

const useStrict = strict ? `'use strict';${n}${n}` : '';
const esModuleProp =
namedExportsMode && hasExports && isEntryModuleFacade && esModule
? `${compact ? compactEsModuleExport : esModuleExport}${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,
s,
t
);

magicString.prepend(`${useStrict}${intro}${esModuleProp}${importBlock}${interopBlock}`);
magicString.prepend(`${useStrict}${intro}${namespaceMarkers}${importBlock}${interopBlock}`);

const exportBlock = getExportBlock(
exports,
Expand Down
17 changes: 15 additions & 2 deletions src/finalisers/iife.ts
Expand Up @@ -3,7 +3,7 @@ import { NormalizedOutputOptions } from '../rollup/types';
import { error } from '../utils/error';
import { isLegal } from '../utils/identifierHelpers';
import { FinaliserOptions } from './index';
import getExportBlock from './shared/getExportBlock';
import { getExportBlock, getNamespaceMarkers } from './shared/getExportBlock';
import getInteropBlock from './shared/getInteropBlock';
import { keypath } from './shared/sanitize';
import setupNamespace from './shared/setupNamespace';
Expand All @@ -28,12 +28,14 @@ export default function iife(
}: FinaliserOptions,
{
compact,
esModule,
extend,
freeze,
externalLiveBindings,
globals,
interop,
name,
namespaceToStringTag,
strict
}: NormalizedOutputOptions
) {
Expand Down Expand Up @@ -81,6 +83,7 @@ export default function iife(
interop,
externalLiveBindings,
freeze,
namespaceToStringTag,
accessedGlobals,
_,
n,
Expand Down Expand Up @@ -115,6 +118,16 @@ export default function iife(
t,
externalLiveBindings
);
magicString.append(`${exportBlock}${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
2 changes: 0 additions & 2 deletions src/finalisers/shared/esModuleExport.ts

This file was deleted.

32 changes: 31 additions & 1 deletion src/finalisers/shared/getExportBlock.ts
Expand Up @@ -6,7 +6,7 @@ import {
namespaceInteropHelpersByInteropType
} from '../../utils/interopHelpers';

export default function getExportBlock(
export function getExportBlock(
exports: ChunkExports,
dependencies: ChunkDependencies,
namedExportsMode: boolean,
Expand Down Expand Up @@ -174,3 +174,33 @@ function getReexportedImportName(
}
return `${moduleVariableName}.${imported}`;
}

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}` : ''}`;
}
21 changes: 14 additions & 7 deletions src/finalisers/umd.ts
Expand Up @@ -2,8 +2,7 @@ import { Bundle as MagicStringBundle } from 'magic-string';
import { NormalizedOutputOptions } from '../rollup/types';
import { error } from '../utils/error';
import { FinaliserOptions } from './index';
import { compactEsModuleExport, esModuleExport } from './shared/esModuleExport';
import getExportBlock from './shared/getExportBlock';
import { getExportBlock, getNamespaceMarkers } from './shared/getExportBlock';
import getInteropBlock from './shared/getInteropBlock';
import { keypath, property } from './shared/sanitize';
import { assignToDeepVariable } from './shared/setupNamespace';
Expand Down Expand Up @@ -45,6 +44,7 @@ export default function umd(
freeze,
interop,
name,
namespaceToStringTag,
globals,
noConflict,
strict
Expand Down Expand Up @@ -161,6 +161,7 @@ export default function umd(
interop,
externalLiveBindings,
freeze,
namespaceToStringTag,
accessedGlobals,
_,
n,
Expand All @@ -178,10 +179,16 @@ export default function umd(
t,
externalLiveBindings
);
if (exportBlock) magicString.append(exportBlock);
if (namedExportsMode && hasExports && esModule)
magicString.append(n + n + (compact ? compactEsModuleExport : esModuleExport));
if (outro) magicString.append(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);
}

0 comments on commit 05d578a

Please sign in to comment.