UNPKG

4.56 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
6
7const browserslist = require('browserslist');
8
9const semver = require('semver');
10
11const Path = require('path');
12
13const DEFAULT_ENGINES = {
14 browsers: ['> 0.25%'],
15 node: '8'
16};
17/**
18 * Loads target node and browser versions from the following locations:
19 * - package.json engines field
20 * - package.json browserslist field
21 * - browserslist or .browserslistrc files
22 * - .babelrc or .babelrc.js files with @babel/preset-env
23 */
24
25function getTargetEngines(_x, _x2) {
26 return _getTargetEngines.apply(this, arguments);
27}
28
29function _getTargetEngines() {
30 _getTargetEngines = (0, _asyncToGenerator2.default)(function* (asset, isTargetApp) {
31 let targets = {};
32 let path = isTargetApp ? Path.join(asset.options.rootDir, 'index') : asset.name;
33 let compileTarget = asset.options.target === 'browser' ? 'browsers' : asset.options.target;
34 let pkg = yield asset.getConfig(['package.json'], {
35 path
36 });
37 let engines = pkg && pkg.engines;
38 let nodeVersion = engines && getMinSemver(engines.node);
39
40 if (compileTarget === 'node') {
41 // Use package.engines.node by default if we are compiling for node.
42 if (typeof nodeVersion === 'string') {
43 targets.node = nodeVersion;
44 }
45 } else {
46 if (engines && (typeof engines.browsers === 'string' || Array.isArray(engines.browsers))) {
47 targets.browsers = engines.browsers;
48 } else if (pkg && pkg.browserslist) {
49 targets.browsers = pkg.browserslist;
50 } else {
51 let browserslist = yield loadBrowserslist(asset, path);
52
53 if (browserslist) {
54 targets.browsers = browserslist;
55 } else {
56 let babelTargets = yield loadBabelrc(asset, path);
57
58 if (babelTargets && babelTargets.browsers) {
59 targets.browsers = babelTargets.browsers;
60 } else if (babelTargets && babelTargets.node && !nodeVersion) {
61 nodeVersion = babelTargets.node;
62 }
63 }
64 } // Fall back to package.engines.node for node_modules without any browser target info.
65
66
67 if (!isTargetApp && !targets.browsers && typeof nodeVersion === 'string') {
68 targets.node = nodeVersion;
69 }
70 } // If we didn't find any targets, set some default engines for the target app.
71
72
73 if (isTargetApp && !targets[compileTarget] && DEFAULT_ENGINES[compileTarget]) {
74 targets[compileTarget] = DEFAULT_ENGINES[compileTarget];
75 } // Parse browser targets
76
77
78 if (targets.browsers) {
79 if (typeof targets.browsers === 'object' && !Array.isArray(targets.browsers)) {
80 let env = asset.options.production ? 'production' : process.env.NODE_ENV || 'development';
81 targets.browsers = targets.browsers[env] || targets.browsers.defaults;
82 }
83
84 if (targets.browsers) {
85 targets.browsers = browserslist(targets.browsers).sort();
86 }
87 } // Dont compile if we couldn't find any targets
88
89
90 if (Object.keys(targets).length === 0) {
91 return null;
92 }
93
94 return targets;
95 });
96 return _getTargetEngines.apply(this, arguments);
97}
98
99function getMinSemver(version) {
100 try {
101 let range = new semver.Range(version);
102 let sorted = range.set.sort((a, b) => a[0].semver.compare(b[0].semver));
103 return sorted[0][0].semver.version;
104 } catch (err) {
105 return null;
106 }
107}
108
109function loadBrowserslist(_x3, _x4) {
110 return _loadBrowserslist.apply(this, arguments);
111}
112
113function _loadBrowserslist() {
114 _loadBrowserslist = (0, _asyncToGenerator2.default)(function* (asset, path) {
115 let config = yield asset.getConfig(['browserslist', '.browserslistrc'], {
116 path,
117 load: false
118 });
119
120 if (config) {
121 return browserslist.readConfig(config);
122 }
123 });
124 return _loadBrowserslist.apply(this, arguments);
125}
126
127function loadBabelrc(_x5, _x6) {
128 return _loadBabelrc.apply(this, arguments);
129}
130
131function _loadBabelrc() {
132 _loadBabelrc = (0, _asyncToGenerator2.default)(function* (asset, path) {
133 let config = yield asset.getConfig(['.babelrc', '.babelrc.js'], {
134 path
135 });
136
137 if (config && config.presets) {
138 let env = config.presets.find(plugin => Array.isArray(plugin) && (plugin[0] === 'env' || plugin[0] === '@babel/env'));
139
140 if (env && env[1] && env[1].targets) {
141 return env[1].targets;
142 }
143 }
144 });
145 return _loadBabelrc.apply(this, arguments);
146}
147
148module.exports = getTargetEngines;
\No newline at end of file