From 89a302469b652ff0d20cad4a1033c274255c846d Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Wed, 29 May 2019 08:41:11 +0200 Subject: [PATCH] Use different globals for file accesses --- src/ast/nodes/MetaProperty.ts | 31 +++++++++++++------ src/utils/defaultPlugin.ts | 11 +++++-- .../_config.js | 23 ++++++++++++++ .../_expected/amd.js | 5 +++ .../_expected/assets/logo-25253976.svg | 3 ++ .../_expected/cjs.js | 3 ++ .../_expected/es.js | 1 + .../_expected/iife.js | 6 ++++ .../_expected/system.js | 10 ++++++ .../_expected/umd.js | 8 +++++ .../logo.svg | 3 ++ .../asset-emission-tree-shaken-access/main.js | 6 ++++ .../treeshake-import-meta-props/_config.js | 3 ++ .../_expected/amd.js | 5 +++ .../_expected/cjs.js | 3 ++ .../_expected/es.js | 1 + .../_expected/iife.js | 6 ++++ .../_expected/system.js | 10 ++++++ .../_expected/umd.js | 8 +++++ .../treeshake-import-meta-props/main.js | 4 +++ 20 files changed, 138 insertions(+), 12 deletions(-) create mode 100644 test/form/samples/asset-emission-tree-shaken-access/_config.js create mode 100644 test/form/samples/asset-emission-tree-shaken-access/_expected/amd.js create mode 100644 test/form/samples/asset-emission-tree-shaken-access/_expected/assets/logo-25253976.svg create mode 100644 test/form/samples/asset-emission-tree-shaken-access/_expected/cjs.js create mode 100644 test/form/samples/asset-emission-tree-shaken-access/_expected/es.js create mode 100644 test/form/samples/asset-emission-tree-shaken-access/_expected/iife.js create mode 100644 test/form/samples/asset-emission-tree-shaken-access/_expected/system.js create mode 100644 test/form/samples/asset-emission-tree-shaken-access/_expected/umd.js create mode 100644 test/form/samples/asset-emission-tree-shaken-access/logo.svg create mode 100644 test/form/samples/asset-emission-tree-shaken-access/main.js create mode 100644 test/form/samples/treeshake-import-meta-props/_config.js create mode 100644 test/form/samples/treeshake-import-meta-props/_expected/amd.js create mode 100644 test/form/samples/treeshake-import-meta-props/_expected/cjs.js create mode 100644 test/form/samples/treeshake-import-meta-props/_expected/es.js create mode 100644 test/form/samples/treeshake-import-meta-props/_expected/iife.js create mode 100644 test/form/samples/treeshake-import-meta-props/_expected/system.js create mode 100644 test/form/samples/treeshake-import-meta-props/_expected/umd.js create mode 100644 test/form/samples/treeshake-import-meta-props/main.js diff --git a/src/ast/nodes/MetaProperty.ts b/src/ast/nodes/MetaProperty.ts index 10fd9735510..a3833e11f28 100644 --- a/src/ast/nodes/MetaProperty.ts +++ b/src/ast/nodes/MetaProperty.ts @@ -1,5 +1,5 @@ import MagicString from 'magic-string'; -import { accessedMetaPropertyGlobals } from '../../utils/defaultPlugin'; +import { accessedFileUrlGlobals, accessedMetaUrlGlobals } from '../../utils/defaultPlugin'; import { dirname, normalize, relative } from '../../utils/path'; import { PluginDriver } from '../../utils/pluginDriver'; import { ObjectPathKey } from '../values'; @@ -16,16 +16,30 @@ export default class MetaProperty extends NodeBase { property: Identifier; type: NodeType.tMetaProperty; - bind() { - super.bind(); - // TODO Lukas only when included, only when needed - this.scope.addAccessedGlobalsByFormat(accessedMetaPropertyGlobals); - } + private metaProperty?: string | null; hasEffectsWhenAccessedAtPath(path: ObjectPathKey[]): boolean { return path.length > 1; } + include() { + if (!this.included) { + this.included = true; + const parent = this.parent; + const metaProperty = (this.metaProperty = + parent instanceof MemberExpression && typeof parent.propertyKey === 'string' + ? parent.propertyKey + : null); + if (metaProperty) { + if (metaProperty === 'url') { + this.scope.addAccessedGlobalsByFormat(accessedMetaUrlGlobals); + } else if (metaProperty.startsWith(ASSET_PREFIX) || metaProperty.startsWith(CHUNK_PREFIX)) { + this.scope.addAccessedGlobalsByFormat(accessedFileUrlGlobals); + } + } + } + } + initialise() { if (this.meta.name === 'import') { this.context.addImportMeta(this); @@ -41,10 +55,7 @@ export default class MetaProperty extends NodeBase { ): void { if (!this.included) return; const parent = this.parent; - const importMetaProperty = - parent instanceof MemberExpression && typeof parent.propertyKey === 'string' - ? parent.propertyKey - : null; + const importMetaProperty = this.metaProperty as string | null; if ( importMetaProperty && diff --git a/src/utils/defaultPlugin.ts b/src/utils/defaultPlugin.ts index c6379addcc3..8acd9298b96 100644 --- a/src/utils/defaultPlugin.ts +++ b/src/utils/defaultPlugin.ts @@ -130,11 +130,18 @@ const relativeUrlMechanisms: Record string> = )} : ${getRelativeUrlFromDocument(relativePath)})` }; -// TODO Lukas also for resolved file URLs -export const accessedMetaPropertyGlobals = { +export const accessedMetaUrlGlobals = { amd: ['document', 'module', 'URL'], cjs: ['document', 'require', 'URL'], iife: ['document', 'URL'], system: ['module'], umd: ['document', 'require', 'URL'] }; + +export const accessedFileUrlGlobals = { + amd: ['document', 'module', 'URL'], + cjs: ['document', 'require', 'URL'], + iife: ['document', 'URL'], + system: ['module', 'URL'], + umd: ['document', 'require', 'URL'] +}; diff --git a/test/form/samples/asset-emission-tree-shaken-access/_config.js b/test/form/samples/asset-emission-tree-shaken-access/_config.js new file mode 100644 index 00000000000..cb600e60ce1 --- /dev/null +++ b/test/form/samples/asset-emission-tree-shaken-access/_config.js @@ -0,0 +1,23 @@ +const fs = require('fs'); +const path = require('path'); + +module.exports = { + description: 'does not include format globals when tree-shaking an asset access', + options: { + plugins: { + resolveId(id, importee) { + if (id.endsWith('.svg')) { + return path.resolve(path.dirname(importee), id); + } + }, + load(id) { + if (id.endsWith('.svg')) { + return `export default import.meta.ROLLUP_ASSET_URL_${this.emitAsset( + path.basename(id), + fs.readFileSync(id) + )};`; + } + } + } + } +}; diff --git a/test/form/samples/asset-emission-tree-shaken-access/_expected/amd.js b/test/form/samples/asset-emission-tree-shaken-access/_expected/amd.js new file mode 100644 index 00000000000..126aa22ee83 --- /dev/null +++ b/test/form/samples/asset-emission-tree-shaken-access/_expected/amd.js @@ -0,0 +1,5 @@ +define(function () { 'use strict'; + + console.log('main'); + +}); diff --git a/test/form/samples/asset-emission-tree-shaken-access/_expected/assets/logo-25253976.svg b/test/form/samples/asset-emission-tree-shaken-access/_expected/assets/logo-25253976.svg new file mode 100644 index 00000000000..20bb5dfe639 --- /dev/null +++ b/test/form/samples/asset-emission-tree-shaken-access/_expected/assets/logo-25253976.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/test/form/samples/asset-emission-tree-shaken-access/_expected/cjs.js b/test/form/samples/asset-emission-tree-shaken-access/_expected/cjs.js new file mode 100644 index 00000000000..d0ed06d8c90 --- /dev/null +++ b/test/form/samples/asset-emission-tree-shaken-access/_expected/cjs.js @@ -0,0 +1,3 @@ +'use strict'; + +console.log('main'); diff --git a/test/form/samples/asset-emission-tree-shaken-access/_expected/es.js b/test/form/samples/asset-emission-tree-shaken-access/_expected/es.js new file mode 100644 index 00000000000..c0b933d7b56 --- /dev/null +++ b/test/form/samples/asset-emission-tree-shaken-access/_expected/es.js @@ -0,0 +1 @@ +console.log('main'); diff --git a/test/form/samples/asset-emission-tree-shaken-access/_expected/iife.js b/test/form/samples/asset-emission-tree-shaken-access/_expected/iife.js new file mode 100644 index 00000000000..d283cbce8ba --- /dev/null +++ b/test/form/samples/asset-emission-tree-shaken-access/_expected/iife.js @@ -0,0 +1,6 @@ +(function () { + 'use strict'; + + console.log('main'); + +}()); diff --git a/test/form/samples/asset-emission-tree-shaken-access/_expected/system.js b/test/form/samples/asset-emission-tree-shaken-access/_expected/system.js new file mode 100644 index 00000000000..c83499bc2d4 --- /dev/null +++ b/test/form/samples/asset-emission-tree-shaken-access/_expected/system.js @@ -0,0 +1,10 @@ +System.register([], function () { + 'use strict'; + return { + execute: function () { + + console.log('main'); + + } + }; +}); diff --git a/test/form/samples/asset-emission-tree-shaken-access/_expected/umd.js b/test/form/samples/asset-emission-tree-shaken-access/_expected/umd.js new file mode 100644 index 00000000000..4768f1d9737 --- /dev/null +++ b/test/form/samples/asset-emission-tree-shaken-access/_expected/umd.js @@ -0,0 +1,8 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +}(function () { 'use strict'; + + console.log('main'); + +})); diff --git a/test/form/samples/asset-emission-tree-shaken-access/logo.svg b/test/form/samples/asset-emission-tree-shaken-access/logo.svg new file mode 100644 index 00000000000..20bb5dfe639 --- /dev/null +++ b/test/form/samples/asset-emission-tree-shaken-access/logo.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/test/form/samples/asset-emission-tree-shaken-access/main.js b/test/form/samples/asset-emission-tree-shaken-access/main.js new file mode 100644 index 00000000000..6dc3ecd4e7b --- /dev/null +++ b/test/form/samples/asset-emission-tree-shaken-access/main.js @@ -0,0 +1,6 @@ +import logo from './logo.svg'; + +if (false) { + console.log(logo); +} +console.log('main'); diff --git a/test/form/samples/treeshake-import-meta-props/_config.js b/test/form/samples/treeshake-import-meta-props/_config.js new file mode 100644 index 00000000000..d73457be9b1 --- /dev/null +++ b/test/form/samples/treeshake-import-meta-props/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'also does not include format globals when tree-shaking import meta' +}; diff --git a/test/form/samples/treeshake-import-meta-props/_expected/amd.js b/test/form/samples/treeshake-import-meta-props/_expected/amd.js new file mode 100644 index 00000000000..126aa22ee83 --- /dev/null +++ b/test/form/samples/treeshake-import-meta-props/_expected/amd.js @@ -0,0 +1,5 @@ +define(function () { 'use strict'; + + console.log('main'); + +}); diff --git a/test/form/samples/treeshake-import-meta-props/_expected/cjs.js b/test/form/samples/treeshake-import-meta-props/_expected/cjs.js new file mode 100644 index 00000000000..d0ed06d8c90 --- /dev/null +++ b/test/form/samples/treeshake-import-meta-props/_expected/cjs.js @@ -0,0 +1,3 @@ +'use strict'; + +console.log('main'); diff --git a/test/form/samples/treeshake-import-meta-props/_expected/es.js b/test/form/samples/treeshake-import-meta-props/_expected/es.js new file mode 100644 index 00000000000..c0b933d7b56 --- /dev/null +++ b/test/form/samples/treeshake-import-meta-props/_expected/es.js @@ -0,0 +1 @@ +console.log('main'); diff --git a/test/form/samples/treeshake-import-meta-props/_expected/iife.js b/test/form/samples/treeshake-import-meta-props/_expected/iife.js new file mode 100644 index 00000000000..d283cbce8ba --- /dev/null +++ b/test/form/samples/treeshake-import-meta-props/_expected/iife.js @@ -0,0 +1,6 @@ +(function () { + 'use strict'; + + console.log('main'); + +}()); diff --git a/test/form/samples/treeshake-import-meta-props/_expected/system.js b/test/form/samples/treeshake-import-meta-props/_expected/system.js new file mode 100644 index 00000000000..c83499bc2d4 --- /dev/null +++ b/test/form/samples/treeshake-import-meta-props/_expected/system.js @@ -0,0 +1,10 @@ +System.register([], function () { + 'use strict'; + return { + execute: function () { + + console.log('main'); + + } + }; +}); diff --git a/test/form/samples/treeshake-import-meta-props/_expected/umd.js b/test/form/samples/treeshake-import-meta-props/_expected/umd.js new file mode 100644 index 00000000000..4768f1d9737 --- /dev/null +++ b/test/form/samples/treeshake-import-meta-props/_expected/umd.js @@ -0,0 +1,8 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +}(function () { 'use strict'; + + console.log('main'); + +})); diff --git a/test/form/samples/treeshake-import-meta-props/main.js b/test/form/samples/treeshake-import-meta-props/main.js new file mode 100644 index 00000000000..92eac685996 --- /dev/null +++ b/test/form/samples/treeshake-import-meta-props/main.js @@ -0,0 +1,4 @@ +const removed1 = import.meta; +const removed2 = import.meta.url; +const removed3 = import.meta.unknown; +console.log('main');