Merge pull request #7490 from loganfsmyth/sourcetype-helpful-errors

Give helpful errors if the wrong sourceType is detected
This commit is contained in:
Logan Smyth 2018-03-04 15:03:49 -08:00 committed by GitHub
commit 15a80f0df8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 40 additions and 18 deletions

View File

@ -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(

View File

@ -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.");
})()
`;

View File

@ -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 = "";

View File

@ -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");

View File

@ -13,7 +13,13 @@ export default class LocationParser extends CommentsParser {
raise(
pos: number,
message: string,
missingPluginNames?: Array<string>,
{
missingPluginNames,
code,
}: {
missingPluginNames?: Array<string>,
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;
}
}

View File

@ -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",
},
);
}
}

View File

@ -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 },
);
}
}