From 6d6cdf6bafeed80dc8056e23a1014a8d7cd5377a Mon Sep 17 00:00:00 2001 From: Daniel Tschinder Date: Tue, 28 Feb 2017 22:39:08 +0100 Subject: [PATCH] [7.0] Allow presets to be objects (#5385) * Allow presets to be objects * Improve logic to detect preset format --- .../file/options/option-manager.js | 22 ++++++++++++------- ...15_default.js => es2015_default_object.js} | 0 .../option-manager/presets/es2015_invalid.js | 6 +++++ .../presets/{es5.js => es5_object.js} | 0 packages/babel-core/test/option-manager.js | 5 +++-- 5 files changed, 23 insertions(+), 10 deletions(-) rename packages/babel-core/test/fixtures/option-manager/presets/{es2015_default.js => es2015_default_object.js} (100%) create mode 100644 packages/babel-core/test/fixtures/option-manager/presets/es2015_invalid.js rename packages/babel-core/test/fixtures/option-manager/presets/{es5.js => es5_object.js} (100%) diff --git a/packages/babel-core/src/transformation/file/options/option-manager.js b/packages/babel-core/src/transformation/file/options/option-manager.js index 0dd3ecf70d..d50bd2139f 100644 --- a/packages/babel-core/src/transformation/file/options/option-manager.js +++ b/packages/babel-core/src/transformation/file/options/option-manager.js @@ -268,29 +268,30 @@ export default class OptionManager { JSON.stringify(dirname)); } } - const presetFactory = this.getPresetFactoryForPreset(presetLoc || preset); + const resolvedPreset = this.loadPreset(presetLoc || preset, options, { dirname }); - preset = presetFactory(context, options, { dirname }); + if (onResolve) onResolve(resolvedPreset, presetLoc); - if (onResolve) onResolve(preset, presetLoc); + return resolvedPreset; } catch (e) { if (presetLoc) { e.message += ` (While processing preset: ${JSON.stringify(presetLoc)})`; } throw e; } - - return preset; }); } - getPresetFactoryForPreset(preset) { + /** + * Tries to load one preset. The input is either the module name of the preset, + * a function, or an object + */ + loadPreset(preset, options, meta) { let presetFactory = preset; if (typeof presetFactory === "string") { presetFactory = require(presetFactory); } - // If the imported preset is a transpiled ES2015 module if (typeof presetFactory === "object" && presetFactory.__esModule) { if (presetFactory.default) { presetFactory = presetFactory.default; @@ -299,12 +300,17 @@ export default class OptionManager { } } + // Allow simple object exports + if (typeof presetFactory === "object") { + return presetFactory; + } + if (typeof presetFactory !== "function") { // eslint-disable-next-line max-len throw new Error(`Unsupported preset format: ${typeof presetFactory}. Expected preset to return a function.`); } - return presetFactory; + return presetFactory(context, options, meta); } normaliseOptions() { diff --git a/packages/babel-core/test/fixtures/option-manager/presets/es2015_default.js b/packages/babel-core/test/fixtures/option-manager/presets/es2015_default_object.js similarity index 100% rename from packages/babel-core/test/fixtures/option-manager/presets/es2015_default.js rename to packages/babel-core/test/fixtures/option-manager/presets/es2015_default_object.js diff --git a/packages/babel-core/test/fixtures/option-manager/presets/es2015_invalid.js b/packages/babel-core/test/fixtures/option-manager/presets/es2015_invalid.js new file mode 100644 index 0000000000..88437e1088 --- /dev/null +++ b/packages/babel-core/test/fixtures/option-manager/presets/es2015_invalid.js @@ -0,0 +1,6 @@ +// from code: +// export default "string"; +'use strict'; + +exports.__esModule = true; +exports.default = "string"; diff --git a/packages/babel-core/test/fixtures/option-manager/presets/es5.js b/packages/babel-core/test/fixtures/option-manager/presets/es5_object.js similarity index 100% rename from packages/babel-core/test/fixtures/option-manager/presets/es5.js rename to packages/babel-core/test/fixtures/option-manager/presets/es5_object.js diff --git a/packages/babel-core/test/option-manager.js b/packages/babel-core/test/option-manager.js index 582b61d8be..665a514668 100644 --- a/packages/babel-core/test/option-manager.js +++ b/packages/babel-core/test/option-manager.js @@ -76,11 +76,12 @@ describe("option-manager", () => { } presetTest("es5_function"); + presetTest("es5_object"); presetTest("es2015_default_function"); + presetTest("es2015_default_object"); - presetThrowsTest("es5", /Expected preset to return a function./); - presetThrowsTest("es2015_default", /Expected preset to return a function./); presetThrowsTest("es2015_named", /Preset must export a default export when using ES6 modules/); + presetThrowsTest("es2015_invalid", /Unsupported preset format: string/); presetThrowsTest("es5_invalid", /Unsupported preset format: string/); }); });