diff --git a/packages/babel-helper-fixtures/src/index.ts b/packages/babel-helper-fixtures/src/index.ts index 7463cf0bdcc2..6baa9dc348c6 100644 --- a/packages/babel-helper-fixtures/src/index.ts +++ b/packages/babel-helper-fixtures/src/index.ts @@ -64,7 +64,7 @@ function shouldIgnore(name, ignore?: Array) { ); } -const EXTENSIONS = [".js", ".mjs", ".ts", ".tsx"]; +const EXTENSIONS = [".js", ".mjs", ".ts", ".tsx", ".cts", ".mts"]; function findFile(filepath: string, allowJSON?: boolean) { const matches = []; @@ -134,6 +134,7 @@ function pushTask(taskName, taskDir, suite, suiteName) { ? taskOpts.BABEL_8_BREAKING === false : taskOpts.BABEL_8_BREAKING === true), options: taskOpts, + doNotSetSourceType: taskOpts.DO_NOT_SET_SOURCE_TYPE, externalHelpers: taskOpts.externalHelpers ?? !!tryResolve("@babel/plugin-external-helpers"), @@ -162,6 +163,7 @@ function pushTask(taskName, taskDir, suite, suiteName) { }; delete taskOpts.BABEL_8_BREAKING; + delete taskOpts.DO_NOT_SET_SOURCE_TYPE; // If there's node requirement, check it before pushing task if (taskOpts.minNodeVersion) { diff --git a/packages/babel-helper-transform-fixture-test-runner/src/index.ts b/packages/babel-helper-transform-fixture-test-runner/src/index.ts index cfbe4fd9283c..33c2c235994b 100644 --- a/packages/babel-helper-transform-fixture-test-runner/src/index.ts +++ b/packages/babel-helper-transform-fixture-test-runner/src/index.ts @@ -230,6 +230,7 @@ function run(task) { expect: expected, exec, options: opts, + doNotSetSourceType, optionsDir, validateLogs, ignoreOutput, @@ -245,7 +246,7 @@ function run(task) { filename: self.loc, filenameRelative: self.filename, sourceFileName: self.filename, - sourceType: "script", + ...(doNotSetSourceType ? {} : { sourceType: "script" }), babelrc: false, configFile: false, inputSourceMap: task.inputSourceMap || undefined, diff --git a/packages/babel-preset-typescript/src/index.js b/packages/babel-preset-typescript/src/index.js index e384e41c2424..52c71526d63a 100644 --- a/packages/babel-preset-typescript/src/index.js +++ b/packages/babel-preset-typescript/src/index.js @@ -8,6 +8,7 @@ export default declare((api, opts) => { const { allExtensions, allowNamespaces, + disallowJSXAmbiguity, isTSX, jsxPragma, jsxPragmaFrag, @@ -16,17 +17,19 @@ export default declare((api, opts) => { } = normalizeOptions(opts); const pluginOptions = process.env.BABEL_8_BREAKING - ? isTSX => ({ + ? (isTSX, disallowJSXAmbiguity) => ({ allowNamespaces, + disallowJSXAmbiguity, isTSX, jsxPragma, jsxPragmaFrag, onlyRemoveTypeImports, optimizeConstEnums, }) - : isTSX => ({ + : (isTSX, disallowJSXAmbiguity) => ({ allowDeclareFields: opts.allowDeclareFields, allowNamespaces, + disallowJSXAmbiguity, isTSX, jsxPragma, jsxPragmaFrag, @@ -38,21 +41,33 @@ export default declare((api, opts) => { overrides: allExtensions ? [ { - plugins: [[transformTypeScript, pluginOptions(isTSX)]], + plugins: [ + [transformTypeScript, pluginOptions(isTSX, disallowJSXAmbiguity)], + ], }, ] - : [ + : // Only set 'test' if explicitly requested, since it requires that + // Babel is being called` + [ { - // Only set 'test' if explicitly requested, since it requires that - // Babel is being called` test: /\.ts$/, - plugins: [[transformTypeScript, pluginOptions(false)]], + plugins: [[transformTypeScript, pluginOptions(false, false)]], + }, + { + test: /\.mts$/, + sourceType: "module", + plugins: [[transformTypeScript, pluginOptions(false, true)]], + }, + { + test: /\.cts$/, + sourceType: "script", + plugins: [[transformTypeScript, pluginOptions(false, true)]], }, { - // Only set 'test' if explicitly requested, since it requires that - // Babel is being called` test: /\.tsx$/, - plugins: [[transformTypeScript, pluginOptions(true)]], + // disallowJSXAmbiguity is a no-op when parsing TSX, since it's + // always disallowed. + plugins: [[transformTypeScript, pluginOptions(true, false)]], }, ], }; diff --git a/packages/babel-preset-typescript/src/normalize-options.js b/packages/babel-preset-typescript/src/normalize-options.js index 6812fac324b1..f8ac91880ac5 100644 --- a/packages/babel-preset-typescript/src/normalize-options.js +++ b/packages/babel-preset-typescript/src/normalize-options.js @@ -7,6 +7,7 @@ export default function normalizeOptions(options = {}) { const TopLevelOptions = { allExtensions: "allExtensions", allowNamespaces: "allowNamespaces", + disallowJSXAmbiguity: "disallowJSXAmbiguity", isTSX: "isTSX", jsxPragma: "jsxPragma", jsxPragmaFrag: "jsxPragmaFrag", @@ -54,6 +55,18 @@ export default function normalizeOptions(options = {}) { v.invariant(allExtensions, "isTSX:true requires allExtensions:true"); } + const disallowJSXAmbiguity = v.validateBooleanOption( + TopLevelOptions.disallowJSXAmbiguity, + options.disallowJSXAmbiguity, + false, + ); + if (disallowJSXAmbiguity) { + v.invariant( + allExtensions, + "disallowJSXAmbiguity:true requires allExtensions:true", + ); + } + const optimizeConstEnums = v.validateBooleanOption( TopLevelOptions.optimizeConstEnums, options.optimizeConstEnums, @@ -63,6 +76,7 @@ export default function normalizeOptions(options = {}) { return { allExtensions, allowNamespaces, + disallowJSXAmbiguity, isTSX, jsxPragma, jsxPragmaFrag, diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/import-in-cts/input.cts b/packages/babel-preset-typescript/test/fixtures/node-extensions/import-in-cts/input.cts new file mode 100644 index 000000000000..856f26b34c30 --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/import-in-cts/input.cts @@ -0,0 +1 @@ +import "x"; diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/import-in-cts/options.json b/packages/babel-preset-typescript/test/fixtures/node-extensions/import-in-cts/options.json new file mode 100644 index 000000000000..afbed324e92a --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/import-in-cts/options.json @@ -0,0 +1,3 @@ +{ + "throws": "'import' and 'export' may appear only with 'sourceType: \"module\"' (1:0)" +} diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/import-in-mts/input.mts b/packages/babel-preset-typescript/test/fixtures/node-extensions/import-in-mts/input.mts new file mode 100644 index 000000000000..856f26b34c30 --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/import-in-mts/input.mts @@ -0,0 +1 @@ +import "x"; diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/import-in-mts/output.mjs b/packages/babel-preset-typescript/test/fixtures/node-extensions/import-in-mts/output.mjs new file mode 100644 index 000000000000..856f26b34c30 --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/import-in-mts/output.mjs @@ -0,0 +1 @@ +import "x"; diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/options.json b/packages/babel-preset-typescript/test/fixtures/node-extensions/options.json new file mode 100644 index 000000000000..d1e62be8eb76 --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/options.json @@ -0,0 +1,4 @@ +{ + "DO_NOT_SET_SOURCE_TYPE": true, + "presets": ["typescript"] +} diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-cts/input.cts b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-cts/input.cts new file mode 100644 index 000000000000..35a8b2e1277f --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-cts/input.cts @@ -0,0 +1 @@ + x; diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-cts/options.json b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-cts/options.json new file mode 100644 index 000000000000..d59f14ff0b1b --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-cts/options.json @@ -0,0 +1,3 @@ +{ + "throws": "This syntax is reserved in files with the .mts or .cts extension. Use an `as` expression instead. (1:0)" +} diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-mts/input.mts b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-mts/input.mts new file mode 100644 index 000000000000..35a8b2e1277f --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-mts/input.mts @@ -0,0 +1 @@ + x; diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-mts/options.json b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-mts/options.json new file mode 100644 index 000000000000..d59f14ff0b1b --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-mts/options.json @@ -0,0 +1,3 @@ +{ + "throws": "This syntax is reserved in files with the .mts or .cts extension. Use an `as` expression instead. (1:0)" +} diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-ts/input.ts b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-ts/input.ts new file mode 100644 index 000000000000..35a8b2e1277f --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-ts/input.ts @@ -0,0 +1 @@ + x; diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-ts/options.json b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-ts/options.json new file mode 100644 index 000000000000..55a498f5e8b2 --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-ts/options.json @@ -0,0 +1,3 @@ +{ + "DO_NOT_SET_SOURCE_TYPE": false +} diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-ts/output.js b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-ts/output.js new file mode 100644 index 000000000000..6c650fc54be1 --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-assertion-in-ts/output.js @@ -0,0 +1 @@ +x; diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-cts/input.mts b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-cts/input.mts new file mode 100644 index 000000000000..c6c773b424dd --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-cts/input.mts @@ -0,0 +1 @@ +() => 0; diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-cts/options.json b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-cts/options.json new file mode 100644 index 000000000000..656905ed2daf --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-cts/options.json @@ -0,0 +1,3 @@ +{ + "throws": "This syntax is reserved in files with the .mts or .cts extension. Add a trailing comma, as in `() => ...`. (1:0)" +} diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-mts/input.mts b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-mts/input.mts new file mode 100644 index 000000000000..c6c773b424dd --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-mts/input.mts @@ -0,0 +1 @@ +() => 0; diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-mts/options.json b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-mts/options.json new file mode 100644 index 000000000000..656905ed2daf --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-mts/options.json @@ -0,0 +1,3 @@ +{ + "throws": "This syntax is reserved in files with the .mts or .cts extension. Add a trailing comma, as in `() => ...`. (1:0)" +} diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-ts/input.ts b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-ts/input.ts new file mode 100644 index 000000000000..c6c773b424dd --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-ts/input.ts @@ -0,0 +1 @@ +() => 0; diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-ts/options.json b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-ts/options.json new file mode 100644 index 000000000000..55a498f5e8b2 --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-ts/options.json @@ -0,0 +1,3 @@ +{ + "DO_NOT_SET_SOURCE_TYPE": false +} diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-ts/output.js b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-ts/output.js new file mode 100644 index 000000000000..d4bf221471c1 --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/type-param-arrow-in-ts/output.js @@ -0,0 +1 @@ +() => 0; diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/with-in-cts/input.cts b/packages/babel-preset-typescript/test/fixtures/node-extensions/with-in-cts/input.cts new file mode 100644 index 000000000000..66e645012e48 --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/with-in-cts/input.cts @@ -0,0 +1 @@ +with (x) {} diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/with-in-cts/output.js b/packages/babel-preset-typescript/test/fixtures/node-extensions/with-in-cts/output.js new file mode 100644 index 000000000000..66e645012e48 --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/with-in-cts/output.js @@ -0,0 +1 @@ +with (x) {} diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/with-in-mts/input.mts b/packages/babel-preset-typescript/test/fixtures/node-extensions/with-in-mts/input.mts new file mode 100644 index 000000000000..66e645012e48 --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/with-in-mts/input.mts @@ -0,0 +1 @@ +with (x) {} diff --git a/packages/babel-preset-typescript/test/fixtures/node-extensions/with-in-mts/options.json b/packages/babel-preset-typescript/test/fixtures/node-extensions/with-in-mts/options.json new file mode 100644 index 000000000000..25577a776804 --- /dev/null +++ b/packages/babel-preset-typescript/test/fixtures/node-extensions/with-in-mts/options.json @@ -0,0 +1,3 @@ +{ + "throws": "'with' in strict mode. (1:0)" +} diff --git a/packages/babel-preset-typescript/test/normalize-options.spec.js b/packages/babel-preset-typescript/test/normalize-options.spec.js index d0a10d18087b..de9341aca9e8 100644 --- a/packages/babel-preset-typescript/test/normalize-options.spec.js +++ b/packages/babel-preset-typescript/test/normalize-options.spec.js @@ -78,16 +78,17 @@ describe("normalize options", () => { ); it("default values", () => { expect(normalizeOptions({})).toMatchInlineSnapshot(` - Object { - "allExtensions": false, - "allowNamespaces": true, - "isTSX": false, - "jsxPragma": undefined, - "jsxPragmaFrag": "React.Fragment", - "onlyRemoveTypeImports": undefined, - "optimizeConstEnums": false, - } - `); +Object { + "allExtensions": false, + "allowNamespaces": true, + "disallowJSXAmbiguity": false, + "isTSX": false, + "jsxPragma": undefined, + "jsxPragmaFrag": "React.Fragment", + "onlyRemoveTypeImports": undefined, + "optimizeConstEnums": false, +} +`); }); }); });