diff --git a/packages/cli/src/lib/config.ts b/packages/cli/src/lib/config.ts index 63e3958a6f..08a8193818 100644 --- a/packages/cli/src/lib/config.ts +++ b/packages/cli/src/lib/config.ts @@ -40,15 +40,24 @@ export async function loadCliConfig(configArgs: string[]) { `Loaded config from ${appConfigs.map(c => c.context).join(', ')}`, ); - const frontendAppConfigs = schema.process(appConfigs, { - visiblity: ['frontend'], - }); - const frontendConfig = ConfigReader.fromConfigs(frontendAppConfigs); + try { + const frontendAppConfigs = schema.process(appConfigs, { + visiblity: ['frontend'], + }); + const frontendConfig = ConfigReader.fromConfigs(frontendAppConfigs); - return { - schema, - appConfigs, - frontendConfig, - frontendAppConfigs, - }; + return { + schema, + appConfigs, + frontendConfig, + frontendAppConfigs, + }; + } catch (error) { + const maybeSchemaError = error as Error & { messages?: string[] }; + if (maybeSchemaError.messages) { + const messages = maybeSchemaError.messages.join('\n '); + throw new Error(`Configuration does not match schema\n\n ${messages}`); + } + throw error; + } } diff --git a/packages/config-loader/src/lib/schema/compile.ts b/packages/config-loader/src/lib/schema/compile.ts index 7dc65be910..6ee24f8d21 100644 --- a/packages/config-loader/src/lib/schema/compile.ts +++ b/packages/config-loader/src/lib/schema/compile.ts @@ -104,10 +104,14 @@ export function compileConfigSchemas( const valid = validate(config); if (!valid) { - // TODO(Rugvip): better messages here, with more context such as which file the error occurred in - const errors = ajv.errorsText(validate.errors); + const errors = validate.errors ?? []; return { - errors: [errors], + errors: errors.map(({ dataPath, message, params }) => { + const paramStr = Object.entries(params) + .map(([name, value]) => `${name}=${value}`) + .join(' '); + return `Config ${message || ''} { ${paramStr} } at ${dataPath}`; + }), visibilityByPath: new Map(), }; } diff --git a/packages/config-loader/src/lib/schema/load.ts b/packages/config-loader/src/lib/schema/load.ts index 010317849c..01a9499983 100644 --- a/packages/config-loader/src/lib/schema/load.ts +++ b/packages/config-loader/src/lib/schema/load.ts @@ -61,9 +61,11 @@ export async function loadConfigSchema( ): AppConfig[] { const result = validate(configs); if (result.errors) { - throw new Error( + const error = new Error( `Config validation failed, ${result.errors.join('; ')}`, ); + (error as any).messages = result.errors; + throw error; } let processedConfigs = configs;