From 5dc05129efecde97c29bfd181b94bbd3ca6bfa6f Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Tue, 4 Dec 2018 03:01:13 -0600 Subject: [PATCH] Convert process-config-entities to TypeScript (#2113) * Convert process-config-entities to TypeScript * Address review comments but have issues * Resolve merge conflicts * Address review comments Still a typing error which seems like it shouldn't exist * Hack to bypass type assertion --- .../lovelace/cards/hui-entities-card.ts | 2 +- .../lovelace/cards/hui-entity-filter-card.js | 2 +- src/panels/lovelace/cards/hui-glance-card.ts | 4 +- .../lovelace/cards/hui-history-graph-card.js | 2 +- src/panels/lovelace/cards/hui-map-card.js | 2 +- .../lovelace/cards/hui-picture-glance-card.ts | 2 +- .../common/process-config-entities.js | 38 --------------- .../common/process-config-entities.ts | 48 +++++++++++++++++++ 8 files changed, 55 insertions(+), 45 deletions(-) delete mode 100644 src/panels/lovelace/common/process-config-entities.js create mode 100644 src/panels/lovelace/common/process-config-entities.ts diff --git a/src/panels/lovelace/cards/hui-entities-card.ts b/src/panels/lovelace/cards/hui-entities-card.ts index 2afd44ad37..188c8a15ae 100644 --- a/src/panels/lovelace/cards/hui-entities-card.ts +++ b/src/panels/lovelace/cards/hui-entities-card.ts @@ -16,7 +16,7 @@ import { HomeAssistant } from "../../../types"; import { EntityConfig, EntityRow } from "../entity-rows/types"; import { LovelaceCard, LovelaceCardEditor } from "../types"; import { LovelaceCardConfig } from "../../../data/lovelace"; -import processConfigEntities from "../common/process-config-entities"; +import { processConfigEntities } from "../common/process-config-entities"; import createRowElement from "../common/create-row-element"; import computeDomain from "../../../common/entity/compute_domain"; import applyThemesOnElement from "../../../common/dom/apply_themes_on_element"; diff --git a/src/panels/lovelace/cards/hui-entity-filter-card.js b/src/panels/lovelace/cards/hui-entity-filter-card.js index 25403b9582..841dfaa0c5 100644 --- a/src/panels/lovelace/cards/hui-entity-filter-card.js +++ b/src/panels/lovelace/cards/hui-entity-filter-card.js @@ -1,7 +1,7 @@ import { PolymerElement } from "@polymer/polymer/polymer-element"; import createCardElement from "../common/create-card-element"; -import processConfigEntities from "../common/process-config-entities"; +import { processConfigEntities } from "../common/process-config-entities"; function getEntities(hass, filterState, entities) { return entities.filter((entityConf) => { diff --git a/src/panels/lovelace/cards/hui-glance-card.ts b/src/panels/lovelace/cards/hui-glance-card.ts index 51c8edea87..b342c15ddf 100644 --- a/src/panels/lovelace/cards/hui-glance-card.ts +++ b/src/panels/lovelace/cards/hui-glance-card.ts @@ -15,10 +15,10 @@ import { LovelaceCardConfig } from "../../../data/lovelace"; import { longPress } from "../common/directives/long-press-directive"; import { EntityConfig } from "../entity-rows/types"; import { toggleEntity } from "../common/entity/toggle-entity"; +import { processConfigEntities } from "../common/process-config-entities"; import computeStateDisplay from "../../../common/entity/compute_state_display"; import computeStateName from "../../../common/entity/compute_state_name"; -import processConfigEntities from "../common/process-config-entities"; import applyThemesOnElement from "../../../common/dom/apply_themes_on_element"; import "../../../components/entity/state-badge"; @@ -71,7 +71,7 @@ export class HuiGlanceCard extends hassLocalizeLitMixin(LitElement) public setConfig(config: Config): void { this._config = { theme: "default", ...config }; - const entities = processConfigEntities(config.entities); + const entities = processConfigEntities(config.entities); for (const entity of entities) { if ( diff --git a/src/panels/lovelace/cards/hui-history-graph-card.js b/src/panels/lovelace/cards/hui-history-graph-card.js index 5a50a8c0d1..9def759e5a 100644 --- a/src/panels/lovelace/cards/hui-history-graph-card.js +++ b/src/panels/lovelace/cards/hui-history-graph-card.js @@ -5,7 +5,7 @@ import "../../../components/ha-card"; import "../../../components/state-history-charts"; import "../../../data/ha-state-history-data"; -import processConfigEntities from "../common/process-config-entities"; +import { processConfigEntities } from "../common/process-config-entities"; class HuiHistoryGraphCard extends PolymerElement { static get template() { diff --git a/src/panels/lovelace/cards/hui-map-card.js b/src/panels/lovelace/cards/hui-map-card.js index 76034be484..cb52efe46d 100644 --- a/src/panels/lovelace/cards/hui-map-card.js +++ b/src/panels/lovelace/cards/hui-map-card.js @@ -6,7 +6,7 @@ import Leaflet from "leaflet"; import "../../map/ha-entity-marker"; import setupLeafletMap from "../../../common/dom/setup-leaflet-map"; -import processConfigEntities from "../common/process-config-entities"; +import { processConfigEntities } from "../common/process-config-entities"; import computeStateDomain from "../../../common/entity/compute_state_domain"; import computeStateName from "../../../common/entity/compute_state_name"; import debounce from "../../../common/util/debounce"; diff --git a/src/panels/lovelace/cards/hui-picture-glance-card.ts b/src/panels/lovelace/cards/hui-picture-glance-card.ts index 816148aa86..cbd4543663 100644 --- a/src/panels/lovelace/cards/hui-picture-glance-card.ts +++ b/src/panels/lovelace/cards/hui-picture-glance-card.ts @@ -14,7 +14,7 @@ import { toggleEntity } from "../common/entity/toggle-entity"; import computeStateDisplay from "../../../common/entity/compute_state_display"; import computeStateName from "../../../common/entity/compute_state_name"; -import processConfigEntities from "../common/process-config-entities"; +import { processConfigEntities } from "../common/process-config-entities"; import computeDomain from "../../../common/entity/compute_domain"; import stateIcon from "../../../common/entity/state_icon"; diff --git a/src/panels/lovelace/common/process-config-entities.js b/src/panels/lovelace/common/process-config-entities.js deleted file mode 100644 index 68e6e248c2..0000000000 --- a/src/panels/lovelace/common/process-config-entities.js +++ /dev/null @@ -1,38 +0,0 @@ -// Parse array of entity objects from config -import isValidEntityId from "../../../common/entity/valid_entity_id"; - -export default function processConfigEntities(entities) { - if (!entities || !Array.isArray(entities)) { - throw new Error("Entities need to be an array"); - } - - return entities.map((entityConf, index) => { - if ( - typeof entityConf === "object" && - !Array.isArray(entityConf) && - entityConf.type - ) { - return entityConf; - } - - if (typeof entityConf === "string") { - entityConf = { entity: entityConf }; - } else if (typeof entityConf === "object" && !Array.isArray(entityConf)) { - if (!entityConf.entity) { - throw new Error( - `Entity object at position ${index} is missing entity field.` - ); - } - } else { - throw new Error(`Invalid entity specified at position ${index}.`); - } - - if (!isValidEntityId(entityConf.entity)) { - throw new Error( - `Invalid entity ID at position ${index}: ${entityConf.entity}` - ); - } - - return entityConf; - }); -} diff --git a/src/panels/lovelace/common/process-config-entities.ts b/src/panels/lovelace/common/process-config-entities.ts new file mode 100644 index 0000000000..3b13ce4938 --- /dev/null +++ b/src/panels/lovelace/common/process-config-entities.ts @@ -0,0 +1,48 @@ +// Parse array of entity objects from config +import isValidEntityId from "../../../common/entity/valid_entity_id"; +import { EntityConfig } from "../entity-rows/types"; + +export const processConfigEntities = ( + entities: Array +): T[] => { + if (!entities || !Array.isArray(entities)) { + throw new Error("Entities need to be an array"); + } + + return entities.map( + (entityConf, index): T => { + if ( + typeof entityConf === "object" && + !Array.isArray(entityConf) && + entityConf.type + ) { + return entityConf; + } + + let config: T; + + if (typeof entityConf === "string") { + // tslint:disable-next-line:no-object-literal-type-assertion + config = { entity: entityConf } as T; + } else if (typeof entityConf === "object" && !Array.isArray(entityConf)) { + if (!entityConf.entity) { + throw new Error( + `Entity object at position ${index} is missing entity field.` + ); + } + } else { + throw new Error(`Invalid entity specified at position ${index}.`); + } + + config = entityConf as T; + + if (!isValidEntityId(config.entity)) { + throw new Error( + `Invalid entity ID at position ${index}: ${config.entity}` + ); + } + + return config; + } + ); +};