1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 | 'use strict';
|
8 |
|
9 | const browserslist = require('browserslist');
|
10 | const chalk = require('chalk');
|
11 | const os = require('os');
|
12 | const prompts = require('prompts');
|
13 | const pkgUp = require('pkg-up');
|
14 | const fs = require('fs');
|
15 |
|
16 | const defaultBrowsers = {
|
17 | production: ['>0.2%', 'not dead', 'not op_mini all'],
|
18 | development: [
|
19 | 'last 1 chrome version',
|
20 | 'last 1 firefox version',
|
21 | 'last 1 safari version',
|
22 | ],
|
23 | };
|
24 |
|
25 | function shouldSetBrowsers(isInteractive) {
|
26 | if (!isInteractive) {
|
27 | return Promise.resolve(true);
|
28 | }
|
29 |
|
30 | const question = {
|
31 | type: 'confirm',
|
32 | name: 'shouldSetBrowsers',
|
33 | message:
|
34 | chalk.yellow("We're unable to detect target browsers.") +
|
35 | `\n\nWould you like to add the defaults to your ${chalk.bold(
|
36 | 'package.json'
|
37 | )}?`,
|
38 | initial: true,
|
39 | };
|
40 |
|
41 | return prompts(question).then(answer => answer.shouldSetBrowsers);
|
42 | }
|
43 |
|
44 | function checkBrowsers(dir, isInteractive, retry = true) {
|
45 | const current = browserslist.loadConfig({ path: dir });
|
46 | if (current != null) {
|
47 | return Promise.resolve(current);
|
48 | }
|
49 |
|
50 | if (!retry) {
|
51 | return Promise.reject(
|
52 | new Error(
|
53 | chalk.red(
|
54 | 'As of react-scripts >=2 you must specify targeted browsers.'
|
55 | ) +
|
56 | os.EOL +
|
57 | `Please add a ${chalk.underline(
|
58 | 'browserslist'
|
59 | )} key to your ${chalk.bold('package.json')}.`
|
60 | )
|
61 | );
|
62 | }
|
63 |
|
64 | return shouldSetBrowsers(isInteractive).then(shouldSetBrowsers => {
|
65 | if (!shouldSetBrowsers) {
|
66 | return checkBrowsers(dir, isInteractive, false);
|
67 | }
|
68 |
|
69 | return (
|
70 | pkgUp({ cwd: dir })
|
71 | .then(filePath => {
|
72 | if (filePath == null) {
|
73 | return Promise.reject();
|
74 | }
|
75 | const pkg = JSON.parse(fs.readFileSync(filePath));
|
76 | pkg['browserslist'] = defaultBrowsers;
|
77 | fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + os.EOL);
|
78 |
|
79 | browserslist.clearCaches();
|
80 | console.log();
|
81 | console.log(
|
82 | `${chalk.green('Set target browsers:')} ${chalk.cyan(
|
83 | defaultBrowsers.join(', ')
|
84 | )}`
|
85 | );
|
86 | console.log();
|
87 | })
|
88 |
|
89 | .catch(() => {})
|
90 | .then(() => checkBrowsers(dir, isInteractive, false))
|
91 | );
|
92 | });
|
93 | }
|
94 |
|
95 | module.exports = { defaultBrowsers, checkBrowsers };
|