mirror of
https://github.com/renovatebot/renovate.git
synced 2026-10-27 07:50:47 +00:00
97327c3d28
* refactor(linters): add prefer-coerce-array rule Refs #45217 `x ?? []` and `coerceArray(x)` say the same thing, but only the second one is searchable and consistent. The rule flags a `??` whose default is a bare `[]` literal; a non-empty default or an asserted `([] as Foo[])` still passes. Applying it across `lib/` surfaced three spots the helper cannot cover, which keep `?? []` with a disable comment or a narrower fix: - `package-files.ts` destructures a tuple, which `coerceArray()` widens - `generate.spec.ts` defaults `matchAll()`, an iterator rather than an array - `mise/upgradeable-tooling.ts` declares a `Record` return, so its `?? []` fallback was wrong to begin with and becomes `coerceObject()` * refactor(platform/github): hoist the GHE version header lookup `Object.entries(...).find()` returns a tuple, and defaulting it with `?? []` only to destructure the second element reads as an array default when it is not one. Name the found entry instead, which drops the `?? []` rather than routing a tuple through `coerceArray()`.
54 lines
1.8 KiB
TypeScript
54 lines
1.8 KiB
TypeScript
import { isNonEmptyArray } from '@sindresorhus/is';
|
|
import { dequal } from 'dequal';
|
|
import { logger } from '../logger/index.ts';
|
|
import { coerceArray } from '../util/array.ts';
|
|
import * as configMassage from './massage.ts';
|
|
import * as configMigration from './migration.ts';
|
|
import type { RenovateConfig, ValidationMessage } from './types.ts';
|
|
import * as configValidation from './validation.ts';
|
|
|
|
export async function migrateAndValidate(
|
|
config: RenovateConfig,
|
|
input: RenovateConfig,
|
|
): Promise<RenovateConfig> {
|
|
logger.debug('migrateAndValidate()');
|
|
try {
|
|
const { isMigrated, migratedConfig } = configMigration.migrateConfig(input);
|
|
if (isMigrated) {
|
|
logger.debug(
|
|
{ oldConfig: input, newConfig: migratedConfig },
|
|
'Config migration necessary',
|
|
);
|
|
} else {
|
|
logger.debug('No config migration necessary');
|
|
}
|
|
const massagedConfig = configMassage.massageConfig(migratedConfig);
|
|
// log only if it's changed
|
|
if (!dequal(input, massagedConfig)) {
|
|
logger.debug({ config: massagedConfig }, 'Post-massage config');
|
|
}
|
|
const {
|
|
warnings,
|
|
errors,
|
|
}: {
|
|
warnings: ValidationMessage[];
|
|
errors: ValidationMessage[];
|
|
} = await configValidation.validateConfig('repo', massagedConfig);
|
|
/* v8 ignore if -- hard to test */
|
|
if (isNonEmptyArray(warnings)) {
|
|
logger.warn({ warnings }, 'Found renovate config warnings');
|
|
}
|
|
if (isNonEmptyArray(errors)) {
|
|
logger.info({ errors }, 'Found renovate config errors');
|
|
}
|
|
massagedConfig.errors = coerceArray(config.errors).concat(errors);
|
|
if (!config.repoIsOnboarded) {
|
|
massagedConfig.warnings = coerceArray(config.warnings).concat(warnings);
|
|
}
|
|
return massagedConfig;
|
|
} catch (err) {
|
|
logger.debug({ config: input }, 'migrateAndValidate error');
|
|
throw err;
|
|
}
|
|
}
|