Skip to content

Commit

Permalink
Add esModule: 'if-default-prop' and make it the default value
Browse files Browse the repository at this point in the history
  • Loading branch information
lukastaegert committed Aug 29, 2022
1 parent adef9fe commit dbda147
Show file tree
Hide file tree
Showing 637 changed files with 74 additions and 1,282 deletions.
27 changes: 9 additions & 18 deletions docs/999-big-list-of-options.md
Expand Up @@ -591,15 +591,11 @@ const foo = null;
export { foo as void };
// cjs output with reservedNamesAsProps: false
Object.defineProperty(exports, '__esModule', { value: true });
const foo = null;
exports['void'] = foo;
// cjs output with reservedNamesAsProps: true
Object.defineProperty(exports, '__esModule', { value: true });
const foo = null;
exports.void = foo;
Expand All @@ -614,25 +610,18 @@ Whether to allow the use of `Symbol` in auto-generated code snippets. Currently,
export const foo = 42;
// cjs output with symbols: false
Object.defineProperty(exports, '__esModule', { value: true });
const foo = 42;
exports.foo = foo;
// cjs output with symbols: true
Object.defineProperties(exports, {
__esModule: { value: true },
[Symbol.toStringTag]: { value: 'Module' }
});
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const foo = 42;
exports.foo = foo;
```

Note: The `__esModule` flag in the example can be prevented via the [`output.esModule`](https://rollupjs.org/guide/en/#outputesmodule) option.

#### output.hoistTransitiveImports

Type: `boolean`<br> CLI: `--hoistTransitiveImports`/`--no-hoistTransitiveImports`<br> Default: `true`
Expand Down Expand Up @@ -1412,9 +1401,15 @@ export default {
#### output.esModule
Type: `boolean`<br> CLI: `--esModule`/`--no-esModule`<br> Default: `true`
Type: `boolean | "if-default-prop"`<br> CLI: `--esModule`/`--no-esModule`<br> Default: `"if-default-prop"`
Whether to add a `__esModule: true` property when generating exports for non-ES formats. This property signifies that the exported value is the namespace of an ES module and that the default export of this module corresponds to the `.default` property of the exported object.
Whether to add a `__esModule: true` property when generating exports for non-ES formats. This property signifies that the exported value is the namespace of an ES module and that the default export of this module corresponds to the `.default` property of the exported object. By default, Rollup adds this property when using [named exports mode](guide/en/#outputexports) for a chunk. See also [`output.interop`](https://rollupjs.org/guide/en/#outputinterop).
- `true` will always add the property when using [named exports mode](guide/en/#outputexports), which is similar to what other tools do.
- `"if-default-prop"` will only add the property when using named exports mode and there also is a default export. The subtle difference is that if there is no default export, consumers of the CommonJS version of your library will get all named exports as default export instead of an error or `undefined`. We chose to make this the default value as the `__esModule` property is not a standard followed by any JavaScript runtime and leads to many interop issues, so we want to limit its use to the cases where it is really needed.
- `false` on the other hand will never add the property even if the default export would become a property `.default`.
See also [`output.interop`](https://rollupjs.org/guide/en/#outputinterop).
#### output.exports
Expand Down Expand Up @@ -1488,8 +1483,6 @@ Example:
export { x } from 'external';

// CJS output with externalLiveBindings: true
Object.defineProperty(exports, '__esModule', { value: true });

var external = require('external');

Object.defineProperty(exports, 'x', {
Expand All @@ -1500,8 +1493,6 @@ Object.defineProperty(exports, 'x', {
});

// CJS output with externalLiveBindings: false
Object.defineProperty(exports, '__esModule', { value: true });

var external = require('external');

exports.x = external.x;
Expand Down
23 changes: 20 additions & 3 deletions src/Chunk.ts
Expand Up @@ -583,9 +583,25 @@ export default class Chunk {

const renderedDependencies = [...this.getRenderedDependencies().values()];
const renderedExports = exportMode === 'none' ? [] : this.getChunkExportDeclarations(format);
const hasExports =
renderedExports.length !== 0 ||
renderedDependencies.some(dep => (dep.reexports && dep.reexports.length !== 0)!);
let hasExports = renderedExports.length !== 0;
let hasDefaultExport = false;
for (const { reexports } of renderedDependencies) {
if (reexports?.length) {
hasExports = true;
if (reexports.some(reexport => reexport.reexported === 'default')) {
hasDefaultExport = true;
break;
}
}
}
if (!hasDefaultExport) {
for (const { exported } of renderedExports) {
if (exported === 'default') {
hasDefaultExport = true;
break;
}
}
}

const { intro, outro, banner, footer } = await createAddons(
outputOptions,
Expand All @@ -598,6 +614,7 @@ export default class Chunk {
accessedGlobals,
dependencies: renderedDependencies,
exports: renderedExports,
hasDefaultExport,
hasExports,
id: preliminaryFileName.fileName,
indent,
Expand Down
3 changes: 2 additions & 1 deletion src/finalisers/amd.ts
Expand Up @@ -13,6 +13,7 @@ export default function amd(
accessedGlobals,
dependencies,
exports,
hasDefaultExport,
hasExports,
id,
indent: t,
Expand Down Expand Up @@ -84,7 +85,7 @@ export default function amd(
);
let namespaceMarkers = getNamespaceMarkers(
namedExportsMode && hasExports,
isEntryFacade && esModule,
isEntryFacade && (esModule === true || (esModule === 'if-default-prop' && hasDefaultExport)),
isModuleFacade && namespaceToStringTag,
snippets
);
Expand Down
3 changes: 2 additions & 1 deletion src/finalisers/cjs.ts
Expand Up @@ -12,6 +12,7 @@ export default function cjs(
accessedGlobals,
dependencies,
exports,
hasDefaultExport,
hasExports,
indent: t,
intro,
Expand All @@ -36,7 +37,7 @@ export default function cjs(
const useStrict = strict ? `'use strict';${n}${n}` : '';
let namespaceMarkers = getNamespaceMarkers(
namedExportsMode && hasExports,
isEntryFacade && esModule,
isEntryFacade && (esModule === true || (esModule === 'if-default-prop' && hasDefaultExport)),
isModuleFacade && namespaceToStringTag,
snippets
);
Expand Down
3 changes: 2 additions & 1 deletion src/finalisers/iife.ts
Expand Up @@ -20,6 +20,7 @@ export default function iife(
accessedGlobals,
dependencies,
exports,
hasDefaultExport,
hasExports,
indent: t,
intro,
Expand Down Expand Up @@ -118,7 +119,7 @@ export default function iife(
);
let namespaceMarkers = getNamespaceMarkers(
namedExportsMode && hasExports,
esModule,
esModule === true || (esModule === 'if-default-prop' && hasDefaultExport),
namespaceToStringTag,
snippets
);
Expand Down
1 change: 1 addition & 0 deletions src/finalisers/index.ts
Expand Up @@ -13,6 +13,7 @@ export interface FinaliserOptions {
accessedGlobals: Set<string>;
dependencies: ChunkDependency[];
exports: ChunkExports;
hasDefaultExport: boolean;
hasExports: boolean;
id: string;
indent: string;
Expand Down
3 changes: 2 additions & 1 deletion src/finalisers/umd.ts
Expand Up @@ -39,6 +39,7 @@ export default function umd(
accessedGlobals,
dependencies,
exports,
hasDefaultExport,
hasExports,
id,
indent: t,
Expand Down Expand Up @@ -201,7 +202,7 @@ export default function umd(
);
let namespaceMarkers = getNamespaceMarkers(
namedExportsMode && hasExports,
esModule,
esModule === true || (esModule === 'if-default-prop' && hasDefaultExport),
namespaceToStringTag,
snippets
);
Expand Down
4 changes: 2 additions & 2 deletions src/rollup/types.d.ts
Expand Up @@ -619,7 +619,7 @@ export interface OutputOptions {
/** @deprecated Use the "renderDynamicImport" plugin hook instead. */
dynamicImportFunction?: string;
entryFileNames?: string | ((chunkInfo: PreRenderedChunk) => string);
esModule?: boolean;
esModule?: boolean | 'if-default-prop';
exports?: 'default' | 'named' | 'none' | 'auto';
extend?: boolean;
externalLiveBindings?: boolean;
Expand Down Expand Up @@ -669,7 +669,7 @@ export interface NormalizedOutputOptions {
/** @deprecated Use the "renderDynamicImport" plugin hook instead. */
dynamicImportFunction: string | undefined;
entryFileNames: string | ((chunkInfo: PreRenderedChunk) => string);
esModule: boolean;
esModule: boolean | 'if-default-prop';
exports: 'default' | 'named' | 'none' | 'auto';
extend: boolean;
externalLiveBindings: boolean;
Expand Down
2 changes: 1 addition & 1 deletion src/utils/options/normalizeOutputOptions.ts
Expand Up @@ -44,7 +44,7 @@ export function normalizeOutputOptions(
dir: getDir(config, file),
dynamicImportFunction: getDynamicImportFunction(config, inputOptions, format),
entryFileNames: getEntryFileNames(config, unsetOptions),
esModule: config.esModule ?? true,
esModule: config.esModule ?? 'if-default-prop',
exports: getExports(config, unsetOptions),
extend: config.extend || false,
externalLiveBindings: config.externalLiveBindings ?? true,
Expand Down
Expand Up @@ -6,8 +6,6 @@ define('some/where/main', ['require', 'exports'], (function (require, exports) {

exports.getA = getA;

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

}));

define('some/where/generated-a', ['exports'], (function (exports) { 'use strict';
Expand Down
@@ -1,7 +1,5 @@
'use strict';

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

function getA() {
return Promise.resolve().then(function () { return require('./generated-a.js'); });
}
Expand Down
Expand Up @@ -6,6 +6,4 @@ define('some/where/main', ['require', 'exports'], (function (require, exports) {

exports.getA = getA;

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

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

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

function getA() {
return Promise.resolve().then(function () { return require('./chunks/generated-a.js'); });
}
Expand Down
2 changes: 0 additions & 2 deletions test/chunking-form/samples/amd-id-auto/_expected/amd/main.js
Expand Up @@ -6,6 +6,4 @@ define('main', ['require', 'exports'], (function (require, exports) { 'use stric

exports.getA = getA;

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

}));
2 changes: 0 additions & 2 deletions test/chunking-form/samples/amd-id-auto/_expected/cjs/main.js
@@ -1,7 +1,5 @@
'use strict';

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

function getA() {
return Promise.resolve().then(function () { return require('./generated-a.js'); });
}
Expand Down
Expand Up @@ -4,6 +4,4 @@ define(['exports', './generated-one'], (function (exports, one) { 'use strict';

exports.ItemOne = one.One;

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

}));
Expand Up @@ -8,6 +8,4 @@ define(['exports', './generated-one'], (function (exports, one) { 'use strict';

exports.ItemTwo = Two;

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

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

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

var one = require('./generated-one.js');


Expand Down
@@ -1,7 +1,5 @@
'use strict';

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

var one = require('./generated-one.js');

class Two {
Expand Down
Expand Up @@ -7,6 +7,4 @@ define(['exports', './generated-dep', 'external'], (function (exports, dep, exte
get: function () { return external.asdf; }
});

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

}));
Expand Up @@ -7,6 +7,4 @@ define(['exports', './generated-dep', 'external'], (function (exports, dep, exte
get: function () { return external.asdf; }
});

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

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

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

require('./generated-dep.js');
var external = require('external');

Expand Down
@@ -1,7 +1,5 @@
'use strict';

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

require('./generated-dep.js');
var external = require('external');

Expand Down
Expand Up @@ -15,6 +15,4 @@ define(['exports', 'starexternal1', 'external1', './generated-dep', 'starexterna
});
});

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

}));
Expand Up @@ -15,6 +15,4 @@ define(['exports', './generated-dep', 'external2', 'starexternal2'], (function (
});
});

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

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

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

var starexternal1 = require('starexternal1');
var external1 = require('external1');
var dep = require('./generated-dep.js');
Expand Down
@@ -1,7 +1,5 @@
'use strict';

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

var dep = require('./generated-dep.js');
var external2 = require('external2');
var starexternal2 = require('starexternal2');
Expand Down
Expand Up @@ -4,6 +4,4 @@ define(['exports', './generated-main1'], (function (exports, main2) { 'use stric

exports.p = main2.p$1;

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

}));
Expand Up @@ -4,6 +4,4 @@ define(['exports', './generated-main1'], (function (exports, main2) { 'use stric

exports.p = main2.p;

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

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

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

var main2 = require('./generated-main1.js');


Expand Down
@@ -1,7 +1,5 @@
'use strict';

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

var main2 = require('./generated-main1.js');


Expand Down
Expand Up @@ -4,6 +4,4 @@ define(['exports', './main2'], (function (exports, main2) { 'use strict';

exports.p = main2.p2;

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

}));
Expand Up @@ -23,6 +23,4 @@ define(['exports'], (function (exports) { 'use strict';
exports.p = p$1;
exports.p2 = p;

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

}));

0 comments on commit dbda147

Please sign in to comment.