From 930b216b5d10985094a89eb07827a9bfa08b41a8 Mon Sep 17 00:00:00 2001 From: Sang-Sang33 Date: Thu, 24 Oct 2024 19:36:47 +0800 Subject: [PATCH] fix(plugin-less): lessLoaderOptions.lessOptions.plugins has lose it's prototype. --- packages/core/src/internal.ts | 7 ++- packages/plugin-less/src/index.ts | 5 +- .../tests/__snapshots__/index.test.ts.snap | 60 +++++++++++++++++++ packages/plugin-less/tests/index.test.ts | 26 ++++++++ 4 files changed, 96 insertions(+), 2 deletions(-) diff --git a/packages/core/src/internal.ts b/packages/core/src/internal.ts index 1fece521b6..c4bad04cb8 100644 --- a/packages/core/src/internal.ts +++ b/packages/core/src/internal.ts @@ -16,7 +16,12 @@ export { } from './config'; export type { InternalContext } from './types'; export { setHTMLPlugin, getHTMLPlugin } from './pluginHelper'; -export { formatStats, getStatsOptions, prettyTime } from './helpers'; +export { + formatStats, + getStatsOptions, + prettyTime, + isPlainObject, +} from './helpers'; export { registerBuildHook, registerDevHook, onCompileDone } from './hooks'; export { getChainUtils, getConfigUtils } from './provider/rspackConfig'; export { chainToConfig, modifyBundlerChain } from './configChain'; diff --git a/packages/plugin-less/src/index.ts b/packages/plugin-less/src/index.ts index 54e3f5e11d..1289f20be9 100644 --- a/packages/plugin-less/src/index.ts +++ b/packages/plugin-less/src/index.ts @@ -5,6 +5,7 @@ import type { RsbuildPlugin, Rspack, } from '@rsbuild/core'; +import { __internalHelper } from '@rsbuild/core'; import deepmerge from 'deepmerge'; import { reduceConfigsWithContext } from 'reduce-configs'; @@ -75,7 +76,9 @@ const getLessLoaderOptions = ( ): LessLoaderOptions => { const getLessOptions = () => { if (defaults.lessOptions && userOptions.lessOptions) { - return deepmerge(defaults.lessOptions, userOptions.lessOptions); + return deepmerge(defaults.lessOptions, userOptions.lessOptions, { + isMergeableObject: __internalHelper.isPlainObject, + }); } return userOptions.lessOptions || defaults.lessOptions; }; diff --git a/packages/plugin-less/tests/__snapshots__/index.test.ts.snap b/packages/plugin-less/tests/__snapshots__/index.test.ts.snap index 9db6802f2c..bfe327b607 100644 --- a/packages/plugin-less/tests/__snapshots__/index.test.ts.snap +++ b/packages/plugin-less/tests/__snapshots__/index.test.ts.snap @@ -168,6 +168,66 @@ exports[`plugin-less > should add less-loader with excludes 1`] = ` ] `; +exports[`plugin-less > should add less-loader with plugins 1`] = ` +[ + { + "resolve": { + "preferRelative": true, + }, + "sideEffects": true, + "test": /\\\\\\.less\\$/, + "use": [ + { + "loader": "/node_modules//@rspack/core/dist/cssExtractLoader.js", + }, + { + "loader": "/packages/core/compiled/css-loader/index.js", + "options": { + "importLoaders": 2, + "modules": { + "auto": true, + "exportGlobals": false, + "exportLocalsConvention": "camelCase", + "localIdentName": "[path][name]__[local]-[hash:base64:6]", + "namedExport": false, + }, + "sourceMap": false, + }, + }, + { + "loader": "builtin:lightningcss-loader", + "options": { + "targets": [ + "chrome >= 87", + "edge >= 88", + "firefox >= 78", + "safari >= 14", + ], + }, + }, + { + "loader": "/packages/plugin-less/compiled/less-loader/index.js", + "options": { + "implementation": "/packages/plugin-less/compiled/less/index.js", + "lessOptions": { + "javascriptEnabled": true, + "paths": [ + "/node_modules", + ], + "plugins": [ + { + "options": undefined, + }, + ], + }, + "sourceMap": false, + }, + }, + ], + }, +] +`; + exports[`plugin-less > should add less-loader with tools.less 1`] = ` [ { diff --git a/packages/plugin-less/tests/index.test.ts b/packages/plugin-less/tests/index.test.ts index 2b7a4d978b..61820dbd2b 100644 --- a/packages/plugin-less/tests/index.test.ts +++ b/packages/plugin-less/tests/index.test.ts @@ -63,4 +63,30 @@ describe('plugin-less', () => { const bundlerConfigs = await rsbuild.initConfigs(); expect(matchRules(bundlerConfigs[0], 'a.less')).toMatchSnapshot(); }); + + it('should add less-loader with plugins', async () => { + class MockPlugin { + options?: any; + constructor(options?: any) { + this.options = options; + } + install(less: any, pluginManager: any) {} + } + const mockPlugin = new MockPlugin(); + const rsbuild = await createRsbuild({ + rsbuildConfig: { + plugins: [ + pluginLess({ + lessLoaderOptions: { + lessOptions: { + plugins: [mockPlugin], + }, + }, + }), + ], + }, + }); + const bundlerConfigs = await rsbuild.initConfigs(); + expect(matchRules(bundlerConfigs[0], 'a.less')).toMatchSnapshot(); + }); });