From 72a586121a22111c8540920c616a31ce21f764f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Thu, 30 Mar 2023 19:06:39 +0200 Subject: [PATCH] Align behavior with TS --- .../src/plugins/typescript/index.ts | 14 ++-------- .../export/equals-in-script/output.json | 3 +++ .../export/equals-in-unambiguous/output.json | 2 +- .../import/equals-in-script/output.json | 3 +++ .../equals-require-in-script/output.json | 3 +++ .../equals-require-in-unambiguous/output.json | 2 +- .../src/index.ts | 26 ++++++++++++------- .../fixtures/exports/export=-script/input.ts | 1 - .../exports/export=-script/options.json | 3 --- .../fixtures/exports/export=-script/output.js | 1 - .../fixtures/exports/export=/options.json | 2 +- .../imports/import=-module/options.json | 2 +- .../fixtures/imports/import=-script/input.ts | 2 -- .../imports/import=-script/options.json | 3 --- .../fixtures/imports/import=-script/output.js | 2 -- 15 files changed, 31 insertions(+), 38 deletions(-) delete mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/exports/export=-script/input.ts delete mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/exports/export=-script/options.json delete mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/exports/export=-script/output.js delete mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-script/input.ts delete mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-script/options.json delete mode 100644 packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-script/output.js diff --git a/packages/babel-parser/src/plugins/typescript/index.ts b/packages/babel-parser/src/plugins/typescript/index.ts index df97882b7729..665df7ab23f3 100644 --- a/packages/babel-parser/src/plugins/typescript/index.ts +++ b/packages/babel-parser/src/plugins/typescript/index.ts @@ -2017,6 +2017,7 @@ export default (superClass: ClassWithMixin) => // For compatibility to estree we cannot call parseLiteral directly here node.expression = super.parseExprAtom() as N.StringLiteral; this.expect(tt.parenR); + this.sawUnambiguousESM = true; return this.finishNode(node, "TSExternalModuleReference"); } @@ -2711,18 +2712,6 @@ export default (superClass: ClassWithMixin) => */ checkDuplicateExports() {} - assertModuleNodeAllowed(node: N.Node): void { - if ( - node.type === "TSImportEqualsDeclaration" || - node.type === "TSExportAssignment" - ) { - // `import ... =` and `export =` are allowed in scripts, - // since they are used for CommonJS. - return; - } - super.assertModuleNodeAllowed(node); - } - parseImport( node: Undone, ): N.AnyImport { @@ -2800,6 +2789,7 @@ export default (superClass: ClassWithMixin) => const assign = node as Undone; assign.expression = super.parseExpression(); this.semicolon(); + this.sawUnambiguousESM = true; return this.finishNode(assign, "TSExportAssignment"); } else if (this.eatContextual(tt._as)) { // `export as namespace A;` diff --git a/packages/babel-parser/test/fixtures/typescript/export/equals-in-script/output.json b/packages/babel-parser/test/fixtures/typescript/export/equals-in-script/output.json index 4435b69c7622..a49b3540c5dd 100644 --- a/packages/babel-parser/test/fixtures/typescript/export/equals-in-script/output.json +++ b/packages/babel-parser/test/fixtures/typescript/export/equals-in-script/output.json @@ -1,6 +1,9 @@ { "type": "File", "start":0,"end":11,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":11,"index":11}}, + "errors": [ + "SyntaxError: 'import' and 'export' may appear only with 'sourceType: \"module\"' (1:0)" + ], "program": { "type": "Program", "start":0,"end":11,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":11,"index":11}}, diff --git a/packages/babel-parser/test/fixtures/typescript/export/equals-in-unambiguous/output.json b/packages/babel-parser/test/fixtures/typescript/export/equals-in-unambiguous/output.json index 4435b69c7622..9f13e9e0bae5 100644 --- a/packages/babel-parser/test/fixtures/typescript/export/equals-in-unambiguous/output.json +++ b/packages/babel-parser/test/fixtures/typescript/export/equals-in-unambiguous/output.json @@ -4,7 +4,7 @@ "program": { "type": "Program", "start":0,"end":11,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":11,"index":11}}, - "sourceType": "script", + "sourceType": "module", "interpreter": null, "body": [ { diff --git a/packages/babel-parser/test/fixtures/typescript/import/equals-in-script/output.json b/packages/babel-parser/test/fixtures/typescript/import/equals-in-script/output.json index f89c0c3c37b3..6d116ee43624 100644 --- a/packages/babel-parser/test/fixtures/typescript/import/equals-in-script/output.json +++ b/packages/babel-parser/test/fixtures/typescript/import/equals-in-script/output.json @@ -1,6 +1,9 @@ { "type": "File", "start":0,"end":15,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":15,"index":15}}, + "errors": [ + "SyntaxError: 'import' and 'export' may appear only with 'sourceType: \"module\"' (1:0)" + ], "program": { "type": "Program", "start":0,"end":15,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":15,"index":15}}, diff --git a/packages/babel-parser/test/fixtures/typescript/import/equals-require-in-script/output.json b/packages/babel-parser/test/fixtures/typescript/import/equals-require-in-script/output.json index 8a8fdd743052..1d87684dbe32 100644 --- a/packages/babel-parser/test/fixtures/typescript/import/equals-require-in-script/output.json +++ b/packages/babel-parser/test/fixtures/typescript/import/equals-require-in-script/output.json @@ -1,6 +1,9 @@ { "type": "File", "start":0,"end":24,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":24,"index":24}}, + "errors": [ + "SyntaxError: 'import' and 'export' may appear only with 'sourceType: \"module\"' (1:0)" + ], "program": { "type": "Program", "start":0,"end":24,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":24,"index":24}}, diff --git a/packages/babel-parser/test/fixtures/typescript/import/equals-require-in-unambiguous/output.json b/packages/babel-parser/test/fixtures/typescript/import/equals-require-in-unambiguous/output.json index 8a8fdd743052..19b29f5d027f 100644 --- a/packages/babel-parser/test/fixtures/typescript/import/equals-require-in-unambiguous/output.json +++ b/packages/babel-parser/test/fixtures/typescript/import/equals-require-in-unambiguous/output.json @@ -4,7 +4,7 @@ "program": { "type": "Program", "start":0,"end":24,"loc":{"start":{"line":1,"column":0,"index":0},"end":{"line":1,"column":24,"index":24}}, - "sourceType": "script", + "sourceType": "module", "interpreter": null, "body": [ { diff --git a/packages/babel-plugin-transform-typescript/src/index.ts b/packages/babel-plugin-transform-typescript/src/index.ts index bcb9f6c7ff20..4375e1560bb6 100644 --- a/packages/babel-plugin-transform-typescript/src/index.ts +++ b/packages/babel-plugin-transform-typescript/src/index.ts @@ -1,6 +1,6 @@ import { declare } from "@babel/helper-plugin-utils"; import syntaxTypeScript from "@babel/plugin-syntax-typescript"; -import type { types as t } from "@babel/core"; +import type { PluginPass, types as t } from "@babel/core"; import { injectInitialization } from "@babel/helper-create-class-features-plugin"; import type { Binding, NodePath, Scope } from "@babel/traverse"; import type { Options as SyntaxOptions } from "@babel/plugin-syntax-typescript"; @@ -78,17 +78,18 @@ function safeRemove(path: NodePath) { path.opts.noScope = false; } -function assertCjsModuleIsScript( +function assertCjsTransformEnabled( path: NodePath, + pass: PluginPass, wrong: string, suggestion: string, extra: string = "", ): void { - const programParent = path.find(p => p.isProgram()) as NodePath; - if (programParent.node.sourceType !== "script") { + if (pass.get("@babel/plugin-transform-modules-*") !== "commonjs") { throw path.buildCodeFrameError( - `\`${wrong}\` is only supported when "sourceType" is "script".\n` + - `Please consider using \`${suggestion}\`${extra}.`, + `\`${wrong}\` is only supported when compiling modules to CommonJS.\n` + + `Please consider using \`${suggestion}\`${extra}, or add ` + + `@babel/plugin-transform-modules-commonjs to your Babel config.`, ); } } @@ -589,15 +590,19 @@ export default declare((api, opts: Options) => { } }, - TSImportEqualsDeclaration(path: NodePath) { + TSImportEqualsDeclaration( + path: NodePath, + pass, + ) { const { id, moduleReference } = path.node; let init: t.Expression; let varKind: "var" | "const"; if (t.isTSExternalModuleReference(moduleReference)) { // import alias = require('foo'); - assertCjsModuleIsScript( + assertCjsTransformEnabled( path, + pass, `import ${id.name} = require(...);`, `import ${id.name} from '...';`, " alongside Typescript's --allowSyntheticDefaultImports option", @@ -618,9 +623,10 @@ export default declare((api, opts: Options) => { path.scope.registerDeclaration(path); }, - TSExportAssignment(path) { - assertCjsModuleIsScript( + TSExportAssignment(path, pass) { + assertCjsTransformEnabled( path, + pass, `export = ;`, `export default ;`, ); diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=-script/input.ts b/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=-script/input.ts deleted file mode 100644 index fbedae645eb3..000000000000 --- a/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=-script/input.ts +++ /dev/null @@ -1 +0,0 @@ -export = 0; \ No newline at end of file diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=-script/options.json b/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=-script/options.json deleted file mode 100644 index b412ffe6712f..000000000000 --- a/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=-script/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "sourceType": "script" -} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=-script/output.js b/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=-script/output.js deleted file mode 100644 index d5b2e8bb3efb..000000000000 --- a/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=-script/output.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 0; diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=/options.json b/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=/options.json index e2376e518413..a4af08a4d481 100644 --- a/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=/options.json +++ b/packages/babel-plugin-transform-typescript/test/fixtures/exports/export=/options.json @@ -1,3 +1,3 @@ { - "throws": "`export = ;` is only supported when \"sourceType\" is \"script\".\nPlease consider using `export default ;`" + "throws": "`export = ;` is only supported when compiling modules to CommonJS.\nPlease consider using `export default ;`, or add @babel/plugin-transform-modules-commonjs to your Babel config." } diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-module/options.json b/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-module/options.json index 8f13c717fc76..eb23daa9d797 100644 --- a/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-module/options.json +++ b/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-module/options.json @@ -1,4 +1,4 @@ { "sourceType": "module", - "throws": "`import lib = require(...);` is only supported when \"sourceType\" is \"script\".\nPlease consider using `import lib from '...';` alongside Typescript's --allowSyntheticDefaultImports option." + "throws": "`import lib = require(...);` is only supported when compiling modules to CommonJS.\nPlease consider using `import lib from '...';` alongside Typescript's --allowSyntheticDefaultImports option, or add @babel/plugin-transform-modules-commonjs to your Babel config." } diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-script/input.ts b/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-script/input.ts deleted file mode 100644 index dc8b049669b3..000000000000 --- a/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-script/input.ts +++ /dev/null @@ -1,2 +0,0 @@ -import lib = require("lib"); -lib(); diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-script/options.json b/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-script/options.json deleted file mode 100644 index b412ffe6712f..000000000000 --- a/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-script/options.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "sourceType": "script" -} diff --git a/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-script/output.js b/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-script/output.js deleted file mode 100644 index 2ddbce589436..000000000000 --- a/packages/babel-plugin-transform-typescript/test/fixtures/imports/import=-script/output.js +++ /dev/null @@ -1,2 +0,0 @@ -const lib = require("lib"); -lib();