diff --git a/modules/code-generator/src/generator/ProjectBuilder.ts b/modules/code-generator/src/generator/ProjectBuilder.ts index 8f5405882..819f37c5c 100644 --- a/modules/code-generator/src/generator/ProjectBuilder.ts +++ b/modules/code-generator/src/generator/ProjectBuilder.ts @@ -40,6 +40,11 @@ export interface ProjectBuilderInitOptions { inStrictMode?: boolean; /** 一些额外的上下文数据 */ extraContextData?: Record; + /** + * Hook which is used to customize original options, we can reorder/add/remove plugins/processors + * of the existing solution. + */ + customizeBuilderOptions?(originalOptions: ProjectBuilderInitOptions): ProjectBuilderInitOptions; } export class ProjectBuilder implements IProjectBuilder { @@ -67,16 +72,21 @@ export class ProjectBuilder implements IProjectBuilder { /** 一些额外的上下文数据 */ readonly extraContextData: IContextData; - constructor({ - template, - plugins, - postProcessors, - schemaParser = new SchemaParser(), - projectPreProcessors = [], - projectPostProcessors = [], - inStrictMode = false, - extraContextData = {}, - }: ProjectBuilderInitOptions) { + constructor(builderOptions: ProjectBuilderInitOptions) { + let customBuilderOptions = builderOptions; + if (typeof builderOptions.customizeBuilderOptions === 'function') { + customBuilderOptions = builderOptions.customizeBuilderOptions(builderOptions); + } + const { + template, + plugins, + postProcessors, + schemaParser = new SchemaParser(), + projectPreProcessors = [], + projectPostProcessors = [], + inStrictMode = false, + extraContextData = {}, + } = customBuilderOptions; this.template = template; this.plugins = plugins; this.postProcessors = postProcessors; diff --git a/modules/code-generator/src/solutions/icejs.ts b/modules/code-generator/src/solutions/icejs.ts index 85ce7c1f5..1b3dec4af 100644 --- a/modules/code-generator/src/solutions/icejs.ts +++ b/modules/code-generator/src/solutions/icejs.ts @@ -91,6 +91,7 @@ export default function createIceJsProjectBuilder( packageJSON: [icejs.plugins.packageJSON()], }, postProcessors: [prettier()], + customizeBuilderOptions: options?.customizeBuilderOptions, }); } diff --git a/modules/code-generator/src/solutions/rax-app.ts b/modules/code-generator/src/solutions/rax-app.ts index c2b3adac5..f7e903835 100644 --- a/modules/code-generator/src/solutions/rax-app.ts +++ b/modules/code-generator/src/solutions/rax-app.ts @@ -71,6 +71,7 @@ export default function createRaxProjectBuilder( packageJSON: [raxApp.plugins.packageJSON(options)], }, postProcessors: [prettier()], + customizeBuilderOptions: options?.customizeBuilderOptions, }); } diff --git a/modules/code-generator/src/types/core.ts b/modules/code-generator/src/types/core.ts index 6c33d0e25..39e4c32ba 100644 --- a/modules/code-generator/src/types/core.ts +++ b/modules/code-generator/src/types/core.ts @@ -14,6 +14,7 @@ import { import { IParseResult } from './intermediate'; import { IScopeBindings } from '../utils/ScopeBindings'; +import type { ProjectBuilderInitOptions } from '../generator/ProjectBuilder'; export enum FileType { CSS = 'css', @@ -167,6 +168,11 @@ export interface IProjectBuilderOptions { * - expr: 求值的表达式 */ evalErrorsHandler?: string; + /** + * Hook which is used to customize original options, we can reorder/add/remove plugins/processors + * of the existing solution. + */ + customizeBuilderOptions?(originalOptions: ProjectBuilderInitOptions): ProjectBuilderInitOptions; } export interface IProjectBuilder {