|
7 | 7 | */
|
8 | 8 |
|
9 | 9 | import browserslist from 'browserslist';
|
| 10 | +import { promises as fs } from 'fs'; |
10 | 11 |
|
11 |
| -export function getSupportedBrowsers( |
| 12 | +export async function getSupportedBrowsers( |
12 | 13 | projectRoot: string,
|
13 | 14 | logger: { warn(message: string): void },
|
14 |
| -): string[] { |
15 |
| - browserslist.defaults = [ |
16 |
| - 'last 2 Chrome versions', |
17 |
| - 'last 1 Firefox version', |
18 |
| - 'last 2 Edge major versions', |
19 |
| - 'last 2 Safari major versions', |
20 |
| - 'last 2 iOS major versions', |
21 |
| - 'last 2 Android major versions', |
22 |
| - 'Firefox ESR', |
23 |
| - ]; |
| 15 | +): Promise<string[]> { |
| 16 | + // Read the browserslist configuration containing Angular's browser support policy. |
| 17 | + const angularBrowserslist = ( |
| 18 | + await fs.readFile(require.resolve('../browserslist/.browserslistrc'), 'utf8') |
| 19 | + ) |
| 20 | + .split('\n') |
| 21 | + .filter((line) => !line.startsWith('#')); // Omit comments. |
| 22 | + |
| 23 | + // Use Angular's configuration as the default. |
| 24 | + browserslist.defaults = angularBrowserslist; |
| 25 | + |
| 26 | + // Get the minimum set of browser versions supported by Angular. |
| 27 | + const minimumBrowsers = new Set(browserslist(angularBrowserslist)); |
24 | 28 |
|
25 | 29 | // Get browsers from config or default.
|
26 | 30 | const browsersFromConfigOrDefault = new Set(browserslist(undefined, { path: projectRoot }));
|
27 | 31 |
|
28 | 32 | // Get browsers that support ES6 modules.
|
29 | 33 | const browsersThatSupportEs6 = new Set(browserslist('supports es6-module'));
|
30 | 34 |
|
| 35 | + const nonEs6Browsers: string[] = []; |
31 | 36 | const unsupportedBrowsers: string[] = [];
|
32 | 37 | for (const browser of browsersFromConfigOrDefault) {
|
33 | 38 | if (!browsersThatSupportEs6.has(browser)) {
|
| 39 | + // Any browser which does not support ES6 is explicitly ignored, as Angular will not build successfully. |
34 | 40 | browsersFromConfigOrDefault.delete(browser);
|
| 41 | + nonEs6Browsers.push(browser); |
| 42 | + } else if (!minimumBrowsers.has(browser)) { |
| 43 | + // Any other unsupported browser we will attempt to use, but provide no support for. |
35 | 44 | unsupportedBrowsers.push(browser);
|
36 | 45 | }
|
37 | 46 | }
|
38 | 47 |
|
39 |
| - if (unsupportedBrowsers.length) { |
| 48 | + if (nonEs6Browsers.length) { |
40 | 49 | logger.warn(
|
41 | 50 | `One or more browsers which are configured in the project's Browserslist configuration ` +
|
42 | 51 | 'will be ignored as ES5 output is not supported by the Angular CLI.\n' +
|
43 |
| - `Ignored browsers: ${unsupportedBrowsers.join(', ')}`, |
| 52 | + `Ignored browsers:\n${nonEs6Browsers.join(', ')}`, |
| 53 | + ); |
| 54 | + } |
| 55 | + |
| 56 | + if (unsupportedBrowsers.length) { |
| 57 | + logger.warn( |
| 58 | + `One or more browsers which are configured in the project's Browserslist configuration ` + |
| 59 | + "fall outside Angular's browser support for this version.\n" + |
| 60 | + `Unsupported browsers:\n${unsupportedBrowsers.join(', ')}`, |
44 | 61 | );
|
45 | 62 | }
|
46 | 63 |
|
|
0 commit comments