Skip to content

Commit 6303126

Browse files
committed
added support for customizing Browserslist discovery
passing `resolvePath` through several layers is awkward, but seemingly inevitable (cf. b2bde4f)
1 parent b4b8690 commit 6303126

File tree

6 files changed

+45
-10
lines changed

6 files changed

+45
-10
lines changed

lib/bundle/config.js

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
let generateTranspiler = require("./babel");
44
let { requireOptional } = require("../util");
5+
let determineBrowserslist = require("faucet-pipeline/lib/util/browserslist");
56
let commonjs = require("rollup-plugin-commonjs");
67
let nodeResolve = require("rollup-plugin-node-resolve");
78

@@ -24,7 +25,8 @@ module.exports = generateConfig;
2425
// exports (if any)
2526
// * `esnext`, if truthy, activates ESNext transpilation
2627
// * `esnext.browserslist`, if `false`, suppresses automatic configuration
27-
// via Browserslist
28+
// via Browserslist - alternatively, a path to a directory containing a
29+
// custom Browserslist configuration
2830
// * `esnext.exclude` is a list of modules for which to skip transpilation
2931
// (e.g. `esnext: { exclude: ["jquery"] }`, perhaps due to a distribution
3032
// already optimized for ES5)
@@ -37,7 +39,8 @@ module.exports = generateConfig;
3739
// * `compact`, if truthy, compresses the bundle's code while retaining the
3840
// source code's original structure
3941
function generateConfig({ extensions = [], // eslint-disable-next-line indent
40-
externals, format, moduleName, esnext, jsx, typescript, compact }, { browsers }) {
42+
externals, format, moduleName, esnext, jsx, typescript, compact },
43+
{ browsers, resolvePath }) {
4144
let plugins = [];
4245
if(esnext || jsx) {
4346
let transpiler = Object.assign({}, esnext, jsx);
@@ -48,8 +51,16 @@ function generateConfig({ extensions = [], // eslint-disable-next-line indent
4851
delete transpiler.pragma; // just to be safe, clean up JSX-specifics
4952
transpiler.jsx = jsx;
5053
}
51-
if(transpiler.browserslist === false) { // TODO: support for custom path
54+
55+
let { browserslist } = transpiler
56+
if(browserslist === false) {
5257
browsers = null;
58+
} else if(browserslist) {
59+
let dir = resolvePath(browserslist, { enforceRelative: true });
60+
browsers = determineBrowserslist(dir);
61+
if(!browsers) {
62+
throw new Error(`failed to detect Browserslist in ${browserslist}`);
63+
}
5364
}
5465

5566
let { plugin, extensions: ext } = generateTranspiler(transpiler, { browsers });

lib/bundle/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,12 @@ let DEFAULTS = {
1010
};
1111

1212
module.exports = class Bundle {
13-
constructor(entryPoint, target, config, { browsers }) {
13+
constructor(entryPoint, target, config, { browsers, resolvePath }) {
1414
this.entryPoint = entryPoint;
1515
this.target = target;
1616

1717
config = Object.assign({}, DEFAULTS, config);
18-
this._config = generateConfig(config, { browsers });
18+
this._config = generateConfig(config, { browsers, resolvePath });
1919
}
2020

2121
// recompiles the bundle if its dependency graph includes any of the given files

lib/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ function makeBundle(config, resolvePath, { browsers }) {
4141

4242
entryPoint = resolvePath(entryPoint);
4343
target = resolvePath(target, { enforceRelative: true });
44-
return new Bundle(entryPoint, target, config, { browsers });
44+
return new Bundle(entryPoint, target, config, { browsers, resolvePath });
4545
}
4646

4747
// removes properties from object, returning their respective values

package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "faucet-pipeline-js",
3-
"version": "1.0.0-beta.0",
3+
"version": "1.0.0-beta.1",
44
"description": "JavaScript module bundling for faucet-pipeline",
55
"author": "FND",
66
"contributors": [
@@ -26,9 +26,9 @@
2626
"node": ">=6"
2727
},
2828
"dependencies": {
29-
"faucet-pipeline": "1.0.0-beta.0",
29+
"faucet-pipeline": "1.0.0-beta.1",
3030
"mkdirp": "^0.5.1",
31-
"rollup": "^0.56.1",
31+
"rollup": "^0.56.2",
3232
"rollup-plugin-commonjs": "^8.3.0",
3333
"rollup-plugin-node-resolve": "^3.0.3"
3434
},
@@ -40,6 +40,6 @@
4040
"json-diff": "^0.5.2",
4141
"mocha": "^5.0.1",
4242
"npm-run-all": "^4.1.2",
43-
"release-util-fnd": "^1.0.7"
43+
"release-util-fnd": "^1.1.0"
4444
}
4545
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Chrome 63

test/unit/test_bundling.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,29 @@ console.log("[\\u2026] " + util); // eslint-disable-line no-console
268268
});
269269
});
270270

271+
it("should allow specifying an alternative Browserslist directory", () => {
272+
let config = [{
273+
source: "./src/index.js",
274+
target: "./dist/bundle.js",
275+
esnext: {
276+
browserslist: "./alt"
277+
}
278+
}];
279+
let assetManager = new MockAssetManager(FIXTURES_DIR);
280+
281+
return faucetJS(config, assetManager, { browsers: ["IE 11"] }).
282+
then(_ => {
283+
assetManager.assertWrites([{
284+
filepath: path.resolve(FIXTURES_DIR, "./dist/bundle.js"),
285+
content: makeBundle(`
286+
var util = "UTIL";
287+
288+
console.log(\`[…] $\{util}\`); // eslint-disable-line no-console
289+
`.trim())
290+
}]);
291+
});
292+
});
293+
271294
it("should optionally compact bundle", () => {
272295
let config = [{
273296
source: "./src/index.js",

0 commit comments

Comments
 (0)