diff --git a/src/ast/variables/NamespaceVariable.ts b/src/ast/variables/NamespaceVariable.ts index 3dfb2a4d5ad..7a22234e862 100644 --- a/src/ast/variables/NamespaceVariable.ts +++ b/src/ast/variables/NamespaceVariable.ts @@ -91,25 +91,15 @@ export default class NamespaceVariable extends Variable { return `${t}${safeName}: ${original.getName()}`; }); + if (options.namespaceToStringTag) { + members.unshift(`${t}[Symbol.toStringTag]:${_}'Module'`); + } + const name = this.getName(); const callee = options.freeze ? `/*#__PURE__*/Object.freeze` : ''; - - let output = `${options.varOrConst} ${name} = ${ - options.namespaceToStringTag - ? `{${n}${members.join(`,${n}`)}${n}};` - : `${callee}({${n}${members.join(`,${n}`)}${n}});` - }`; - - if (options.namespaceToStringTag) { - output += `${n}if${_}(typeof Symbol${_}!==${_}'undefined'${_}&&${_}Symbol.toStringTag)${n}`; - output += `${t}Object.defineProperty(${name},${_}Symbol.toStringTag,${_}{${_}value:${_}'Module'${_}});${n}`; - output += `else${n || ' '}`; - output += `${t}Object.defineProperty(${name},${_}'toString',${_}{${_}value:${_}function${_}()${_}{${_}return${_}'[object Module]'${ - options.compact ? ';' : '' - }${_}}${_}});${n}`; - output += `${callee}(${name});`; - } + const membersStr = members.join(`,${n}`); + let output = `${options.varOrConst} ${name}${_}=${_}${callee}({${n}${membersStr}${n}});`; if (options.format === 'system' && this.exportName) { output += `${n}exports('${this.exportName}',${_}${name});`; diff --git a/test/form/samples/compact/_expected/amd.js b/test/form/samples/compact/_expected/amd.js index 70cf60b5aa4..f4dcdb9033c 100644 --- a/test/form/samples/compact/_expected/amd.js +++ b/test/form/samples/compact/_expected/amd.js @@ -1,4 +1,4 @@ -define(['external'],function(x){'use strict';x=x&&x.hasOwnProperty('default')?x['default']:x;var self = {get default(){return foo}};if(typeof Symbol!=='undefined'&&Symbol.toStringTag)Object.defineProperty(self,Symbol.toStringTag,{value:'Module'});else Object.defineProperty(self,'toString',{value:function(){return'[object Module]';}});/*#__PURE__*/Object.freeze(self);console.log(self); +define(['external'],function(x){'use strict';x=x&&x.hasOwnProperty('default')?x['default']:x;var self=/*#__PURE__*/Object.freeze({[Symbol.toStringTag]:'Module',get default(){return foo}});console.log(self); function foo () { console.log( x ); } diff --git a/test/form/samples/compact/_expected/cjs.js b/test/form/samples/compact/_expected/cjs.js index 901c1a95d5d..361c43c7205 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 = {get default(){return foo}};if(typeof Symbol!=='undefined'&&Symbol.toStringTag)Object.defineProperty(self,Symbol.toStringTag,{value:'Module'});else Object.defineProperty(self,'toString',{value:function(){return'[object Module]';}});/*#__PURE__*/Object.freeze(self);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({[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 b1c4f336677..2ade9a52f1f 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 = {get default(){return foo}};if(typeof Symbol!=='undefined'&&Symbol.toStringTag)Object.defineProperty(self,Symbol.toStringTag,{value:'Module'});else Object.defineProperty(self,'toString',{value:function(){return'[object Module]';}});/*#__PURE__*/Object.freeze(self);console.log(self); +import x from'external';var self=/*#__PURE__*/Object.freeze({[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 89db3068c1e..90d89ca7d8b 100644 --- a/test/form/samples/compact/_expected/iife.js +++ b/test/form/samples/compact/_expected/iife.js @@ -1,4 +1,4 @@ -var foo=(function(x){'use strict';x=x&&x.hasOwnProperty('default')?x['default']:x;var self = {get default(){return foo}};if(typeof Symbol!=='undefined'&&Symbol.toStringTag)Object.defineProperty(self,Symbol.toStringTag,{value:'Module'});else Object.defineProperty(self,'toString',{value:function(){return'[object Module]';}});/*#__PURE__*/Object.freeze(self);console.log(self); +var foo=(function(x){'use strict';x=x&&x.hasOwnProperty('default')?x['default']:x;var self=/*#__PURE__*/Object.freeze({[Symbol.toStringTag]:'Module',get default(){return foo}});console.log(self); function foo () { console.log( x ); } diff --git a/test/form/samples/compact/_expected/system.js b/test/form/samples/compact/_expected/system.js index 32148f6e287..e819d842949 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 = {get default(){return foo}};if(typeof Symbol!=='undefined'&&Symbol.toStringTag)Object.defineProperty(self,Symbol.toStringTag,{value:'Module'});else Object.defineProperty(self,'toString',{value:function(){return'[object Module]';}});/*#__PURE__*/Object.freeze(self);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({[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 0e1d4877478..443f7265209 100644 --- a/test/form/samples/compact/_expected/umd.js +++ b/test/form/samples/compact/_expected/umd.js @@ -1,4 +1,4 @@ -(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&&x.hasOwnProperty('default')?x['default']:x;var self = {get default(){return foo}};if(typeof Symbol!=='undefined'&&Symbol.toStringTag)Object.defineProperty(self,Symbol.toStringTag,{value:'Module'});else Object.defineProperty(self,'toString',{value:function(){return'[object Module]';}});/*#__PURE__*/Object.freeze(self);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&&x.hasOwnProperty('default')?x['default']:x;var self=/*#__PURE__*/Object.freeze({[Symbol.toStringTag]:'Module',get default(){return foo}});console.log(self); function foo () { console.log( x ); } diff --git a/test/form/samples/namespace-tostringtag/_expected/amd.js b/test/form/samples/namespace-tostringtag/_expected/amd.js index d93c8311ca5..4f533907284 100644 --- a/test/form/samples/namespace-tostringtag/_expected/amd.js +++ b/test/form/samples/namespace-tostringtag/_expected/amd.js @@ -1,13 +1,9 @@ define(['exports'], function (exports) { 'use strict'; - var self = { + var self = /*#__PURE__*/Object.freeze({ + [Symbol.toStringTag]: 'Module', get p () { return p; } - }; - if (typeof Symbol !== 'undefined' && Symbol.toStringTag) - Object.defineProperty(self, Symbol.toStringTag, { value: 'Module' }); - else - Object.defineProperty(self, 'toString', { value: function () { return '[object Module]' } }); - /*#__PURE__*/Object.freeze(self); + }); console.log(Object.keys(self)); diff --git a/test/form/samples/namespace-tostringtag/_expected/cjs.js b/test/form/samples/namespace-tostringtag/_expected/cjs.js index 72abfebab30..29707aa7bf7 100644 --- a/test/form/samples/namespace-tostringtag/_expected/cjs.js +++ b/test/form/samples/namespace-tostringtag/_expected/cjs.js @@ -2,14 +2,10 @@ Object.defineProperty(exports, '__esModule', { value: true }); -var self = { +var self = /*#__PURE__*/Object.freeze({ + [Symbol.toStringTag]: 'Module', get p () { return p; } -}; -if (typeof Symbol !== 'undefined' && Symbol.toStringTag) - Object.defineProperty(self, Symbol.toStringTag, { value: 'Module' }); -else - Object.defineProperty(self, 'toString', { value: function () { return '[object Module]' } }); -/*#__PURE__*/Object.freeze(self); +}); console.log(Object.keys(self)); diff --git a/test/form/samples/namespace-tostringtag/_expected/es.js b/test/form/samples/namespace-tostringtag/_expected/es.js index 53fea534eb9..aeb84e06686 100644 --- a/test/form/samples/namespace-tostringtag/_expected/es.js +++ b/test/form/samples/namespace-tostringtag/_expected/es.js @@ -1,11 +1,7 @@ -var self = { +var self = /*#__PURE__*/Object.freeze({ + [Symbol.toStringTag]: 'Module', get p () { return p; } -}; -if (typeof Symbol !== 'undefined' && Symbol.toStringTag) - Object.defineProperty(self, Symbol.toStringTag, { value: 'Module' }); -else - Object.defineProperty(self, 'toString', { value: function () { return '[object Module]' } }); -/*#__PURE__*/Object.freeze(self); +}); console.log(Object.keys(self)); diff --git a/test/form/samples/namespace-tostringtag/_expected/iife.js b/test/form/samples/namespace-tostringtag/_expected/iife.js index 2ab56c69888..c51559a5be6 100644 --- a/test/form/samples/namespace-tostringtag/_expected/iife.js +++ b/test/form/samples/namespace-tostringtag/_expected/iife.js @@ -1,14 +1,10 @@ var iife = (function (exports) { 'use strict'; - var self = { + var self = /*#__PURE__*/Object.freeze({ + [Symbol.toStringTag]: 'Module', get p () { return p; } - }; - if (typeof Symbol !== 'undefined' && Symbol.toStringTag) - Object.defineProperty(self, Symbol.toStringTag, { value: 'Module' }); - else - Object.defineProperty(self, 'toString', { value: function () { return '[object Module]' } }); - /*#__PURE__*/Object.freeze(self); + }); console.log(Object.keys(self)); diff --git a/test/form/samples/namespace-tostringtag/_expected/system.js b/test/form/samples/namespace-tostringtag/_expected/system.js index 272997644a1..8dbbf4f6702 100644 --- a/test/form/samples/namespace-tostringtag/_expected/system.js +++ b/test/form/samples/namespace-tostringtag/_expected/system.js @@ -3,14 +3,10 @@ System.register('iife', [], function (exports) { return { execute: function () { - var self = { + var self = /*#__PURE__*/Object.freeze({ + [Symbol.toStringTag]: 'Module', get p () { return p; } - }; - if (typeof Symbol !== 'undefined' && Symbol.toStringTag) - Object.defineProperty(self, Symbol.toStringTag, { value: 'Module' }); - else - Object.defineProperty(self, 'toString', { value: function () { return '[object Module]' } }); - /*#__PURE__*/Object.freeze(self); + }); console.log(Object.keys(self)); diff --git a/test/form/samples/namespace-tostringtag/_expected/umd.js b/test/form/samples/namespace-tostringtag/_expected/umd.js index f32ddad473c..e0c9dd8bc49 100644 --- a/test/form/samples/namespace-tostringtag/_expected/umd.js +++ b/test/form/samples/namespace-tostringtag/_expected/umd.js @@ -4,14 +4,10 @@ (global = global || self, factory(global.iife = {})); }(this, function (exports) { 'use strict'; - var self = { + var self = /*#__PURE__*/Object.freeze({ + [Symbol.toStringTag]: 'Module', get p () { return p; } - }; - if (typeof Symbol !== 'undefined' && Symbol.toStringTag) - Object.defineProperty(self, Symbol.toStringTag, { value: 'Module' }); - else - Object.defineProperty(self, 'toString', { value: function () { return '[object Module]' } }); - /*#__PURE__*/Object.freeze(self); + }); console.log(Object.keys(self)); diff --git a/test/function/samples/namespace-tostring/_config.js b/test/function/samples/namespace-tostring/_config.js new file mode 100644 index 00000000000..9a2eca563e7 --- /dev/null +++ b/test/function/samples/namespace-tostring/_config.js @@ -0,0 +1,8 @@ +module.exports = { + description: 'creates Symbol.toStringTag property', + options: { + output: { + namespaceToStringTag: true + } + } +}; diff --git a/test/function/samples/namespace-tostring/foo.js b/test/function/samples/namespace-tostring/foo.js new file mode 100644 index 00000000000..308e102fe9a --- /dev/null +++ b/test/function/samples/namespace-tostring/foo.js @@ -0,0 +1 @@ +export const bar = 42; diff --git a/test/function/samples/namespace-tostring/main.js b/test/function/samples/namespace-tostring/main.js new file mode 100644 index 00000000000..dd991f848c9 --- /dev/null +++ b/test/function/samples/namespace-tostring/main.js @@ -0,0 +1,4 @@ +import * as foo from './foo'; + +assert.equal("" + foo, "[object Module]"); +assert.equal(foo.bar, 42);