From ab1b916f92adcfaf484105f43f952e24c691de72 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Mon, 17 Oct 2022 16:38:42 +0200 Subject: [PATCH] Do not rewrite new.target --- src/ast/nodes/MetaProperty.ts | 12 +++++++++--- .../new-target-meta-property/_expected/amd.js | 11 +++++++++++ .../new-target-meta-property/_expected/cjs.js | 9 +++++++++ .../{_expected.js => _expected/es.js} | 0 .../new-target-meta-property/_expected/iife.js | 12 ++++++++++++ .../new-target-meta-property/_expected/system.js | 16 ++++++++++++++++ .../new-target-meta-property/_expected/umd.js | 14 ++++++++++++++ test/function/samples/new-target-meta/_config.js | 3 +++ test/function/samples/new-target-meta/main.js | 5 +++++ 9 files changed, 79 insertions(+), 3 deletions(-) create mode 100644 test/form/samples/new-target-meta-property/_expected/amd.js create mode 100644 test/form/samples/new-target-meta-property/_expected/cjs.js rename test/form/samples/new-target-meta-property/{_expected.js => _expected/es.js} (100%) create mode 100644 test/form/samples/new-target-meta-property/_expected/iife.js create mode 100644 test/form/samples/new-target-meta-property/_expected/system.js create mode 100644 test/form/samples/new-target-meta-property/_expected/umd.js create mode 100644 test/function/samples/new-target-meta/_config.js create mode 100644 test/function/samples/new-target-meta/main.js diff --git a/src/ast/nodes/MetaProperty.ts b/src/ast/nodes/MetaProperty.ts index 82fb5b20f1e..e71d1d8cd59 100644 --- a/src/ast/nodes/MetaProperty.ts +++ b/src/ast/nodes/MetaProperty.ts @@ -14,6 +14,7 @@ import type * as NodeType from './NodeType'; import { NodeBase } from './shared/Node'; const FILE_PREFIX = 'ROLLUP_FILE_URL_'; +const IMPORT = 'import'; export default class MetaProperty extends NodeBase { declare meta: Identifier; @@ -25,8 +26,11 @@ export default class MetaProperty extends NodeBase { private referenceId: string | null = null; getReferencedFileName(outputPluginDriver: PluginDriver): string | null { - const { metaProperty } = this; - if (metaProperty?.startsWith(FILE_PREFIX)) { + const { + meta: { name }, + metaProperty + } = this; + if (name === IMPORT && metaProperty?.startsWith(FILE_PREFIX)) { return outputPluginDriver.getFileName(metaProperty.slice(FILE_PREFIX.length)); } return null; @@ -43,7 +47,7 @@ export default class MetaProperty extends NodeBase { include(): void { if (!this.included) { this.included = true; - if (this.meta.name === 'import') { + if (this.meta.name === IMPORT) { this.context.addImportMeta(this); const parent = this.parent; const metaProperty = (this.metaProperty = @@ -62,6 +66,7 @@ export default class MetaProperty extends NodeBase { context: { module: { id: moduleId } }, + meta: { name }, metaProperty, parent, preliminaryChunkId, @@ -69,6 +74,7 @@ export default class MetaProperty extends NodeBase { start, end } = this; + if (name !== IMPORT) return; const chunkId = preliminaryChunkId!; if (referenceId) { diff --git a/test/form/samples/new-target-meta-property/_expected/amd.js b/test/form/samples/new-target-meta-property/_expected/amd.js new file mode 100644 index 00000000000..dd4f32a0c00 --- /dev/null +++ b/test/form/samples/new-target-meta-property/_expected/amd.js @@ -0,0 +1,11 @@ +define((function () { 'use strict'; + + class Foo { + constructor() { + console.log(new.target.name); + } + } + + new Foo(); + +})); diff --git a/test/form/samples/new-target-meta-property/_expected/cjs.js b/test/form/samples/new-target-meta-property/_expected/cjs.js new file mode 100644 index 00000000000..ab9ae691acd --- /dev/null +++ b/test/form/samples/new-target-meta-property/_expected/cjs.js @@ -0,0 +1,9 @@ +'use strict'; + +class Foo { + constructor() { + console.log(new.target.name); + } +} + +new Foo(); diff --git a/test/form/samples/new-target-meta-property/_expected.js b/test/form/samples/new-target-meta-property/_expected/es.js similarity index 100% rename from test/form/samples/new-target-meta-property/_expected.js rename to test/form/samples/new-target-meta-property/_expected/es.js diff --git a/test/form/samples/new-target-meta-property/_expected/iife.js b/test/form/samples/new-target-meta-property/_expected/iife.js new file mode 100644 index 00000000000..0c3d26e367c --- /dev/null +++ b/test/form/samples/new-target-meta-property/_expected/iife.js @@ -0,0 +1,12 @@ +(function () { + 'use strict'; + + class Foo { + constructor() { + console.log(new.target.name); + } + } + + new Foo(); + +})(); diff --git a/test/form/samples/new-target-meta-property/_expected/system.js b/test/form/samples/new-target-meta-property/_expected/system.js new file mode 100644 index 00000000000..7cfbd402995 --- /dev/null +++ b/test/form/samples/new-target-meta-property/_expected/system.js @@ -0,0 +1,16 @@ +System.register([], (function () { + 'use strict'; + return { + execute: (function () { + + class Foo { + constructor() { + console.log(new.target.name); + } + } + + new Foo(); + + }) + }; +})); diff --git a/test/form/samples/new-target-meta-property/_expected/umd.js b/test/form/samples/new-target-meta-property/_expected/umd.js new file mode 100644 index 00000000000..40340fa863a --- /dev/null +++ b/test/form/samples/new-target-meta-property/_expected/umd.js @@ -0,0 +1,14 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +})((function () { 'use strict'; + + class Foo { + constructor() { + console.log(new.target.name); + } + } + + new Foo(); + +})); diff --git a/test/function/samples/new-target-meta/_config.js b/test/function/samples/new-target-meta/_config.js new file mode 100644 index 00000000000..3f2fb6ea8fb --- /dev/null +++ b/test/function/samples/new-target-meta/_config.js @@ -0,0 +1,3 @@ +module.exports = { + description: 'does not change new.target usages' +}; diff --git a/test/function/samples/new-target-meta/main.js b/test/function/samples/new-target-meta/main.js new file mode 100644 index 00000000000..1ba94c8d5c9 --- /dev/null +++ b/test/function/samples/new-target-meta/main.js @@ -0,0 +1,5 @@ +function Foo() { + assert.strictEqual(new.target, Foo); +} + +new Foo();