From aecd3e16c5d0f19feab75dabfbd4d86e5ccb4cee Mon Sep 17 00:00:00 2001 From: Manu MA Date: Tue, 7 Apr 2020 22:49:25 +0200 Subject: [PATCH] Handle re-exports of synthetic named exports (#3319) * Fix: handle re-exports of synthetic named exports * fix systemjs * reenable all tests * emit var or const * fix reexports * apply feedback * wip * Add test case for global name conflict * Add test case for multi-level synthetic named exports * Add test case for handling and deduplicating multiple synthetic named and default imports * Fix esm synthetic export deconflicting * Fix reeports of synthetic named exports * Slightly improve coverage * Fix namespace object generation Co-authored-by: Lukas Taegert-Atkinson --- src/Chunk.ts | 52 +++++++++++++++---- src/Module.ts | 30 ++++++++--- src/ast/variables/NamespaceVariable.ts | 23 ++++---- .../variables/SyntheticNamedExportVariable.ts | 17 +++++- src/ast/variables/Variable.ts | 6 +-- src/finalisers/es.ts | 9 ++-- src/finalisers/system.ts | 16 ++++-- src/utils/deconflictChunk.ts | 16 ++++-- .../_config.js | 17 ++++++ .../_expected/amd/generated-lib.js | 7 +++ .../_expected/amd/main1.js | 10 ++++ .../_expected/amd/main2.js | 5 ++ .../_expected/amd/main3.js | 9 ++++ .../_expected/cjs/generated-lib.js | 5 ++ .../_expected/cjs/main1.js | 10 ++++ .../_expected/cjs/main2.js | 5 ++ .../_expected/cjs/main3.js | 9 ++++ .../_expected/es/generated-lib.js | 3 ++ .../_expected/es/main1.js | 7 +++ .../_expected/es/main2.js | 3 ++ .../_expected/es/main3.js | 6 +++ .../_expected/system/generated-lib.js | 10 ++++ .../_expected/system/main1.js | 17 ++++++ .../_expected/system/main2.js | 14 +++++ .../_expected/system/main3.js | 16 ++++++ .../lib.js | 1 + .../main1.js | 1 + .../main2.js | 2 + .../main3.js | 1 + .../_config.js | 4 +- .../_expected/amd/generated-dep2.js | 7 +++ .../_expected/amd/main.js | 6 +-- .../_expected/amd/main2.js | 5 ++ .../_expected/cjs/generated-dep2.js | 5 ++ .../_expected/cjs/main.js | 4 +- .../_expected/cjs/main2.js | 5 ++ .../_expected/es/generated-dep2.js | 3 ++ .../_expected/es/main.js | 2 +- .../_expected/es/main2.js | 3 ++ .../_expected/system/generated-dep2.js | 10 ++++ .../_expected/system/main.js | 8 +-- .../_expected/system/main2.js | 14 +++++ .../mixed-synthetic-named-exports-2/main2.js | 2 + .../_expected/amd/main.js | 16 ++++-- .../_expected/cjs/main.js | 14 +++-- .../_expected/es/main.js | 12 +++-- .../_expected/system/main.js | 17 ++++-- .../mixed-synthetic-named-exports/dep2.js | 1 + .../mixed-synthetic-named-exports/main.js | 7 ++- .../_config.js | 16 ++++++ .../_expected/amd/main.js | 11 ++++ .../_expected/cjs/main.js | 9 ++++ .../_expected/es/main.js | 6 +++ .../_expected/system/main.js | 14 +++++ .../dep.js | 3 ++ .../main.js | 1 + .../_config.js | 17 ++++++ .../_expected/amd/main.js | 7 +++ .../_expected/amd/main2.js | 7 +++ .../_expected/amd/main3.js | 7 +++ .../_expected/amd/main4.js | 7 +++ .../_expected/amd/main5.js | 7 +++ .../_expected/cjs/main.js | 5 ++ .../_expected/cjs/main2.js | 7 +++ .../_expected/cjs/main3.js | 7 +++ .../_expected/cjs/main4.js | 7 +++ .../_expected/cjs/main5.js | 7 +++ .../_expected/es/main.js | 3 ++ .../_expected/es/main2.js | 5 ++ .../_expected/es/main3.js | 5 ++ .../_expected/es/main4.js | 5 ++ .../_expected/es/main5.js | 5 ++ .../_expected/system/main.js | 10 ++++ .../_expected/system/main2.js | 16 ++++++ .../_expected/system/main3.js | 16 ++++++ .../_expected/system/main4.js | 16 ++++++ .../_expected/system/main5.js | 16 ++++++ .../main.js | 1 + .../main2.js | 1 + .../main3.js | 1 + .../main4.js | 1 + .../main5.js | 1 + .../_config.js | 18 +++++++ .../_expected/amd/main.js | 30 +++++++++++ .../_expected/cjs/main.js | 28 ++++++++++ .../_expected/es/main.js | 24 +++++++++ .../_expected/system/main.js | 32 ++++++++++++ .../synthetic-named-exports-namespace/dep.js | 4 ++ .../synthetic-named-exports-namespace/main.js | 1 + .../synthetic.js | 7 +++ .../_expected/amd.js | 4 +- .../_expected/cjs.js | 4 +- .../ns-external-star-reexport/_expected/es.js | 4 +- .../_expected/iife.js | 4 +- .../_expected/system.js | 4 +- .../_expected/umd.js | 4 +- .../_config.js | 52 +++++++++++++++++++ .../dep.js | 4 ++ .../main.js | 1 + .../synthetic.js | 7 +++ .../_config.js | 39 ++++++++++++++ .../synthetic-named-exports-namespace/dep.js | 2 + .../synthetic-named-exports-namespace/main.js | 1 + .../main2.js | 1 + .../synthetic.js | 3 ++ 105 files changed, 908 insertions(+), 89 deletions(-) create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_config.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/generated-lib.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/main1.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/main2.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/main3.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/generated-lib.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/main1.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/main2.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/main3.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/generated-lib.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/main1.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/main2.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/main3.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/generated-lib.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/main1.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/main2.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/main3.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/lib.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/main1.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/main2.js create mode 100644 test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/main3.js create mode 100644 test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/amd/generated-dep2.js create mode 100644 test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/amd/main2.js create mode 100644 test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/cjs/generated-dep2.js create mode 100644 test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/cjs/main2.js create mode 100644 test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/es/generated-dep2.js create mode 100644 test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/es/main2.js create mode 100644 test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/system/generated-dep2.js create mode 100644 test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/system/main2.js create mode 100644 test/chunking-form/samples/mixed-synthetic-named-exports-2/main2.js create mode 100644 test/chunking-form/samples/mixed-synthetic-named-exports/dep2.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-global-conflict/_config.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/amd/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/cjs/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/es/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/system/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-global-conflict/dep.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-global-conflict/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_config.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main2.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main3.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main4.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main5.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main2.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main3.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main4.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main5.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main2.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main3.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main4.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main5.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main2.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main3.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main4.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main5.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/main2.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/main3.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/main4.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-multi-level/main5.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-namespace/_config.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-namespace/_expected/amd/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-namespace/_expected/cjs/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-namespace/_expected/es/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-namespace/_expected/system/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-namespace/dep.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-namespace/main.js create mode 100644 test/chunking-form/samples/synthetic-named-exports-namespace/synthetic.js create mode 100644 test/function/samples/synthetic-named-exports-namespace-overrides/_config.js create mode 100644 test/function/samples/synthetic-named-exports-namespace-overrides/dep.js create mode 100644 test/function/samples/synthetic-named-exports-namespace-overrides/main.js create mode 100644 test/function/samples/synthetic-named-exports-namespace-overrides/synthetic.js create mode 100644 test/function/samples/synthetic-named-exports-namespace/_config.js create mode 100644 test/function/samples/synthetic-named-exports-namespace/dep.js create mode 100644 test/function/samples/synthetic-named-exports-namespace/main.js create mode 100644 test/function/samples/synthetic-named-exports-namespace/main2.js create mode 100644 test/function/samples/synthetic-named-exports-namespace/synthetic.js diff --git a/src/Chunk.ts b/src/Chunk.ts index 7e5f24e72fa..242d5a2a3ba 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -8,6 +8,7 @@ import ExportDefaultVariable from './ast/variables/ExportDefaultVariable'; import ExportShimVariable from './ast/variables/ExportShimVariable'; import LocalVariable from './ast/variables/LocalVariable'; import NamespaceVariable from './ast/variables/NamespaceVariable'; +import SyntheticNamedExportVariable from './ast/variables/SyntheticNamedExportVariable'; import Variable from './ast/variables/Variable'; import ExternalModule from './ExternalModule'; import finalisers from './finalisers/index'; @@ -64,6 +65,7 @@ export type ChunkDependencies = ModuleDeclarationDependency[]; export type ChunkExports = { exported: string; + expression: string | null; hoisted: boolean; local: string; uninitialized: boolean; @@ -317,6 +319,7 @@ export default class Chunk { safeExportName: string; this.exportNames = Object.create(null); this.sortedExportNames = null; + if (mangle) { for (const variable of this.exports) { const suggestedName = variable.name[0]; @@ -507,7 +510,10 @@ export default class Chunk { this.setExternalRenderPaths(options, inputBase); this.renderedDependencies = this.getChunkDependencyDeclarations(options); - this.renderedExports = this.exportMode === 'none' ? [] : this.getChunkExportDeclarations(); + this.renderedExports = + this.exportMode === 'none' + ? [] + : this.getChunkExportDeclarations(options.format as InternalModuleFormat); timeEnd('render modules', 3); } @@ -744,8 +750,8 @@ export default class Chunk { importName = exportName = '*'; } else { const variable = this.exportNames[exportName]; + if (variable instanceof SyntheticNamedExportVariable) continue; const module = variable.module; - // skip local exports if (!module || module.chunk === this) continue; if (module instanceof Module) { exportChunk = module.chunk!; @@ -830,17 +836,20 @@ export default class Chunk { return dependencies; } - private getChunkExportDeclarations(): ChunkExports { + private getChunkExportDeclarations(format: InternalModuleFormat): ChunkExports { const exports: ChunkExports = []; for (const exportName of this.getExportNames()) { if (exportName[0] === '*') continue; const variable = this.exportNames[exportName]; - const module = variable.module; - - if (module && module.chunk !== this) continue; + if (!(variable instanceof SyntheticNamedExportVariable)) { + const module = variable.module; + if (module && module.chunk !== this) continue; + } + let expression = null; let hoisted = false; let uninitialized = false; + let local = variable.getName(); if (variable instanceof LocalVariable) { if (variable.init === UNDEFINED_EXPRESSION) { uninitialized = true; @@ -855,12 +864,18 @@ export default class Chunk { break; } } + } else if (variable instanceof SyntheticNamedExportVariable) { + expression = local; + if (format === 'es' && exportName !== 'default') { + local = variable.renderName!; + } } exports.push({ exported: exportName, + expression, hoisted, - local: variable.getName(), + local, uninitialized }); } @@ -944,6 +959,8 @@ export default class Chunk { } private setIdentifierRenderResolutions(options: OutputOptions) { + const syntheticExports = new Set(); + for (const exportName of this.getExportNames()) { const exportVariable = this.exportNames[exportName]; if (exportVariable instanceof ExportShimVariable) { @@ -957,6 +974,8 @@ export default class Chunk { !exportVariable.isId ) { exportVariable.setRenderNames('exports', exportName); + } else if (exportVariable instanceof SyntheticNamedExportVariable) { + syntheticExports.add(exportVariable); } else { exportVariable.setRenderNames(null, null); } @@ -985,13 +1004,17 @@ export default class Chunk { usedNames, options.format as string, options.interop !== false, - this.graph.preserveModules + this.graph.preserveModules, + syntheticExports ); } private setUpChunkImportsAndExportsForModule(module: Module) { - for (const variable of module.imports) { + for (let variable of module.imports) { if ((variable.module as Module).chunk !== this) { + if (variable instanceof SyntheticNamedExportVariable) { + variable = variable.getOriginalVariable(); + } this.imports.add(variable); if (variable.module instanceof Module) { variable.module.chunk!.exports.add(variable); @@ -1005,9 +1028,16 @@ export default class Chunk { const map = module.getExportNamesByVariable(); for (const exportedVariable of map.keys()) { this.exports.add(exportedVariable); - const exportingModule = exportedVariable.module; + const isSynthetic = exportedVariable instanceof SyntheticNamedExportVariable; + const importedVariable = isSynthetic + ? (exportedVariable as SyntheticNamedExportVariable).getOriginalVariable() + : exportedVariable; + const exportingModule = importedVariable.module; if (exportingModule && exportingModule.chunk && exportingModule.chunk !== this) { - exportingModule.chunk.exports.add(exportedVariable); + exportingModule.chunk.exports.add(importedVariable); + if (isSynthetic) { + this.imports.add(importedVariable); + } } } } diff --git a/src/Module.ts b/src/Module.ts index 4c7ccd8ae2c..343aaa3ce91 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -100,7 +100,7 @@ export interface AstContext { getModuleName: () => string; getReexports: () => string[]; importDescriptions: { [name: string]: ImportDescription }; - includeAndGetReexportedExternalNamespaces: () => ExternalVariable[]; + includeAndGetAdditionalMergedNamespaces: (context: InclusionContext) => Variable[]; includeDynamicImport: (node: ImportExpression) => void; includeVariable: (context: InclusionContext, variable: Variable) => void; magicString: MagicString; @@ -351,11 +351,20 @@ export default class Module { if (this.relevantDependencies) return this.relevantDependencies; const relevantDependencies = new Set(); for (const variable of this.imports) { - relevantDependencies.add(variable.module!); + relevantDependencies.add( + variable instanceof SyntheticNamedExportVariable + ? variable.getOriginalVariable().module! + : variable.module! + ); } if (this.isEntryPoint || this.dynamicallyImportedBy.length > 0 || this.graph.preserveModules) { for (const exportName of [...this.getReexports(), ...this.getExports()]) { - relevantDependencies.add(this.getVariableForExportName(exportName).module as Module); + const variable = this.getVariableForExportName(exportName); + relevantDependencies.add( + variable instanceof SyntheticNamedExportVariable + ? variable.getOriginalVariable().module! + : variable.module! + ); } } if (this.graph.treeshakingOptions) { @@ -700,7 +709,7 @@ export default class Module { getModuleName: this.basename.bind(this), getReexports: this.getReexports.bind(this), importDescriptions: this.importDescriptions, - includeAndGetReexportedExternalNamespaces: this.includeAndGetReexportedExternalNamespaces.bind( + includeAndGetAdditionalMergedNamespaces: this.includeAndGetAdditionalMergedNamespaces.bind( this ), includeDynamicImport: this.includeDynamicImport.bind(this), @@ -896,17 +905,22 @@ export default class Module { } } - private includeAndGetReexportedExternalNamespaces(): ExternalVariable[] { - const reexportedExternalNamespaces: ExternalVariable[] = []; + private includeAndGetAdditionalMergedNamespaces(context: InclusionContext): Variable[] { + const mergedNamespaces: Variable[] = []; for (const module of this.exportAllModules) { if (module instanceof ExternalModule) { const externalVariable = module.getVariableForExportName('*'); externalVariable.include(); this.imports.add(externalVariable); - reexportedExternalNamespaces.push(externalVariable); + mergedNamespaces.push(externalVariable); + } else if (module.syntheticNamedExports) { + const syntheticNamespace = module.getDefaultExport(); + syntheticNamespace.include(context); + this.imports.add(syntheticNamespace); + mergedNamespaces.push(syntheticNamespace); } } - return reexportedExternalNamespaces; + return mergedNamespaces; } private includeDynamicImport(node: ImportExpression) { diff --git a/src/ast/variables/NamespaceVariable.ts b/src/ast/variables/NamespaceVariable.ts index 6d495da5b7f..47b45ed1870 100644 --- a/src/ast/variables/NamespaceVariable.ts +++ b/src/ast/variables/NamespaceVariable.ts @@ -4,7 +4,6 @@ import { RESERVED_NAMES } from '../../utils/reservedNames'; import { InclusionContext } from '../ExecutionContext'; import Identifier from '../nodes/Identifier'; import { UNKNOWN_PATH } from '../utils/PathTracker'; -import ExternalVariable from './ExternalVariable'; import Variable from './Variable'; export default class NamespaceVariable extends Variable { @@ -13,7 +12,7 @@ export default class NamespaceVariable extends Variable { memberVariables: { [name: string]: Variable } = Object.create(null); module: Module; - private reexportedExternalNamespaces: ExternalVariable[] = []; + private mergedNamespaces: Variable[] = []; private referencedEarly = false; private references: Identifier[] = []; private syntheticNamedExports: boolean; @@ -49,7 +48,7 @@ export default class NamespaceVariable extends Variable { break; } } - this.reexportedExternalNamespaces = this.context.includeAndGetReexportedExternalNamespaces(); + this.mergedNamespaces = this.context.includeAndGetAdditionalMergedNamespaces(context); if (this.context.preserveModules) { for (const memberName of Object.keys(this.memberVariables)) this.memberVariables[memberName].include(context); @@ -91,21 +90,21 @@ export default class NamespaceVariable extends Variable { members.unshift(`${t}[Symbol.toStringTag]:${_}'Module'`); } - const hasExternalReexports = this.reexportedExternalNamespaces.length > 0; - if (!hasExternalReexports) members.unshift(`${t}__proto__:${_}null`); + const needsObjectAssign = this.mergedNamespaces.length > 0 || this.syntheticNamedExports; + if (!needsObjectAssign) members.unshift(`${t}__proto__:${_}null`); let output = `{${n}${members.join(`,${n}`)}${n}}`; - if (hasExternalReexports || this.syntheticNamedExports) { - const assignmentArgs = members.length > 0 ? [output] : []; - if (hasExternalReexports) { - assignmentArgs.unshift( - '/*#__PURE__*/Object.create(null)', - ...this.reexportedExternalNamespaces.map(variable => variable.getName()) - ); + if (needsObjectAssign) { + const assignmentArgs: string[] = ['/*#__PURE__*/Object.create(null)']; + if (this.mergedNamespaces.length > 0) { + assignmentArgs.push(...this.mergedNamespaces.map(variable => variable.getName())); } if (this.syntheticNamedExports) { assignmentArgs.push(this.module.getDefaultExport().getName()); } + if (members.length > 0) { + assignmentArgs.push(output); + } output = `/*#__PURE__*/Object.assign(${assignmentArgs.join(`,${_}`)})`; } if (options.freeze) { diff --git a/src/ast/variables/SyntheticNamedExportVariable.ts b/src/ast/variables/SyntheticNamedExportVariable.ts index da07fd189d1..3c7548b63d2 100644 --- a/src/ast/variables/SyntheticNamedExportVariable.ts +++ b/src/ast/variables/SyntheticNamedExportVariable.ts @@ -3,7 +3,7 @@ import { InclusionContext } from '../ExecutionContext'; import ExportDefaultVariable from './ExportDefaultVariable'; import Variable from './Variable'; -export default class SyntheticNamedExportVariableVariable extends Variable { +export default class SyntheticNamedExportVariable extends Variable { context: AstContext; defaultVariable: ExportDefaultVariable; module: Module; @@ -13,7 +13,16 @@ export default class SyntheticNamedExportVariableVariable extends Variable { this.context = context; this.module = context.module; this.defaultVariable = defaultVariable; - this.setRenderNames(defaultVariable.getName(), name); + } + + getName(): string { + const name = this.name; + const renderBaseName = this.defaultVariable.getName(); + return `${renderBaseName}${getPropertyAccess(name)}`; + } + + getOriginalVariable(): Variable { + return this.defaultVariable.getOriginalVariable(); } include(context: InclusionContext) { @@ -23,3 +32,7 @@ export default class SyntheticNamedExportVariableVariable extends Variable { } } } + +const getPropertyAccess = (name: string) => { + return /^(?!\d)[\w$]+$/.test(name) ? `.${name}` : `[${JSON.stringify(name)}]`; +}; diff --git a/src/ast/variables/Variable.ts b/src/ast/variables/Variable.ts index 0567b69396c..f17f86faa6a 100644 --- a/src/ast/variables/Variable.ts +++ b/src/ast/variables/Variable.ts @@ -49,7 +49,7 @@ export default class Variable implements ExpressionEntity { getName(): string { const name = this.renderName || this.name; - return this.renderBaseName ? `${this.renderBaseName}${getPropertyAccess(name)}` : name; + return this.renderBaseName ? `${this.renderBaseName}.${name}` : name; } getReturnExpressionWhenCalledAtPath( @@ -107,7 +107,3 @@ export default class Variable implements ExpressionEntity { return this.name; } } - -const getPropertyAccess = (name: string) => { - return /^(?!\d)[\w$]+$/.test(name) ? `.${name}` : `[${JSON.stringify(name)}]`; -}; diff --git a/src/finalisers/es.ts b/src/finalisers/es.ts index 5de0b6c3679..d98af4cb012 100644 --- a/src/finalisers/es.ts +++ b/src/finalisers/es.ts @@ -5,7 +5,7 @@ import { FinaliserOptions } from './index'; export default function es( magicString: MagicStringBundle, - { intro, outro, dependencies, exports }: FinaliserOptions, + { intro, outro, dependencies, exports, varOrConst }: FinaliserOptions, options: OutputOptions ) { const _ = options.compact ? '' : ' '; @@ -15,7 +15,7 @@ export default function es( if (importBlock.length > 0) intro += importBlock.join(n) + n + n; if (intro) magicString.prepend(intro); - const exportBlock = getExportBlock(exports, _); + const exportBlock = getExportBlock(exports, _, varOrConst); if (exportBlock.length) magicString.append(n + n + exportBlock.join(n).trim()); if (outro) magicString.append(outro); @@ -110,13 +110,16 @@ function getImportBlock(dependencies: ChunkDependencies, _: string): string[] { return importBlock; } -function getExportBlock(exports: ChunkExports, _: string): string[] { +function getExportBlock(exports: ChunkExports, _: string, varOrConst: string): string[] { const exportBlock: string[] = []; const exportDeclaration: string[] = []; for (const specifier of exports) { if (specifier.exported === 'default') { exportBlock.push(`export default ${specifier.local};`); } else { + if (specifier.expression) { + exportBlock.push(`${varOrConst} ${specifier.local}${_}=${_}${specifier.expression};`); + } exportDeclaration.push( specifier.exported === specifier.local ? specifier.local diff --git a/src/finalisers/system.ts b/src/finalisers/system.ts index a11c7f83bcb..e5315861b06 100644 --- a/src/finalisers/system.ts +++ b/src/finalisers/system.ts @@ -78,6 +78,16 @@ const getMissingExportsBlock = (exports: ChunkExports, _: string, t: string, n: n ); +const getSyntheticExportsBlock = (exports: ChunkExports, _: string, t: string, n: string): string => + getExportsBlock( + exports + .filter(expt => expt.expression) + .map(expt => ({ name: expt.exported, value: expt.local })), + _, + t, + n + ); + export default function system( magicString: MagicStringBundle, { @@ -194,13 +204,11 @@ export default function system( const wrapperEnd = `${n}${n}` + + getSyntheticExportsBlock(exports, _, t, n) + getMissingExportsBlock(exports, _, t, n) + `${t}${t}}${n}${t}}${options.compact ? '' : ';'}${n}});`; if (intro) magicString.prepend(intro); if (outro) magicString.append(outro); - return magicString - .indent(`${t}${t}${t}`) - .append(wrapperEnd) - .prepend(wrapperStart); + return magicString.indent(`${t}${t}${t}`).append(wrapperEnd).prepend(wrapperStart); } diff --git a/src/utils/deconflictChunk.ts b/src/utils/deconflictChunk.ts index e692d25f5d9..2069a9d7638 100644 --- a/src/utils/deconflictChunk.ts +++ b/src/utils/deconflictChunk.ts @@ -1,4 +1,5 @@ import ExportDefaultVariable from '../ast/variables/ExportDefaultVariable'; +import SyntheticNamedExportVariable from '../ast/variables/SyntheticNamedExportVariable'; import Variable from '../ast/variables/Variable'; import Chunk from '../Chunk'; import ExternalModule from '../ExternalModule'; @@ -11,7 +12,8 @@ const DECONFLICT_IMPORTED_VARIABLES_BY_FORMAT: { imports: Set, dependencies: Set, interop: boolean, - preserveModules: boolean + preserveModules: boolean, + syntheticExports: Set ) => void; } = { amd: deconflictImportsOther, @@ -29,7 +31,8 @@ export function deconflictChunk( usedNames: Set, format: string, interop: boolean, - preserveModules: boolean + preserveModules: boolean, + syntheticExports: Set ) { for (const module of modules) { module.scope.addUsedOutsideNames(usedNames, format); @@ -40,7 +43,8 @@ export function deconflictChunk( imports, dependencies, interop, - preserveModules + preserveModules, + syntheticExports ); for (const module of modules) { @@ -53,7 +57,8 @@ function deconflictImportsEsm( imports: Set, dependencies: Set, interop: boolean, - preserveModules: boolean + preserveModules: boolean, + syntheticExports: Set ) { // Deconflict re-exported variables of dependencies when preserveModules is true. // However, this implementation will result in unnecessary variable renaming without @@ -69,6 +74,9 @@ function deconflictImportsEsm( } } deconflictImportsEsmOrSystem(usedNames, imports, dependencies, interop); + for (const variable of syntheticExports) { + variable.setSafeName(getSafeName(variable.name, usedNames)); + } } function deconflictImportsEsmOrSystem( diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_config.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_config.js new file mode 100644 index 00000000000..9553f613606 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_config.js @@ -0,0 +1,17 @@ +module.exports = { + description: 'handles importing a synthetic named export together with the default export', + options: { + input: ['main1', 'main2', 'main3'], + plugins: [ + { + name: 'test-plugin', + transform(code) { + return { + code, + syntheticNamedExports: true + }; + } + } + ] + } +}; diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/generated-lib.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/generated-lib.js new file mode 100644 index 00000000000..ddc3e67c5c1 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/generated-lib.js @@ -0,0 +1,7 @@ +define(['exports'], function (exports) { 'use strict'; + + var lib = { foo: true, bar: true, baz: true }; + + exports.lib = lib; + +}); diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/main1.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/main1.js new file mode 100644 index 00000000000..016e31a212b --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/main1.js @@ -0,0 +1,10 @@ +define(['exports', './generated-lib'], function (exports, lib) { 'use strict'; + + + + exports.lib = lib.lib; + exports.foo = lib.lib.foo; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/main2.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/main2.js new file mode 100644 index 00000000000..11d3c897835 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/main2.js @@ -0,0 +1,5 @@ +define(['./generated-lib'], function (lib) { 'use strict'; + + console.log(lib.lib, lib.lib.foo, lib.lib.bar, lib.lib.baz); + +}); diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/main3.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/main3.js new file mode 100644 index 00000000000..503be04cea0 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/amd/main3.js @@ -0,0 +1,9 @@ +define(['exports', './generated-lib'], function (exports, lib) { 'use strict'; + + + + exports.foo = lib.lib.foo; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/generated-lib.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/generated-lib.js new file mode 100644 index 00000000000..8f023f26e39 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/generated-lib.js @@ -0,0 +1,5 @@ +'use strict'; + +var lib = { foo: true, bar: true, baz: true }; + +exports.lib = lib; diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/main1.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/main1.js new file mode 100644 index 00000000000..c161933fa8b --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/main1.js @@ -0,0 +1,10 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var lib = require('./generated-lib.js'); + + + +exports.lib = lib.lib; +exports.foo = lib.lib.foo; diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/main2.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/main2.js new file mode 100644 index 00000000000..96ce48edb46 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/main2.js @@ -0,0 +1,5 @@ +'use strict'; + +var lib = require('./generated-lib.js'); + +console.log(lib.lib, lib.lib.foo, lib.lib.bar, lib.lib.baz); diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/main3.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/main3.js new file mode 100644 index 00000000000..060e43c4807 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/cjs/main3.js @@ -0,0 +1,9 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var lib = require('./generated-lib.js'); + + + +exports.foo = lib.lib.foo; diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/generated-lib.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/generated-lib.js new file mode 100644 index 00000000000..9196d1bda06 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/generated-lib.js @@ -0,0 +1,3 @@ +var lib = { foo: true, bar: true, baz: true }; + +export { lib as l }; diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/main1.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/main1.js new file mode 100644 index 00000000000..fd5fab10b7a --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/main1.js @@ -0,0 +1,7 @@ +import { l as lib } from './generated-lib.js'; +export { l as lib } from './generated-lib.js'; + + + +var foo = lib.foo; +export { foo }; diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/main2.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/main2.js new file mode 100644 index 00000000000..84d281eca4e --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/main2.js @@ -0,0 +1,3 @@ +import { l as lib } from './generated-lib.js'; + +console.log(lib, lib.foo, lib.bar, lib.baz); diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/main3.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/main3.js new file mode 100644 index 00000000000..76cd1353449 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/es/main3.js @@ -0,0 +1,6 @@ +import { l as lib } from './generated-lib.js'; + + + +var foo = lib.foo; +export { foo }; diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/generated-lib.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/generated-lib.js new file mode 100644 index 00000000000..5ec5bda9998 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/generated-lib.js @@ -0,0 +1,10 @@ +System.register([], function (exports) { + 'use strict'; + return { + execute: function () { + + var lib = exports('l', { foo: true, bar: true, baz: true }); + + } + }; +}); diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/main1.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/main1.js new file mode 100644 index 00000000000..040f04f92e1 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/main1.js @@ -0,0 +1,17 @@ +System.register(['./generated-lib.js'], function (exports) { + 'use strict'; + var lib; + return { + setters: [function (module) { + lib = module.l; + exports('lib', module.l); + }], + execute: function () { + + + + exports('foo', lib.foo); + + } + }; +}); diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/main2.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/main2.js new file mode 100644 index 00000000000..f5170242109 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/main2.js @@ -0,0 +1,14 @@ +System.register(['./generated-lib.js'], function () { + 'use strict'; + var lib; + return { + setters: [function (module) { + lib = module.l; + }], + execute: function () { + + console.log(lib, lib.foo, lib.bar, lib.baz); + + } + }; +}); diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/main3.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/main3.js new file mode 100644 index 00000000000..6a5024c167d --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/_expected/system/main3.js @@ -0,0 +1,16 @@ +System.register(['./generated-lib.js'], function (exports) { + 'use strict'; + var lib; + return { + setters: [function (module) { + lib = module.l; + }], + execute: function () { + + + + exports('foo', lib.foo); + + } + }; +}); diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/lib.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/lib.js new file mode 100644 index 00000000000..08c422aab65 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/lib.js @@ -0,0 +1 @@ +export default { foo: true, bar: true, baz: true }; diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/main1.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/main1.js new file mode 100644 index 00000000000..a80de44e9cf --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/main1.js @@ -0,0 +1 @@ +export { default as lib, foo } from './lib.js'; diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/main2.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/main2.js new file mode 100644 index 00000000000..ca554b02a33 --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/main2.js @@ -0,0 +1,2 @@ +import lib, { foo, bar, baz } from './lib.js'; +console.log(lib, foo, bar, baz); diff --git a/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/main3.js b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/main3.js new file mode 100644 index 00000000000..93d1472b79b --- /dev/null +++ b/test/chunking-form/samples/deduplicate-synthetic-named-exports-and-default/main3.js @@ -0,0 +1 @@ +export { foo } from './lib.js'; diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_config.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_config.js index d076570b3b9..9627155afc2 100644 --- a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_config.js +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_config.js @@ -1,7 +1,7 @@ module.exports = { - description: 'mixed synthetic named exports', + description: 'mixed synthetic named exports 2', options: { - input: ['main.js'], + input: ['main.js', 'main2.js'], plugins: [ { transform(code, id) { diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/amd/generated-dep2.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/amd/generated-dep2.js new file mode 100644 index 00000000000..bf8ce12ad97 --- /dev/null +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/amd/generated-dep2.js @@ -0,0 +1,7 @@ +define(['exports'], function (exports) { 'use strict'; + + var dep2 = {bar: {foo: 'works'}}; + + exports.dep2 = dep2; + +}); diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/amd/main.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/amd/main.js index 2d5a6a148b1..d8e2d49a49b 100644 --- a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/amd/main.js +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/amd/main.js @@ -1,7 +1,5 @@ -define(function () { 'use strict'; +define(['./generated-dep2'], function (dep2) { 'use strict'; - var dep2 = {bar: {foo: 'works'}}; - - console.log(dep2.bar.foo); + console.log(dep2.dep2.bar.foo); }); diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/amd/main2.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/amd/main2.js new file mode 100644 index 00000000000..d8e2d49a49b --- /dev/null +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/amd/main2.js @@ -0,0 +1,5 @@ +define(['./generated-dep2'], function (dep2) { 'use strict'; + + console.log(dep2.dep2.bar.foo); + +}); diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/cjs/generated-dep2.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/cjs/generated-dep2.js new file mode 100644 index 00000000000..2b3995abca6 --- /dev/null +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/cjs/generated-dep2.js @@ -0,0 +1,5 @@ +'use strict'; + +var dep2 = {bar: {foo: 'works'}}; + +exports.dep2 = dep2; diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/cjs/main.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/cjs/main.js index 3a897a26f6d..8d1ac6eb90c 100644 --- a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/cjs/main.js +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/cjs/main.js @@ -1,5 +1,5 @@ 'use strict'; -var dep2 = {bar: {foo: 'works'}}; +var dep2 = require('./generated-dep2.js'); -console.log(dep2.bar.foo); +console.log(dep2.dep2.bar.foo); diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/cjs/main2.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/cjs/main2.js new file mode 100644 index 00000000000..8d1ac6eb90c --- /dev/null +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/cjs/main2.js @@ -0,0 +1,5 @@ +'use strict'; + +var dep2 = require('./generated-dep2.js'); + +console.log(dep2.dep2.bar.foo); diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/es/generated-dep2.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/es/generated-dep2.js new file mode 100644 index 00000000000..89c4d994e3f --- /dev/null +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/es/generated-dep2.js @@ -0,0 +1,3 @@ +var dep2 = {bar: {foo: 'works'}}; + +export { dep2 as d }; diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/es/main.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/es/main.js index f84e5168475..5e890796f14 100644 --- a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/es/main.js +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/es/main.js @@ -1,3 +1,3 @@ -var dep2 = {bar: {foo: 'works'}}; +import { d as dep2 } from './generated-dep2.js'; console.log(dep2.bar.foo); diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/es/main2.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/es/main2.js new file mode 100644 index 00000000000..5e890796f14 --- /dev/null +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/es/main2.js @@ -0,0 +1,3 @@ +import { d as dep2 } from './generated-dep2.js'; + +console.log(dep2.bar.foo); diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/system/generated-dep2.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/system/generated-dep2.js new file mode 100644 index 00000000000..7b4cb15fbc9 --- /dev/null +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/system/generated-dep2.js @@ -0,0 +1,10 @@ +System.register([], function (exports) { + 'use strict'; + return { + execute: function () { + + var dep2 = exports('d', {bar: {foo: 'works'}}); + + } + }; +}); diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/system/main.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/system/main.js index 0efe9ac0943..db0259f47e2 100644 --- a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/system/main.js +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/system/main.js @@ -1,10 +1,12 @@ -System.register([], function () { +System.register(['./generated-dep2.js'], function () { 'use strict'; + var dep2; return { + setters: [function (module) { + dep2 = module.d; + }], execute: function () { - var dep2 = {bar: {foo: 'works'}}; - console.log(dep2.bar.foo); } diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/system/main2.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/system/main2.js new file mode 100644 index 00000000000..db0259f47e2 --- /dev/null +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/_expected/system/main2.js @@ -0,0 +1,14 @@ +System.register(['./generated-dep2.js'], function () { + 'use strict'; + var dep2; + return { + setters: [function (module) { + dep2 = module.d; + }], + execute: function () { + + console.log(dep2.bar.foo); + + } + }; +}); diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports-2/main2.js b/test/chunking-form/samples/mixed-synthetic-named-exports-2/main2.js new file mode 100644 index 00000000000..62bc2e01f82 --- /dev/null +++ b/test/chunking-form/samples/mixed-synthetic-named-exports-2/main2.js @@ -0,0 +1,2 @@ +import { bar } from './dep2.js'; +console.log(bar.foo); diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/amd/main.js b/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/amd/main.js index 6285d62559e..8186f765ca9 100644 --- a/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/amd/main.js +++ b/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/amd/main.js @@ -1,4 +1,4 @@ -define(function () { 'use strict'; +define(['exports'], function (exports) { 'use strict'; const d = { fn: 42, @@ -6,14 +6,22 @@ define(function () { 'use strict'; }; const foo = 100; - var ns = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign({ - __proto__: null, + var ns = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), d, { foo: foo, 'default': d - }, d)); + })); + + const stuff = 12; + console.log(stuff); console.log(d.fn); console.log(foo); console.log(ns); + exports.fn = d.fn; + exports.foo = foo; + exports.stuff = d.stuff; + + Object.defineProperty(exports, '__esModule', { value: true }); + }); diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/cjs/main.js b/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/cjs/main.js index f2c1b375abb..07b00cddba6 100644 --- a/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/cjs/main.js +++ b/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/cjs/main.js @@ -1,17 +1,25 @@ 'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); + const d = { fn: 42, hello: 'hola' }; const foo = 100; -var ns = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign({ - __proto__: null, +var ns = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), d, { foo: foo, 'default': d -}, d)); +})); + +const stuff = 12; +console.log(stuff); console.log(d.fn); console.log(foo); console.log(ns); + +exports.fn = d.fn; +exports.foo = foo; +exports.stuff = d.stuff; diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/es/main.js b/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/es/main.js index 3b23f6d33bb..a9a0d834108 100644 --- a/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/es/main.js +++ b/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/es/main.js @@ -4,12 +4,18 @@ const d = { }; const foo = 100; -var ns = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign({ - __proto__: null, +var ns = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), d, { foo: foo, 'default': d -}, d)); +})); + +const stuff = 12; +console.log(stuff); console.log(d.fn); console.log(foo); console.log(ns); + +var fn = d.fn; +var stuff$1 = d.stuff; +export { fn, foo, stuff$1 as stuff }; diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/system/main.js b/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/system/main.js index 1147e48c999..01f53a09d05 100644 --- a/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/system/main.js +++ b/test/chunking-form/samples/mixed-synthetic-named-exports/_expected/system/main.js @@ -1,4 +1,4 @@ -System.register([], function () { +System.register([], function (exports) { 'use strict'; return { execute: function () { @@ -7,18 +7,25 @@ System.register([], function () { fn: 42, hello: 'hola' }; - const foo = 100; + const foo = exports('foo', 100); - var ns = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign({ - __proto__: null, + var ns = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), d, { foo: foo, 'default': d - }, d)); + })); + + const stuff = 12; + console.log(stuff); console.log(d.fn); console.log(foo); console.log(ns); + exports({ + fn: d.fn, + stuff: d.stuff + }); + } }; }); diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports/dep2.js b/test/chunking-form/samples/mixed-synthetic-named-exports/dep2.js new file mode 100644 index 00000000000..22e91cf9f6b --- /dev/null +++ b/test/chunking-form/samples/mixed-synthetic-named-exports/dep2.js @@ -0,0 +1 @@ +export {fn, foo, stuff} from './dep1.js'; diff --git a/test/chunking-form/samples/mixed-synthetic-named-exports/main.js b/test/chunking-form/samples/mixed-synthetic-named-exports/main.js index 9f9f926d5ad..fbca5496476 100644 --- a/test/chunking-form/samples/mixed-synthetic-named-exports/main.js +++ b/test/chunking-form/samples/mixed-synthetic-named-exports/main.js @@ -1,6 +1,11 @@ -import {fn, foo} from './dep1.js'; +import {fn, foo} from './dep2.js'; +export {fn, stuff, foo} from './dep2.js'; + import * as ns from './dep1.js'; +const stuff = 12; +console.log(stuff); + console.log(fn); console.log(foo); console.log(ns); \ No newline at end of file diff --git a/test/chunking-form/samples/synthetic-named-exports-global-conflict/_config.js b/test/chunking-form/samples/synthetic-named-exports-global-conflict/_config.js new file mode 100644 index 00000000000..5848d32b403 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-global-conflict/_config.js @@ -0,0 +1,16 @@ +module.exports = { + description: 'avoids conflicts with global variables when re-exporting synthetic named exports', + options: { + plugins: [ + { + name: 'test-plugin', + transform(code) { + return { + code, + syntheticNamedExports: true + }; + } + } + ] + } +}; diff --git a/test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/amd/main.js b/test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/amd/main.js new file mode 100644 index 00000000000..f959819397b --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/amd/main.js @@ -0,0 +1,11 @@ +define(['exports'], function (exports) { 'use strict'; + + var dep = { foo: 'bar' }; + // This should log a global variable + console.log(foo); + + exports.foo = dep.foo; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/cjs/main.js b/test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/cjs/main.js new file mode 100644 index 00000000000..124960daafa --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/cjs/main.js @@ -0,0 +1,9 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var dep = { foo: 'bar' }; +// This should log a global variable +console.log(foo); + +exports.foo = dep.foo; diff --git a/test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/es/main.js b/test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/es/main.js new file mode 100644 index 00000000000..106e89b1108 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/es/main.js @@ -0,0 +1,6 @@ +var dep = { foo: 'bar' }; +// This should log a global variable +console.log(foo); + +var foo$1 = dep.foo; +export { foo$1 as foo }; diff --git a/test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/system/main.js b/test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/system/main.js new file mode 100644 index 00000000000..87797e647ca --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-global-conflict/_expected/system/main.js @@ -0,0 +1,14 @@ +System.register([], function (exports) { + 'use strict'; + return { + execute: function () { + + var dep = { foo: 'bar' }; + // This should log a global variable + console.log(foo); + + exports('foo', dep.foo); + + } + }; +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-global-conflict/dep.js b/test/chunking-form/samples/synthetic-named-exports-global-conflict/dep.js new file mode 100644 index 00000000000..cdc752d178c --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-global-conflict/dep.js @@ -0,0 +1,3 @@ +export default { foo: 'bar' }; +// This should log a global variable +console.log(foo); diff --git a/test/chunking-form/samples/synthetic-named-exports-global-conflict/main.js b/test/chunking-form/samples/synthetic-named-exports-global-conflict/main.js new file mode 100644 index 00000000000..d5eae06078e --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-global-conflict/main.js @@ -0,0 +1 @@ +export { foo } from './dep.js'; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_config.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_config.js new file mode 100644 index 00000000000..428b9202e06 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_config.js @@ -0,0 +1,17 @@ +module.exports = { + description: 'handles multiple levels of synthetic named exports', + options: { + input: ['main.js', 'main2.js', 'main3.js', 'main4.js', 'main5.js'], + plugins: [ + { + name: 'test-plugin', + transform(code) { + return { + code, + syntheticNamedExports: true + }; + } + } + ] + } +}; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main.js new file mode 100644 index 00000000000..5345ab01ede --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main.js @@ -0,0 +1,7 @@ +define(function () { 'use strict'; + + var main = { one: { two: { three: { four: 42 } } } }; + + return main; + +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main2.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main2.js new file mode 100644 index 00000000000..69d6be24e95 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main2.js @@ -0,0 +1,7 @@ +define(['./main'], function (main) { 'use strict'; + + + + return main.one; + +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main3.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main3.js new file mode 100644 index 00000000000..ddd801950f3 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main3.js @@ -0,0 +1,7 @@ +define(['./main'], function (main) { 'use strict'; + + + + return main.one.two; + +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main4.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main4.js new file mode 100644 index 00000000000..571fd05288e --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main4.js @@ -0,0 +1,7 @@ +define(['./main'], function (main) { 'use strict'; + + + + return main.one.two.three; + +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main5.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main5.js new file mode 100644 index 00000000000..a57fdf1e8a9 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/amd/main5.js @@ -0,0 +1,7 @@ +define(['./main'], function (main) { 'use strict'; + + + + return main.one.two.three.four; + +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main.js new file mode 100644 index 00000000000..40bf1eb3134 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main.js @@ -0,0 +1,5 @@ +'use strict'; + +var main = { one: { two: { three: { four: 42 } } } }; + +module.exports = main; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main2.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main2.js new file mode 100644 index 00000000000..288d8a4ff41 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main2.js @@ -0,0 +1,7 @@ +'use strict'; + +var main = require('./main.js'); + + + +module.exports = main.one; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main3.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main3.js new file mode 100644 index 00000000000..cec84f5544e --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main3.js @@ -0,0 +1,7 @@ +'use strict'; + +var main = require('./main.js'); + + + +module.exports = main.one.two; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main4.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main4.js new file mode 100644 index 00000000000..77276ee0ecb --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main4.js @@ -0,0 +1,7 @@ +'use strict'; + +var main = require('./main.js'); + + + +module.exports = main.one.two.three; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main5.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main5.js new file mode 100644 index 00000000000..70774760f2e --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/cjs/main5.js @@ -0,0 +1,7 @@ +'use strict'; + +var main = require('./main.js'); + + + +module.exports = main.one.two.three.four; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main.js new file mode 100644 index 00000000000..e8e776d75c4 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main.js @@ -0,0 +1,3 @@ +var main = { one: { two: { three: { four: 42 } } } }; + +export default main; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main2.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main2.js new file mode 100644 index 00000000000..90a5c6eebb0 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main2.js @@ -0,0 +1,5 @@ +import main from './main.js'; + + + +export default main.one; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main3.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main3.js new file mode 100644 index 00000000000..f9bb1e916dc --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main3.js @@ -0,0 +1,5 @@ +import main from './main.js'; + + + +export default main.one.two; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main4.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main4.js new file mode 100644 index 00000000000..1a9f5e0da78 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main4.js @@ -0,0 +1,5 @@ +import main from './main.js'; + + + +export default main.one.two.three; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main5.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main5.js new file mode 100644 index 00000000000..03ca87e27a3 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/es/main5.js @@ -0,0 +1,5 @@ +import main from './main.js'; + + + +export default main.one.two.three.four; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main.js new file mode 100644 index 00000000000..99003e9f1e9 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main.js @@ -0,0 +1,10 @@ +System.register([], function (exports) { + 'use strict'; + return { + execute: function () { + + var main = exports('default', { one: { two: { three: { four: 42 } } } }); + + } + }; +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main2.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main2.js new file mode 100644 index 00000000000..9b5ce5eb807 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main2.js @@ -0,0 +1,16 @@ +System.register(['./main.js'], function (exports) { + 'use strict'; + var main; + return { + setters: [function (module) { + main = module.default; + }], + execute: function () { + + + + exports('default', main.one); + + } + }; +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main3.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main3.js new file mode 100644 index 00000000000..6fac0bfa41b --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main3.js @@ -0,0 +1,16 @@ +System.register(['./main.js'], function (exports) { + 'use strict'; + var main; + return { + setters: [function (module) { + main = module.default; + }], + execute: function () { + + + + exports('default', main.one.two); + + } + }; +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main4.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main4.js new file mode 100644 index 00000000000..cd109a5c27d --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main4.js @@ -0,0 +1,16 @@ +System.register(['./main.js'], function (exports) { + 'use strict'; + var main; + return { + setters: [function (module) { + main = module.default; + }], + execute: function () { + + + + exports('default', main.one.two.three); + + } + }; +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main5.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main5.js new file mode 100644 index 00000000000..20e0cef2195 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/_expected/system/main5.js @@ -0,0 +1,16 @@ +System.register(['./main.js'], function (exports) { + 'use strict'; + var main; + return { + setters: [function (module) { + main = module.default; + }], + execute: function () { + + + + exports('default', main.one.two.three.four); + + } + }; +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/main.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/main.js new file mode 100644 index 00000000000..5f6a929a540 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/main.js @@ -0,0 +1 @@ +export default { one: { two: { three: { four: 42 } } } }; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/main2.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/main2.js new file mode 100644 index 00000000000..33df4a9a3e8 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/main2.js @@ -0,0 +1 @@ +export { one as default } from './main.js'; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/main3.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/main3.js new file mode 100644 index 00000000000..9c4c8a445dc --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/main3.js @@ -0,0 +1 @@ +export { two as default } from './main2.js'; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/main4.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/main4.js new file mode 100644 index 00000000000..a02e2c016cf --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/main4.js @@ -0,0 +1 @@ +export { three as default } from './main3.js'; diff --git a/test/chunking-form/samples/synthetic-named-exports-multi-level/main5.js b/test/chunking-form/samples/synthetic-named-exports-multi-level/main5.js new file mode 100644 index 00000000000..2e67cd2364a --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-multi-level/main5.js @@ -0,0 +1 @@ +export { four as default } from './main4.js'; diff --git a/test/chunking-form/samples/synthetic-named-exports-namespace/_config.js b/test/chunking-form/samples/synthetic-named-exports-namespace/_config.js new file mode 100644 index 00000000000..cfc5383d876 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-namespace/_config.js @@ -0,0 +1,18 @@ +module.exports = { + description: 'supports re-exported synthetic exports in namespace objects', + options: { + plugins: [ + { + name: 'test-plugin', + transform(code, id) { + if (id.endsWith('synthetic.js')) { + return { + code, + syntheticNamedExports: true + }; + } + } + } + ] + } +}; diff --git a/test/chunking-form/samples/synthetic-named-exports-namespace/_expected/amd/main.js b/test/chunking-form/samples/synthetic-named-exports-namespace/_expected/amd/main.js new file mode 100644 index 00000000000..a7cc7e7dc2c --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-namespace/_expected/amd/main.js @@ -0,0 +1,30 @@ +define(['exports'], function (exports) { 'use strict'; + + var synthetic = { + foo: 'synthetic-foo', + bar: 'synthetic-bar', + baz: 'synthetic-baz', + default: 'not-in-namespace' + }; + const foo = 'foo'; + + var synthetic$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), synthetic, { + 'default': synthetic, + foo: foo + })); + + const bar = 'bar'; + var dep = 'not-overwritten'; + + var dep$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), synthetic, { + bar: bar, + 'default': dep, + synthetic: synthetic$1, + foo: foo + })); + + exports.dep = dep$1; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-namespace/_expected/cjs/main.js b/test/chunking-form/samples/synthetic-named-exports-namespace/_expected/cjs/main.js new file mode 100644 index 00000000000..a15bddf8416 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-namespace/_expected/cjs/main.js @@ -0,0 +1,28 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var synthetic = { + foo: 'synthetic-foo', + bar: 'synthetic-bar', + baz: 'synthetic-baz', + default: 'not-in-namespace' +}; +const foo = 'foo'; + +var synthetic$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), synthetic, { + 'default': synthetic, + foo: foo +})); + +const bar = 'bar'; +var dep = 'not-overwritten'; + +var dep$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), synthetic, { + bar: bar, + 'default': dep, + synthetic: synthetic$1, + foo: foo +})); + +exports.dep = dep$1; diff --git a/test/chunking-form/samples/synthetic-named-exports-namespace/_expected/es/main.js b/test/chunking-form/samples/synthetic-named-exports-namespace/_expected/es/main.js new file mode 100644 index 00000000000..4868b649580 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-namespace/_expected/es/main.js @@ -0,0 +1,24 @@ +var synthetic = { + foo: 'synthetic-foo', + bar: 'synthetic-bar', + baz: 'synthetic-baz', + default: 'not-in-namespace' +}; +const foo = 'foo'; + +var synthetic$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), synthetic, { + 'default': synthetic, + foo: foo +})); + +const bar = 'bar'; +var dep = 'not-overwritten'; + +var dep$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), synthetic, { + bar: bar, + 'default': dep, + synthetic: synthetic$1, + foo: foo +})); + +export { dep$1 as dep }; diff --git a/test/chunking-form/samples/synthetic-named-exports-namespace/_expected/system/main.js b/test/chunking-form/samples/synthetic-named-exports-namespace/_expected/system/main.js new file mode 100644 index 00000000000..42195788910 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-namespace/_expected/system/main.js @@ -0,0 +1,32 @@ +System.register([], function (exports) { + 'use strict'; + return { + execute: function () { + + var synthetic = { + foo: 'synthetic-foo', + bar: 'synthetic-bar', + baz: 'synthetic-baz', + default: 'not-in-namespace' + }; + const foo = 'foo'; + + var synthetic$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), synthetic, { + 'default': synthetic, + foo: foo + })); + + const bar = 'bar'; + var dep = 'not-overwritten'; + + var dep$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), synthetic, { + bar: bar, + 'default': dep, + synthetic: synthetic$1, + foo: foo + })); + exports('dep', dep$1); + + } + }; +}); diff --git a/test/chunking-form/samples/synthetic-named-exports-namespace/dep.js b/test/chunking-form/samples/synthetic-named-exports-namespace/dep.js new file mode 100644 index 00000000000..6562231f809 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-namespace/dep.js @@ -0,0 +1,4 @@ +export * as synthetic from './synthetic.js'; +export const bar = 'bar'; +export default 'not-overwritten'; +export * from './synthetic.js'; diff --git a/test/chunking-form/samples/synthetic-named-exports-namespace/main.js b/test/chunking-form/samples/synthetic-named-exports-namespace/main.js new file mode 100644 index 00000000000..b47aa74e93c --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-namespace/main.js @@ -0,0 +1 @@ +export * as dep from './dep.js'; diff --git a/test/chunking-form/samples/synthetic-named-exports-namespace/synthetic.js b/test/chunking-form/samples/synthetic-named-exports-namespace/synthetic.js new file mode 100644 index 00000000000..f8f24e7f0e0 --- /dev/null +++ b/test/chunking-form/samples/synthetic-named-exports-namespace/synthetic.js @@ -0,0 +1,7 @@ +export default { + foo: 'synthetic-foo', + bar: 'synthetic-bar', + baz: 'synthetic-baz', + default: 'not-in-namespace' +}; +export const foo = 'foo'; diff --git a/test/form/samples/ns-external-star-reexport/_expected/amd.js b/test/form/samples/ns-external-star-reexport/_expected/amd.js index e756846048f..ccb7ce31f47 100644 --- a/test/form/samples/ns-external-star-reexport/_expected/amd.js +++ b/test/form/samples/ns-external-star-reexport/_expected/amd.js @@ -7,11 +7,11 @@ define(['exports', 'external1', 'external2'], function (exports, external1, exte const override = 'override'; var reexportExternalsWithOverride = { synthetic: 'synthetic' }; - var reexportExternalsWithOverride$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1, external2, { + var reexportExternalsWithOverride$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1, external2, reexportExternalsWithOverride, { override: override, 'default': reexportExternalsWithOverride, extra: extra - }, reexportExternalsWithOverride)); + })); exports.external = reexportExternal; exports.externalOverride = reexportExternalsWithOverride$1; diff --git a/test/form/samples/ns-external-star-reexport/_expected/cjs.js b/test/form/samples/ns-external-star-reexport/_expected/cjs.js index 5cd3ce1a6a0..01a0405d6f3 100644 --- a/test/form/samples/ns-external-star-reexport/_expected/cjs.js +++ b/test/form/samples/ns-external-star-reexport/_expected/cjs.js @@ -12,11 +12,11 @@ const extra = 'extra'; const override = 'override'; var reexportExternalsWithOverride = { synthetic: 'synthetic' }; -var reexportExternalsWithOverride$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1, external2, { +var reexportExternalsWithOverride$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1, external2, reexportExternalsWithOverride, { override: override, 'default': reexportExternalsWithOverride, extra: extra -}, reexportExternalsWithOverride)); +})); exports.external = reexportExternal; exports.externalOverride = reexportExternalsWithOverride$1; diff --git a/test/form/samples/ns-external-star-reexport/_expected/es.js b/test/form/samples/ns-external-star-reexport/_expected/es.js index c4fd6f26ef8..ed3032da5ac 100644 --- a/test/form/samples/ns-external-star-reexport/_expected/es.js +++ b/test/form/samples/ns-external-star-reexport/_expected/es.js @@ -8,10 +8,10 @@ const extra = 'extra'; const override = 'override'; var reexportExternalsWithOverride = { synthetic: 'synthetic' }; -var reexportExternalsWithOverride$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1, external2, { +var reexportExternalsWithOverride$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1, external2, reexportExternalsWithOverride, { override: override, 'default': reexportExternalsWithOverride, extra: extra -}, reexportExternalsWithOverride)); +})); export { reexportExternal as external, reexportExternalsWithOverride$1 as externalOverride }; diff --git a/test/form/samples/ns-external-star-reexport/_expected/iife.js b/test/form/samples/ns-external-star-reexport/_expected/iife.js index 93e3f50b66b..ab4cf56dc25 100644 --- a/test/form/samples/ns-external-star-reexport/_expected/iife.js +++ b/test/form/samples/ns-external-star-reexport/_expected/iife.js @@ -8,11 +8,11 @@ var bundle = (function (exports, external1, external2) { const override = 'override'; var reexportExternalsWithOverride = { synthetic: 'synthetic' }; - var reexportExternalsWithOverride$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1, external2, { + var reexportExternalsWithOverride$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1, external2, reexportExternalsWithOverride, { override: override, 'default': reexportExternalsWithOverride, extra: extra - }, reexportExternalsWithOverride)); + })); exports.external = reexportExternal; exports.externalOverride = reexportExternalsWithOverride$1; diff --git a/test/form/samples/ns-external-star-reexport/_expected/system.js b/test/form/samples/ns-external-star-reexport/_expected/system.js index 7a209f559a9..6ad689bd7a8 100644 --- a/test/form/samples/ns-external-star-reexport/_expected/system.js +++ b/test/form/samples/ns-external-star-reexport/_expected/system.js @@ -17,11 +17,11 @@ System.register('bundle', ['external1', 'external2'], function (exports) { const override = 'override'; var reexportExternalsWithOverride = { synthetic: 'synthetic' }; - var reexportExternalsWithOverride$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1, external2, { + var reexportExternalsWithOverride$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1, external2, reexportExternalsWithOverride, { override: override, 'default': reexportExternalsWithOverride, extra: extra - }, reexportExternalsWithOverride)); + })); exports('externalOverride', reexportExternalsWithOverride$1); } diff --git a/test/form/samples/ns-external-star-reexport/_expected/umd.js b/test/form/samples/ns-external-star-reexport/_expected/umd.js index 9baac1a2697..2221b6aee45 100644 --- a/test/form/samples/ns-external-star-reexport/_expected/umd.js +++ b/test/form/samples/ns-external-star-reexport/_expected/umd.js @@ -11,11 +11,11 @@ const override = 'override'; var reexportExternalsWithOverride = { synthetic: 'synthetic' }; - var reexportExternalsWithOverride$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1, external2, { + var reexportExternalsWithOverride$1 = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1, external2, reexportExternalsWithOverride, { override: override, 'default': reexportExternalsWithOverride, extra: extra - }, reexportExternalsWithOverride)); + })); exports.external = reexportExternal; exports.externalOverride = reexportExternalsWithOverride$1; diff --git a/test/function/samples/synthetic-named-exports-namespace-overrides/_config.js b/test/function/samples/synthetic-named-exports-namespace-overrides/_config.js new file mode 100644 index 00000000000..98cf939f018 --- /dev/null +++ b/test/function/samples/synthetic-named-exports-namespace-overrides/_config.js @@ -0,0 +1,52 @@ +const assert = require('assert'); + +module.exports = { + description: + 'supports re-exported synthetic exports in namespace objects with correct export precedence', + options: { + plugins: [ + { + name: 'test-plugin', + transform(code, id) { + if (id.endsWith('synthetic.js')) { + return { + code, + syntheticNamedExports: true + }; + } + } + } + ] + }, + exports(exports) { + const synthetic = { + __proto__: null, + foo: 'foo', + bar: 'synthetic-bar', + baz: 'synthetic-baz', + default: 'ignored' + }; + synthetic.default = synthetic; + assert.deepStrictEqual(exports, { + dep: { + __proto__: null, + foo: 'foo', + bar: 'bar', + baz: 'synthetic-baz', + default: 'not-overwritten', + synthetic: { + __proto__: null, + foo: 'foo', + bar: 'synthetic-bar', + baz: 'synthetic-baz', + default: { + foo: 'synthetic-foo', + bar: 'synthetic-bar', + baz: 'synthetic-baz', + default: 'not-in-namespace' + } + } + } + }); + } +}; diff --git a/test/function/samples/synthetic-named-exports-namespace-overrides/dep.js b/test/function/samples/synthetic-named-exports-namespace-overrides/dep.js new file mode 100644 index 00000000000..6562231f809 --- /dev/null +++ b/test/function/samples/synthetic-named-exports-namespace-overrides/dep.js @@ -0,0 +1,4 @@ +export * as synthetic from './synthetic.js'; +export const bar = 'bar'; +export default 'not-overwritten'; +export * from './synthetic.js'; diff --git a/test/function/samples/synthetic-named-exports-namespace-overrides/main.js b/test/function/samples/synthetic-named-exports-namespace-overrides/main.js new file mode 100644 index 00000000000..b47aa74e93c --- /dev/null +++ b/test/function/samples/synthetic-named-exports-namespace-overrides/main.js @@ -0,0 +1 @@ +export * as dep from './dep.js'; diff --git a/test/function/samples/synthetic-named-exports-namespace-overrides/synthetic.js b/test/function/samples/synthetic-named-exports-namespace-overrides/synthetic.js new file mode 100644 index 00000000000..f8f24e7f0e0 --- /dev/null +++ b/test/function/samples/synthetic-named-exports-namespace-overrides/synthetic.js @@ -0,0 +1,7 @@ +export default { + foo: 'synthetic-foo', + bar: 'synthetic-bar', + baz: 'synthetic-baz', + default: 'not-in-namespace' +}; +export const foo = 'foo'; diff --git a/test/function/samples/synthetic-named-exports-namespace/_config.js b/test/function/samples/synthetic-named-exports-namespace/_config.js new file mode 100644 index 00000000000..35c27edf923 --- /dev/null +++ b/test/function/samples/synthetic-named-exports-namespace/_config.js @@ -0,0 +1,39 @@ +const assert = require('assert'); + +module.exports = { + description: + 'supports re-exported synthetic exports in namespace objects with correct export precedence', + options: { + input: ['main', 'main2'], + plugins: [ + { + name: 'test-plugin', + transform(code, id) { + if (id.endsWith('synthetic.js')) { + return { + code, + syntheticNamedExports: true + }; + } + } + } + ] + }, + exports(exports) { + const synthetic = { + __proto__: null, + foo: 'foo', + bar: 'synthetic-bar', + baz: 'synthetic-baz', + default: 'ignored' + }; + synthetic.default = synthetic; + assert.deepStrictEqual(exports, { + synthetic: { + __proto__: null, + foo: 'synthetic-foo', + bar: 'bar' + } + }); + } +}; diff --git a/test/function/samples/synthetic-named-exports-namespace/dep.js b/test/function/samples/synthetic-named-exports-namespace/dep.js new file mode 100644 index 00000000000..e81ad277d5b --- /dev/null +++ b/test/function/samples/synthetic-named-exports-namespace/dep.js @@ -0,0 +1,2 @@ +export * from './synthetic.js'; +export const bar = 'bar'; diff --git a/test/function/samples/synthetic-named-exports-namespace/main.js b/test/function/samples/synthetic-named-exports-namespace/main.js new file mode 100644 index 00000000000..4c5a55decca --- /dev/null +++ b/test/function/samples/synthetic-named-exports-namespace/main.js @@ -0,0 +1 @@ +export * as synthetic from './dep.js'; diff --git a/test/function/samples/synthetic-named-exports-namespace/main2.js b/test/function/samples/synthetic-named-exports-namespace/main2.js new file mode 100644 index 00000000000..7a39aa23d99 --- /dev/null +++ b/test/function/samples/synthetic-named-exports-namespace/main2.js @@ -0,0 +1 @@ +export { default } from './synthetic.js'; diff --git a/test/function/samples/synthetic-named-exports-namespace/synthetic.js b/test/function/samples/synthetic-named-exports-namespace/synthetic.js new file mode 100644 index 00000000000..4d0d7e0cf2a --- /dev/null +++ b/test/function/samples/synthetic-named-exports-namespace/synthetic.js @@ -0,0 +1,3 @@ +export default { + foo: 'synthetic-foo' +};