From c9dc363f70c76f44697d8cd210c832d483485451 Mon Sep 17 00:00:00 2001 From: Lukas Taegert-Atkinson Date: Mon, 3 Oct 2022 17:14:23 +0200 Subject: [PATCH] Keep assertions on fully dynamic imports --- src/Chunk.ts | 4 +- src/ast/nodes/ImportExpression.ts | 37 +++++++++---------- .../keep-dynamic-assertions/_config.js | 6 +++ .../keep-dynamic-assertions/_expected/amd.js | 22 +++++++++++ .../keep-dynamic-assertions/_expected/cjs.js | 20 ++++++++++ .../keep-dynamic-assertions/_expected/es.js | 1 + .../keep-dynamic-assertions/_expected/iife.js | 6 +++ .../_expected/system.js | 10 +++++ .../keep-dynamic-assertions/_expected/umd.js | 8 ++++ .../keep-dynamic-assertions/main.js | 1 + 10 files changed, 94 insertions(+), 21 deletions(-) create mode 100644 test/form/samples/import-assertions/keep-dynamic-assertions/_config.js create mode 100644 test/form/samples/import-assertions/keep-dynamic-assertions/_expected/amd.js create mode 100644 test/form/samples/import-assertions/keep-dynamic-assertions/_expected/cjs.js create mode 100644 test/form/samples/import-assertions/keep-dynamic-assertions/_expected/es.js create mode 100644 test/form/samples/import-assertions/keep-dynamic-assertions/_expected/iife.js create mode 100644 test/form/samples/import-assertions/keep-dynamic-assertions/_expected/system.js create mode 100644 test/form/samples/import-assertions/keep-dynamic-assertions/_expected/umd.js create mode 100644 test/form/samples/import-assertions/keep-dynamic-assertions/main.js diff --git a/src/Chunk.ts b/src/Chunk.ts index aa5b0c1efd8..0c18fa732b6 100644 --- a/src/Chunk.ts +++ b/src/Chunk.ts @@ -857,12 +857,12 @@ export default class Chunk { private getDynamicImportStringAndAssertions( resolution: ExternalModule | string | null, fileName: string - ): [importPath: string, assertions: string | null] { + ): [importPath: string, assertions: string | null | true] { if (resolution instanceof ExternalModule) { const chunk = this.externalChunkByModule.get(resolution)!; return [`'${chunk.getImportPath(fileName)}'`, chunk.getImportAssertions(this.snippets)]; } - return [resolution || '', null]; + return [resolution || '', this.outputOptions.format === 'es' || null]; } private getFallbackChunkName(): string { diff --git a/src/ast/nodes/ImportExpression.ts b/src/ast/nodes/ImportExpression.ts index 3f4a3408518..e9cd31f209b 100644 --- a/src/ast/nodes/ImportExpression.ts +++ b/src/ast/nodes/ImportExpression.ts @@ -29,7 +29,7 @@ export default class ImportExpression extends NodeBase { declare source: ExpressionNode; declare type: NodeType.tImportExpression; - private assertions: string | null = null; + private assertions: string | null | true = null; private mechanism: DynamicImportMechanism | null = null; private namespaceExportName: string | false | undefined = undefined; private resolution: Module | ExternalModule | string | null = null; @@ -70,34 +70,20 @@ export default class ImportExpression extends NodeBase { code.overwrite( this.start, this.end, - `Promise.resolve().then(${left}${this.inlineNamespace.getName(getPropertyAccess)}${right})`, - { contentOnly: true } + `Promise.resolve().then(${left}${this.inlineNamespace.getName(getPropertyAccess)}${right})` ); return; } - - if (this.arguments) { - code.remove(this.source.end, this.end - 1); - } if (this.mechanism) { code.overwrite( this.start, findFirstOccurrenceOutsideComment(code.original, '(', this.start + 6) + 1, - this.mechanism.left, - { contentOnly: true } + this.mechanism.left ); - code.overwrite(this.end - 1, this.end, this.mechanism.right, { contentOnly: true }); + code.overwrite(this.end - 1, this.end, this.mechanism.right); } if (this.resolutionString) { code.overwrite(this.source.start, this.source.end, this.resolutionString); - if (this.assertions) { - code.appendLeft( - this.end - 1, - `,${_}${getObject([['assert', this.assertions]], { - lineBreakIndent: null - })}` - ); - } if (this.namespaceExportName) { const [left, right] = getDirectReturnFunction(['n'], { functionReturn: true, @@ -109,6 +95,19 @@ export default class ImportExpression extends NodeBase { } else { this.source.render(code, options); } + if (this.assertions !== true) { + if (this.arguments) { + code.overwrite(this.source.end, this.end - 1, '', { contentOnly: true }); + } + if (this.assertions) { + code.appendLeft( + this.end - 1, + `,${_}${getObject([['assert', this.assertions]], { + lineBreakIndent: null + })}` + ); + } + } } setExternalResolution( @@ -120,7 +119,7 @@ export default class ImportExpression extends NodeBase { accessedGlobalsByScope: Map>, resolutionString: string, namespaceExportName: string | false | undefined, - assertions: string | null + assertions: string | null | true ): void { const { format } = options; this.inlineNamespace = null; diff --git a/test/form/samples/import-assertions/keep-dynamic-assertions/_config.js b/test/form/samples/import-assertions/keep-dynamic-assertions/_config.js new file mode 100644 index 00000000000..14e4b6662e6 --- /dev/null +++ b/test/form/samples/import-assertions/keep-dynamic-assertions/_config.js @@ -0,0 +1,6 @@ +module.exports = { + description: 'keep import assertions for non-resolvable dynamic imports', + options: { + external: true + } +}; diff --git a/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/amd.js b/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/amd.js new file mode 100644 index 00000000000..622ca8b31b8 --- /dev/null +++ b/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/amd.js @@ -0,0 +1,22 @@ +define(['require'], (function (require) { 'use strict'; + + function _interopNamespaceDefault(e) { + var n = Object.create(null); + if (e) { + Object.keys(e).forEach(function (k) { + if (k !== 'default') { + var d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { return e[k]; } + }); + } + }); + } + n.default = e; + return Object.freeze(n); + } + + (function (t) { return new Promise(function (resolve, reject) { require([t], function (m) { resolve(/*#__PURE__*/_interopNamespaceDefault(m)); }, reject); }); })(globalThis.unknown); + +})); diff --git a/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/cjs.js b/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/cjs.js new file mode 100644 index 00000000000..440ea28ac47 --- /dev/null +++ b/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/cjs.js @@ -0,0 +1,20 @@ +'use strict'; + +function _interopNamespaceDefault(e) { + var n = Object.create(null); + if (e) { + Object.keys(e).forEach(function (k) { + if (k !== 'default') { + var d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: function () { return e[k]; } + }); + } + }); + } + n.default = e; + return Object.freeze(n); +} + +(function (t) { return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefault(require(t)); }); })(globalThis.unknown); diff --git a/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/es.js b/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/es.js new file mode 100644 index 00000000000..63795c9009a --- /dev/null +++ b/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/es.js @@ -0,0 +1 @@ +import(globalThis.unknown, { assert: { type: 'special' } }); diff --git a/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/iife.js b/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/iife.js new file mode 100644 index 00000000000..da9cafa781a --- /dev/null +++ b/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/iife.js @@ -0,0 +1,6 @@ +(function () { + 'use strict'; + + import(globalThis.unknown); + +})(); diff --git a/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/system.js b/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/system.js new file mode 100644 index 00000000000..264d8ebb609 --- /dev/null +++ b/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/system.js @@ -0,0 +1,10 @@ +System.register([], (function (exports, module) { + 'use strict'; + return { + execute: (function () { + + module.import(globalThis.unknown); + + }) + }; +})); diff --git a/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/umd.js b/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/umd.js new file mode 100644 index 00000000000..bc60999ca93 --- /dev/null +++ b/test/form/samples/import-assertions/keep-dynamic-assertions/_expected/umd.js @@ -0,0 +1,8 @@ +(function (factory) { + typeof define === 'function' && define.amd ? define(factory) : + factory(); +})((function () { 'use strict'; + + import(globalThis.unknown); + +})); diff --git a/test/form/samples/import-assertions/keep-dynamic-assertions/main.js b/test/form/samples/import-assertions/keep-dynamic-assertions/main.js new file mode 100644 index 00000000000..63795c9009a --- /dev/null +++ b/test/form/samples/import-assertions/keep-dynamic-assertions/main.js @@ -0,0 +1 @@ +import(globalThis.unknown, { assert: { type: 'special' } });