From 098e3255e4ca3603660cee7fa30325823f16f7f4 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Tue, 12 May 2020 20:47:39 +0200 Subject: [PATCH] Fix dependencies in facade creation --- src/Chunk.ts | 100 ++++++------------ src/Module.ts | 15 +-- src/utils/executionOrder.ts | 3 +- .../_expected/amd/components/index.js | 6 +- .../_expected/amd/main.js | 6 +- .../_expected/cjs/components/index.js | 6 +- .../_expected/cjs/main.js | 8 +- test/cli/samples/watch/bundle-error/main.js | 1 - .../prune-pure-unused-import-array/_config.js | 12 +++ .../_expected/amd.js | 5 + .../_expected/cjs.js | 4 + .../_expected/es.js | 1 + .../_expected/iife.js | 6 ++ .../_expected/system.js | 11 ++ .../_expected/umd.js | 9 ++ .../prune-pure-unused-import-array/main.js | 7 ++ .../_config.js | 12 +++ .../_expected/amd.js | 5 + .../_expected/cjs.js | 4 + .../_expected/es.js | 1 + .../_expected/iife.js | 6 ++ .../_expected/system.js | 11 ++ .../_expected/umd.js | 9 ++ .../prune-pure-unused-import-function/main.js | 7 ++ .../prune-pure-unused-import/_config.js | 9 ++ .../prune-pure-unused-import/_expected/amd.js | 5 + .../prune-pure-unused-import/_expected/cjs.js | 2 + .../prune-pure-unused-import/_expected/es.js | 1 + .../_expected/iife.js | 6 ++ .../_expected/system.js | 10 ++ .../prune-pure-unused-import/_expected/umd.js | 8 ++ .../prune-pure-unused-import/main.js | 5 + .../prune-pure-unused-import-array/_config.js | 4 +- .../_expected/amd.js | 2 +- .../_expected/cjs.js | 2 + .../_expected/es.js | 2 +- .../_expected/iife.js | 4 +- .../_expected/system.js | 3 +- .../_expected/umd.js | 9 +- .../_config.js | 5 +- .../_expected/amd.js | 2 +- .../_expected/cjs.js | 2 + .../_expected/es.js | 2 +- .../_expected/iife.js | 4 +- .../_expected/system.js | 3 +- .../_expected/umd.js | 9 +- .../prune-pure-unused-import/_config.js | 5 +- .../samples/facade-reexports/_config.js | 14 +++ .../samples/facade-reexports/dynamic.js | 2 + test/function/samples/facade-reexports/lib.js | 1 + .../function/samples/facade-reexports/main.js | 3 + .../samples/facade-reexports/other.js | 1 + 52 files changed, 261 insertions(+), 119 deletions(-) delete mode 100644 test/cli/samples/watch/bundle-error/main.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-array/_config.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-array/_expected/amd.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-array/_expected/cjs.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-array/_expected/es.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-array/_expected/iife.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-array/_expected/system.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-array/_expected/umd.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-array/main.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-function/_config.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-function/_expected/amd.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-function/_expected/cjs.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-function/_expected/es.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-function/_expected/iife.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-function/_expected/system.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-function/_expected/umd.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import-function/main.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import/_config.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import/_expected/amd.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import/_expected/cjs.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import/_expected/es.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import/_expected/iife.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import/_expected/system.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import/_expected/umd.js create mode 100644 test/form/samples/deprecated/prune-pure-unused-import/main.js create mode 100644 test/function/samples/facade-reexports/_config.js create mode 100644 test/function/samples/facade-reexports/dynamic.js create mode 100644 test/function/samples/facade-reexports/lib.js create mode 100644 test/function/samples/facade-reexports/main.js create mode 100644 test/function/samples/facade-reexports/other.js diff --git a/src/Chunk.ts b/src/Chunk.ts index 88d7de44bad..ee7b92ccc3c 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -126,7 +126,12 @@ export default class Chunk { if (!facadedModule.facadeChunk) { facadedModule.facadeChunk = chunk; } - chunk.dependencies.add(facadedModule.chunk!); + for (const dependency of facadedModule.getDependenciesToBeIncluded()) { + chunk.dependencies.add(dependency instanceof Module ? dependency.chunk! : dependency); + } + if (!chunk.dependencies.has(facadedModule.chunk!) && facadedModule.hasEffects()) { + chunk.dependencies.add(facadedModule.chunk!); + } chunk.facadeModule = facadedModule; chunk.strictFacade = true; return chunk; @@ -137,7 +142,6 @@ export default class Chunk { exportMode: 'none' | 'named' | 'default' = 'named'; facadeModule: Module | null = null; graph: Graph; - hasSideEffects = false; id: string | null = null; indentString: string = undefined as any; isDynamicEntry = false; @@ -148,7 +152,6 @@ export default class Chunk { }; usedModules: Module[] = undefined as any; variableName = 'chunk'; - private allDependencies = new Set(); private dependencies = new Set(); private dynamicDependencies = new Set(); @@ -470,11 +473,19 @@ export default class Chunk { varOrConst: options.preferConst ? 'const' : 'var' }; - // because bindings are resolved to their exact chunk, we need all chunk dependencies directly - // available to the dependency analysis - this.allDependencies = new Set(); - this.gatherAllDependencies(this); - this.hasSideEffects = this.orderedModules.some(module => module.hasSideEffects); + // for static and dynamic entry points, inline the execution list to avoid loading latency + if ( + options.hoistTransitiveImports !== false && + !this.graph.preserveModules && + this.facadeModule !== null + ) { + for (const dep of this.dependencies) { + if (dep instanceof Chunk) this.inlineChunkDependencies(dep); + } + } + const sortedDependencies = [...this.dependencies]; + sortByExecutionOrder(sortedDependencies); + this.dependencies = new Set(sortedDependencies); this.prepareDynamicImports(); this.setIdentifierRenderResolutions(options); @@ -564,7 +575,7 @@ export default class Chunk { // populate ids in the rendered declarations only here // as chunk ids known only after prerender - for (const dependency of this.allDependencies) { + for (const dependency of this.dependencies) { if (dependency instanceof ExternalModule && !dependency.renormalizeRenderPath) continue; const renderedDependency = this.renderedDependencies!.get(dependency)!; const depId = dependency instanceof ExternalModule ? renderedDependency.id : dependency.id!; @@ -605,22 +616,11 @@ export default class Chunk { }); } - // when using inlineDependencies, orphaned pure chunks can be excluded - const dependencies = new Set([]); - const inlineDependencies = - options.hoistTransitiveImports !== false && - !this.graph.preserveModules && - this.facadeModule !== null; - const pureExternalModules = Boolean(this.graph.treeshakingOptions?.pureExternalModules); - this.gatherUsedDependencies(this, pureExternalModules, inlineDependencies, dependencies); - const magicString = finalise( this.renderedSource!, { accessedGlobals, - dependencies: sortByExecutionOrder([...dependencies]).map( - dep => this.renderedDependencies?.get(dep) as ModuleDeclarationDependency - ), + dependencies: [...this.renderedDependencies!.values()], exports: this.renderedExports!, hasExports, indentString: this.indentString, @@ -780,49 +780,6 @@ export default class Chunk { } } - private gatherAllDependencies(chunk: Chunk) { - for (const dep of chunk.dependencies) { - if (this.allDependencies.has(dep)) continue; - this.allDependencies.add(dep); - if (dep instanceof Chunk) { - this.gatherAllDependencies(dep); - } - } - } - - private gatherUsedDependencies( - chunk: Chunk, - pureExternalModules: boolean, - inlineDependencies: boolean, - dependencies: Set, - seen = new Set() - ) { - const doInline = inlineDependencies || chunk === this; - for (const dep of chunk.dependencies) { - if (seen.has(dep)) return; - seen.add(dep); - - const hasImportedBinding = this.hasImportedBindingTo(dep); - - if (dep instanceof ExternalModule) { - if ( - hasImportedBinding || - (doInline && (!pureExternalModules || chunk.hasImportedBindingTo(dep))) - ) - dependencies.add(dep); - continue; - } - - if ( - hasImportedBinding || - (doInline && (dep.hasSideEffects || chunk.hasImportedBindingTo(dep))) - ) - dependencies.add(dep); - - this.gatherUsedDependencies(dep, pureExternalModules, inlineDependencies, dependencies, seen); - } - } - private getChunkDependencyDeclarations( options: OutputOptions ): Map { @@ -859,7 +816,7 @@ export default class Chunk { const renderedImports = new Set(); const dependencies = new Map(); - for (const dep of this.allDependencies) { + for (const dep of this.dependencies) { const imports: ImportSpecifier[] = []; for (const variable of this.imports) { if ( @@ -1003,9 +960,14 @@ export default class Chunk { return relativePath.startsWith('../') ? relativePath : './' + relativePath; } - private hasImportedBindingTo(dep: Chunk | ExternalModule) { - const renderedDeclaration = this.renderedDependencies?.get(dep)!; - return renderedDeclaration.imports?.length || renderedDeclaration.reexports?.length; + private inlineChunkDependencies(chunk: Chunk) { + for (const dep of chunk.dependencies) { + if (this.dependencies.has(dep)) continue; + this.dependencies.add(dep); + if (dep instanceof Chunk) { + this.inlineChunkDependencies(dep); + } + } } private prepareDynamicImports() { @@ -1026,7 +988,7 @@ export default class Chunk { } private setExternalRenderPaths(options: OutputOptions, inputBase: string) { - for (const dependency of [...this.allDependencies, ...this.dynamicDependencies]) { + for (const dependency of [...this.dependencies, ...this.dynamicDependencies]) { if (dependency instanceof ExternalModule) { dependency.setRenderPath(options, inputBase); } diff --git a/src/Module.ts b/src/Module.ts index c96a24e4ce7..723b5e74823 100644 --- a/src/Module.ts +++ b/src/Module.ts @@ -208,7 +208,6 @@ export default class Module { exports: { [name: string]: ExportDescription } = Object.create(null); exportsAll: { [name: string]: string } = Object.create(null); facadeChunk: Chunk | null = null; - hasSideEffects = false; importDescriptions: { [name: string]: ImportDescription } = Object.create(null); importers: string[] = []; importMetas: MetaProperty[] = []; @@ -369,10 +368,7 @@ export default class Module { const possibleDependencies = new Set(this.dependencies); for (const dependency of possibleDependencies) { if (!dependency.moduleSideEffects || relevantDependencies.has(dependency)) continue; - if ( - dependency instanceof ExternalModule || - (dependency.ast.included && dependency.hasSideEffects) - ) { + if (dependency instanceof ExternalModule || dependency.hasEffects()) { relevantDependencies.add(dependency); } else { for (const transitiveDependency of dependency.dependencies) { @@ -533,10 +529,15 @@ export default class Module { return null as any; } + hasEffects() { + return ( + this.moduleSideEffects && this.ast.included && this.ast.hasEffects(createHasEffectsContext()) + ); + } + include(): void { const context = createInclusionContext(); - this.hasSideEffects = this.ast.hasEffects(createHasEffectsContext()); - if (this.hasSideEffects || this.ast.shouldBeIncluded(context)) this.ast.include(context, false); + if (this.ast.shouldBeIncluded(context)) this.ast.include(context, false); } includeAllExports() { diff --git a/src/utils/executionOrder.ts b/src/utils/executionOrder.ts index a2f71c8c666..4ef4e7fde39 100644 --- a/src/utils/executionOrder.ts +++ b/src/utils/executionOrder.ts @@ -9,9 +9,8 @@ interface OrderedExecutionUnit { const compareExecIndex = (unitA: T, unitB: T) => unitA.execIndex > unitB.execIndex ? 1 : -1; -export function sortByExecutionOrder(units: T[]): T[] { +export function sortByExecutionOrder(units: OrderedExecutionUnit[]) { units.sort(compareExecIndex); - return units; } export function analyseModuleExecution(entryModules: Module[]) { diff --git a/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/amd/components/index.js b/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/amd/components/index.js index 04f8fad3dbe..6c3ef478f75 100644 --- a/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/amd/components/index.js +++ b/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/amd/components/index.js @@ -1,8 +1,8 @@ -define(['exports', './sub/index'], function (exports, index$1) { 'use strict'; +define(['exports', './sub/index'], function (exports, index) { 'use strict'; - const baz = { bar: index$1.default }; + const baz = { bar: index.default }; - exports.foo = index$1.foo; + exports.foo = index.foo; exports.baz = baz; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/amd/main.js b/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/amd/main.js index 38be52d66a0..42ad50c3101 100644 --- a/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/amd/main.js +++ b/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/amd/main.js @@ -1,9 +1,9 @@ -define(['exports', './components/sub/index', './components/index'], function (exports, index$1, index) { 'use strict'; +define(['exports', './components/sub/index', './components/index'], function (exports, index, index$1) { 'use strict'; - exports.foo = index$1.foo; - exports.baz = index.baz; + exports.foo = index.foo; + exports.baz = index$1.baz; Object.defineProperty(exports, '__esModule', { value: true }); diff --git a/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/cjs/components/index.js b/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/cjs/components/index.js index aac5937a8c4..46429b712ad 100644 --- a/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/cjs/components/index.js +++ b/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/cjs/components/index.js @@ -2,9 +2,9 @@ Object.defineProperty(exports, '__esModule', { value: true }); -var index$1 = require('./sub/index.js'); +var index = require('./sub/index.js'); -const baz = { bar: index$1.default }; +const baz = { bar: index.default }; -exports.foo = index$1.foo; +exports.foo = index.foo; exports.baz = baz; diff --git a/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/cjs/main.js b/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/cjs/main.js index 088354d51fd..bdb3ac56756 100644 --- a/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/cjs/main.js +++ b/test/chunking-form/samples/indirect-reexports-preserve-modules/_expected/cjs/main.js @@ -2,10 +2,10 @@ Object.defineProperty(exports, '__esModule', { value: true }); -var index$1 = require('./components/sub/index.js'); -var index = require('./components/index.js'); +var index = require('./components/sub/index.js'); +var index$1 = require('./components/index.js'); -exports.foo = index$1.foo; -exports.baz = index.baz; +exports.foo = index.foo; +exports.baz = index$1.baz; diff --git a/test/cli/samples/watch/bundle-error/main.js b/test/cli/samples/watch/bundle-error/main.js deleted file mode 100644 index a4012bff06c..00000000000 --- a/test/cli/samples/watch/bundle-error/main.js +++ /dev/null @@ -1 +0,0 @@ -export default 42; \ No newline at end of file diff --git a/test/form/samples/deprecated/prune-pure-unused-import-array/_config.js b/test/form/samples/deprecated/prune-pure-unused-import-array/_config.js new file mode 100644 index 00000000000..6dd4090563a --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-array/_config.js @@ -0,0 +1,12 @@ +module.exports = { + description: 'prunes pure unused external imports ([#1352])', + expectedWarnings: ['DEPRECATED_FEATURE'], + options: { + strictDeprecations: false, + external: ['external', 'other'], + treeshake: { pureExternalModules: ['external'] }, + output: { + globals: { other: 'other' } + } + } +}; diff --git a/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/amd.js b/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/amd.js new file mode 100644 index 00000000000..f02c330d436 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/amd.js @@ -0,0 +1,5 @@ +define(['other'], function (other) { 'use strict'; + + + +}); diff --git a/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/cjs.js b/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/cjs.js new file mode 100644 index 00000000000..d4c04157586 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/cjs.js @@ -0,0 +1,4 @@ +'use strict'; + +require('other'); + diff --git a/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/es.js b/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/es.js new file mode 100644 index 00000000000..4c6a1dd1289 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/es.js @@ -0,0 +1 @@ +import 'other'; diff --git a/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/iife.js b/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/iife.js new file mode 100644 index 00000000000..8435bdceb01 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/iife.js @@ -0,0 +1,6 @@ +(function (other) { + 'use strict'; + + + +}(other)); diff --git a/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/system.js b/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/system.js new file mode 100644 index 00000000000..44f1ac2d34d --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/system.js @@ -0,0 +1,11 @@ +System.register(['other'], function () { + 'use strict'; + return { + setters: [function () {}], + execute: function () { + + + + } + }; +}); diff --git a/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/umd.js b/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/umd.js new file mode 100644 index 00000000000..481b0e068ab --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-array/_expected/umd.js @@ -0,0 +1,9 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('other')) : + typeof define === 'function' && define.amd ? define(['other'], factory) : + (global = global || self, factory(global.other)); +}(this, (function (other) { 'use strict'; + + + +}))); diff --git a/test/form/samples/deprecated/prune-pure-unused-import-array/main.js b/test/form/samples/deprecated/prune-pure-unused-import-array/main.js new file mode 100644 index 00000000000..558f459bd2a --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-array/main.js @@ -0,0 +1,7 @@ +import { unused } from 'external'; +import { notused } from 'other'; + +function alsoUnused () { + unused(); + notused(); +} diff --git a/test/form/samples/deprecated/prune-pure-unused-import-function/_config.js b/test/form/samples/deprecated/prune-pure-unused-import-function/_config.js new file mode 100644 index 00000000000..ca46cdf2ddd --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-function/_config.js @@ -0,0 +1,12 @@ +module.exports = { + description: 'prunes pure unused external imports ([#1352])', + expectedWarnings: ['DEPRECATED_FEATURE', 'EMPTY_BUNDLE'], + options: { + strictDeprecations: false, + external: ['external', 'other'], + treeshake: { pureExternalModules: id => id === 'external' }, + output: { + globals: { other: 'other' } + } + } +}; diff --git a/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/amd.js b/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/amd.js new file mode 100644 index 00000000000..f02c330d436 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/amd.js @@ -0,0 +1,5 @@ +define(['other'], function (other) { 'use strict'; + + + +}); diff --git a/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/cjs.js b/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/cjs.js new file mode 100644 index 00000000000..d4c04157586 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/cjs.js @@ -0,0 +1,4 @@ +'use strict'; + +require('other'); + diff --git a/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/es.js b/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/es.js new file mode 100644 index 00000000000..4c6a1dd1289 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/es.js @@ -0,0 +1 @@ +import 'other'; diff --git a/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/iife.js b/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/iife.js new file mode 100644 index 00000000000..8435bdceb01 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/iife.js @@ -0,0 +1,6 @@ +(function (other) { + 'use strict'; + + + +}(other)); diff --git a/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/system.js b/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/system.js new file mode 100644 index 00000000000..44f1ac2d34d --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/system.js @@ -0,0 +1,11 @@ +System.register(['other'], function () { + 'use strict'; + return { + setters: [function () {}], + execute: function () { + + + + } + }; +}); diff --git a/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/umd.js b/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/umd.js new file mode 100644 index 00000000000..481b0e068ab --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-function/_expected/umd.js @@ -0,0 +1,9 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('other')) : + typeof define === 'function' && define.amd ? define(['other'], factory) : + (global = global || self, factory(global.other)); +}(this, (function (other) { 'use strict'; + + + +}))); diff --git a/test/form/samples/deprecated/prune-pure-unused-import-function/main.js b/test/form/samples/deprecated/prune-pure-unused-import-function/main.js new file mode 100644 index 00000000000..558f459bd2a --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import-function/main.js @@ -0,0 +1,7 @@ +import { unused } from 'external'; +import { notused } from 'other'; + +function alsoUnused () { + unused(); + notused(); +} diff --git a/test/form/samples/deprecated/prune-pure-unused-import/_config.js b/test/form/samples/deprecated/prune-pure-unused-import/_config.js new file mode 100644 index 00000000000..fe513326305 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import/_config.js @@ -0,0 +1,9 @@ +module.exports = { + description: 'prunes pure unused external imports ([#1352])', + expectedWarnings: ['DEPRECATED_FEATURE', 'EMPTY_BUNDLE'], + options: { + strictDeprecations: false, + external: ['external', 'other'], + treeshake: { pureExternalModules: true } + } +}; diff --git a/test/form/samples/deprecated/prune-pure-unused-import/_expected/amd.js b/test/form/samples/deprecated/prune-pure-unused-import/_expected/amd.js new file mode 100644 index 00000000000..f9f8229aa40 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import/_expected/amd.js @@ -0,0 +1,5 @@ +define(function () { 'use strict'; + + + +}); diff --git a/test/form/samples/deprecated/prune-pure-unused-import/_expected/cjs.js b/test/form/samples/deprecated/prune-pure-unused-import/_expected/cjs.js new file mode 100644 index 00000000000..eb109abbed0 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import/_expected/cjs.js @@ -0,0 +1,2 @@ +'use strict'; + diff --git a/test/form/samples/deprecated/prune-pure-unused-import/_expected/es.js b/test/form/samples/deprecated/prune-pure-unused-import/_expected/es.js new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import/_expected/es.js @@ -0,0 +1 @@ + diff --git a/test/form/samples/deprecated/prune-pure-unused-import/_expected/iife.js b/test/form/samples/deprecated/prune-pure-unused-import/_expected/iife.js new file mode 100644 index 00000000000..43ef5426880 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import/_expected/iife.js @@ -0,0 +1,6 @@ +(function () { + 'use strict'; + + + +}()); diff --git a/test/form/samples/deprecated/prune-pure-unused-import/_expected/system.js b/test/form/samples/deprecated/prune-pure-unused-import/_expected/system.js new file mode 100644 index 00000000000..a702f2b06ef --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import/_expected/system.js @@ -0,0 +1,10 @@ +System.register([], function () { + 'use strict'; + return { + execute: function () { + + + + } + }; +}); diff --git a/test/form/samples/deprecated/prune-pure-unused-import/_expected/umd.js b/test/form/samples/deprecated/prune-pure-unused-import/_expected/umd.js new file mode 100644 index 00000000000..8bf6301d469 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import/_expected/umd.js @@ -0,0 +1,8 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +}((function () { 'use strict'; + + + +}))); diff --git a/test/form/samples/deprecated/prune-pure-unused-import/main.js b/test/form/samples/deprecated/prune-pure-unused-import/main.js new file mode 100644 index 00000000000..ce3e0cb6298 --- /dev/null +++ b/test/form/samples/deprecated/prune-pure-unused-import/main.js @@ -0,0 +1,5 @@ +import { unused } from 'external'; + +function alsoUnused () { + unused(); +} diff --git a/test/form/samples/prune-pure-unused-import-array/_config.js b/test/form/samples/prune-pure-unused-import-array/_config.js index 6dd4090563a..4d9035fa705 100644 --- a/test/form/samples/prune-pure-unused-import-array/_config.js +++ b/test/form/samples/prune-pure-unused-import-array/_config.js @@ -1,10 +1,8 @@ module.exports = { description: 'prunes pure unused external imports ([#1352])', - expectedWarnings: ['DEPRECATED_FEATURE'], options: { - strictDeprecations: false, external: ['external', 'other'], - treeshake: { pureExternalModules: ['external'] }, + treeshake: { moduleSideEffects: ['other'] }, output: { globals: { other: 'other' } } diff --git a/test/form/samples/prune-pure-unused-import-array/_expected/amd.js b/test/form/samples/prune-pure-unused-import-array/_expected/amd.js index f9f8229aa40..f02c330d436 100644 --- a/test/form/samples/prune-pure-unused-import-array/_expected/amd.js +++ b/test/form/samples/prune-pure-unused-import-array/_expected/amd.js @@ -1,4 +1,4 @@ -define(function () { 'use strict'; +define(['other'], function (other) { 'use strict'; diff --git a/test/form/samples/prune-pure-unused-import-array/_expected/cjs.js b/test/form/samples/prune-pure-unused-import-array/_expected/cjs.js index eb109abbed0..d4c04157586 100644 --- a/test/form/samples/prune-pure-unused-import-array/_expected/cjs.js +++ b/test/form/samples/prune-pure-unused-import-array/_expected/cjs.js @@ -1,2 +1,4 @@ 'use strict'; +require('other'); + diff --git a/test/form/samples/prune-pure-unused-import-array/_expected/es.js b/test/form/samples/prune-pure-unused-import-array/_expected/es.js index 8b137891791..4c6a1dd1289 100644 --- a/test/form/samples/prune-pure-unused-import-array/_expected/es.js +++ b/test/form/samples/prune-pure-unused-import-array/_expected/es.js @@ -1 +1 @@ - +import 'other'; diff --git a/test/form/samples/prune-pure-unused-import-array/_expected/iife.js b/test/form/samples/prune-pure-unused-import-array/_expected/iife.js index 43ef5426880..8435bdceb01 100644 --- a/test/form/samples/prune-pure-unused-import-array/_expected/iife.js +++ b/test/form/samples/prune-pure-unused-import-array/_expected/iife.js @@ -1,6 +1,6 @@ -(function () { +(function (other) { 'use strict'; -}()); +}(other)); diff --git a/test/form/samples/prune-pure-unused-import-array/_expected/system.js b/test/form/samples/prune-pure-unused-import-array/_expected/system.js index a702f2b06ef..44f1ac2d34d 100644 --- a/test/form/samples/prune-pure-unused-import-array/_expected/system.js +++ b/test/form/samples/prune-pure-unused-import-array/_expected/system.js @@ -1,6 +1,7 @@ -System.register([], function () { +System.register(['other'], function () { 'use strict'; return { + setters: [function () {}], execute: function () { diff --git a/test/form/samples/prune-pure-unused-import-array/_expected/umd.js b/test/form/samples/prune-pure-unused-import-array/_expected/umd.js index 8bf6301d469..481b0e068ab 100644 --- a/test/form/samples/prune-pure-unused-import-array/_expected/umd.js +++ b/test/form/samples/prune-pure-unused-import-array/_expected/umd.js @@ -1,7 +1,8 @@ -(function (factory) { - typeof define === 'function' && define.amd ? define(factory) : - factory(); -}((function () { 'use strict'; +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('other')) : + typeof define === 'function' && define.amd ? define(['other'], factory) : + (global = global || self, factory(global.other)); +}(this, (function (other) { 'use strict'; diff --git a/test/form/samples/prune-pure-unused-import-function/_config.js b/test/form/samples/prune-pure-unused-import-function/_config.js index ca46cdf2ddd..c682d7c9920 100644 --- a/test/form/samples/prune-pure-unused-import-function/_config.js +++ b/test/form/samples/prune-pure-unused-import-function/_config.js @@ -1,10 +1,9 @@ module.exports = { description: 'prunes pure unused external imports ([#1352])', - expectedWarnings: ['DEPRECATED_FEATURE', 'EMPTY_BUNDLE'], + expectedWarnings: ['EMPTY_BUNDLE'], options: { - strictDeprecations: false, external: ['external', 'other'], - treeshake: { pureExternalModules: id => id === 'external' }, + treeshake: { moduleSideEffects: id => id !== 'external' }, output: { globals: { other: 'other' } } diff --git a/test/form/samples/prune-pure-unused-import-function/_expected/amd.js b/test/form/samples/prune-pure-unused-import-function/_expected/amd.js index f9f8229aa40..f02c330d436 100644 --- a/test/form/samples/prune-pure-unused-import-function/_expected/amd.js +++ b/test/form/samples/prune-pure-unused-import-function/_expected/amd.js @@ -1,4 +1,4 @@ -define(function () { 'use strict'; +define(['other'], function (other) { 'use strict'; diff --git a/test/form/samples/prune-pure-unused-import-function/_expected/cjs.js b/test/form/samples/prune-pure-unused-import-function/_expected/cjs.js index eb109abbed0..d4c04157586 100644 --- a/test/form/samples/prune-pure-unused-import-function/_expected/cjs.js +++ b/test/form/samples/prune-pure-unused-import-function/_expected/cjs.js @@ -1,2 +1,4 @@ 'use strict'; +require('other'); + diff --git a/test/form/samples/prune-pure-unused-import-function/_expected/es.js b/test/form/samples/prune-pure-unused-import-function/_expected/es.js index 8b137891791..4c6a1dd1289 100644 --- a/test/form/samples/prune-pure-unused-import-function/_expected/es.js +++ b/test/form/samples/prune-pure-unused-import-function/_expected/es.js @@ -1 +1 @@ - +import 'other'; diff --git a/test/form/samples/prune-pure-unused-import-function/_expected/iife.js b/test/form/samples/prune-pure-unused-import-function/_expected/iife.js index 43ef5426880..8435bdceb01 100644 --- a/test/form/samples/prune-pure-unused-import-function/_expected/iife.js +++ b/test/form/samples/prune-pure-unused-import-function/_expected/iife.js @@ -1,6 +1,6 @@ -(function () { +(function (other) { 'use strict'; -}()); +}(other)); diff --git a/test/form/samples/prune-pure-unused-import-function/_expected/system.js b/test/form/samples/prune-pure-unused-import-function/_expected/system.js index a702f2b06ef..44f1ac2d34d 100644 --- a/test/form/samples/prune-pure-unused-import-function/_expected/system.js +++ b/test/form/samples/prune-pure-unused-import-function/_expected/system.js @@ -1,6 +1,7 @@ -System.register([], function () { +System.register(['other'], function () { 'use strict'; return { + setters: [function () {}], execute: function () { diff --git a/test/form/samples/prune-pure-unused-import-function/_expected/umd.js b/test/form/samples/prune-pure-unused-import-function/_expected/umd.js index 8bf6301d469..481b0e068ab 100644 --- a/test/form/samples/prune-pure-unused-import-function/_expected/umd.js +++ b/test/form/samples/prune-pure-unused-import-function/_expected/umd.js @@ -1,7 +1,8 @@ -(function (factory) { - typeof define === 'function' && define.amd ? define(factory) : - factory(); -}((function () { 'use strict'; +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('other')) : + typeof define === 'function' && define.amd ? define(['other'], factory) : + (global = global || self, factory(global.other)); +}(this, (function (other) { 'use strict'; diff --git a/test/form/samples/prune-pure-unused-import/_config.js b/test/form/samples/prune-pure-unused-import/_config.js index fe513326305..a3236e50639 100644 --- a/test/form/samples/prune-pure-unused-import/_config.js +++ b/test/form/samples/prune-pure-unused-import/_config.js @@ -1,9 +1,8 @@ module.exports = { description: 'prunes pure unused external imports ([#1352])', - expectedWarnings: ['DEPRECATED_FEATURE', 'EMPTY_BUNDLE'], + expectedWarnings: ['EMPTY_BUNDLE'], options: { - strictDeprecations: false, external: ['external', 'other'], - treeshake: { pureExternalModules: true } + treeshake: { moduleSideEffects: 'no-external' } } }; diff --git a/test/function/samples/facade-reexports/_config.js b/test/function/samples/facade-reexports/_config.js new file mode 100644 index 00000000000..e96eb2c2b73 --- /dev/null +++ b/test/function/samples/facade-reexports/_config.js @@ -0,0 +1,14 @@ +const assert = require('assert'); + +module.exports = { + description: + 'handles reexports when creating a facade chunk and transitive dependencies are not hoisted', + options: { + input: ['main', 'other'], + output: { hoistTransitiveImports: false } + }, + async exports(exports) { + assert.strictEqual(exports.other, 'other'); + assert.strictEqual(await exports.dynamic(), 'liblib'); + } +}; diff --git a/test/function/samples/facade-reexports/dynamic.js b/test/function/samples/facade-reexports/dynamic.js new file mode 100644 index 00000000000..02aaca499c0 --- /dev/null +++ b/test/function/samples/facade-reexports/dynamic.js @@ -0,0 +1,2 @@ +import { lib } from './lib'; +export const dynamic = lib; \ No newline at end of file diff --git a/test/function/samples/facade-reexports/lib.js b/test/function/samples/facade-reexports/lib.js new file mode 100644 index 00000000000..da7d8c96654 --- /dev/null +++ b/test/function/samples/facade-reexports/lib.js @@ -0,0 +1 @@ +export const lib = 'lib'; diff --git a/test/function/samples/facade-reexports/main.js b/test/function/samples/facade-reexports/main.js new file mode 100644 index 00000000000..2da811a9f54 --- /dev/null +++ b/test/function/samples/facade-reexports/main.js @@ -0,0 +1,3 @@ +import { lib } from './lib'; +export const dynamic = () => import('./dynamic').then(({ dynamic }) => dynamic + lib); +export { other } from './other'; diff --git a/test/function/samples/facade-reexports/other.js b/test/function/samples/facade-reexports/other.js new file mode 100644 index 00000000000..46e8ba3a3e2 --- /dev/null +++ b/test/function/samples/facade-reexports/other.js @@ -0,0 +1 @@ +export const other = 'other' \ No newline at end of file