Skip to content

Commit 897f553

Browse files
loganfsmythhzoo
authored andcommitted
Support passing options to presets. (#3331)
1 parent a959ebe commit 897f553

File tree

3 files changed

+113
-36
lines changed

3 files changed

+113
-36
lines changed

packages/babel-core/src/transformation/file/options/option-manager.js

+30-11
Original file line numberDiff line numberDiff line change
@@ -248,21 +248,40 @@ export default class OptionManager {
248248
*/
249249
resolvePresets(presets: Array<string | Object>, dirname: string, onResolve?) {
250250
return presets.map((val) => {
251+
let options;
252+
if (Array.isArray(val)) {
253+
if (val.length > 2) {
254+
throw new Error(`Unexpected extra options ${JSON.stringify(val.slice(2))} many ` +
255+
"options passed to preset.");
256+
}
257+
258+
[val, options] = val;
259+
}
260+
261+
let presetLoc;
251262
if (typeof val === "string") {
252-
let presetLoc = resolve(`babel-preset-${val}`, dirname) || resolve(val, dirname);
253-
if (presetLoc) {
254-
let val = require(presetLoc);
255-
onResolve && onResolve(val, presetLoc);
256-
return val;
257-
} else {
258-
throw new Error(`Couldn't find preset ${JSON.stringify(val)} relative to directory ${JSON.stringify(dirname)}`);
263+
presetLoc = resolve(`babel-preset-${val}`, dirname) || resolve(val, dirname);
264+
if (!presetLoc) {
265+
throw new Error(`Couldn't find preset ${JSON.stringify(val)} relative to directory ` +
266+
JSON.stringify(dirname));
259267
}
260-
} else if (typeof val === "object") {
261-
onResolve && onResolve(val);
262-
return val;
263-
} else {
268+
269+
val = require(presetLoc);
270+
}
271+
272+
if (typeof val !== "function" && options !== undefined) {
273+
throw new Error(`Options ${JSON.stringify(options)} passed to ` +
274+
(presetLoc || "a preset") + " which does not accept options.");
275+
}
276+
277+
if (typeof val === "function") val = val(context, options);
278+
279+
if (typeof val !== "object") {
264280
throw new Error(`Unsupported preset format: ${val}.`);
265281
}
282+
283+
onResolve && onResolve(val);
284+
return val;
266285
});
267286
}
268287

packages/babel-preset-es2015/README.md

+14-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ $ npm install --save-dev babel-preset-es2015
2323
### Via CLI
2424

2525
```sh
26-
$ babel script.js --presets es2015
26+
$ babel script.js --presets es2015
2727
```
2828

2929
### Via Node API
@@ -33,3 +33,16 @@ require("babel-core").transform("code", {
3333
presets: ["es2015"]
3434
});
3535
```
36+
37+
## Options
38+
39+
* `loose` - Enable "loose" transformations for any plugins in this preset that allow them (Disabled by default).
40+
* `modules` - Enable transformation of ES6 module syntax to CommonJS (Enabled by default).
41+
42+
```
43+
{
44+
presets: [
45+
["es2015", {loose: true, modules: false}]
46+
]
47+
}
48+
```

packages/babel-preset-es2015/index.js

+69-24
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,70 @@
1-
module.exports = {
2-
plugins: [
3-
require("babel-plugin-transform-es2015-template-literals"),
4-
require("babel-plugin-transform-es2015-literals"),
5-
require("babel-plugin-transform-es2015-function-name"),
6-
require("babel-plugin-transform-es2015-arrow-functions"),
7-
require("babel-plugin-transform-es2015-block-scoped-functions"),
8-
require("babel-plugin-transform-es2015-classes"),
9-
require("babel-plugin-transform-es2015-object-super"),
10-
require("babel-plugin-transform-es2015-shorthand-properties"),
11-
require("babel-plugin-transform-es2015-duplicate-keys"),
12-
require("babel-plugin-transform-es2015-computed-properties"),
13-
require("babel-plugin-transform-es2015-for-of"),
14-
require("babel-plugin-transform-es2015-sticky-regex"),
15-
require("babel-plugin-transform-es2015-unicode-regex"),
16-
require("babel-plugin-check-es2015-constants"),
17-
require("babel-plugin-transform-es2015-spread"),
18-
require("babel-plugin-transform-es2015-parameters"),
19-
require("babel-plugin-transform-es2015-destructuring"),
20-
require("babel-plugin-transform-es2015-block-scoping"),
21-
require("babel-plugin-transform-es2015-typeof-symbol"),
22-
require("babel-plugin-transform-es2015-modules-commonjs"),
23-
[require("babel-plugin-transform-regenerator"), { async: false, asyncGenerators: false }],
24-
]
1+
module.exports = function(context, opts) {
2+
/* eslint-disable no-var */
3+
var loose = false;
4+
var modules = true;
5+
/* eslint-enable no-var */
6+
if (opts !== undefined) {
7+
if (opts.loose !== undefined) loose = opts.loose;
8+
if (opts.modules !== undefined) modules = opts.modules;
9+
}
10+
11+
if (typeof loose !== "boolean") throw new Error("Preset es2015 'loose' option must be a boolean.");
12+
if (typeof modules !== "boolean") throw new Error("Preset es2015 'modules' option must be a boolean.");
13+
14+
return {
15+
plugins: [
16+
[require("babel-plugin-transform-es2015-template-literals"), {loose: loose}],
17+
require("babel-plugin-transform-es2015-literals"),
18+
require("babel-plugin-transform-es2015-function-name"),
19+
require("babel-plugin-transform-es2015-arrow-functions"),
20+
require("babel-plugin-transform-es2015-block-scoped-functions"),
21+
[require("babel-plugin-transform-es2015-classes"), {loose: loose}],
22+
require("babel-plugin-transform-es2015-object-super"),
23+
require("babel-plugin-transform-es2015-shorthand-properties"),
24+
require("babel-plugin-transform-es2015-duplicate-keys"),
25+
[require("babel-plugin-transform-es2015-computed-properties"), {loose: loose}],
26+
[require("babel-plugin-transform-es2015-for-of"), {loose: loose}],
27+
require("babel-plugin-transform-es2015-sticky-regex"),
28+
require("babel-plugin-transform-es2015-unicode-regex"),
29+
require("babel-plugin-check-es2015-constants"),
30+
[require("babel-plugin-transform-es2015-spread"), {loose: loose}],
31+
require("babel-plugin-transform-es2015-parameters"),
32+
[require("babel-plugin-transform-es2015-destructuring"), {loose: loose}],
33+
require("babel-plugin-transform-es2015-block-scoping"),
34+
require("babel-plugin-transform-es2015-typeof-symbol"),
35+
].concat(modules ? [
36+
[require("babel-plugin-transform-es2015-modules-commonjs"), {loose: loose}],
37+
] : []).concat([
38+
[require("babel-plugin-transform-regenerator"), { async: false, asyncGenerators: false }],
39+
]),
40+
};
2541
};
42+
43+
/**
44+
* This preset was originally an object, before function-based configurable presets were introduced.
45+
* For backward-compatibility with anything that may have been loading this preset and expecting
46+
* it to be a simple Babel config object, we maintain the old config here.
47+
*/
48+
module.exports.plugins = [
49+
require("babel-plugin-transform-es2015-template-literals"),
50+
require("babel-plugin-transform-es2015-literals"),
51+
require("babel-plugin-transform-es2015-function-name"),
52+
require("babel-plugin-transform-es2015-arrow-functions"),
53+
require("babel-plugin-transform-es2015-block-scoped-functions"),
54+
require("babel-plugin-transform-es2015-classes"),
55+
require("babel-plugin-transform-es2015-object-super"),
56+
require("babel-plugin-transform-es2015-shorthand-properties"),
57+
require("babel-plugin-transform-es2015-duplicate-keys"),
58+
require("babel-plugin-transform-es2015-computed-properties"),
59+
require("babel-plugin-transform-es2015-for-of"),
60+
require("babel-plugin-transform-es2015-sticky-regex"),
61+
require("babel-plugin-transform-es2015-unicode-regex"),
62+
require("babel-plugin-check-es2015-constants"),
63+
require("babel-plugin-transform-es2015-spread"),
64+
require("babel-plugin-transform-es2015-parameters"),
65+
require("babel-plugin-transform-es2015-destructuring"),
66+
require("babel-plugin-transform-es2015-block-scoping"),
67+
require("babel-plugin-transform-es2015-typeof-symbol"),
68+
require("babel-plugin-transform-es2015-modules-commonjs"),
69+
[require("babel-plugin-transform-regenerator"), { async: false, asyncGenerators: false }],
70+
];

0 commit comments

Comments
 (0)