refactor: Migrate config schema from Zod v3 to Zod v4 (#2357)

This commit is contained in:
Dermot Duffy
2026-02-18 21:47:43 -08:00
committed by GitHub
parent a15376602f
commit 529500ed94
51 changed files with 1110 additions and 443 deletions
+17 -7
View File
@@ -1,5 +1,5 @@
import { isEqual } from 'lodash-es';
import { isConfigUpgradeable } from '../../config/management.js';
import { copyConfig, isConfigUpgradeable } from '../../config/management.js';
import { setProfiles } from '../../config/profiles/set-profiles.js';
import {
AdvancedCameraCardConfig,
@@ -8,7 +8,7 @@ import {
} from '../../config/schema/types.js';
import { RawAdvancedCameraCardConfig } from '../../config/types.js';
import { localize } from '../../localize/localize.js';
import { getParseErrorPaths } from '../../utils/zod.js';
import { getParseError } from '../../utils/zod/parse-errors.js';
import { InitializationAspect } from '../initialization-manager.js';
import { CardConfigAPI } from '../types.js';
import { setAutomationsFromConfig } from './load-automations.js';
@@ -64,7 +64,7 @@ export class ConfigManager {
const parseResult = advancedCameraCardConfigSchema.safeParse(inputConfig);
if (!parseResult.success) {
const configUpgradeable = isConfigUpgradeable(inputConfig);
const hint = getParseErrorPaths(parseResult.error);
const hint = getParseError(parseResult.error);
let upgradeMessage = '';
if (configUpgradeable) {
upgradeMessage = `${localize('error.upgrade_available')}. `;
@@ -72,12 +72,22 @@ export class ConfigManager {
throw new Error(
upgradeMessage +
`${localize('error.invalid_configuration')}: ` +
(hint && hint.size
? JSON.stringify([...hint], null, ' ')
: localize('error.invalid_configuration_no_hint')),
(hint ?? localize('error.invalid_configuration_no_hint')),
);
}
const config = setProfiles(inputConfig, parseResult.data, parseResult.data.profiles);
const config = advancedCameraCardConfigSchema.parse(
setProfiles(
inputConfig,
// The config is cloned here because Zod 4 returns shared constant
// defaults by reference. Since setProfiles() mutates the configuration
// in-place, those mutations would "pollute" the global defaults and break
// test isolation if we didn't use a fresh clone here.
copyConfig(parseResult.data),
parseResult.data.profiles,
),
);
this._rawConfig = inputConfig;
if (isEqual(this._config, config)) {
@@ -94,7 +94,7 @@ export class OverridesManager {
if (!parseResult.success) {
throw new OverrideConfigurationError(
localize('error.invalid_configuration_override'),
[parseResult.error.errors, output],
[parseResult.error.issues, output],
);
}
return parseResult.data;