diff --git a/lib/RuntimeTemplate.js b/lib/RuntimeTemplate.js index 08b9e636d65..feb9b3e505c 100644 --- a/lib/RuntimeTemplate.js +++ b/lib/RuntimeTemplate.js @@ -200,7 +200,7 @@ class RuntimeTemplate { // when the first two args are expression, we need to prepend "" + to force string // concatenation instead of number addition. - return typeof args[0] !== "string" && args[1] !== "string" + return typeof args[0] !== "string" && typeof args[1] !== "string" ? `"" + ${str}` : str; } diff --git a/test/RuntimeTemplate.unittest.js b/test/RuntimeTemplate.unittest.js new file mode 100644 index 00000000000..1cd083e3036 --- /dev/null +++ b/test/RuntimeTemplate.unittest.js @@ -0,0 +1,78 @@ +"use strict"; + +const RuntimeTemplate = require("../lib/RuntimeTemplate"); +const RequestShortener = require("../lib/RequestShortener"); + +describe("RuntimeTemplate.concatenation", () => { + it("no args", () => { + const runtimeTemplate = new RuntimeTemplate( + undefined, + { environment: { templateLiteral: false } }, + new RequestShortener(__dirname) + ); + expect(runtimeTemplate.concatenation()).toBe('""'); + }); + + it("1 arg", () => { + const runtimeTemplate = new RuntimeTemplate( + undefined, + { environment: { templateLiteral: false } }, + new RequestShortener(__dirname) + ); + expect(runtimeTemplate.concatenation({ expr: 1 })).toBe('"" + 1'); + expect(runtimeTemplate.concatenation("str")).toBe('"str"'); + }); + + it("es5", () => { + const runtimeTemplate = new RuntimeTemplate( + undefined, + { environment: { templateLiteral: false } }, + new RequestShortener(__dirname) + ); + + expect( + runtimeTemplate.concatenation({ expr: "__webpack__.p" }, "str/a") + ).toBe('__webpack__.p + "str/a"'); + expect( + runtimeTemplate.concatenation( + { expr: "__webpack__.p" }, + { expr: "str.a" }, + "str" + ) + ).toBe('"" + __webpack__.p + str.a + "str"'); + expect(runtimeTemplate.concatenation("a", "b", { expr: 1 })).toBe( + '"a" + "b" + 1' + ); + expect(runtimeTemplate.concatenation("a", { expr: 1 }, "b")).toBe( + '"a" + 1 + "b"' + ); + }); + + describe("es6", () => { + const runtimeTemplate = new RuntimeTemplate( + undefined, + { environment: { templateLiteral: true } }, + new RequestShortener(__dirname) + ); + + it("should prefer shorten variant #1", () => { + expect(runtimeTemplate.concatenation({ expr: 1 }, "a", { expr: 2 })).toBe( + '1 + "a" + 2' + ); + }); + + it("should prefer shorten variant #2", () => { + expect( + runtimeTemplate.concatenation({ expr: 1 }, "a", { expr: 2 }, "b") + ).toBe('1 + "a" + 2 + "b"'); + }); + + it("should prefer shorten variant #3", () => { + /* eslint-disable no-template-curly-in-string */ + expect(runtimeTemplate.concatenation("a", { expr: 1 }, "b")).toBe( + "`a${1}b`" + ); + /* eslint-enable */ + }); + }); +});