From 9aa1367f32b94b784c5d6e55a3e1f50d6220e216 Mon Sep 17 00:00:00 2001 From: neverland Date: Thu, 20 Jun 2024 17:52:01 +0800 Subject: [PATCH 1/3] feat!: add browserslist to context.environments --- packages/compat/plugin-swc/src/plugin.ts | 2 + packages/compat/plugin-swc/src/utils.ts | 11 +- packages/core/src/createContext.ts | 64 +++-- packages/core/src/mergeConfig.ts | 1 + packages/core/src/plugins/css.ts | 9 +- packages/core/src/plugins/swc.ts | 20 +- packages/core/src/plugins/target.ts | 14 +- packages/core/src/provider/initConfigs.ts | 2 +- .../core/tests/__snapshots__/swc.test.ts.snap | 236 ------------------ packages/core/tests/swc.test.ts | 18 -- packages/core/tests/target.test.ts | 6 +- packages/plugin-check-syntax/src/index.ts | 33 +-- packages/plugin-lightningcss/src/plugin.ts | 23 +- packages/shared/src/getBrowserslist.ts | 30 --- packages/shared/src/types/config/output.ts | 6 +- packages/shared/src/types/context.ts | 1 + packages/shared/tests/getBrowserslist.test.ts | 105 +------- 17 files changed, 82 insertions(+), 499 deletions(-) diff --git a/packages/compat/plugin-swc/src/plugin.ts b/packages/compat/plugin-swc/src/plugin.ts index 964a49a67f..4235d26406 100644 --- a/packages/compat/plugin-swc/src/plugin.ts +++ b/packages/compat/plugin-swc/src/plugin.ts @@ -43,11 +43,13 @@ export const pluginSwc = (options: PluginSwcOptions = {}): RsbuildPlugin => ({ const rsbuildConfig = api.getNormalizedConfig(); const { rootPath } = api.context; + const { browserslist } = api.context.environments[utils.environment]; const swcConfigs = await applyPluginConfig( options, utils, rsbuildConfig, rootPath, + browserslist, ); // If babel plugin is used, replace babel-loader diff --git a/packages/compat/plugin-swc/src/utils.ts b/packages/compat/plugin-swc/src/utils.ts index 12f3273c19..e904a9a96e 100644 --- a/packages/compat/plugin-swc/src/utils.ts +++ b/packages/compat/plugin-swc/src/utils.ts @@ -2,7 +2,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { __internalHelper } from '@rsbuild/core'; import type { ModifyChainUtils, NormalizedConfig } from '@rsbuild/core'; -import { getBrowserslistWithDefault, getCoreJsVersion } from '@rsbuild/shared'; +import { getCoreJsVersion } from '@rsbuild/shared'; import _ from 'lodash'; import semver from 'semver'; import { CORE_JS_DIR, CORE_JS_PKG_PATH, SWC_HELPERS_DIR } from './constants'; @@ -176,6 +176,7 @@ export async function applyPluginConfig( utils: ModifyChainUtils, rsbuildConfig: NormalizedConfig, rootPath: string, + browserslist?: string[], ): Promise { const isUsingFnOptions = typeof rawOptions === 'function'; const { target, isProd } = utils; @@ -216,12 +217,8 @@ export async function applyPluginConfig( } // If `targets` is not specified manually, we get `browserslist` from project. - if (!swc.env.targets) { - swc.env.targets = await getBrowserslistWithDefault( - rootPath, - rsbuildConfig, - target, - ); + if (!swc.env.targets && browserslist) { + swc.env.targets = browserslist; } const isSSR = target === 'node'; diff --git a/packages/core/src/createContext.ts b/packages/core/src/createContext.ts index d000747764..301a8bf102 100644 --- a/packages/core/src/createContext.ts +++ b/packages/core/src/createContext.ts @@ -1,8 +1,10 @@ import { isAbsolute, join } from 'node:path'; -import type { - BundlerType, - NormalizedEnvironmentConfig, - RsbuildContext, +import { + type BundlerType, + DEFAULT_BROWSERSLIST, + type NormalizedEnvironmentConfig, + type RsbuildContext, + getBrowserslist, } from '@rsbuild/shared'; import { withDefaultConfig } from './config'; import { ROOT_DIST_DIR } from './constants'; @@ -57,23 +59,49 @@ async function createContextByConfig( }; } -export function updateEnvironmentContext( +export async function getBrowserslistByEnvironment( + path: string, + config: NormalizedEnvironmentConfig, +): Promise { + const { overrideBrowserslist: overrides, target } = config.output; + + if (target === 'web' || target === 'web-worker') { + if (Array.isArray(overrides)) { + return overrides; + } + const browserslistrc = await getBrowserslist(path); + if (browserslistrc) { + return browserslistrc; + } + } + + return DEFAULT_BROWSERSLIST[target]; +} + +export async function updateEnvironmentContext( context: RsbuildContext, configs: Record, ) { - context.environments = Object.fromEntries( - Object.entries(configs).map(([name, config]) => [ - name, - { - target: config.output.target, - distPath: getAbsoluteDistPath(context.rootPath, config), - entry: getEntryObject(config, config.output.target), - tsconfigPath: config.source.tsconfigPath - ? getAbsolutePath(context.rootPath, config.source.tsconfigPath) - : undefined, - }, - ]), - ); + context.environments ||= {}; + + for (const [name, config] of Object.entries(configs)) { + const tsconfigPath = config.source.tsconfigPath + ? getAbsolutePath(context.rootPath, config.source.tsconfigPath) + : undefined; + + const browserslist = await getBrowserslistByEnvironment( + context.rootPath, + config, + ); + + context.environments[name] = { + target: config.output.target, + distPath: getAbsoluteDistPath(context.rootPath, config), + entry: getEntryObject(config, config.output.target), + browserslist, + tsconfigPath, + }; + } } export function updateContextByNormalizedConfig( diff --git a/packages/core/src/mergeConfig.ts b/packages/core/src/mergeConfig.ts index bfb282ba24..9da3a644d3 100644 --- a/packages/core/src/mergeConfig.ts +++ b/packages/core/src/mergeConfig.ts @@ -12,6 +12,7 @@ const OVERRIDE_PATH = [ 'output.cssModules.auto', 'output.targets', 'output.emitAssets', + 'output.overrideBrowserslist', 'server.open', 'server.printUrls', 'provider', diff --git a/packages/core/src/plugins/css.ts b/packages/core/src/plugins/css.ts index 92030ebba7..17e833f741 100644 --- a/packages/core/src/plugins/css.ts +++ b/packages/core/src/plugins/css.ts @@ -10,7 +10,6 @@ import { type RsbuildTarget, type RspackChain, deepmerge, - getBrowserslistWithDefault, isFunction, isPlainObject, } from '@rsbuild/shared'; @@ -242,7 +241,7 @@ async function applyCSSRule({ rule, config, context, - utils: { target, isProd, CHAIN_ID }, + utils: { target, isProd, CHAIN_ID, environment }, importLoaders = 1, }: { rule: RspackChain.Rule; @@ -251,11 +250,7 @@ async function applyCSSRule({ utils: ModifyChainUtils; importLoaders?: number; }) { - const browserslist = await getBrowserslistWithDefault( - context.rootPath, - config, - target, - ); + const { browserslist } = context.environments[environment]; // 1. Check user config const enableExtractCSS = isUseCssExtract(config, target); diff --git a/packages/core/src/plugins/swc.ts b/packages/core/src/plugins/swc.ts index c858289b30..8334853354 100644 --- a/packages/core/src/plugins/swc.ts +++ b/packages/core/src/plugins/swc.ts @@ -1,12 +1,10 @@ import path from 'node:path'; import { type Polyfill, - type RsbuildTarget, SCRIPT_REGEX, applyScriptCondition, cloneDeep, deepmerge, - getBrowserslistWithDefault, getCoreJsVersion, } from '@rsbuild/shared'; import type { SwcLoaderOptions } from '@rspack/core'; @@ -21,11 +19,7 @@ import type { const builtinSwcLoaderName = 'builtin:swc-loader'; -async function getDefaultSwcConfig( - config: NormalizedConfig, - rootPath: string, - target: RsbuildTarget, -): Promise { +function getDefaultSwcConfig(browserslist: string[]): SwcLoaderOptions { return { jsc: { externalHelpers: true, @@ -40,7 +34,7 @@ async function getDefaultSwcConfig( }, isModule: 'unknown', env: { - targets: await getBrowserslistWithDefault(rootPath, config, target), + targets: browserslist, }, }; } @@ -59,7 +53,7 @@ export const pluginSwc = (): RsbuildPlugin => ({ api.modifyBundlerChain({ order: 'pre', - handler: async (chain, { CHAIN_ID, target }) => { + handler: async (chain, { CHAIN_ID, target, environment }) => { const config = api.getNormalizedConfig(); const rule = chain.module @@ -82,11 +76,9 @@ export const pluginSwc = (): RsbuildPlugin => ({ excludes: [], }); - const swcConfig = await getDefaultSwcConfig( - config, - api.context.rootPath, - target, - ); + const { browserslist } = api.context.environments[environment]; + + const swcConfig = getDefaultSwcConfig(browserslist); applyTransformImport(swcConfig, config.source.transformImport); applySwcDecoratorConfig(swcConfig, config); diff --git a/packages/core/src/plugins/target.ts b/packages/core/src/plugins/target.ts index d2bc007fe6..9f9977fb45 100644 --- a/packages/core/src/plugins/target.ts +++ b/packages/core/src/plugins/target.ts @@ -1,7 +1,4 @@ -import { - browserslistToESVersion, - getBrowserslistWithDefault, -} from '@rsbuild/shared'; +import { browserslistToESVersion } from '@rsbuild/shared'; import type { RsbuildPlugin } from '../types'; export const pluginTarget = (): RsbuildPlugin => ({ @@ -10,18 +7,13 @@ export const pluginTarget = (): RsbuildPlugin => ({ setup(api) { api.modifyBundlerChain({ order: 'pre', - handler: async (chain, { target }) => { + handler: async (chain, { target, environment }) => { if (target === 'node') { chain.target('node'); return; } - const config = api.getNormalizedConfig(); - const browserslist = await getBrowserslistWithDefault( - api.context.rootPath, - config, - target, - ); + const { browserslist } = api.context.environments[environment]; const esVersion = browserslistToESVersion(browserslist); if (target === 'web-worker' || target === 'service-worker') { diff --git a/packages/core/src/provider/initConfigs.ts b/packages/core/src/provider/initConfigs.ts index 66d3a03a36..f48bac3d4f 100644 --- a/packages/core/src/provider/initConfigs.ts +++ b/packages/core/src/provider/initConfigs.ts @@ -97,7 +97,7 @@ export async function initRsbuildConfig({ updateContextByNormalizedConfig(context, context.normalizedConfig); - updateEnvironmentContext(context, environments); + await updateEnvironmentContext(context, environments); // TODO: will remove soon context.targets = Object.values(environments).map((e) => e.output.target); diff --git a/packages/core/tests/__snapshots__/swc.test.ts.snap b/packages/core/tests/__snapshots__/swc.test.ts.snap index 4f0a8dbe36..589a4cc2dd 100644 --- a/packages/core/tests/__snapshots__/swc.test.ts.snap +++ b/packages/core/tests/__snapshots__/swc.test.ts.snap @@ -234,121 +234,6 @@ exports[`plugin-swc > should add browserslist 1`] = ` ] `; -exports[`plugin-swc > should add browserslist 2`] = ` -[ - { - "entry": { - "main": [ - "src/index.js", - ], - }, - "module": { - "rules": [ - { - "include": [ - { - "and": [ - "/packages/core/tests", - { - "not": /\\[\\\\\\\\/\\]node_modules\\[\\\\\\\\/\\]/, - }, - ], - }, - /\\\\\\.\\(\\?:ts\\|tsx\\|jsx\\|mts\\|cts\\)\\$/, - ], - "resolve": { - "alias": { - "core-js": "/node_modules//core-js", - }, - }, - "test": /\\\\\\.\\(\\?:js\\|jsx\\|mjs\\|cjs\\|ts\\|tsx\\|mts\\|cts\\)\\$/, - "type": "javascript/auto", - "use": [ - { - "loader": "builtin:swc-loader", - "options": { - "env": { - "coreJs": "3.36", - "mode": "usage", - "shippedProposals": true, - "targets": [ - "chrome 98", - ], - }, - "isModule": "unknown", - "jsc": { - "externalHelpers": true, - "parser": { - "decorators": true, - "syntax": "typescript", - "tsx": false, - }, - "preserveAllComments": true, - "transform": { - "decoratorMetadata": true, - "legacyDecorator": true, - "useDefineForClassFields": false, - }, - }, - }, - }, - ], - }, - { - "mimetype": { - "or": [ - "text/javascript", - "application/javascript", - ], - }, - "resolve": { - "alias": { - "core-js": "/node_modules//core-js", - }, - "fullySpecified": false, - }, - "use": [ - { - "loader": "builtin:swc-loader", - "options": { - "env": { - "coreJs": "3.36", - "mode": "usage", - "shippedProposals": true, - "targets": [ - "chrome 98", - ], - }, - "isModule": "unknown", - "jsc": { - "externalHelpers": true, - "parser": { - "decorators": true, - "syntax": "typescript", - "tsx": false, - }, - "preserveAllComments": true, - "transform": { - "decoratorMetadata": true, - "legacyDecorator": true, - "useDefineForClassFields": false, - }, - }, - }, - }, - ], - }, - ], - }, - "resolve": { - "alias": { - "@swc/helpers": "/node_modules//@swc/helpers", - }, - }, - }, -] -`; - exports[`plugin-swc > should add pluginImport 1`] = ` [ { @@ -1438,124 +1323,3 @@ exports[`plugin-swc > should has correct core-js 2`] = ` }, ] `; - -exports[`plugin-swc > should'n override browserslist when target platform is not web 1`] = ` -[ - { - "entry": { - "main": [ - "src/index.js", - ], - }, - "module": { - "rules": [ - { - "include": [ - { - "and": [ - "/packages/core/tests", - { - "not": /\\[\\\\\\\\/\\]node_modules\\[\\\\\\\\/\\]/, - }, - ], - }, - /\\\\\\.\\(\\?:ts\\|tsx\\|jsx\\|mts\\|cts\\)\\$/, - ], - "resolve": { - "alias": { - "core-js": "/node_modules//core-js", - }, - }, - "test": /\\\\\\.\\(\\?:js\\|jsx\\|mjs\\|cjs\\|ts\\|tsx\\|mts\\|cts\\)\\$/, - "type": "javascript/auto", - "use": [ - { - "loader": "builtin:swc-loader", - "options": { - "env": { - "coreJs": "3.36", - "mode": "usage", - "shippedProposals": true, - "targets": [ - "chrome >= 87", - "edge >= 88", - "firefox >= 78", - "safari >= 14", - ], - }, - "isModule": "unknown", - "jsc": { - "externalHelpers": true, - "parser": { - "decorators": true, - "syntax": "typescript", - "tsx": false, - }, - "preserveAllComments": true, - "transform": { - "decoratorMetadata": true, - "legacyDecorator": true, - "useDefineForClassFields": false, - }, - }, - }, - }, - ], - }, - { - "mimetype": { - "or": [ - "text/javascript", - "application/javascript", - ], - }, - "resolve": { - "alias": { - "core-js": "/node_modules//core-js", - }, - "fullySpecified": false, - }, - "use": [ - { - "loader": "builtin:swc-loader", - "options": { - "env": { - "coreJs": "3.36", - "mode": "usage", - "shippedProposals": true, - "targets": [ - "chrome >= 87", - "edge >= 88", - "firefox >= 78", - "safari >= 14", - ], - }, - "isModule": "unknown", - "jsc": { - "externalHelpers": true, - "parser": { - "decorators": true, - "syntax": "typescript", - "tsx": false, - }, - "preserveAllComments": true, - "transform": { - "decoratorMetadata": true, - "legacyDecorator": true, - "useDefineForClassFields": false, - }, - }, - }, - }, - ], - }, - ], - }, - "resolve": { - "alias": { - "@swc/helpers": "/node_modules//@swc/helpers", - }, - }, - }, -] -`; diff --git a/packages/core/tests/swc.test.ts b/packages/core/tests/swc.test.ts index 2428799a06..e1d162a42c 100644 --- a/packages/core/tests/swc.test.ts +++ b/packages/core/tests/swc.test.ts @@ -43,24 +43,6 @@ describe('plugin-swc', () => { overrideBrowserslist: ['chrome 98'], }, }); - - await matchConfigSnapshot({ - output: { - overrideBrowserslist: { - web: ['chrome 98'], - }, - }, - }); - }); - - it("should'n override browserslist when target platform is not web", async () => { - await matchConfigSnapshot({ - output: { - overrideBrowserslist: { - node: ['chrome 98'], - }, - }, - }); }); it('should has correct core-js', async () => { diff --git a/packages/core/tests/target.test.ts b/packages/core/tests/target.test.ts index 12a9c23a8e..66fc18ee75 100644 --- a/packages/core/tests/target.test.ts +++ b/packages/core/tests/target.test.ts @@ -15,12 +15,12 @@ describe('plugin-target', () => { const cases = [ { target: 'node' as const, - browserslist: ['foo'], + browserslist: ['Chrome 100'], expected: { target: 'node' }, }, { - browserslist: ['foo'], - expected: { target: ['web', 'es2017'] }, + browserslist: ['Chrome 100'], + expected: { target: ['web', 'es2018'] }, }, { browserslist: null, diff --git a/packages/plugin-check-syntax/src/index.ts b/packages/plugin-check-syntax/src/index.ts index 1f5e5dc624..d2f1a39af2 100644 --- a/packages/plugin-check-syntax/src/index.ts +++ b/packages/plugin-check-syntax/src/index.ts @@ -1,25 +1,8 @@ -import type { - NormalizedConfig, - RsbuildPlugin, - RsbuildTarget, -} from '@rsbuild/core'; -import { getBrowserslistWithDefault } from '@rsbuild/shared'; +import type { RsbuildPlugin } from '@rsbuild/core'; import type { CheckSyntaxOptions } from './types'; export type PluginCheckSyntaxOptions = CheckSyntaxOptions; -async function getTargets( - rootPath: string, - rsbuildConfig: NormalizedConfig, - rsbuildTarget: RsbuildTarget, - checkSyntax: CheckSyntaxOptions, -) { - return ( - checkSyntax.targets ?? - (await getBrowserslistWithDefault(rootPath, rsbuildConfig, rsbuildTarget)) - ); -} - export const PLUGIN_CHECK_SYNTAX_NAME = 'rsbuild:check-syntax'; export function pluginCheckSyntax( @@ -29,20 +12,16 @@ export function pluginCheckSyntax( name: PLUGIN_CHECK_SYNTAX_NAME, setup(api) { - api.modifyBundlerChain(async (chain, { isDev, target }) => { + api.modifyBundlerChain(async (chain, { isDev, target, environment }) => { if (isDev || target !== 'web') { return; } const { rootPath } = api.context; - const rsbuildConfig = api.getNormalizedConfig(); - - const targets = await getTargets( - rootPath, - rsbuildConfig, - target, - options, - ); + + const targets = + options.targets ?? api.context.environments[environment].browserslist; + const { CheckSyntaxPlugin } = await import('./CheckSyntaxPlugin'); chain.plugin(CheckSyntaxPlugin.name).use(CheckSyntaxPlugin, [ diff --git a/packages/plugin-lightningcss/src/plugin.ts b/packages/plugin-lightningcss/src/plugin.ts index 4fbde313b0..56f2ae265c 100644 --- a/packages/plugin-lightningcss/src/plugin.ts +++ b/packages/plugin-lightningcss/src/plugin.ts @@ -1,14 +1,11 @@ import path from 'node:path'; import type { ChainIdentifier, - NormalizedConfig, RsbuildContext, RsbuildPlugin, - RsbuildTarget, RspackChain, } from '@rsbuild/core'; import { reduceConfigs } from '@rsbuild/core'; -import { getBrowserslistWithDefault } from '@rsbuild/shared'; import browserslist from '@rsbuild/shared/browserslist'; import * as lightningcss from 'lightningcss'; import type { Targets } from 'lightningcss'; @@ -23,21 +20,14 @@ export const PLUGIN_LIGHTNINGCSS_NAME = 'rsbuild:lightningcss'; const getLightningCSSTargets = async ({ context, - config, - target, options, + environment, }: { context: RsbuildContext; - config: NormalizedConfig; - target: RsbuildTarget; options: PluginLightningcssOptions; + environment: string; }) => { - const browserslistUserConfig = await getBrowserslistWithDefault( - context.rootPath, - config, - target, - ); - + const browserslistUserConfig = context.environments[environment].browserslist; const implementation = (options.implementation as Lightningcss) ?? lightningcss; @@ -170,14 +160,11 @@ export const pluginLightningcss = ( // ensure lightningcss-loader can be applied to sass/less/stylus rules order: 'pre', - handler: async (chain, { CHAIN_ID, target }) => { - const config = api.getNormalizedConfig(); - + handler: async (chain, { CHAIN_ID, target, environment }) => { targets = await getLightningCSSTargets({ context: api.context, - config, - target, options, + environment, }); if (target === 'web' && options?.transform !== false) { diff --git a/packages/shared/src/getBrowserslist.ts b/packages/shared/src/getBrowserslist.ts index 0cc2dc2906..60ea3abff7 100644 --- a/packages/shared/src/getBrowserslist.ts +++ b/packages/shared/src/getBrowserslist.ts @@ -1,6 +1,4 @@ import browserslist from '../compiled/browserslist/index.js'; -import { DEFAULT_BROWSERSLIST } from './constants'; -import type { OverrideBrowserslist, RsbuildTarget } from './types'; // using cache to avoid multiple calls to loadConfig const browsersListCache = new Map(); @@ -23,34 +21,6 @@ export async function getBrowserslist(path: string) { return null; } -export async function getBrowserslistWithDefault( - path: string, - config: { output?: { overrideBrowserslist?: OverrideBrowserslist } }, - target: RsbuildTarget, -): Promise { - const { overrideBrowserslist: overrides = {} } = config?.output || {}; - - if (target === 'web' || target === 'web-worker') { - if (Array.isArray(overrides)) { - return overrides; - } - if (overrides[target]) { - return overrides[target]!; - } - - const browserslistrc = await getBrowserslist(path); - if (browserslistrc) { - return browserslistrc; - } - } - - if (!Array.isArray(overrides) && overrides[target]) { - return overrides[target]!; - } - - return DEFAULT_BROWSERSLIST[target]; -} - enum ESVersion { es5 = 5, es2015 = 2015, diff --git a/packages/shared/src/types/config/output.ts b/packages/shared/src/types/config/output.ts index 87385caf50..d23636814b 100644 --- a/packages/shared/src/types/config/output.ts +++ b/packages/shared/src/types/config/output.ts @@ -297,7 +297,7 @@ export interface OutputConfig { * [autoprefixer](https://github.com/postcss/autoprefixer) to identify the JavaScript syntax that * need to be transformed and the CSS browser prefixes that need to be added. */ - overrideBrowserslist?: string[] | Partial>; + overrideBrowserslist?: string[]; /** * Copies the specified file or directory to the dist directory. */ @@ -309,10 +309,6 @@ export interface OutputConfig { emitAssets?: EmitAssets; } -export type OverrideBrowserslist = - | string[] - | Partial>; - export interface NormalizedOutputConfig extends OutputConfig { target: RsbuildTarget; filename: FilenameConfig; diff --git a/packages/shared/src/types/context.ts b/packages/shared/src/types/context.ts index cd84f673fb..770957219e 100644 --- a/packages/shared/src/types/context.ts +++ b/packages/shared/src/types/context.ts @@ -6,6 +6,7 @@ type EnvironmentContext = { target: RsbuildTarget; entry: RsbuildEntry; distPath: string; + browserslist: string[]; tsconfigPath?: string; }; diff --git a/packages/shared/tests/getBrowserslist.test.ts b/packages/shared/tests/getBrowserslist.test.ts index 6f3a36360e..55d7d230b0 100644 --- a/packages/shared/tests/getBrowserslist.test.ts +++ b/packages/shared/tests/getBrowserslist.test.ts @@ -1,107 +1,4 @@ -import { DEFAULT_BROWSERSLIST } from '../src'; -import { - browserslistToESVersion, - getBrowserslistWithDefault, -} from '../src/getBrowserslist'; - -describe('getBrowserslistWithDefault', () => { - it('should get default browserslist correctly', async () => { - expect(await getBrowserslistWithDefault(__dirname, {}, 'web')).toEqual( - DEFAULT_BROWSERSLIST.web, - ); - expect(await getBrowserslistWithDefault(__dirname, {}, 'node')).toEqual( - DEFAULT_BROWSERSLIST.node, - ); - expect( - await getBrowserslistWithDefault(__dirname, {}, 'web-worker'), - ).toEqual(DEFAULT_BROWSERSLIST['web-worker']); - expect( - await getBrowserslistWithDefault(__dirname, {}, 'service-worker'), - ).toEqual(DEFAULT_BROWSERSLIST['service-worker']); - }); - - it('should override browserslist when using overrideBrowserslist config', async () => { - const override = ['Android >= 4.4', 'iOS >= 8']; - expect( - await getBrowserslistWithDefault( - __dirname, - { - output: { - overrideBrowserslist: override, - }, - }, - 'web', - ), - ).toEqual(override); - - expect( - await getBrowserslistWithDefault( - __dirname, - { - output: { - overrideBrowserslist: override, - }, - }, - 'web-worker', - ), - ).toEqual(override); - - expect( - await getBrowserslistWithDefault( - __dirname, - { - output: { - overrideBrowserslist: override, - }, - }, - 'node', - ), - ).toEqual(DEFAULT_BROWSERSLIST.node); - - expect( - await getBrowserslistWithDefault( - __dirname, - { - output: { - overrideBrowserslist: override, - }, - }, - 'service-worker', - ), - ).toEqual(DEFAULT_BROWSERSLIST['service-worker']); - }); - - it('should allow to override browserslist according to target', async () => { - const override = { - web: ['Android >= 4.4', 'iOS >= 8'], - node: ['node >= 12'], - }; - - expect( - await getBrowserslistWithDefault( - __dirname, - { - output: { - overrideBrowserslist: override, - }, - }, - 'web', - ), - ).toEqual(override.web); - - expect( - await getBrowserslistWithDefault( - __dirname, - { - output: { - overrideBrowserslist: override, - }, - }, - 'node', - ), - ).toEqual(override.node); - }); -}); +import { browserslistToESVersion } from '../src/getBrowserslist'; describe('browserslistToESVersion', () => { test('should get ecma version correctly', () => { From 6bdc4ecdc4fd5758f92334667ca66578298bc55f Mon Sep 17 00:00:00 2001 From: neverland Date: Thu, 20 Jun 2024 17:57:21 +0800 Subject: [PATCH 2/3] fix: override --- packages/core/src/createContext.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/core/src/createContext.ts b/packages/core/src/createContext.ts index 301a8bf102..9b7fc34047 100644 --- a/packages/core/src/createContext.ts +++ b/packages/core/src/createContext.ts @@ -65,10 +65,12 @@ export async function getBrowserslistByEnvironment( ): Promise { const { overrideBrowserslist: overrides, target } = config.output; + if (Array.isArray(overrides)) { + return overrides; + } + + // Read project browserslist config when target is `web-like` if (target === 'web' || target === 'web-worker') { - if (Array.isArray(overrides)) { - return overrides; - } const browserslistrc = await getBrowserslist(path); if (browserslistrc) { return browserslistrc; From ba70d9b0647d23cb2f8d3a80f07d1f25c7c98e1a Mon Sep 17 00:00:00 2001 From: neverland Date: Thu, 20 Jun 2024 17:57:58 +0800 Subject: [PATCH 3/3] fix: upd --- packages/core/src/createContext.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/src/createContext.ts b/packages/core/src/createContext.ts index 9b7fc34047..2de6f8a298 100644 --- a/packages/core/src/createContext.ts +++ b/packages/core/src/createContext.ts @@ -63,10 +63,10 @@ export async function getBrowserslistByEnvironment( path: string, config: NormalizedEnvironmentConfig, ): Promise { - const { overrideBrowserslist: overrides, target } = config.output; + const { target, overrideBrowserslist } = config.output; - if (Array.isArray(overrides)) { - return overrides; + if (Array.isArray(overrideBrowserslist)) { + return overrideBrowserslist; } // Read project browserslist config when target is `web-like`