nx/packages/angular/src/migrations/update-15-2-0/remove-browserlist-config.ts
2022-11-17 09:31:45 -05:00

78 lines
2.0 KiB
TypeScript

import type { Tree } from '@nrwl/devkit';
import { logger, visitNotIgnoredFiles } from '@nrwl/devkit';
import { basename } from 'path';
const validBrowserslistConfigFilenames = new Set([
'browserslist',
'.browserslistrc',
]);
export const DEFAULT_BROWSERS = [
'last 1 Chrome version',
'last 1 Firefox version',
'last 2 Edge major versions',
'last 2 Safari major versions',
'last 2 iOS major versions',
'Firefox ESR',
];
export default async function removeBrowserlistConfig(tree: Tree) {
let browserslist: any;
try {
browserslist = await import('browserslist');
} catch {
logger.warn(
'Skipping migration because the "browserslist" package could not be loaded.'
);
return;
}
// Set the defaults to match the defaults in build-angular.
browserslist.defaults = DEFAULT_BROWSERS;
const defaultSupportedBrowsers = new Set(browserslist(DEFAULT_BROWSERS));
const es5Browsers = new Set(browserslist(['supports es6-module']));
visitNotIgnoredFiles(tree, '/', (path) => {
const fileName = basename(path);
if (
!validBrowserslistConfigFilenames.has(fileName) ||
path.startsWith('node_modules')
) {
return;
}
const { defaults: browsersListConfig, ...otherConfigs } =
browserslist.parseConfig(tree.read(path, 'utf-8'));
if (Object.keys(otherConfigs).length) {
// The config contains additional sections.
return;
}
const browserslistInProject = browserslist(
// Exclude from the list ES5 browsers which are not supported.
browsersListConfig.map((s) => `${s} and supports es6-module`),
{
ignoreUnknownVersions: true,
}
);
if (defaultSupportedBrowsers.size !== browserslistInProject.length) {
return;
}
const shouldDelete = browserslistInProject.every((browser) =>
defaultSupportedBrowsers.has(browser)
);
if (shouldDelete) {
// All browsers are the same as the default config.
// Delete file as it's redundant.
tree.delete(path);
}
});
}