diff --git a/packages/babel-core/src/transformation/normalize-file.js b/packages/babel-core/src/transformation/normalize-file.js index 2ff27aadaf..2ea1e034ed 100644 --- a/packages/babel-core/src/transformation/normalize-file.js +++ b/packages/babel-core/src/transformation/normalize-file.js @@ -89,6 +89,12 @@ function parser(pluginPasses, options, code) { } throw new Error("More than one plugin attempted to override parsing."); } catch (err) { + if (err.code === "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED") { + err.message += + "\nConsider renaming the file to '.mjs', or setting sourceType:module " + + "or sourceType:unambiguous in your Babel config for this file."; + } + const { loc, missingPlugin } = err; if (loc) { const codeFrame = codeFrameColumns( diff --git a/packages/babel-plugin-transform-modules-commonjs/src/index.js b/packages/babel-plugin-transform-modules-commonjs/src/index.js index 83cb7dbf16..e1f1431ff2 100644 --- a/packages/babel-plugin-transform-modules-commonjs/src/index.js +++ b/packages/babel-plugin-transform-modules-commonjs/src/index.js @@ -34,7 +34,10 @@ export default declare((api, options) => { const getAssertion = localName => template.expression.ast` (function(){ - throw new Error("The CommonJS '" + "${localName}" + "' variable is not available in ES6 modules."); + throw new Error( + "The CommonJS '" + "${localName}" + "' variable is not available in ES6 modules." + + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + + "Babel config for this file."); })() `; diff --git a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/module-exports/output.js b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/module-exports/output.js index e1138b612d..3e9254c59b 100644 --- a/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/module-exports/output.js +++ b/packages/babel-plugin-transform-modules-commonjs/test/fixtures/misc/module-exports/output.js @@ -3,56 +3,56 @@ require("foo"); console.log(function () { - throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); }()); console.log(function () { - throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); }().prop); exports = function () { - throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); }() + 1; exports = function () { - throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); }() + 4; ({ exports } = ({}, function () { - throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); }())); [exports] = ([], function () { - throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); }()); exports = {}; (function () { - throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "exports" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); })().prop = ""; console.log(function () { - throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); }()); console.log(function () { - throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); }().exports); module = function () { - throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); }() + 1; module = function () { - throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); }() + 4; ({ module } = ({}, function () { - throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); }())); [module] = ([], function () { - throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); }()); module = {}; (function () { - throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules."); + throw new Error("The CommonJS '" + "module" + "' variable is not available in ES6 modules." + "Consider setting setting sourceType:script or sourceType:unambiguous in your " + "Babel config for this file."); })().prop = ""; diff --git a/packages/babylon/src/parser/expression.js b/packages/babylon/src/parser/expression.js index 73dc458d0e..1712baf40f 100644 --- a/packages/babylon/src/parser/expression.js +++ b/packages/babylon/src/parser/expression.js @@ -949,6 +949,7 @@ export default class ExpressionParser extends LValParser { this.raise( id.start, `import.meta may appear only with 'sourceType: "module"'`, + { code: "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED" }, ); } return this.parseMetaProperty(node, id, "meta"); diff --git a/packages/babylon/src/parser/location.js b/packages/babylon/src/parser/location.js index f3b0fb656d..79db584a49 100644 --- a/packages/babylon/src/parser/location.js +++ b/packages/babylon/src/parser/location.js @@ -13,7 +13,13 @@ export default class LocationParser extends CommentsParser { raise( pos: number, message: string, - missingPluginNames?: Array, + { + missingPluginNames, + code, + }: { + missingPluginNames?: Array, + code?: string, + } = {}, ): empty { const loc = getLineInfo(this.input, pos); message += ` (${loc.line}:${loc.column})`; @@ -26,6 +32,9 @@ export default class LocationParser extends CommentsParser { if (missingPluginNames) { err.missingPlugin = missingPluginNames; } + if (code !== undefined) { + err.code = code; + } throw err; } } diff --git a/packages/babylon/src/parser/statement.js b/packages/babylon/src/parser/statement.js index ab917a22db..d736b46184 100644 --- a/packages/babylon/src/parser/statement.js +++ b/packages/babylon/src/parser/statement.js @@ -192,6 +192,9 @@ export default class StatementParser extends ExpressionParser { this.raise( node.start, `'import' and 'export' may appear only with 'sourceType: "module"'`, + { + code: "BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED", + }, ); } } diff --git a/packages/babylon/src/parser/util.js b/packages/babylon/src/parser/util.js index c89e40bd8f..dd5a14a167 100644 --- a/packages/babylon/src/parser/util.js +++ b/packages/babylon/src/parser/util.js @@ -120,7 +120,7 @@ export default class UtilParser extends Tokenizer { throw this.raise( pos != null ? pos : this.state.start, `This experimental syntax requires enabling the parser plugin: '${name}'`, - [name], + { missingPluginNames: [name] }, ); } @@ -134,7 +134,7 @@ export default class UtilParser extends Tokenizer { `This experimental syntax requires enabling one of the following parser plugin(s): '${names.join( ", ", )}'`, - names, + { missingPluginNames: names }, ); } }