diff --git a/src/Chunk.ts b/src/Chunk.ts index 5b884c6d65e..bb3c9d47adb 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -31,6 +31,7 @@ import { basename, dirname, isAbsolute, normalize, relative, resolve } from './u import renderChunk from './utils/renderChunk'; import { RenderOptions } from './utils/renderHelpers'; import { makeUnique, renderNamePattern } from './utils/renderNamePattern'; +import { ADDITIONAL_NAMES_BY_FORMAT } from './utils/safeName'; import { sanitizeFileName } from './utils/sanitizeFileName'; import { timeEnd, timeStart } from './utils/timers'; import { MISSING_EXPORT_SHIM_VARIABLE } from './utils/variableNames'; @@ -433,10 +434,21 @@ export default class Chunk { } } + const additionalNames = ADDITIONAL_NAMES_BY_FORMAT[options.format]; + const usedNames = Object.assign(Object.create(null), additionalNames.globals); + const forbiddenNames = Object.assign(Object.create(null), additionalNames.forbidden); + Object.assign(usedNames, forbiddenNames); + + if (this.needsExportsShim) { + usedNames[MISSING_EXPORT_SHIM_VARIABLE] = true; + } + deconflictChunk( this.orderedModules, this.dependencies, this.imports, + usedNames, + forbiddenNames, esmOrSystem, options.interop !== false, this.graph.preserveModules diff --git a/src/ast/nodes/ObjectExpression.ts b/src/ast/nodes/ObjectExpression.ts index 2f6d7ff06e1..e3d95d0a60d 100644 --- a/src/ast/nodes/ObjectExpression.ts +++ b/src/ast/nodes/ObjectExpression.ts @@ -1,6 +1,7 @@ import MagicString from 'magic-string'; import { BLANK } from '../../utils/blank'; import { NodeRenderOptions, RenderOptions } from '../../utils/renderHelpers'; +import { NameCollection } from '../../utils/safeName'; import CallOptions from '../CallOptions'; import { DeoptimizableEntity } from '../DeoptimizableEntity'; import { ExecutionPathOptions } from '../ExecutionPathOptions'; @@ -45,7 +46,7 @@ export default class ObjectExpression extends NodeBase { private propertyMap: PropertyMap | null; private unmatchablePropertiesRead: (Property | SpreadElement)[] | null; private unmatchablePropertiesWrite: Property[] | null; - private deoptimizedPaths: { [key: string]: true }; + private deoptimizedPaths: NameCollection; private hasUnknownDeoptimizedProperty: boolean; private expressionsToBeDeoptimized: { [key: string]: DeoptimizableEntity[] }; diff --git a/src/ast/nodes/shared/pureFunctions.ts b/src/ast/nodes/shared/pureFunctions.ts index e2926568db2..8ce0eb260d3 100644 --- a/src/ast/nodes/shared/pureFunctions.ts +++ b/src/ast/nodes/shared/pureFunctions.ts @@ -1,4 +1,6 @@ -const pureFunctions: { [name: string]: boolean } = {}; +import { NameCollection } from '../../../utils/safeName'; + +const pureFunctions: NameCollection = {}; const arrayTypes = 'Array Int8Array Uint8Array Uint8ClampedArray Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array'.split( ' ' diff --git a/src/ast/scopes/ChildScope.ts b/src/ast/scopes/ChildScope.ts index 5c8e900f513..c3be0e66328 100644 --- a/src/ast/scopes/ChildScope.ts +++ b/src/ast/scopes/ChildScope.ts @@ -1,4 +1,4 @@ -import { getSafeName } from '../../utils/safeName'; +import { getSafeName, NameCollection } from '../../utils/safeName'; import { ExpressionEntity } from '../nodes/shared/Expression'; import Variable from '../variables/Variable'; import Scope from './Scope'; @@ -28,8 +28,8 @@ export default class ChildScope extends Scope { return name in this.variables || this.parent.contains(name); } - deconflict() { - const usedNames: { [name: string]: true } = Object.create(null); + deconflict(forbiddenNames: NameCollection) { + const usedNames: NameCollection = Object.assign(Object.create(null), forbiddenNames); for (const name of Object.keys(this.accessedOutsideVariables)) { const variable = this.accessedOutsideVariables[name]; if (variable.included) { @@ -43,7 +43,7 @@ export default class ChildScope extends Scope { } } for (const scope of this.children) { - scope.deconflict(); + scope.deconflict(forbiddenNames); } } diff --git a/src/ast/scopes/ModuleScope.ts b/src/ast/scopes/ModuleScope.ts index f60208c2ce8..3c728606da2 100644 --- a/src/ast/scopes/ModuleScope.ts +++ b/src/ast/scopes/ModuleScope.ts @@ -1,4 +1,5 @@ import { AstContext } from '../../Module'; +import { NameCollection } from '../../utils/safeName'; import ExportDefaultDeclaration from '../nodes/ExportDefaultDeclaration'; import { UNDEFINED_EXPRESSION } from '../values'; import ExportDefaultVariable from '../variables/ExportDefaultVariable'; @@ -36,9 +37,9 @@ export default class ModuleScope extends ChildScope { } } - deconflict() { + deconflict(forbiddenNames: NameCollection) { // all module level variables are already deconflicted in the chunk - for (const scope of this.children) scope.deconflict(); + for (const scope of this.children) scope.deconflict(forbiddenNames); } findLexicalBoundary() { diff --git a/src/utils/deconflictChunk.ts b/src/utils/deconflictChunk.ts index 5a2a933e679..98dc8913d6a 100644 --- a/src/utils/deconflictChunk.ts +++ b/src/utils/deconflictChunk.ts @@ -3,22 +3,24 @@ import Variable from '../ast/variables/Variable'; import Chunk from '../Chunk'; import ExternalModule from '../ExternalModule'; import Module from '../Module'; -import { getSafeName } from './safeName'; +import { getSafeName, NameCollection } from './safeName'; export function deconflictChunk( modules: Module[], dependencies: (ExternalModule | Chunk)[], imports: Set, + usedNames: NameCollection, + forbiddenNames: NameCollection, esmOrSystem: boolean, interop: boolean, preserveModules: boolean ) { + // register globals const accessedGlobals: { [name: string]: Variable } = Object.assign( {}, ...modules.map(module => module.scope.accessedOutsideVariables) ); - const usedNames: { [name: string]: true } = Object.create(null); for (const name of Object.keys(accessedGlobals)) { const variable = accessedGlobals[name]; if (variable.included) { @@ -91,6 +93,6 @@ export function deconflictChunk( } for (const module of modules) { - module.scope.deconflict(); + module.scope.deconflict(forbiddenNames); } } diff --git a/src/utils/pluginDriver.ts b/src/utils/pluginDriver.ts index 916577fec5d..ccbe55319f0 100644 --- a/src/utils/pluginDriver.ts +++ b/src/utils/pluginDriver.ts @@ -15,6 +15,7 @@ import { import { createAssetPluginHooks, EmitAsset } from './assetHooks'; import { getRollupDefaultPlugin } from './defaultPlugin'; import { error } from './error'; +import { NameCollection } from './safeName'; export interface PluginDriver { emitAsset: EmitAsset; @@ -57,7 +58,7 @@ export function createPluginDriver( ): PluginDriver { const plugins = [...(options.plugins || []), getRollupDefaultPlugin(options)]; const { emitAsset, getAssetFileName, setAssetSource } = createAssetPluginHooks(graph.assetsById); - const existingPluginKeys: { [key: string]: true } = {}; + const existingPluginKeys: NameCollection = {}; let hasLoadersOrTransforms = false; diff --git a/src/utils/safeName.ts b/src/utils/safeName.ts index 34dddc83c10..765cf6c6dc4 100644 --- a/src/utils/safeName.ts +++ b/src/utils/safeName.ts @@ -1,17 +1,79 @@ import { toBase64 } from './base64'; -import { INTEROP_DEFAULT_VARIABLE, MISSING_EXPORT_SHIM_VARIABLE } from './variableNames'; +import { INTEROP_DEFAULT_VARIABLE } from './variableNames'; -const RESERVED_NAMES: { [name: string]: true } = { - [MISSING_EXPORT_SHIM_VARIABLE]: true, - [INTEROP_DEFAULT_VARIABLE]: true, - exports: true, - module: true +export interface NameCollection { + [name: string]: true; +} + +const RESERVED_NAMES: NameCollection = Object.assign(Object.create(null), { + await: true, + break: true, + case: true, + catch: true, + class: true, + const: true, + continue: true, + debugger: true, + default: true, + delete: true, + do: true, + else: true, + enum: true, + eval: true, + export: true, + extends: true, + finally: true, + for: true, + function: true, + if: true, + implements: true, + import: true, + in: true, + instanceof: true, + interface: true, + let: true, + new: true, + null: true, + package: true, + private: true, + protected: true, + public: true, + return: true, + static: true, + super: true, + switch: true, + throw: true, + try: true, + typeof: true, + undefined: true, + var: true, + void: true, + while: true, + with: true, + yield: true +}); + +const NONE = Object.create(null); +const EXPORTS: NameCollection = { exports: true }; + +export const ADDITIONAL_NAMES_BY_FORMAT: { + [format: string]: { globals: NameCollection; forbidden: NameCollection }; +} = { + cjs: { + globals: { exports: true, module: true, [INTEROP_DEFAULT_VARIABLE]: true }, + forbidden: RESERVED_NAMES + }, + iife: { globals: EXPORTS, forbidden: RESERVED_NAMES }, + amd: { globals: EXPORTS, forbidden: RESERVED_NAMES }, + umd: { globals: EXPORTS, forbidden: RESERVED_NAMES }, + system: { globals: NONE, forbidden: Object.assign(Object.create(null), RESERVED_NAMES, EXPORTS) }, + es: { globals: NONE, forbidden: RESERVED_NAMES } }; -export function getSafeName(baseName: string, usedNames: { [name: string]: true }): string { +export function getSafeName(baseName: string, usedNames: NameCollection): string { let safeName = baseName; let count = 1; - while (usedNames[safeName] || RESERVED_NAMES[safeName]) { + while (usedNames[safeName]) { safeName = `${baseName}$${toBase64(count++)}`; } usedNames[safeName] = true; diff --git a/src/utils/traverseStaticDependencies.ts b/src/utils/traverseStaticDependencies.ts index c546b068ca1..20229707058 100644 --- a/src/utils/traverseStaticDependencies.ts +++ b/src/utils/traverseStaticDependencies.ts @@ -1,12 +1,13 @@ import ExternalModule from '../ExternalModule'; import Module from '../Module'; +import { NameCollection } from './safeName'; export function visitStaticModuleDependencies( baseModule: Module | ExternalModule, areDependenciesSkipped: (module: Module | ExternalModule) => boolean ) { const modules = [baseModule]; - const visitedModules: { [id: string]: true } = {}; + const visitedModules: NameCollection = {}; for (const module of modules) { if (areDependenciesSkipped(module) || module instanceof ExternalModule) continue; for (const dependency of module.dependencies) { diff --git a/test/chunking-form/samples/missing-export-compact/_expected/es/main.js b/test/chunking-form/samples/missing-export-compact/_expected/es/main.js index ac1e69ef80f..f1d0a6754a0 100644 --- a/test/chunking-form/samples/missing-export-compact/_expected/es/main.js +++ b/test/chunking-form/samples/missing-export-compact/_expected/es/main.js @@ -1,2 +1,2 @@ -import {missingFn as _missingExportShim$1,x}from'./dep.js';_missingExportShim$1(); -x(_missingExportShim$1); \ No newline at end of file +import {missingFn as _missingExportShim,x}from'./dep.js';_missingExportShim(); +x(_missingExportShim); \ No newline at end of file diff --git a/test/chunking-form/samples/missing-export-compact/_expected/system/main.js b/test/chunking-form/samples/missing-export-compact/_expected/system/main.js index 2526542b862..68308ec298a 100644 --- a/test/chunking-form/samples/missing-export-compact/_expected/system/main.js +++ b/test/chunking-form/samples/missing-export-compact/_expected/system/main.js @@ -1,2 +1,2 @@ -System.register(['./dep.js'],function(exports,module){'use strict';var _missingExportShim$1,x;return{setters:[function(module){_missingExportShim$1=module.missingFn;x=module.x;}],execute:function(){_missingExportShim$1(); -x(_missingExportShim$1);}}}); \ No newline at end of file +System.register(['./dep.js'],function(exports,module){'use strict';var _missingExportShim,x;return{setters:[function(module){_missingExportShim=module.missingFn;x=module.x;}],execute:function(){_missingExportShim(); +x(_missingExportShim);}}}); \ No newline at end of file diff --git a/test/chunking-form/samples/missing-export-reused-deconflicting/_expected/es/main.js b/test/chunking-form/samples/missing-export-reused-deconflicting/_expected/es/main.js index 92a53c97ac5..ea2616a1c8c 100644 --- a/test/chunking-form/samples/missing-export-reused-deconflicting/_expected/es/main.js +++ b/test/chunking-form/samples/missing-export-reused-deconflicting/_expected/es/main.js @@ -1,4 +1,4 @@ -import { missing1 as _missingExportShim$1 } from './dep1.js'; -import { missing2 as _missingExportShim$2, previousShimmedExport as _missingExportShim$3 } from './dep2.js'; +import { missing1 as _missingExportShim } from './dep1.js'; +import { missing2 as _missingExportShim$1, previousShimmedExport as _missingExportShim$2 } from './dep2.js'; -console.log(_missingExportShim$1, _missingExportShim$2, _missingExportShim$3); +console.log(_missingExportShim, _missingExportShim$1, _missingExportShim$2); diff --git a/test/chunking-form/samples/missing-export-reused-deconflicting/_expected/system/main.js b/test/chunking-form/samples/missing-export-reused-deconflicting/_expected/system/main.js index 286d38bda38..0fb8136ac7c 100644 --- a/test/chunking-form/samples/missing-export-reused-deconflicting/_expected/system/main.js +++ b/test/chunking-form/samples/missing-export-reused-deconflicting/_expected/system/main.js @@ -1,16 +1,16 @@ System.register(['./dep1.js', './dep2.js'], function (exports, module) { 'use strict'; - var _missingExportShim$1, _missingExportShim$2, _missingExportShim$3; + var _missingExportShim, _missingExportShim$1, _missingExportShim$2; return { setters: [function (module) { - _missingExportShim$1 = module.missing1; + _missingExportShim = module.missing1; }, function (module) { - _missingExportShim$2 = module.missing2; - _missingExportShim$3 = module.previousShimmedExport; + _missingExportShim$1 = module.missing2; + _missingExportShim$2 = module.previousShimmedExport; }], execute: function () { - console.log(_missingExportShim$1, _missingExportShim$2, _missingExportShim$3); + console.log(_missingExportShim, _missingExportShim$1, _missingExportShim$2); } }; diff --git a/test/chunking-form/samples/missing-export/_expected/es/main.js b/test/chunking-form/samples/missing-export/_expected/es/main.js index f539ec1208a..42ed3d2bae5 100644 --- a/test/chunking-form/samples/missing-export/_expected/es/main.js +++ b/test/chunking-form/samples/missing-export/_expected/es/main.js @@ -1,4 +1,4 @@ -import { missingFn as _missingExportShim$1, x } from './dep.js'; +import { missingFn as _missingExportShim, x } from './dep.js'; -_missingExportShim$1(); -x(_missingExportShim$1, _missingExportShim$1); +_missingExportShim(); +x(_missingExportShim, _missingExportShim); diff --git a/test/chunking-form/samples/missing-export/_expected/system/main.js b/test/chunking-form/samples/missing-export/_expected/system/main.js index 77d033e0e64..8aeac7a4e88 100644 --- a/test/chunking-form/samples/missing-export/_expected/system/main.js +++ b/test/chunking-form/samples/missing-export/_expected/system/main.js @@ -1,15 +1,15 @@ System.register(['./dep.js'], function (exports, module) { 'use strict'; - var _missingExportShim$1, x; + var _missingExportShim, x; return { setters: [function (module) { - _missingExportShim$1 = module.missingFn; + _missingExportShim = module.missingFn; x = module.x; }], execute: function () { - _missingExportShim$1(); - x(_missingExportShim$1, _missingExportShim$1); + _missingExportShim(); + x(_missingExportShim, _missingExportShim); } }; diff --git a/test/form/samples/deconflict-format-specific-exports/_config.js b/test/form/samples/deconflict-format-specific-exports/_config.js new file mode 100644 index 00000000000..3618b693baf --- /dev/null +++ b/test/form/samples/deconflict-format-specific-exports/_config.js @@ -0,0 +1,4 @@ +module.exports = { + description: 'only deconflict "exports" for formats where it is necessary', + options: { output: { name: 'bundle' } } +}; diff --git a/test/form/samples/deconflict-format-specific-exports/_expected/amd.js b/test/form/samples/deconflict-format-specific-exports/_expected/amd.js new file mode 100644 index 00000000000..e060619b182 --- /dev/null +++ b/test/form/samples/deconflict-format-specific-exports/_expected/amd.js @@ -0,0 +1,29 @@ +define(['exports'], function (exports) { 'use strict'; + + const exports$1 = { + x: 42 + }; + console.log(exports$1); + + function nestedConflict() { + const exports$1 = { + x: 42 + }; + console.log(exports$1); + exports.x++; + } + + function nestedNoConflict() { + const exports = { + x: 42 + }; + console.log(exports); + } + + exports.x = 43; + nestedConflict(); + nestedNoConflict(); + + Object.defineProperty(exports, '__esModule', { value: true }); + +}); diff --git a/test/form/samples/deconflict-format-specific-exports/_expected/cjs.js b/test/form/samples/deconflict-format-specific-exports/_expected/cjs.js new file mode 100644 index 00000000000..21cadc195ec --- /dev/null +++ b/test/form/samples/deconflict-format-specific-exports/_expected/cjs.js @@ -0,0 +1,27 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { value: true }); + +const exports$1 = { + x: 42 +}; +console.log(exports$1); + +function nestedConflict() { + const exports$1 = { + x: 42 + }; + console.log(exports$1); + exports.x++; +} + +function nestedNoConflict() { + const exports = { + x: 42 + }; + console.log(exports); +} + +exports.x = 43; +nestedConflict(); +nestedNoConflict(); diff --git a/test/form/samples/deconflict-format-specific-exports/_expected/es.js b/test/form/samples/deconflict-format-specific-exports/_expected/es.js new file mode 100644 index 00000000000..131a3701263 --- /dev/null +++ b/test/form/samples/deconflict-format-specific-exports/_expected/es.js @@ -0,0 +1,25 @@ +const exports = { + x: 42 +}; +console.log(exports); + +function nestedConflict() { + const exports = { + x: 42 + }; + console.log(exports); + x++; +} + +function nestedNoConflict() { + const exports = { + x: 42 + }; + console.log(exports); +} + +var x = 43; +nestedConflict(); +nestedNoConflict(); + +export { x }; diff --git a/test/form/samples/deconflict-format-specific-exports/_expected/iife.js b/test/form/samples/deconflict-format-specific-exports/_expected/iife.js new file mode 100644 index 00000000000..0ec8042b07c --- /dev/null +++ b/test/form/samples/deconflict-format-specific-exports/_expected/iife.js @@ -0,0 +1,30 @@ +var bundle = (function (exports) { + 'use strict'; + + const exports$1 = { + x: 42 + }; + console.log(exports$1); + + function nestedConflict() { + const exports$1 = { + x: 42 + }; + console.log(exports$1); + exports.x++; + } + + function nestedNoConflict() { + const exports = { + x: 42 + }; + console.log(exports); + } + + exports.x = 43; + nestedConflict(); + nestedNoConflict(); + + return exports; + +}({})); diff --git a/test/form/samples/deconflict-format-specific-exports/_expected/system.js b/test/form/samples/deconflict-format-specific-exports/_expected/system.js new file mode 100644 index 00000000000..b78cf175a69 --- /dev/null +++ b/test/form/samples/deconflict-format-specific-exports/_expected/system.js @@ -0,0 +1,32 @@ +System.register('bundle', [], function (exports, module) { + 'use strict'; + return { + execute: function () { + + const exports$1 = { + x: 42 + }; + console.log(exports$1); + + function nestedConflict() { + const exports$1 = { + x: 42 + }; + console.log(exports$1); + (exports('x', x + 1), x++); + } + + function nestedNoConflict() { + const exports$1 = { + x: 42 + }; + console.log(exports$1); + } + + var x = exports('x', 43); + nestedConflict(); + nestedNoConflict(); + + } + }; +}); diff --git a/test/form/samples/deconflict-format-specific-exports/_expected/umd.js b/test/form/samples/deconflict-format-specific-exports/_expected/umd.js new file mode 100644 index 00000000000..e05a4449c51 --- /dev/null +++ b/test/form/samples/deconflict-format-specific-exports/_expected/umd.js @@ -0,0 +1,33 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.bundle = {})); +}(this, function (exports) { 'use strict'; + + const exports$1 = { + x: 42 + }; + console.log(exports$1); + + function nestedConflict() { + const exports$1 = { + x: 42 + }; + console.log(exports$1); + exports.x++; + } + + function nestedNoConflict() { + const exports = { + x: 42 + }; + console.log(exports); + } + + exports.x = 43; + nestedConflict(); + nestedNoConflict(); + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/test/form/samples/deconflict-format-specific-exports/main.js b/test/form/samples/deconflict-format-specific-exports/main.js new file mode 100644 index 00000000000..26fd218756a --- /dev/null +++ b/test/form/samples/deconflict-format-specific-exports/main.js @@ -0,0 +1,23 @@ +const exports = { + x: 42 +}; +console.log(exports); + +function nestedConflict() { + const exports = { + x: 42 + }; + console.log(exports); + x++; +} + +function nestedNoConflict() { + const exports = { + x: 42 + }; + console.log(exports); +} + +export var x = 43; +nestedConflict(); +nestedNoConflict(); diff --git a/test/form/samples/deconflict-format-specific-interop/_config.js b/test/form/samples/deconflict-format-specific-interop/_config.js new file mode 100644 index 00000000000..4194988127c --- /dev/null +++ b/test/form/samples/deconflict-format-specific-interop/_config.js @@ -0,0 +1,4 @@ +module.exports = { + description: 'only deconflict "interop" for formats where it is necessary', + options: { external: ['external'] } +}; diff --git a/test/form/samples/deconflict-format-specific-interop/_expected/amd.js b/test/form/samples/deconflict-format-specific-interop/_expected/amd.js new file mode 100644 index 00000000000..a1ffe6c9326 --- /dev/null +++ b/test/form/samples/deconflict-format-specific-interop/_expected/amd.js @@ -0,0 +1,8 @@ +define(['external'], function (external) { 'use strict'; + + external = external && external.hasOwnProperty('default') ? external['default'] : external; + + const _interopDefault = 42; + console.log(external, _interopDefault); + +}); diff --git a/test/form/samples/deconflict-format-specific-interop/_expected/cjs.js b/test/form/samples/deconflict-format-specific-interop/_expected/cjs.js new file mode 100644 index 00000000000..f201edb1286 --- /dev/null +++ b/test/form/samples/deconflict-format-specific-interop/_expected/cjs.js @@ -0,0 +1,8 @@ +'use strict'; + +function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } + +var external = _interopDefault(require('external')); + +const _interopDefault$1 = 42; +console.log(external, _interopDefault$1); diff --git a/test/form/samples/deconflict-format-specific-interop/_expected/es.js b/test/form/samples/deconflict-format-specific-interop/_expected/es.js new file mode 100644 index 00000000000..f89c64b5b23 --- /dev/null +++ b/test/form/samples/deconflict-format-specific-interop/_expected/es.js @@ -0,0 +1,4 @@ +import external from 'external'; + +const _interopDefault = 42; +console.log(external, _interopDefault); diff --git a/test/form/samples/deconflict-format-specific-interop/_expected/iife.js b/test/form/samples/deconflict-format-specific-interop/_expected/iife.js new file mode 100644 index 00000000000..6d52d475b9b --- /dev/null +++ b/test/form/samples/deconflict-format-specific-interop/_expected/iife.js @@ -0,0 +1,9 @@ +(function (external) { + 'use strict'; + + external = external && external.hasOwnProperty('default') ? external['default'] : external; + + const _interopDefault = 42; + console.log(external, _interopDefault); + +}(external)); diff --git a/test/form/samples/deconflict-format-specific-interop/_expected/system.js b/test/form/samples/deconflict-format-specific-interop/_expected/system.js new file mode 100644 index 00000000000..7d25adfa650 --- /dev/null +++ b/test/form/samples/deconflict-format-specific-interop/_expected/system.js @@ -0,0 +1,15 @@ +System.register(['external'], function (exports, module) { + 'use strict'; + var external; + return { + setters: [function (module) { + external = module.default; + }], + execute: function () { + + const _interopDefault = 42; + console.log(external, _interopDefault); + + } + }; +}); diff --git a/test/form/samples/deconflict-format-specific-interop/_expected/umd.js b/test/form/samples/deconflict-format-specific-interop/_expected/umd.js new file mode 100644 index 00000000000..d28769cf89b --- /dev/null +++ b/test/form/samples/deconflict-format-specific-interop/_expected/umd.js @@ -0,0 +1,12 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('external')) : + typeof define === 'function' && define.amd ? define(['external'], factory) : + (global = global || self, factory(global.external)); +}(this, function (external) { 'use strict'; + + external = external && external.hasOwnProperty('default') ? external['default'] : external; + + const _interopDefault = 42; + console.log(external, _interopDefault); + +})); diff --git a/test/form/samples/deconflict-format-specific-interop/main.js b/test/form/samples/deconflict-format-specific-interop/main.js new file mode 100644 index 00000000000..f89c64b5b23 --- /dev/null +++ b/test/form/samples/deconflict-format-specific-interop/main.js @@ -0,0 +1,4 @@ +import external from 'external'; + +const _interopDefault = 42; +console.log(external, _interopDefault); diff --git a/test/form/samples/deconflict-format-specific-module/_config.js b/test/form/samples/deconflict-format-specific-module/_config.js new file mode 100644 index 00000000000..8ba567b9a9c --- /dev/null +++ b/test/form/samples/deconflict-format-specific-module/_config.js @@ -0,0 +1,4 @@ +module.exports = { + description: 'only deconflict "module" for formats where it is necessary', + options: { output: { name: 'bundle' } } +}; diff --git a/test/form/samples/deconflict-format-specific-module/_expected/amd.js b/test/form/samples/deconflict-format-specific-module/_expected/amd.js new file mode 100644 index 00000000000..8801f2c2a58 --- /dev/null +++ b/test/form/samples/deconflict-format-specific-module/_expected/amd.js @@ -0,0 +1,12 @@ +define(function () { 'use strict'; + + const module = { + exports: 99 + }; + console.log(module); + + var main = 42; + + return main; + +}); diff --git a/test/form/samples/deconflict-format-specific-module/_expected/cjs.js b/test/form/samples/deconflict-format-specific-module/_expected/cjs.js new file mode 100644 index 00000000000..27b7aa822ad --- /dev/null +++ b/test/form/samples/deconflict-format-specific-module/_expected/cjs.js @@ -0,0 +1,10 @@ +'use strict'; + +const module$1 = { + exports: 99 +}; +console.log(module$1); + +var main = 42; + +module.exports = main; diff --git a/test/form/samples/deconflict-format-specific-module/_expected/es.js b/test/form/samples/deconflict-format-specific-module/_expected/es.js new file mode 100644 index 00000000000..6bde991495b --- /dev/null +++ b/test/form/samples/deconflict-format-specific-module/_expected/es.js @@ -0,0 +1,8 @@ +const module = { + exports: 99 +}; +console.log(module); + +var main = 42; + +export default main; diff --git a/test/form/samples/deconflict-format-specific-module/_expected/iife.js b/test/form/samples/deconflict-format-specific-module/_expected/iife.js new file mode 100644 index 00000000000..d9bc6034233 --- /dev/null +++ b/test/form/samples/deconflict-format-specific-module/_expected/iife.js @@ -0,0 +1,13 @@ +var bundle = (function () { + 'use strict'; + + const module = { + exports: 99 + }; + console.log(module); + + var main = 42; + + return main; + +}()); diff --git a/test/form/samples/deconflict-format-specific-module/_expected/system.js b/test/form/samples/deconflict-format-specific-module/_expected/system.js new file mode 100644 index 00000000000..700ce53af0e --- /dev/null +++ b/test/form/samples/deconflict-format-specific-module/_expected/system.js @@ -0,0 +1,15 @@ +System.register('bundle', [], function (exports, module) { + 'use strict'; + return { + execute: function () { + + const module = { + exports: 99 + }; + console.log(module); + + var main = exports('default', 42); + + } + }; +}); diff --git a/test/form/samples/deconflict-format-specific-module/_expected/umd.js b/test/form/samples/deconflict-format-specific-module/_expected/umd.js new file mode 100644 index 00000000000..239341b049a --- /dev/null +++ b/test/form/samples/deconflict-format-specific-module/_expected/umd.js @@ -0,0 +1,16 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, global.bundle = factory()); +}(this, function () { 'use strict'; + + const module = { + exports: 99 + }; + console.log(module); + + var main = 42; + + return main; + +})); diff --git a/test/form/samples/deconflict-format-specific-module/main.js b/test/form/samples/deconflict-format-specific-module/main.js new file mode 100644 index 00000000000..eeb42d0c4c2 --- /dev/null +++ b/test/form/samples/deconflict-format-specific-module/main.js @@ -0,0 +1,6 @@ +const module = { + exports: 99 +}; +console.log(module); + +export default 42; diff --git a/test/form/samples/deconflict-reserved-words/_config.js b/test/form/samples/deconflict-reserved-words/_config.js new file mode 100644 index 00000000000..0be4d22cb9c --- /dev/null +++ b/test/form/samples/deconflict-reserved-words/_config.js @@ -0,0 +1,4 @@ +module.exports = { + description: 'deconflict reserved words when inlining namespace imports', + options: { external: ['dep'] } +}; diff --git a/test/form/samples/deconflict-reserved-words/_expected.js b/test/form/samples/deconflict-reserved-words/_expected.js new file mode 100644 index 00000000000..8f11287671e --- /dev/null +++ b/test/form/samples/deconflict-reserved-words/_expected.js @@ -0,0 +1,47 @@ +import dep__default, { await as await$1, break as break$1, case as case$1, catch as catch$1, class as class$1, const as const$1, continue as continue$1, debugger as debugger$1, delete as delete$1, do as do$1, else as else$1, enum as enum$1, eval as eval$1, export as export$1, extends as extends$1, finally as finally$1, for as for$1, function as function$1, if as if$1, implements as implements$1, import as import$1, in as in$1, instanceof as instanceof$1, interface as interface$1, let as let$1, new as new$1, null as null$1, package as package$1, private as private$1, protected as protected$1, public as public$1, return as return$1, static as static$1, super as super$1, switch as switch$1, throw as throw$1, try as try$1, typeof as typeof$1, undefined as undefined$1, var as var$1, void as void$1, while as while$1, with as with$1, yield as yield$1 } from 'dep'; + +console.log(await$1); +console.log(break$1); +console.log(case$1); +console.log(catch$1); +console.log(class$1); +console.log(const$1); +console.log(continue$1); +console.log(debugger$1); +console.log(dep__default); +console.log(delete$1); +console.log(do$1); +console.log(else$1); +console.log(enum$1); +console.log(eval$1); +console.log(export$1); +console.log(extends$1); +console.log(finally$1); +console.log(for$1); +console.log(function$1); +console.log(if$1); +console.log(implements$1); +console.log(import$1); +console.log(in$1); +console.log(instanceof$1); +console.log(interface$1); +console.log(let$1); +console.log(new$1); +console.log(null$1); +console.log(package$1); +console.log(private$1); +console.log(protected$1); +console.log(public$1); +console.log(return$1); +console.log(static$1); +console.log(super$1); +console.log(switch$1); +console.log(throw$1); +console.log(try$1); +console.log(typeof$1); +console.log(undefined$1); +console.log(var$1); +console.log(void$1); +console.log(while$1); +console.log(with$1); +console.log(yield$1); diff --git a/test/form/samples/deconflict-reserved-words/main.js b/test/form/samples/deconflict-reserved-words/main.js new file mode 100644 index 00000000000..0081bb9fb1f --- /dev/null +++ b/test/form/samples/deconflict-reserved-words/main.js @@ -0,0 +1,47 @@ +import * as dep from 'dep'; + +console.log(dep.await); +console.log(dep.break); +console.log(dep.case); +console.log(dep.catch); +console.log(dep.class); +console.log(dep.const); +console.log(dep.continue); +console.log(dep.debugger); +console.log(dep.default); +console.log(dep.delete); +console.log(dep.do); +console.log(dep.else); +console.log(dep.enum); +console.log(dep.eval); +console.log(dep.export); +console.log(dep.extends); +console.log(dep.finally); +console.log(dep.for); +console.log(dep.function); +console.log(dep.if); +console.log(dep.implements); +console.log(dep.import); +console.log(dep.in); +console.log(dep.instanceof); +console.log(dep.interface); +console.log(dep.let); +console.log(dep.new); +console.log(dep.null); +console.log(dep.package); +console.log(dep.private); +console.log(dep.protected); +console.log(dep.public); +console.log(dep.return); +console.log(dep.static); +console.log(dep.super); +console.log(dep.switch); +console.log(dep.throw); +console.log(dep.try); +console.log(dep.typeof); +console.log(dep.undefined); +console.log(dep.var); +console.log(dep.void); +console.log(dep.while); +console.log(dep.with); +console.log(dep.yield); diff --git a/test/form/samples/sequence-expression/_expected/amd.js b/test/form/samples/sequence-expression/_expected/amd.js index 1bb396422fc..3bc5a88aa06 100644 --- a/test/form/samples/sequence-expression/_expected/amd.js +++ b/test/form/samples/sequence-expression/_expected/amd.js @@ -20,8 +20,8 @@ define(function () { 'use strict'; var g = ((() => {console.log(foo$1());})(), 1); // should maintain this context - var module$1 = {}; - module$1.bar = function () { console.log( 'bar' );}; - var h = (0, module$1.bar)(); + var module = {}; + module.bar = function () { console.log( 'bar' );}; + var h = (0, module.bar)(); }); diff --git a/test/form/samples/sequence-expression/_expected/es.js b/test/form/samples/sequence-expression/_expected/es.js index a8781ec0593..8de2bf8164d 100644 --- a/test/form/samples/sequence-expression/_expected/es.js +++ b/test/form/samples/sequence-expression/_expected/es.js @@ -18,6 +18,6 @@ var e = (foo$1()); var g = ((() => {console.log(foo$1());})(), 1); // should maintain this context -var module$1 = {}; -module$1.bar = function () { console.log( 'bar' );}; -var h = (0, module$1.bar)(); +var module = {}; +module.bar = function () { console.log( 'bar' );}; +var h = (0, module.bar)(); diff --git a/test/form/samples/sequence-expression/_expected/iife.js b/test/form/samples/sequence-expression/_expected/iife.js index d77362f8477..10ed645ca68 100644 --- a/test/form/samples/sequence-expression/_expected/iife.js +++ b/test/form/samples/sequence-expression/_expected/iife.js @@ -21,8 +21,8 @@ var g = ((() => {console.log(foo$1());})(), 1); // should maintain this context - var module$1 = {}; - module$1.bar = function () { console.log( 'bar' );}; - var h = (0, module$1.bar)(); + var module = {}; + module.bar = function () { console.log( 'bar' );}; + var h = (0, module.bar)(); }()); diff --git a/test/form/samples/sequence-expression/_expected/system.js b/test/form/samples/sequence-expression/_expected/system.js index fafae7d3e52..b8cc9f0b2f2 100644 --- a/test/form/samples/sequence-expression/_expected/system.js +++ b/test/form/samples/sequence-expression/_expected/system.js @@ -23,9 +23,9 @@ System.register([], function (exports, module) { var g = ((() => {console.log(foo$1());})(), 1); // should maintain this context - var module$1 = {}; - module$1.bar = function () { console.log( 'bar' );}; - var h = (0, module$1.bar)(); + var module = {}; + module.bar = function () { console.log( 'bar' );}; + var h = (0, module.bar)(); } }; diff --git a/test/form/samples/sequence-expression/_expected/umd.js b/test/form/samples/sequence-expression/_expected/umd.js index 059d87f43de..5ce2c02cb76 100644 --- a/test/form/samples/sequence-expression/_expected/umd.js +++ b/test/form/samples/sequence-expression/_expected/umd.js @@ -23,8 +23,8 @@ var g = ((() => {console.log(foo$1());})(), 1); // should maintain this context - var module$1 = {}; - module$1.bar = function () { console.log( 'bar' );}; - var h = (0, module$1.bar)(); + var module = {}; + module.bar = function () { console.log( 'bar' );}; + var h = (0, module.bar)(); })); diff --git a/test/function/samples/allow-reserved/main.js b/test/function/samples/allow-reserved/main.js index 547a9a5311d..00782b93d9c 100644 --- a/test/function/samples/allow-reserved/main.js +++ b/test/function/samples/allow-reserved/main.js @@ -1,2 +1,4 @@ -var x = function await () {} -assert.equal( x.name, 'await' ); +var x = function await() { + return 42; +}; +assert.equal(x(), 42);