diff --git a/packages/babel-core/src/config/full.js b/packages/babel-core/src/config/full.js index eba908c2566e..5ba198d91d17 100644 --- a/packages/babel-core/src/config/full.js +++ b/packages/babel-core/src/config/full.js @@ -284,9 +284,18 @@ const validateIfOptionNeedsFilename = ( descriptor: UnloadedDescriptor, ): void => { if (options.test || options.include || options.exclude) { + const formattedPresetName = descriptor.name + ? `"${descriptor.name}"` + : "/* your preset */"; throw new Error( - `Preset ${descriptor.name || - ""} requires filename, but it was not passed.`.replace(/\s{2}/, " "), + [ + `Preset ${formattedPresetName} requires a filename be set.`, + `For example, if you are calling Babel directly`, + `\`\`\``, + `babel.transform(code, { filename: 'file.js', presets: [${formattedPresetName}] });`, + `\`\`\``, + `See https://babeljs.io/docs/en/options#filename for more information.`, + ].join("\n"), ); } }; diff --git a/packages/babel-core/test/config-chain.js b/packages/babel-core/test/config-chain.js index 7aacbe62d1e9..f1f67d430327 100644 --- a/packages/babel-core/test/config-chain.js +++ b/packages/babel-core/test/config-chain.js @@ -1061,7 +1061,7 @@ describe("buildConfigChain", function() { loadOptions({ presets: [require("./fixtures/config-loading/preset4")], }); - }).toThrow(/Preset requires filename/); + }).toThrow(/Preset \/\* your preset \*\/ requires sa filename/); }); it("should throw when `preset.overrides` requires `filename` but it was not passed", () => { @@ -1069,7 +1069,7 @@ describe("buildConfigChain", function() { loadOptions({ presets: [require("./fixtures/config-loading/preset5")], }); - }).toThrow(/Preset requires filename/); + }).toThrow(/Preset \/\* your preset \*\/ requires a filename/); }); }); });