You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.4 KiB
95 lines
2.4 KiB
/** |
|
* 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 };
|
|
|