Skip to content

Commit

Permalink
feat: transformImport support function type (#3266)
Browse files Browse the repository at this point in the history
Co-authored-by: neverland <chenjiahan.jait@bytedance.com>
  • Loading branch information
9aoy and chenjiahan committed Aug 23, 2024
1 parent 436a4ed commit d931b48
Show file tree
Hide file tree
Showing 7 changed files with 418 additions and 8 deletions.
35 changes: 33 additions & 2 deletions packages/compat/plugin-swc/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import { __internalHelper } from '@rsbuild/core';
import type {
ModifyChainUtils,
NormalizedEnvironmentConfig,
NormalizedSourceConfig,
TransformImport,
} from '@rsbuild/core';
import _ from 'lodash';
import semver from 'semver';
Expand All @@ -17,6 +19,13 @@ import type {

const { applySwcDecoratorConfig } = __internalHelper;

const castArray = <T>(arr?: T | T[]): T[] => {
if (arr === undefined) {
return [];
}
return Array.isArray(arr) ? arr : [arr];
};

async function findUp({
filename,
cwd = process.cwd(),
Expand Down Expand Up @@ -184,6 +193,24 @@ const getCoreJsVersion = (corejsPkgPath: string) => {
}
};

const reduceTransformImportConfig = (
options: NormalizedSourceConfig['transformImport'],
): TransformImport[] | false => {
if (options === false || !options) {
return false;
}

let imports: TransformImport[] = [];
for (const item of castArray(options)) {
if (typeof item === 'function') {
imports = item(imports) ?? imports;
} else {
imports.push(item);
}
}
return imports;
};

export async function applyPluginConfig(
rawOptions: PluginSwcOptions,
utils: ModifyChainUtils,
Expand Down Expand Up @@ -248,9 +275,13 @@ export async function applyPluginConfig(

const extensions = swc.extensions;

if (rsbuildConfig.source?.transformImport) {
const finalPluginImport = reduceTransformImportConfig(
rsbuildConfig.source?.transformImport,
);

if (finalPluginImport !== false && finalPluginImport?.length) {
extensions.pluginImport ??= [];
extensions.pluginImport.push(...rsbuildConfig.source.transformImport);
extensions.pluginImport.push(...finalPluginImport);
}

if (pluginOptions?.transformLodash !== false) {
Expand Down
27 changes: 24 additions & 3 deletions packages/core/src/plugins/swc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,15 @@ import {
PLUGIN_SWC_NAME,
SCRIPT_REGEX,
} from '../constants';
import { castArray, cloneDeep, isWebTarget } from '../helpers';
import { castArray, cloneDeep, isFunction, isWebTarget } from '../helpers';
import type {
NormalizedEnvironmentConfig,
NormalizedSourceConfig,
Polyfill,
RsbuildContext,
RsbuildPlugin,
RspackChain,
TransformImport,
} from '../types';

const builtinSwcLoaderName = 'builtin:swc-loader';
Expand Down Expand Up @@ -215,14 +216,34 @@ async function applyCoreJs(
return coreJsDir;
}

const reduceTransformImportConfig = (
options: NormalizedSourceConfig['transformImport'],
): TransformImport[] | false => {
if (options === false || !options) {
return false;
}

let imports: TransformImport[] = [];
for (const item of castArray(options)) {
if (isFunction(item)) {
imports = item(imports) ?? imports;
} else {
imports.push(item);
}
}
return imports;
};

function applyTransformImport(
swcConfig: SwcLoaderOptions,
pluginImport?: NormalizedSourceConfig['transformImport'],
) {
if (pluginImport !== false && pluginImport) {
const finalPluginImport = reduceTransformImportConfig(pluginImport);

if (finalPluginImport !== false && finalPluginImport?.length) {
swcConfig.rspackExperiments ??= {};
swcConfig.rspackExperiments.import ??= [];
swcConfig.rspackExperiments.import.push(...pluginImport);
swcConfig.rspackExperiments.import.push(...finalPluginImport);
}
}

Expand Down
9 changes: 8 additions & 1 deletion packages/core/src/types/config/source.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,10 @@ export interface SourceConfig {
/**
* Used to import the code and style of the component library on demand.
*/
transformImport?: false | TransformImport[];
transformImport?:
| TransformImportFn
| Array<TransformImport | TransformImportFn>
| false;
/**
* Configure a custom tsconfig.json file path to use, can be a relative or absolute path.
* @default 'tsconfig.json'
Expand All @@ -82,6 +85,10 @@ export type TransformImport = {
customStyleName?: any;
};

type TransformImportFn = (
imports: TransformImport[],
) => TransformImport[] | void;

export interface NormalizedSourceConfig extends SourceConfig {
define: Define;
alias: ConfigChain<Alias>;
Expand Down
Loading

0 comments on commit d931b48

Please sign in to comment.