diff --git a/src/Module.ts b/src/Module.ts index a8b8450fb20..4c7ccd8ae2c 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -100,9 +100,9 @@ export interface AstContext { getModuleName: () => string; getReexports: () => string[]; importDescriptions: { [name: string]: ImportDescription }; + includeAndGetReexportedExternalNamespaces: () => ExternalVariable[]; includeDynamicImport: (node: ImportExpression) => void; includeVariable: (context: InclusionContext, variable: Variable) => void; - isCrossChunkImport: (importDescription: ImportDescription) => boolean; magicString: MagicString; module: Module; // not to be used for tree-shaking moduleContext: string; @@ -198,7 +198,6 @@ export default class Module { chunkName: string | null = null; code!: string; comments: CommentDescription[] = []; - customTransformCache!: boolean; dependencies = new Set(); dynamicallyImportedBy: Module[] = []; dynamicDependencies = new Set(); @@ -208,11 +207,9 @@ export default class Module { }[] = []; excludeFromSourcemap: boolean; execIndex = Infinity; - exportAllModules: (Module | ExternalModule)[] = []; exportAllSources = new Set(); exports: { [name: string]: ExportDescription } = Object.create(null); exportsAll: { [name: string]: string } = Object.create(null); - exportShimVariable: ExportShimVariable = new ExportShimVariable(this); facadeChunk: Chunk | null = null; id: string; importDescriptions: { [name: string]: ImportDescription } = Object.create(null); @@ -240,8 +237,11 @@ export default class Module { private ast!: Program; private astContext!: AstContext; private context: string; + private customTransformCache!: boolean; private defaultExport: ExportDefaultVariable | null | undefined = null; private esTreeAst!: acorn.Node; + private exportAllModules: (Module | ExternalModule)[] = []; + private exportShimVariable: ExportShimVariable = new ExportShimVariable(this); private graph: Graph; private magicString!: MagicString; private namespaceVariable: NamespaceVariable | null = null; @@ -700,10 +700,11 @@ export default class Module { getModuleName: this.basename.bind(this), getReexports: this.getReexports.bind(this), importDescriptions: this.importDescriptions, + includeAndGetReexportedExternalNamespaces: this.includeAndGetReexportedExternalNamespaces.bind( + this + ), includeDynamicImport: this.includeDynamicImport.bind(this), includeVariable: this.includeVariable.bind(this), - isCrossChunkImport: importDescription => - (importDescription.module as Module).chunk !== this.chunk, magicString: this.magicString, module: this, moduleContext: this.context, @@ -864,18 +865,6 @@ export default class Module { const source = node.source.value; this.sources.add(source); for (const specifier of node.specifiers) { - const localName = specifier.local.name; - - if (this.importDescriptions[localName]) { - return this.error( - { - code: 'DUPLICATE_IMPORT', - message: `Duplicated import '${localName}'` - }, - specifier.start - ); - } - const isDefault = specifier.type === NodeType.ImportDefaultSpecifier; const isNamespace = specifier.type === NodeType.ImportNamespaceSpecifier; @@ -884,7 +873,7 @@ export default class Module { : isNamespace ? '*' : (specifier as ImportSpecifier).imported.name; - this.importDescriptions[localName] = { + this.importDescriptions[specifier.local.name] = { module: null as any, // filled in later name, source, @@ -907,6 +896,19 @@ export default class Module { } } + private includeAndGetReexportedExternalNamespaces(): ExternalVariable[] { + const reexportedExternalNamespaces: ExternalVariable[] = []; + for (const module of this.exportAllModules) { + if (module instanceof ExternalModule) { + const externalVariable = module.getVariableForExportName('*'); + externalVariable.include(); + this.imports.add(externalVariable); + reexportedExternalNamespaces.push(externalVariable); + } + } + return reexportedExternalNamespaces; + } + private includeDynamicImport(node: ImportExpression) { const resolution = (this.dynamicImports.find(dynamicImport => dynamicImport.node === node) as { resolution: string | Module | ExternalModule | undefined; @@ -929,14 +931,12 @@ export default class Module { } private shimMissingExport(name: string): void { - if (!this.exports[name]) { - this.graph.warn({ - code: 'SHIMMED_EXPORT', - exporter: relativeId(this.id), - exportName: name, - message: `Missing export "${name}" has been shimmed in module ${relativeId(this.id)}.` - }); - this.exports[name] = MISSING_EXPORT_SHIM_DESCRIPTION; - } + this.graph.warn({ + code: 'SHIMMED_EXPORT', + exporter: relativeId(this.id), + exportName: name, + message: `Missing export "${name}" has been shimmed in module ${relativeId(this.id)}.` + }); + this.exports[name] = MISSING_EXPORT_SHIM_DESCRIPTION; } } diff --git a/src/ast/variables/NamespaceVariable.ts b/src/ast/variables/NamespaceVariable.ts index 403095ca79f..6d495da5b7f 100644 --- a/src/ast/variables/NamespaceVariable.ts +++ b/src/ast/variables/NamespaceVariable.ts @@ -4,6 +4,7 @@ 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 { @@ -12,7 +13,7 @@ export default class NamespaceVariable extends Variable { memberVariables: { [name: string]: Variable } = Object.create(null); module: Module; - private containsExternalNamespace = false; + private reexportedExternalNamespaces: ExternalVariable[] = []; private referencedEarly = false; private references: Identifier[] = []; private syntheticNamedExports: boolean; @@ -41,13 +42,6 @@ export default class NamespaceVariable extends Variable { include(context: InclusionContext) { if (!this.included) { - if (this.containsExternalNamespace) { - return this.context.error({ - code: 'NAMESPACE_CANNOT_CONTAIN_EXTERNAL', - id: this.module.id, - message: `Cannot create an explicit namespace object for module "${this.context.getModuleName()}" because it contains a reexported external namespace` - }); - } this.included = true; for (const identifier of this.references) { if (identifier.context.getModuleExecIndex() <= this.context.getModuleExecIndex()) { @@ -55,6 +49,7 @@ export default class NamespaceVariable extends Variable { break; } } + this.reexportedExternalNamespaces = this.context.includeAndGetReexportedExternalNamespaces(); if (this.context.preserveModules) { for (const memberName of Object.keys(this.memberVariables)) this.memberVariables[memberName].include(context); @@ -67,8 +62,9 @@ export default class NamespaceVariable extends Variable { initialise() { for (const name of this.context.getExports().concat(this.context.getReexports())) { - if (name[0] === '*' && name.length > 1) this.containsExternalNamespace = true; - this.memberVariables[name] = this.context.traceExport(name); + if (name[0] !== '*') { + this.memberVariables[name] = this.context.traceExport(name); + } } } @@ -91,21 +87,32 @@ export default class NamespaceVariable extends Variable { return `${t}${safeName}: ${original.getName()}`; }); - members.unshift(`${t}__proto__:${_}null`); - if (options.namespaceToStringTag) { members.unshift(`${t}[Symbol.toStringTag]:${_}'Module'`); } - const name = this.getName(); + const hasExternalReexports = this.reexportedExternalNamespaces.length > 0; + if (!hasExternalReexports) members.unshift(`${t}__proto__:${_}null`); + let output = `{${n}${members.join(`,${n}`)}${n}}`; - if (this.syntheticNamedExports) { - output = `/*#__PURE__*/Object.assign(${output}, ${this.module.getDefaultExport().getName()})`; + 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 (this.syntheticNamedExports) { + assignmentArgs.push(this.module.getDefaultExport().getName()); + } + output = `/*#__PURE__*/Object.assign(${assignmentArgs.join(`,${_}`)})`; } if (options.freeze) { output = `/*#__PURE__*/Object.freeze(${output})`; } + const name = this.getName(); output = `${options.varOrConst} ${name}${_}=${_}${output};`; if (options.format === 'system' && this.exportName) { diff --git a/test/form/samples/compact/_expected/amd.js b/test/form/samples/compact/_expected/amd.js index 6be712a0259..dfa075b328d 100644 --- a/test/form/samples/compact/_expected/amd.js +++ b/test/form/samples/compact/_expected/amd.js @@ -1,6 +1,6 @@ -define(['external'],function(x){'use strict';x=x&&Object.prototype.hasOwnProperty.call(x,'default')?x['default']:x;var self=/*#__PURE__*/Object.freeze({[Symbol.toStringTag]:'Module',__proto__:null,get default(){return foo}});console.log(self); +define(['external'],function(x){'use strict';x=x&&Object.prototype.hasOwnProperty.call(x,'default')?x['default']:x;var self=/*#__PURE__*/Object.freeze({__proto__:null,[Symbol.toStringTag]:'Module',get default(){return foo}});console.log(self); function foo () { console.log( x ); } // trailing comment -return foo;}); +return foo;}); \ No newline at end of file diff --git a/test/form/samples/compact/_expected/cjs.js b/test/form/samples/compact/_expected/cjs.js index 0c18fd099f3..f52e48bba2a 100644 --- a/test/form/samples/compact/_expected/cjs.js +++ b/test/form/samples/compact/_expected/cjs.js @@ -1,4 +1,4 @@ -'use strict';function _interopDefault(e){return(e&&(typeof e==='object')&&'default'in e)?e['default']:e}var x=_interopDefault(require('external'));var self=/*#__PURE__*/Object.freeze({[Symbol.toStringTag]:'Module',__proto__:null,get default(){return foo}});console.log(self); +'use strict';function _interopDefault(e){return(e&&(typeof e==='object')&&'default'in e)?e['default']:e}var x=_interopDefault(require('external'));var self=/*#__PURE__*/Object.freeze({__proto__:null,[Symbol.toStringTag]:'Module',get default(){return foo}});console.log(self); function foo () { console.log( x ); } diff --git a/test/form/samples/compact/_expected/es.js b/test/form/samples/compact/_expected/es.js index 8440fbc9991..a580d524969 100644 --- a/test/form/samples/compact/_expected/es.js +++ b/test/form/samples/compact/_expected/es.js @@ -1,4 +1,4 @@ -import x from'external';var self=/*#__PURE__*/Object.freeze({[Symbol.toStringTag]:'Module',__proto__:null,get default(){return foo}});console.log(self); +import x from'external';var self=/*#__PURE__*/Object.freeze({__proto__:null,[Symbol.toStringTag]:'Module',get default(){return foo}});console.log(self); function foo () { console.log( x ); } diff --git a/test/form/samples/compact/_expected/iife.js b/test/form/samples/compact/_expected/iife.js index d17c5d43442..e01b3cf90a4 100644 --- a/test/form/samples/compact/_expected/iife.js +++ b/test/form/samples/compact/_expected/iife.js @@ -1,6 +1,6 @@ -var foo=(function(x){'use strict';x=x&&Object.prototype.hasOwnProperty.call(x,'default')?x['default']:x;var self=/*#__PURE__*/Object.freeze({[Symbol.toStringTag]:'Module',__proto__:null,get default(){return foo}});console.log(self); +var foo=(function(x){'use strict';x=x&&Object.prototype.hasOwnProperty.call(x,'default')?x['default']:x;var self=/*#__PURE__*/Object.freeze({__proto__:null,[Symbol.toStringTag]:'Module',get default(){return foo}});console.log(self); function foo () { console.log( x ); } // trailing comment -return foo;}(x)); +return foo;}(x)); \ No newline at end of file diff --git a/test/form/samples/compact/_expected/system.js b/test/form/samples/compact/_expected/system.js index 42b5074a7cb..31cc2cf03b0 100644 --- a/test/form/samples/compact/_expected/system.js +++ b/test/form/samples/compact/_expected/system.js @@ -1,4 +1,4 @@ -System.register('foo',['external'],function(exports){'use strict';var x;return{setters:[function(module){x=module.default;}],execute:function(){exports('default',foo);var self=/*#__PURE__*/Object.freeze({[Symbol.toStringTag]:'Module',__proto__:null,get default(){return foo}});console.log(self); +System.register('foo',['external'],function(exports){'use strict';var x;return{setters:[function(module){x=module.default;}],execute:function(){exports('default',foo);var self=/*#__PURE__*/Object.freeze({__proto__:null,[Symbol.toStringTag]:'Module',get default(){return foo}});console.log(self); function foo () { console.log( x ); } diff --git a/test/form/samples/compact/_expected/umd.js b/test/form/samples/compact/_expected/umd.js index 18250d221e0..0c0b249d51e 100644 --- a/test/form/samples/compact/_expected/umd.js +++ b/test/form/samples/compact/_expected/umd.js @@ -1,6 +1,6 @@ -(function(g,f){typeof exports==='object'&&typeof module!=='undefined'?module.exports=f(require('external')):typeof define==='function'&&define.amd?define(['external'],f):(g=g||self,g.foo=f(g.x));}(this,(function(x){'use strict';x=x&&Object.prototype.hasOwnProperty.call(x,'default')?x['default']:x;var self=/*#__PURE__*/Object.freeze({[Symbol.toStringTag]:'Module',__proto__:null,get default(){return foo}});console.log(self); +(function(g,f){typeof exports==='object'&&typeof module!=='undefined'?module.exports=f(require('external')):typeof define==='function'&&define.amd?define(['external'],f):(g=g||self,g.foo=f(g.x));}(this,(function(x){'use strict';x=x&&Object.prototype.hasOwnProperty.call(x,'default')?x['default']:x;var self=/*#__PURE__*/Object.freeze({__proto__:null,[Symbol.toStringTag]:'Module',get default(){return foo}});console.log(self); function foo () { console.log( x ); } // trailing comment -return foo;}))); +return foo;}))); \ No newline at end of file diff --git a/test/form/samples/namespace-tostringtag/_expected/amd.js b/test/form/samples/namespace-tostringtag/_expected/amd.js index e6ddbfd62f1..28ab2705d81 100644 --- a/test/form/samples/namespace-tostringtag/_expected/amd.js +++ b/test/form/samples/namespace-tostringtag/_expected/amd.js @@ -1,8 +1,8 @@ define(['exports'], function (exports) { 'use strict'; var self = /*#__PURE__*/Object.freeze({ - [Symbol.toStringTag]: 'Module', __proto__: null, + [Symbol.toStringTag]: 'Module', get p () { return p; } }); diff --git a/test/form/samples/namespace-tostringtag/_expected/cjs.js b/test/form/samples/namespace-tostringtag/_expected/cjs.js index 9eb8fe5b21f..97f13a09c4c 100644 --- a/test/form/samples/namespace-tostringtag/_expected/cjs.js +++ b/test/form/samples/namespace-tostringtag/_expected/cjs.js @@ -3,8 +3,8 @@ Object.defineProperty(exports, '__esModule', { value: true }); var self = /*#__PURE__*/Object.freeze({ - [Symbol.toStringTag]: 'Module', __proto__: null, + [Symbol.toStringTag]: 'Module', get p () { return p; } }); diff --git a/test/form/samples/namespace-tostringtag/_expected/es.js b/test/form/samples/namespace-tostringtag/_expected/es.js index b5e71f3c02f..a7cd93962ea 100644 --- a/test/form/samples/namespace-tostringtag/_expected/es.js +++ b/test/form/samples/namespace-tostringtag/_expected/es.js @@ -1,6 +1,6 @@ var self = /*#__PURE__*/Object.freeze({ - [Symbol.toStringTag]: 'Module', __proto__: null, + [Symbol.toStringTag]: 'Module', get p () { return p; } }); diff --git a/test/form/samples/namespace-tostringtag/_expected/iife.js b/test/form/samples/namespace-tostringtag/_expected/iife.js index e03dfc5a3f2..f96940def5c 100644 --- a/test/form/samples/namespace-tostringtag/_expected/iife.js +++ b/test/form/samples/namespace-tostringtag/_expected/iife.js @@ -2,8 +2,8 @@ var iife = (function (exports) { 'use strict'; var self = /*#__PURE__*/Object.freeze({ - [Symbol.toStringTag]: 'Module', __proto__: null, + [Symbol.toStringTag]: 'Module', get p () { return p; } }); diff --git a/test/form/samples/namespace-tostringtag/_expected/system.js b/test/form/samples/namespace-tostringtag/_expected/system.js index 5e4bc576382..5ee50d33a91 100644 --- a/test/form/samples/namespace-tostringtag/_expected/system.js +++ b/test/form/samples/namespace-tostringtag/_expected/system.js @@ -4,8 +4,8 @@ System.register('iife', [], function (exports) { execute: function () { var self = /*#__PURE__*/Object.freeze({ - [Symbol.toStringTag]: 'Module', __proto__: null, + [Symbol.toStringTag]: 'Module', get p () { return p; } }); diff --git a/test/form/samples/namespace-tostringtag/_expected/umd.js b/test/form/samples/namespace-tostringtag/_expected/umd.js index cdc8347fa00..9ae146ed7ad 100644 --- a/test/form/samples/namespace-tostringtag/_expected/umd.js +++ b/test/form/samples/namespace-tostringtag/_expected/umd.js @@ -5,8 +5,8 @@ }(this, (function (exports) { 'use strict'; var self = /*#__PURE__*/Object.freeze({ - [Symbol.toStringTag]: 'Module', __proto__: null, + [Symbol.toStringTag]: 'Module', get p () { return p; } }); diff --git a/test/form/samples/ns-external-star-reexport/_config.js b/test/form/samples/ns-external-star-reexport/_config.js new file mode 100644 index 00000000000..06cdf4d0268 --- /dev/null +++ b/test/form/samples/ns-external-star-reexport/_config.js @@ -0,0 +1,24 @@ +module.exports = { + description: 'supports namespaces with external star reexports', + options: { + external: ['external1', 'external2'], + plugins: { + transform(code, id) { + if (id.endsWith('override.js')) { + return { + code, + syntheticNamedExports: true + }; + } + return null; + } + }, + output: { + globals: { + external1: 'external1', + external2: 'external2' + }, + name: 'bundle' + } + } +}; diff --git a/test/form/samples/ns-external-star-reexport/_expected/amd.js b/test/form/samples/ns-external-star-reexport/_expected/amd.js new file mode 100644 index 00000000000..e756846048f --- /dev/null +++ b/test/form/samples/ns-external-star-reexport/_expected/amd.js @@ -0,0 +1,21 @@ +define(['exports', 'external1', 'external2'], function (exports, external1, external2) { 'use strict'; + + var reexportExternal = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1)); + + 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, { + override: override, + 'default': reexportExternalsWithOverride, + extra: extra + }, reexportExternalsWithOverride)); + + exports.external = reexportExternal; + exports.externalOverride = reexportExternalsWithOverride$1; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/test/form/samples/ns-external-star-reexport/_expected/cjs.js b/test/form/samples/ns-external-star-reexport/_expected/cjs.js new file mode 100644 index 00000000000..5cd3ce1a6a0 --- /dev/null +++ b/test/form/samples/ns-external-star-reexport/_expected/cjs.js @@ -0,0 +1,22 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +var external1 = require('external1'); +var external2 = require('external2'); + +var reexportExternal = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1)); + +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, { + 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 new file mode 100644 index 00000000000..c4fd6f26ef8 --- /dev/null +++ b/test/form/samples/ns-external-star-reexport/_expected/es.js @@ -0,0 +1,17 @@ +import * as external1 from 'external1'; +import * as external2 from 'external2'; + +var reexportExternal = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1)); + +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, { + 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 new file mode 100644 index 00000000000..93e3f50b66b --- /dev/null +++ b/test/form/samples/ns-external-star-reexport/_expected/iife.js @@ -0,0 +1,22 @@ +var bundle = (function (exports, external1, external2) { + 'use strict'; + + var reexportExternal = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1)); + + 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, { + override: override, + 'default': reexportExternalsWithOverride, + extra: extra + }, reexportExternalsWithOverride)); + + exports.external = reexportExternal; + exports.externalOverride = reexportExternalsWithOverride$1; + + return exports; + +}({}, external1, external2)); diff --git a/test/form/samples/ns-external-star-reexport/_expected/system.js b/test/form/samples/ns-external-star-reexport/_expected/system.js new file mode 100644 index 00000000000..7a209f559a9 --- /dev/null +++ b/test/form/samples/ns-external-star-reexport/_expected/system.js @@ -0,0 +1,29 @@ +System.register('bundle', ['external1', 'external2'], function (exports) { + 'use strict'; + var external1, external2; + return { + setters: [function (module) { + external1 = module; + }, function (module) { + external2 = module; + }], + execute: function () { + + var reexportExternal = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1)); + exports('external', reexportExternal); + + 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, { + 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 new file mode 100644 index 00000000000..9baac1a2697 --- /dev/null +++ b/test/form/samples/ns-external-star-reexport/_expected/umd.js @@ -0,0 +1,25 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('external1'), require('external2')) : + typeof define === 'function' && define.amd ? define(['exports', 'external1', 'external2'], factory) : + (global = global || self, factory(global.bundle = {}, global.external1, global.external2)); +}(this, (function (exports, external1, external2) { 'use strict'; + + var reexportExternal = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.assign(/*#__PURE__*/Object.create(null), external1)); + + 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, { + override: override, + 'default': reexportExternalsWithOverride, + extra: extra + }, reexportExternalsWithOverride)); + + exports.external = reexportExternal; + exports.externalOverride = reexportExternalsWithOverride$1; + + Object.defineProperty(exports, '__esModule', { value: true }); + +}))); diff --git a/test/form/samples/ns-external-star-reexport/extra.js b/test/form/samples/ns-external-star-reexport/extra.js new file mode 100644 index 00000000000..feedf51e56d --- /dev/null +++ b/test/form/samples/ns-external-star-reexport/extra.js @@ -0,0 +1 @@ +export const extra = 'extra'; diff --git a/test/form/samples/ns-external-star-reexport/main.js b/test/form/samples/ns-external-star-reexport/main.js new file mode 100644 index 00000000000..d61257fb7d0 --- /dev/null +++ b/test/form/samples/ns-external-star-reexport/main.js @@ -0,0 +1,2 @@ +export * as external from './reexport-external.js'; +export * as externalOverride from './reexport-externals-with-override.js'; diff --git a/test/form/samples/ns-external-star-reexport/reexport-external.js b/test/form/samples/ns-external-star-reexport/reexport-external.js new file mode 100644 index 00000000000..982df4d556e --- /dev/null +++ b/test/form/samples/ns-external-star-reexport/reexport-external.js @@ -0,0 +1 @@ +export * from 'external1'; diff --git a/test/form/samples/ns-external-star-reexport/reexport-externals-with-override.js b/test/form/samples/ns-external-star-reexport/reexport-externals-with-override.js new file mode 100644 index 00000000000..15e4c2e3794 --- /dev/null +++ b/test/form/samples/ns-external-star-reexport/reexport-externals-with-override.js @@ -0,0 +1,6 @@ +export * from 'external1'; +export * from 'external2'; +export * from './extra.js'; +export const override = 'override'; +export default { synthetic: 'synthetic' }; + diff --git a/test/function/samples/internal-reexports-from-external/_config.js b/test/function/samples/internal-reexports-from-external/_config.js index f6c6ebd8d05..be14c091434 100644 --- a/test/function/samples/internal-reexports-from-external/_config.js +++ b/test/function/samples/internal-reexports-from-external/_config.js @@ -1,16 +1,31 @@ +const assert = require('assert'); +const fs = require('fs'); const path = require('path'); module.exports = { - description: - 'fails with a helpful error if creating a namespace object containing a reexported external namespace', + description: 'supports namespaces with external star reexports', options: { - external: ['external'] + external: ['fs', 'path'], + plugins: { + transform(code, id) { + if (id.endsWith('override.js')) { + return { + code, + syntheticNamedExports: true + }; + } + return null; + } + } }, - error: { - code: 'NAMESPACE_CANNOT_CONTAIN_EXTERNAL', - message: - 'Cannot create an explicit namespace object for module "reexport" because it contains a reexported external namespace', - id: path.join(__dirname, 'reexport.js'), - watchFiles: [path.join(__dirname, 'main.js'), path.join(__dirname, 'reexport.js')] + exports(exports) { + assert.strictEqual(exports.fs.readFile, fs.readFile); + assert.deepStrictEqual(Object.keys(exports.fs), Object.keys(fs)); + assert.notStrictEqual(exports.fsOverride.readFile, fs.readFile); + assert.strictEqual(exports.fsOverride.readFile, 'override'); + assert.strictEqual(exports.fsOverride.extra, 'extra'); + assert.strictEqual(exports.fsOverride.synthetic, 'synthetic'); + assert.strictEqual(exports.fsOverride.synthetic, 'synthetic'); + assert.strictEqual(exports.fsOverride.dirname, path.dirname); } }; diff --git a/test/function/samples/internal-reexports-from-external/extra.js b/test/function/samples/internal-reexports-from-external/extra.js new file mode 100644 index 00000000000..feedf51e56d --- /dev/null +++ b/test/function/samples/internal-reexports-from-external/extra.js @@ -0,0 +1 @@ +export const extra = 'extra'; diff --git a/test/function/samples/internal-reexports-from-external/main.js b/test/function/samples/internal-reexports-from-external/main.js index 0006fef87b4..64b276a3d87 100644 --- a/test/function/samples/internal-reexports-from-external/main.js +++ b/test/function/samples/internal-reexports-from-external/main.js @@ -1,3 +1,2 @@ -import * as namespace from './reexport.js'; - -console.log(namespace); +export * as fs from './reexport-external.js'; +export * as fsOverride from './reexport-externals-with-override.js'; diff --git a/test/function/samples/internal-reexports-from-external/reexport-external.js b/test/function/samples/internal-reexports-from-external/reexport-external.js new file mode 100644 index 00000000000..b301bda0b0a --- /dev/null +++ b/test/function/samples/internal-reexports-from-external/reexport-external.js @@ -0,0 +1 @@ +export * from 'fs'; diff --git a/test/function/samples/internal-reexports-from-external/reexport-externals-with-override.js b/test/function/samples/internal-reexports-from-external/reexport-externals-with-override.js new file mode 100644 index 00000000000..a7d80cbe344 --- /dev/null +++ b/test/function/samples/internal-reexports-from-external/reexport-externals-with-override.js @@ -0,0 +1,6 @@ +export * from 'fs'; +export * from 'path'; +export * from './extra.js'; +export const readFile = 'override'; +export default { synthetic: 'synthetic' }; + diff --git a/test/function/samples/internal-reexports-from-external/reexport.js b/test/function/samples/internal-reexports-from-external/reexport.js deleted file mode 100644 index 4953eb6e351..00000000000 --- a/test/function/samples/internal-reexports-from-external/reexport.js +++ /dev/null @@ -1 +0,0 @@ -export * from 'external';