From e06d6ff30b5cd6351476b857e0ff087a8667cac5 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Thu, 18 Mar 2021 05:55:26 +0100 Subject: [PATCH] Do not count accessing members of an external namespace as side-effects. --- src/ast/variables/ExternalVariable.ts | 5 +++++ .../samples/treeshake-namespace-access/_config.js | 4 ++++ .../treeshake-namespace-access/_expected/amd.js | 5 +++++ .../treeshake-namespace-access/_expected/cjs.js | 5 +++++ .../treeshake-namespace-access/_expected/es.js | 3 +++ .../treeshake-namespace-access/_expected/iife.js | 6 ++++++ .../treeshake-namespace-access/_expected/system.js | 11 +++++++++++ .../treeshake-namespace-access/_expected/umd.js | 8 ++++++++ test/form/samples/treeshake-namespace-access/main.js | 4 ++++ 9 files changed, 51 insertions(+) create mode 100644 test/form/samples/treeshake-namespace-access/_config.js create mode 100644 test/form/samples/treeshake-namespace-access/_expected/amd.js create mode 100644 test/form/samples/treeshake-namespace-access/_expected/cjs.js create mode 100644 test/form/samples/treeshake-namespace-access/_expected/es.js create mode 100644 test/form/samples/treeshake-namespace-access/_expected/iife.js create mode 100644 test/form/samples/treeshake-namespace-access/_expected/system.js create mode 100644 test/form/samples/treeshake-namespace-access/_expected/umd.js create mode 100644 test/form/samples/treeshake-namespace-access/main.js diff --git a/src/ast/variables/ExternalVariable.ts b/src/ast/variables/ExternalVariable.ts index 9ffe9679cb0..b0f2ce6a416 100644 --- a/src/ast/variables/ExternalVariable.ts +++ b/src/ast/variables/ExternalVariable.ts @@ -1,5 +1,6 @@ import ExternalModule from '../../ExternalModule'; import Identifier from '../nodes/Identifier'; +import { ObjectPath } from '../utils/PathTracker'; import Variable from './Variable'; export default class ExternalVariable extends Variable { @@ -21,6 +22,10 @@ export default class ExternalVariable extends Variable { } } + hasEffectsWhenAccessedAtPath(path: ObjectPath) { + return path.length > (this.isNamespace ? 1 : 0); + } + include() { if (!this.included) { this.included = true; diff --git a/test/form/samples/treeshake-namespace-access/_config.js b/test/form/samples/treeshake-namespace-access/_config.js new file mode 100644 index 00000000000..8f398f593b2 --- /dev/null +++ b/test/form/samples/treeshake-namespace-access/_config.js @@ -0,0 +1,4 @@ +module.exports = { + description: 'does not count namespace property access as side-effect', + options: { external: 'external' } +}; diff --git a/test/form/samples/treeshake-namespace-access/_expected/amd.js b/test/form/samples/treeshake-namespace-access/_expected/amd.js new file mode 100644 index 00000000000..0bae1e8d57f --- /dev/null +++ b/test/form/samples/treeshake-namespace-access/_expected/amd.js @@ -0,0 +1,5 @@ +define(['external'], function (external) { 'use strict'; + + console.log('main'); + +}); diff --git a/test/form/samples/treeshake-namespace-access/_expected/cjs.js b/test/form/samples/treeshake-namespace-access/_expected/cjs.js new file mode 100644 index 00000000000..d1e28fe4f99 --- /dev/null +++ b/test/form/samples/treeshake-namespace-access/_expected/cjs.js @@ -0,0 +1,5 @@ +'use strict'; + +require('external'); + +console.log('main'); diff --git a/test/form/samples/treeshake-namespace-access/_expected/es.js b/test/form/samples/treeshake-namespace-access/_expected/es.js new file mode 100644 index 00000000000..cedb294ffee --- /dev/null +++ b/test/form/samples/treeshake-namespace-access/_expected/es.js @@ -0,0 +1,3 @@ +import 'external'; + +console.log('main'); diff --git a/test/form/samples/treeshake-namespace-access/_expected/iife.js b/test/form/samples/treeshake-namespace-access/_expected/iife.js new file mode 100644 index 00000000000..d283cbce8ba --- /dev/null +++ b/test/form/samples/treeshake-namespace-access/_expected/iife.js @@ -0,0 +1,6 @@ +(function () { + 'use strict'; + + console.log('main'); + +}()); diff --git a/test/form/samples/treeshake-namespace-access/_expected/system.js b/test/form/samples/treeshake-namespace-access/_expected/system.js new file mode 100644 index 00000000000..d927c51ce7d --- /dev/null +++ b/test/form/samples/treeshake-namespace-access/_expected/system.js @@ -0,0 +1,11 @@ +System.register(['external'], function () { + 'use strict'; + return { + setters: [function () {}], + execute: function () { + + console.log('main'); + + } + }; +}); diff --git a/test/form/samples/treeshake-namespace-access/_expected/umd.js b/test/form/samples/treeshake-namespace-access/_expected/umd.js new file mode 100644 index 00000000000..a0358332ac1 --- /dev/null +++ b/test/form/samples/treeshake-namespace-access/_expected/umd.js @@ -0,0 +1,8 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(['external'], factory) : + factory(); +}((function () { 'use strict'; + + console.log('main'); + +}))); diff --git a/test/form/samples/treeshake-namespace-access/main.js b/test/form/samples/treeshake-namespace-access/main.js new file mode 100644 index 00000000000..59de52af6c6 --- /dev/null +++ b/test/form/samples/treeshake-namespace-access/main.js @@ -0,0 +1,4 @@ +import * as external from 'external'; + +const unused = external.foo; +console.log('main');