Skip to content

Commit 3106ec9

Browse files
refactor: use map for namespace reexports by name (#4411)
* refactor: use map for namespace reexports by name * remove explicit type assignment * refactor: remove variable, use context property directly * refactor: remove unnecessary array assignment * Add test for recursive reexports * Revert "refactor: remove unnecessary array assignment" This reverts commit f7434c3. Co-authored-by: Lukas Taegert-Atkinson <[email protected]> Co-authored-by: Lukas Taegert-Atkinson <[email protected]>
1 parent 2cca505 commit 3106ec9

4 files changed

Lines changed: 35 additions & 16 deletions

File tree

src/Module.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -232,13 +232,13 @@ export default class Module {
232232
private readonly exportAllModules: (Module | ExternalModule)[] = [];
233233
private readonly exportAllSources = new Set<string>();
234234
private exportNamesByVariable: Map<Variable, string[]> | null = null;
235-
private readonly exportShimVariable: ExportShimVariable = new ExportShimVariable(this);
235+
private readonly exportShimVariable = new ExportShimVariable(this);
236236
private readonly exports = new Map<string, ExportDescription>();
237237
private declare magicString: MagicString;
238-
private namespaceReexportsByName: Record<
238+
private readonly namespaceReexportsByName = new Map<
239239
string,
240240
[variable: Variable | null, indirectExternal?: boolean]
241-
> = Object.create(null);
241+
>();
242242
private readonly reexportDescriptions = new Map<string, ReexportDescription>();
243243
private relevantDependencies: Set<Module | ExternalModule> | null = null;
244244
private readonly syntheticExports = new Map<string, SyntheticNamedExportVariable>();
@@ -380,7 +380,8 @@ export default class Module {
380380

381381
getDependenciesToBeIncluded(): Set<Module | ExternalModule> {
382382
if (this.relevantDependencies) return this.relevantDependencies;
383-
const relevantDependencies = new Set<Module | ExternalModule>();
383+
384+
this.relevantDependencies = new Set<Module | ExternalModule>();
384385
const necessaryDependencies = new Set<Module | ExternalModule>();
385386
const alwaysCheckedDependencies = new Set<Module>();
386387
const dependencyVariables = new Set(this.imports);
@@ -414,19 +415,19 @@ export default class Module {
414415
}
415416
if (!this.options.treeshake || this.info.moduleSideEffects === 'no-treeshake') {
416417
for (const dependency of this.dependencies) {
417-
relevantDependencies.add(dependency);
418+
this.relevantDependencies.add(dependency);
418419
}
419420
} else {
420421
this.addRelevantSideEffectDependencies(
421-
relevantDependencies,
422+
this.relevantDependencies,
422423
necessaryDependencies,
423424
alwaysCheckedDependencies
424425
);
425426
}
426427
for (const dependency of necessaryDependencies) {
427-
relevantDependencies.add(dependency);
428+
this.relevantDependencies.add(dependency);
428429
}
429-
return (this.relevantDependencies = relevantDependencies);
430+
return this.relevantDependencies;
430431
}
431432

432433
getExportNamesByVariable(): Map<Variable, string[]> {
@@ -579,14 +580,13 @@ export default class Module {
579580

580581
if (name !== 'default') {
581582
const foundNamespaceReexport =
582-
name in this.namespaceReexportsByName
583-
? this.namespaceReexportsByName[name]
584-
: this.getVariableFromNamespaceReexports(
585-
name,
586-
importerForSideEffects,
587-
searchedNamesAndModules
588-
);
589-
this.namespaceReexportsByName[name] = foundNamespaceReexport;
583+
this.namespaceReexportsByName.get(name) ??
584+
this.getVariableFromNamespaceReexports(
585+
name,
586+
importerForSideEffects,
587+
searchedNamesAndModules
588+
);
589+
this.namespaceReexportsByName.set(name, foundNamespaceReexport);
590590
if (foundNamespaceReexport[0]) {
591591
return foundNamespaceReexport;
592592
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const assert = require('assert');
2+
module.exports = {
3+
description: 'handles recursive namespace reexports',
4+
exports(exports) {
5+
assert.deepStrictEqual(exports, { main: 'main', other: 'other' });
6+
},
7+
warnings: [
8+
{
9+
code: 'CIRCULAR_DEPENDENCY',
10+
cycle: ['main.js', 'other.js', 'main.js'],
11+
importer: 'main.js',
12+
message: 'Circular dependency: main.js -> other.js -> main.js'
13+
}
14+
]
15+
};
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './other.js';
2+
export const main = 'main';
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export * from './main.js';
2+
export const other = 'other';

0 commit comments

Comments
 (0)