1 |
|
2 |
|
3 | import type {Environment} from '@parcel/types';
|
4 | import type {Targets as BabelTargets} from '@babel/preset-env';
|
5 |
|
6 | import invariant from 'assert';
|
7 | import semver from 'semver';
|
8 | import {TargetNames} from '@babel/helper-compilation-targets/lib/options';
|
9 |
|
10 |
|
11 |
|
12 | const ESMODULE_BROWSERS = [
|
13 | 'not ie <= 11',
|
14 | 'not edge < 16',
|
15 | 'not firefox < 60',
|
16 | 'not chrome < 61',
|
17 | 'not safari < 11',
|
18 | 'not opera < 48',
|
19 | 'not ios_saf < 11',
|
20 | 'not op_mini all',
|
21 | 'not android < 76',
|
22 | 'not blackberry > 0',
|
23 | 'not op_mob > 0',
|
24 | 'not and_chr < 76',
|
25 | 'not and_ff < 68',
|
26 | 'not ie_mob > 0',
|
27 | 'not and_uc > 0',
|
28 | 'not samsung < 8.2',
|
29 | 'not and_qq > 0',
|
30 | 'not baidu > 0',
|
31 | 'not kaios > 0',
|
32 | ];
|
33 |
|
34 | export function enginesToBabelTargets(env: Environment): BabelTargets {
|
35 |
|
36 |
|
37 |
|
38 |
|
39 | let targets = {};
|
40 | for (let engineName of Object.keys(env.engines)) {
|
41 | let engineValue = env.engines[engineName];
|
42 |
|
43 |
|
44 |
|
45 | if (engineName === 'browsers') {
|
46 | targets[engineName] = engineValue;
|
47 | } else {
|
48 | invariant(typeof engineValue === 'string');
|
49 | if (!TargetNames.hasOwnProperty(engineName)) continue;
|
50 | let minVersion = getMinSemver(engineValue);
|
51 | targets[engineName] = minVersion ?? engineValue;
|
52 | }
|
53 | }
|
54 |
|
55 | if (env.outputFormat === 'esmodule' && env.isBrowser()) {
|
56 |
|
57 |
|
58 |
|
59 |
|
60 | if (targets.browsers) {
|
61 | let browsers = Array.isArray(targets.browsers)
|
62 | ? targets.browsers
|
63 | : [targets.browsers];
|
64 | targets.browsers = [...browsers, ...ESMODULE_BROWSERS];
|
65 | } else {
|
66 | targets.esmodules = true;
|
67 | }
|
68 | }
|
69 |
|
70 | return targets;
|
71 | }
|
72 |
|
73 |
|
74 |
|
75 | export function getMinSemver(version: string): ?string {
|
76 | try {
|
77 | let range = new semver.Range(version);
|
78 | let sorted = range.set.sort((a, b) => a[0].semver.compare(b[0].semver));
|
79 | return sorted[0][0].semver.version;
|
80 | } catch (err) {
|
81 | return null;
|
82 | }
|
83 | }
|