fix: Unparseable config when using the low-performance profile (#1570)

* The `low-performance` profile itself had parse errors: fix them!
* Do not silently swallow override parse errors, they are always a user issue
* Minor error message rendering improvements to show multiple pieces of context
This commit is contained in:
Dermot Duffy
2024-09-22 15:08:37 -07:00
committed by GitHub
parent a4417e8a3d
commit 766f3422a9
20 changed files with 137 additions and 88 deletions
+13 -11
View File
@@ -1,6 +1,6 @@
import { CurrentUser } from '@dermotduffy/custom-card-helpers';
import { HassEntities } from 'home-assistant-js-websocket';
import { isEqual } from 'lodash-es';
import isEqual from 'lodash-es/isEqual';
import merge from 'lodash-es/merge';
import { ZodSchema } from 'zod';
import {
@@ -16,6 +16,8 @@ import {
RawFrigateCardConfig,
ViewDisplayMode,
} from '../config/types';
import { localize } from '../localize/localize';
import { FrigateCardError } from '../types';
import { desparsifyArrays } from '../utils/basic';
import { CardConditionAPI, KeysState } from './types';
@@ -39,6 +41,8 @@ interface ConditionState {
keys?: KeysState;
}
class OverrideConfigurationError extends FrigateCardError {}
export class ConditionsEvaluateRequestEvent extends Event {
public conditions: FrigateCardCondition[];
public evaluation?: boolean;
@@ -82,16 +86,15 @@ export function evaluateConditionViaEvent(
return evaluateEvent.evaluation ?? false;
}
export function getOverriddenConfig(
export function getOverriddenConfig<RT extends RawFrigateCardConfig>(
manager: Readonly<ConditionsManager>,
config: Readonly<RawFrigateCardConfig>,
config: Readonly<RT>,
options?: {
configOverrides?: Readonly<Overrides>;
stateOverrides?: Partial<ConditionState>;
schema?: ZodSchema;
logOnParseError?: boolean;
},
): RawFrigateCardConfig {
): RT {
let output = copyConfig(config);
let overridden = false;
if (options?.configOverrides) {
@@ -132,14 +135,13 @@ export function getOverriddenConfig(
if (options?.schema) {
const parseResult = options.schema.safeParse(output);
if (options.logOnParseError && !parseResult.success) {
console.warn(
`Cannot parse overridden configuration`,
output,
parseResult.error.message,
if (!parseResult.success) {
throw new OverrideConfigurationError(
localize('error.invalid_configuration_override'),
[parseResult.error.errors, output],
);
}
return parseResult.success ? parseResult.data : config;
return parseResult.data;
}
return output;
}
+11 -5
View File
@@ -113,11 +113,17 @@ export class ConfigManager {
if (!this._config) {
return;
}
const overriddenConfig = getOverriddenConfig(conditionsManager, this._config, {
configOverrides: this._config.overrides,
schema: frigateCardConfigSchema,
logOnParseError: !!this.getCardWideConfig()?.debug?.logging,
}) as FrigateCardConfig;
let overriddenConfig: FrigateCardConfig | null = null;
try {
overriddenConfig = getOverriddenConfig(conditionsManager, this._config, {
configOverrides: this._config.overrides,
schema: frigateCardConfigSchema,
});
} catch (ev) {
this._api.getMessageManager().setErrorIfHigherPriority(ev);
return;
}
// Save on Lit re-rendering costs by only updating the configuration if it
// actually changes.
+1 -1
View File
@@ -1,4 +1,4 @@
import { isEqual } from 'lodash-es';
import isEqual from 'lodash-es/isEqual';
import { FrigateCardConfig } from '../config/types';
import { createGeneralAction } from '../utils/action';
import { isActionAllowedBasedOnInteractionState } from '../utils/interaction-mode';
@@ -1,4 +1,4 @@
import { isEqual } from 'lodash-es';
import isEqual from 'lodash-es/isEqual';
import { CameraManager } from '../camera-manager/manager';
import { StatusBarConfig, StatusBarItem } from '../config/types';
import { MediaLoadedInfo } from '../types';