diff --git a/packages/babel-core/src/config/validation/options.js b/packages/babel-core/src/config/validation/options.js index 507b183fa07a..ee7621d88f7f 100644 --- a/packages/babel-core/src/config/validation/options.js +++ b/packages/babel-core/src/config/validation/options.js @@ -332,6 +332,7 @@ type EnvPath = $ReadOnly<{ export type NestingPath = RootPath | OverridesPath | EnvPath; export const assumptionsNames = new Set([ + "ignoreToPrimitiveHint", "mutableTemplateObject", "newableArrowFunctions", "setPublicClassFields", diff --git a/packages/babel-plugin-transform-template-literals/src/index.js b/packages/babel-plugin-transform-template-literals/src/index.js index abdf7087f8fc..fe51e5fb33af 100644 --- a/packages/babel-plugin-transform-template-literals/src/index.js +++ b/packages/babel-plugin-transform-template-literals/src/index.js @@ -3,10 +3,14 @@ import { template, types as t } from "@babel/core"; export default declare((api, options) => { api.assertVersion(7); - const { loose } = options; + + const ignoreToPrimitiveHint = + options.loose || api.assumption("ignoreToPrimitiveHint"); + const mutableTemplateObject = + options.loose || api.assumption("mutableTemplateObject"); let helperName = "taggedTemplateLiteral"; - if (loose) helperName += "Loose"; + if (mutableTemplateObject) helperName += "Loose"; /** * This function groups the objects into multiple calls to `.concat()` in @@ -122,13 +126,15 @@ export default declare((api, options) => { // since `+` is left-to-right associative // ensure the first node is a string if first/second isn't - const considerSecondNode = !loose || !t.isStringLiteral(nodes[1]); - if (!t.isStringLiteral(nodes[0]) && considerSecondNode) { + if ( + !t.isStringLiteral(nodes[0]) && + !(ignoreToPrimitiveHint && t.isStringLiteral(nodes[1])) + ) { nodes.unshift(t.stringLiteral("")); } let root = nodes[0]; - if (loose) { + if (ignoreToPrimitiveHint) { for (let i = 1; i < nodes.length; i++) { root = t.binaryExpression("+", root, nodes[i]); } diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/escape-quotes/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/escape-quotes/input.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/escape-quotes/input.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/escape-quotes/input.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/escape-quotes/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/escape-quotes/output.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/escape-quotes/output.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/escape-quotes/output.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/expression-first/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/expression-first/input.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/expression-first/input.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/expression-first/input.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/expression-first/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/expression-first/output.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/expression-first/output.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/expression-first/output.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/functions/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/functions/input.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/functions/input.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/functions/input.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/functions/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/functions/output.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/functions/output.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/functions/output.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/literals/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/literals/input.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/literals/input.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/literals/input.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/literals/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/literals/output.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/literals/output.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/literals/output.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/multiline/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/multiline/input.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/multiline/input.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/multiline/input.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/multiline/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/multiline/output.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/multiline/output.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/multiline/output.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/multiple/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/multiple/input.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/multiple/input.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/multiple/input.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/multiple/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/multiple/output.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/multiple/output.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/multiple/output.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/none/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/none/input.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/none/input.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/none/input.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/none/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/none/output.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/none/output.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/none/output.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/only/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/only/input.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/only/input.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/only/input.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/only/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/only/output.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/only/output.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/only/output.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/options.json b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/options.json new file mode 100644 index 000000000000..e9058d39d544 --- /dev/null +++ b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/options.json @@ -0,0 +1,6 @@ +{ + "plugins": ["transform-template-literals"], + "assumptions": { + "ignoreToPrimitiveHint": true + } +} diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/order/exec.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/order/exec.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/order/exec.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/order/exec.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/order/options.json b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/order/options.json similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/order/options.json rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/order/options.json diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/order2/exec.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/order2/exec.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/order2/exec.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/order2/exec.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/order2/options.json b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/order2/options.json similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/order2/options.json rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/order2/options.json diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/single/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/single/input.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/single/input.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/single/input.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/single/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/single/output.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/single/output.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/single/output.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/statement/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/statement/input.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/statement/input.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/statement/input.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/statement/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/statement/output.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/statement/output.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/statement/output.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/symbol/exec.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/symbol/exec.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/symbol/exec.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/symbol/exec.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/tag/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/tag/input.js new file mode 100644 index 000000000000..79f996661e4b --- /dev/null +++ b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/tag/input.js @@ -0,0 +1 @@ +tag`foo ${bar} baz`; diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/tag/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/tag/output.js new file mode 100644 index 000000000000..8af069907a95 --- /dev/null +++ b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-ignoreToPrimitiveHint/tag/output.js @@ -0,0 +1,13 @@ +function _templateObject() { + const data = _taggedTemplateLiteral(["foo ", " baz"]); + + _templateObject = function () { + return data; + }; + + return data; +} + +function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); } + +tag(_templateObject(), bar); diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/no-tag/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/no-tag/input.js new file mode 100644 index 000000000000..05ead3e65df5 --- /dev/null +++ b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/no-tag/input.js @@ -0,0 +1 @@ +`foo ${bar} baz`; diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/no-tag/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/no-tag/output.js new file mode 100644 index 000000000000..2328f9dfa655 --- /dev/null +++ b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/no-tag/output.js @@ -0,0 +1 @@ +"foo ".concat(bar, " baz"); diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/options.json b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/options.json new file mode 100644 index 000000000000..29cf2ac88867 --- /dev/null +++ b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/options.json @@ -0,0 +1,6 @@ +{ + "plugins": ["transform-template-literals"], + "assumptions": { + "mutableTemplateObject": true + } +} diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/tag/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/tag/input.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/tag/input.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/tag/input.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/tag/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/tag/output.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/tag/output.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/tag/output.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/template-revision/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/template-revision/input.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/template-revision/input.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/template-revision/input.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/template-revision/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/template-revision/output.js similarity index 100% rename from packages/babel-plugin-transform-template-literals/test/fixtures/loose/template-revision/output.js rename to packages/babel-plugin-transform-template-literals/test/fixtures/assumption-mutableTemplateObject/template-revision/output.js diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/ignoreToPrimitiveHint/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/loose/ignoreToPrimitiveHint/input.js new file mode 100644 index 000000000000..98413bcfcede --- /dev/null +++ b/packages/babel-plugin-transform-template-literals/test/fixtures/loose/ignoreToPrimitiveHint/input.js @@ -0,0 +1 @@ +var o = `foo ${bar} baz`; diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/ignoreToPrimitiveHint/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/loose/ignoreToPrimitiveHint/output.js new file mode 100644 index 000000000000..f0a7277e17f4 --- /dev/null +++ b/packages/babel-plugin-transform-template-literals/test/fixtures/loose/ignoreToPrimitiveHint/output.js @@ -0,0 +1 @@ +var o = "foo " + bar + " baz"; diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/mutableTemplateObject/input.js b/packages/babel-plugin-transform-template-literals/test/fixtures/loose/mutableTemplateObject/input.js new file mode 100644 index 000000000000..8b87c3fe9f4d --- /dev/null +++ b/packages/babel-plugin-transform-template-literals/test/fixtures/loose/mutableTemplateObject/input.js @@ -0,0 +1 @@ +var o = tag`foo ${bar} baz`; diff --git a/packages/babel-plugin-transform-template-literals/test/fixtures/loose/mutableTemplateObject/output.js b/packages/babel-plugin-transform-template-literals/test/fixtures/loose/mutableTemplateObject/output.js new file mode 100644 index 000000000000..4e6a108bdb7c --- /dev/null +++ b/packages/babel-plugin-transform-template-literals/test/fixtures/loose/mutableTemplateObject/output.js @@ -0,0 +1,13 @@ +function _templateObject() { + const data = _taggedTemplateLiteralLoose(["foo ", " baz"]); + + _templateObject = function () { + return data; + }; + + return data; +} + +function _taggedTemplateLiteralLoose(strings, raw) { if (!raw) { raw = strings.slice(0); } strings.raw = raw; return strings; } + +var o = tag(_templateObject(), bar);