96 lines
2.4 KiB
JavaScript
96 lines
2.4 KiB
JavaScript
|
/**
|
||
|
* Copyright (c) 2015-present, Facebook, Inc.
|
||
|
*
|
||
|
* This source code is licensed under the MIT license found in the
|
||
|
* LICENSE file in the root directory of this source tree.
|
||
|
*/
|
||
|
'use strict';
|
||
|
|
||
|
const browserslist = require('browserslist');
|
||
|
const chalk = require('chalk');
|
||
|
const os = require('os');
|
||
|
const prompts = require('prompts');
|
||
|
const pkgUp = require('pkg-up');
|
||
|
const fs = require('fs');
|
||
|
|
||
|
const defaultBrowsers = {
|
||
|
production: ['>0.2%', 'not dead', 'not op_mini all'],
|
||
|
development: [
|
||
|
'last 1 chrome version',
|
||
|
'last 1 firefox version',
|
||
|
'last 1 safari version',
|
||
|
],
|
||
|
};
|
||
|
|
||
|
function shouldSetBrowsers(isInteractive) {
|
||
|
if (!isInteractive) {
|
||
|
return Promise.resolve(true);
|
||
|
}
|
||
|
|
||
|
const question = {
|
||
|
type: 'confirm',
|
||
|
name: 'shouldSetBrowsers',
|
||
|
message:
|
||
|
chalk.yellow("We're unable to detect target browsers.") +
|
||
|
`\n\nWould you like to add the defaults to your ${chalk.bold(
|
||
|
'package.json'
|
||
|
)}?`,
|
||
|
initial: true,
|
||
|
};
|
||
|
|
||
|
return prompts(question).then(answer => answer.shouldSetBrowsers);
|
||
|
}
|
||
|
|
||
|
function checkBrowsers(dir, isInteractive, retry = true) {
|
||
|
const current = browserslist.loadConfig({ path: dir });
|
||
|
if (current != null) {
|
||
|
return Promise.resolve(current);
|
||
|
}
|
||
|
|
||
|
if (!retry) {
|
||
|
return Promise.reject(
|
||
|
new Error(
|
||
|
chalk.red(
|
||
|
'As of react-scripts >=2 you must specify targeted browsers.'
|
||
|
) +
|
||
|
os.EOL +
|
||
|
`Please add a ${chalk.underline(
|
||
|
'browserslist'
|
||
|
)} key to your ${chalk.bold('package.json')}.`
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
return shouldSetBrowsers(isInteractive).then(shouldSetBrowsers => {
|
||
|
if (!shouldSetBrowsers) {
|
||
|
return checkBrowsers(dir, isInteractive, false);
|
||
|
}
|
||
|
|
||
|
return (
|
||
|
pkgUp({ cwd: dir })
|
||
|
.then(filePath => {
|
||
|
if (filePath == null) {
|
||
|
return Promise.reject();
|
||
|
}
|
||
|
const pkg = JSON.parse(fs.readFileSync(filePath));
|
||
|
pkg['browserslist'] = defaultBrowsers;
|
||
|
fs.writeFileSync(filePath, JSON.stringify(pkg, null, 2) + os.EOL);
|
||
|
|
||
|
browserslist.clearCaches();
|
||
|
console.log();
|
||
|
console.log(
|
||
|
`${chalk.green('Set target browsers:')} ${chalk.cyan(
|
||
|
defaultBrowsers.join(', ')
|
||
|
)}`
|
||
|
);
|
||
|
console.log();
|
||
|
})
|
||
|
// Swallow any error
|
||
|
.catch(() => {})
|
||
|
.then(() => checkBrowsers(dir, isInteractive, false))
|
||
|
);
|
||
|
});
|
||
|
}
|
||
|
|
||
|
module.exports = { defaultBrowsers, checkBrowsers };
|