diff --git a/packages/cli/src/Cli.ts b/packages/cli/src/Cli.ts index 5fcd15e..9252c36 100644 --- a/packages/cli/src/Cli.ts +++ b/packages/cli/src/Cli.ts @@ -28,7 +28,7 @@ class Cli { // 0. load plugin this.plugins = await this.resolvePlugins() // 1. load project config and validate - await this.ConfigManager.loadUserConfig() + await this.ConfigManager.$loadUserConfig() // 2. apply plugins this.plugins.forEach(({ id, apply }) => { // some skip plugins ?? @@ -36,7 +36,7 @@ class Cli { }) // 3. valid plugin config // should after plugins apply because plugin can register config validator - this.ConfigManager.validatePluginConfig() + this.ConfigManager.$validatePluginConfig() } async resolvePlugins(): Promise { diff --git a/packages/cli/src/PluginAPI.ts b/packages/cli/src/PluginAPI.ts index c7a490f..3c1a6f2 100644 --- a/packages/cli/src/PluginAPI.ts +++ b/packages/cli/src/PluginAPI.ts @@ -3,6 +3,7 @@ import type { IConfigManager } from './manager/ConfigManager' import type { IEnvManager } from './manager/EnvManager' import type { IPathManager } from './manager/PathManager' import type { CliInstance } from './Cli' +import type { ObjectSchema } from 'joi' class PluginAPI { id: string @@ -43,6 +44,13 @@ class PluginAPI { ops } } + + registerConfigValidator>( + pluginConfigName: string, + schema: ObjectSchema + ): void { + this.ConfigManager.$addConfigValidator(pluginConfigName, schema) + } } export type IPluginAPI = InstanceType diff --git a/packages/cli/src/manager/ConfigManager.ts b/packages/cli/src/manager/ConfigManager.ts index aa47790..fcf035e 100644 --- a/packages/cli/src/manager/ConfigManager.ts +++ b/packages/cli/src/manager/ConfigManager.ts @@ -9,14 +9,15 @@ class ConfigManager { private PathManager: IPathManager private finalConfig: ProjectConfig = {} + private userConfigIsLoaded = false private configValidator: ConfigValidator = {} - registerConfigValidator>( + $addConfigValidator>( name: string, - validator: ObjectSchema + schema: ObjectSchema ): void { - this.configValidator[name] = validator + this.configValidator[name] = schema } get projectConfig(): ProjectConfig { @@ -27,7 +28,8 @@ class ConfigManager { this.PathManager = pathManager } - async loadUserConfig(): Promise { + async $loadUserConfig(): Promise { + if (this.userConfigIsLoaded) return // 1. load userConfig let userConfig: ProjectConfig const [err, configContent] = await loadModule( @@ -49,9 +51,10 @@ class ConfigManager { }) this.finalConfig = userConfig + this.userConfigIsLoaded = true } - validatePluginConfig(): void { + $validatePluginConfig(): void { // valid plugin config const { pluginOps = null } = this.projectConfig if (!pluginOps) return diff --git a/packages/cli/src/manager/EnvManager.ts b/packages/cli/src/manager/EnvManager.ts index b10172c..f6afcfb 100644 --- a/packages/cli/src/manager/EnvManager.ts +++ b/packages/cli/src/manager/EnvManager.ts @@ -2,6 +2,7 @@ import { createEnvName } from '../utils' import { IPathManager } from './PathManager' class EnvManager { + // path for load env file ?? private PathManager: IPathManager constructor(pathManager: IPathManager) {