Skip to content

Commit

Permalink
Merge branch 'master' into gh-4746-emit-via-manual-chunk
Browse files Browse the repository at this point in the history
  • Loading branch information
lukastaegert committed Dec 22, 2022
2 parents 148890e + 7182a92 commit 2e4753e
Show file tree
Hide file tree
Showing 28 changed files with 85 additions and 37 deletions.
2 changes: 1 addition & 1 deletion docs/08-troubleshooting.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ Occasionally you will see an error message like this:
Import declarations must have corresponding export declarations in the imported module. For example, if you have `import a from './a.js'` in a module, and a.js doesn't have an `export default` declaration, or `import {foo} from './b.js'`, and b.js doesn't export `foo`, Rollup cannot bundle the code.

This error frequently occurs with CommonJS modules converted by [@rollup/plugin-commonjs](https://github.com/rollup/plugins/tree/master/packages/commonjs), which makes a reasonable attempt to generate named exports from the CommonJS code but won't always succeed, because the freewheeling nature of CommonJS is at odds with the rigorous approach we benefit from in JavaScript modules. It can be solved by using the [namedExports](https://github.com/rollup/plugins/tree/master/packages/commonjs#custom-named-exports) option, which allows you to manually fill in the information gaps.
This error frequently occurs with CommonJS modules converted by [rollup-plugin-commonjs](https://github.com/rollup/rollup-plugin-commonjs), this package has been deprecated and is no longer maintained. Please use [@rollup/plugin-commonjs](https://github.com/rollup/plugins/tree/master/packages/commonjs#custom-named-exports).

### Error: "this is undefined"

Expand Down
32 changes: 28 additions & 4 deletions src/Chunk.ts
Original file line number Diff line number Diff line change
Expand Up @@ -603,12 +603,18 @@ export default class Chunk {
const renderedExports = exportMode === 'none' ? [] : this.getChunkExportDeclarations(format);
let hasExports = renderedExports.length > 0;
let hasDefaultExport = false;
for (const { reexports } of renderedDependencies) {
for (const renderedDependence of renderedDependencies) {
const { reexports } = renderedDependence;
if (reexports?.length) {
hasExports = true;
if (reexports.some(reexport => reexport.reexported === 'default')) {
if (!hasDefaultExport && reexports.some(reexport => reexport.reexported === 'default')) {
hasDefaultExport = true;
break;
}
if (format === 'es') {
renderedDependence.reexports = reexports.filter(
// eslint-disable-next-line unicorn/prefer-array-some
({ reexported }) => !renderedExports.find(({ exported }) => exported === reexported)
);
}
}
}
Expand Down Expand Up @@ -769,7 +775,25 @@ export default class Chunk {
const variable = this.exportsByName.get(exportName)!;
if (!(variable instanceof SyntheticNamedExportVariable)) {
const module = variable.module;
if (module && this.chunkByModule.get(module as Module) !== this) continue;
if (module) {
const chunk = this.chunkByModule.get(module as Module);
if (chunk !== this) {
if (!chunk || format !== 'es') {
continue;
}
const chunkDep = this.renderedDependencies!.get(chunk)!;
const { imports, reexports } = chunkDep;
const importedByReexported = reexports?.find(
({ reexported }) => reexported === exportName
);
const isImported = imports?.find(
({ imported }) => imported === importedByReexported?.imported
);
if (!isImported) {
continue;
}
}
}
}
let expression = null;
let hoisted = false;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import foo from './default.js';
export { default } from './default.js';
import { value } from './named.js';

console.log(foo, value);

import('./default.js').then(result => console.log(result.default));
import('./named.js').then(result => console.log(result.value));

export { foo as default };
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { __exports as other } from './_virtual/other.js';
export { __exports as default } from './_virtual/other.js';

other.value = 43;

export { other as default };
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import foo from './default.js';
export { default } from './default.js';
import { value } from './named.js';

console.log(foo, value);

import('./default.js').then(result => console.log(result.default));
import('./named.js').then(result => console.log(result.value));

export { foo as default };
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
import foo from './dep2.js';
export { default } from './dep2.js';



export { foo as default };
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { value } from './main.js';
export { value } from './main.js';

console.log('dynamic2', value);

export { value };
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { value } from './generated-dynamic1.js';
export { value } from './generated-dynamic1.js';

console.log('dynamic2', value);

export { value };
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { v as value1 } from './generated-from-main-1-and-dynamic.js';
export { v as value1 } from './generated-from-main-1-and-dynamic.js';
import { v as value2 } from './generated-from-main-1-and-2.js';
export { v as value2 } from './generated-from-main-1-and-2.js';

console.log('dynamic1', value1, value2);

export { value1, value2 };
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { v as value1 } from './generated-from-main-1-and-dynamic.js';
export { v as value1 } from './generated-from-main-1-and-dynamic.js';
import { v as value2, a as value3 } from './generated-from-main-1-and-2.js';
export { v as value2, a as value3 } from './generated-from-main-1-and-2.js';

console.log('main1', value1, value2, value3);
import('./generated-dynamic.js');

export { value1, value2, value3 };
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { v as value2, a as value3 } from './generated-from-main-1-and-2.js';
export { v as value2, a as value3 } from './generated-from-main-1-and-2.js';

console.log('main2', value2, value3);
import('./generated-dynamic.js');

export { value2, value3 };
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { v as value1 } from './generated-dep1.js';
export { v as value1 } from './generated-dep1.js';
import { v as value2 } from './generated-dep2.js';
export { v as value2 } from './generated-dep2.js';

console.log('dynamic1', value1, value2);

export { value1, value2 };
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { v as value1 } from './generated-dep1.js';
export { v as value1 } from './generated-dep1.js';
import { v as value2 } from './generated-dep2.js';
export { v as value2 } from './generated-dep2.js';

const something = 'something';

console.log('main1', value1, value2, something);
import('./generated-dynamic.js');

export { value1, value2 };
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { v as value2 } from './generated-dep2.js';
export { v as value2 } from './generated-dep2.js';

console.log('main2', value2);
import('./generated-dynamic.js');

export { value2 };
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { value1 } from './main1.js';
export { value1 } from './main1.js';
import './generated-dep2.js';

console.log('dynamic1', value1);

export { value1 };
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { v as value2 } from './generated-dep2.js';
export { v as value2 } from './generated-dep2.js';

console.log('dynamic2', value2);

export { value2 };
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
import { v as value2 } from './generated-dep2.js';
export { v as value2 } from './generated-dep2.js';

const value1 = 'shared1';

console.log('main1', value1, value2);
import('./generated-dynamic1.js');

export { value1 };
export { value1, value2 };
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { v as value2 } from './generated-dep2.js';
export { v as value2 } from './generated-dep2.js';

console.log('main2', value2);
import('./generated-dynamic2.js');

export { value2 };
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { value } from './main.js';
export { value } from './main.js';

console.log('dynamic', value);

export { value };
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { value } from './main.js';
export { value } from './main.js';

console.log('dynamic', value);

export { value };
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import foo from './default.js';
export { default } from './default.js';
import { value } from './named.js';

console.log(foo, value);

import('./default.js').then(result => console.log(result.default));
import('./named.js').then(result => console.log(result.value));

export { foo as default };
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { __exports as other } from './_virtual/other.js';
export { __exports as default } from './_virtual/other.js';

other.value = 43;

export { other as default };
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import * as lib from './lib.js';
export { lib };

console.log(lib);
import('./lib.js').then(console.log);

export { lib };
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import foo from './default.js';
export { default } from './default.js';
import { value } from './named.js';

console.log(foo, value);

import('./default.js').then(result => console.log(result.default));
import('./named.js').then(result => console.log(result.value));

export { foo as default };
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
import foo from './dep2.js';
export { default } from './dep2.js';



export { foo as default };
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { __exports as myBasePkg } from '../../../_virtual/index.js';
export { __exports as default } from '../../../_virtual/index.js';

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

var hello = 'world';

myBasePkg.hello = hello;

export { myBasePkg as default };
Original file line number Diff line number Diff line change
@@ -1,2 +1,5 @@
import { f as foo } from './generated-dep2.js';
export { f as default } from './generated-dep2.js';



export { foo as default };
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { l as lib } from './generated-lib.js';
export { l as lib } from './generated-lib.js';



var foo = lib.foo;
export { foo };
export { foo, lib };

0 comments on commit 2e4753e

Please sign in to comment.