From c20d27b521aff00a227df23d9875b38002bf4637 Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Sun, 25 Nov 2018 20:30:25 -0600 Subject: [PATCH 1/5] Convert process-config-entities to TypeScript --- src/panels/lovelace/cards/hui-entity-filter-card.js | 2 +- src/panels/lovelace/cards/hui-glance-card.ts | 4 ++-- src/panels/lovelace/cards/hui-history-graph-card.js | 2 +- src/panels/lovelace/cards/hui-map-card.js | 2 +- src/panels/lovelace/cards/hui-picture-glance-card.ts | 2 +- ...process-config-entities.js => process-config-entities.ts} | 5 +++-- 6 files changed, 9 insertions(+), 8 deletions(-) rename src/panels/lovelace/common/{process-config-entities.js => process-config-entities.ts} (88%) diff --git a/src/panels/lovelace/cards/hui-entity-filter-card.js b/src/panels/lovelace/cards/hui-entity-filter-card.js index 25403b95828e..841dfaa0c5f7 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 0fefb1100179..029520600099 100644 --- a/src/panels/lovelace/cards/hui-glance-card.ts +++ b/src/panels/lovelace/cards/hui-glance-card.ts @@ -18,7 +18,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 applyThemesOnElement from "../../../common/dom/apply_themes_on_element"; import "../../../components/entity/state-badge"; @@ -68,7 +68,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) as ConfigEntity[]; 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 5a50a8c0d144..9def759e5af1 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 76034be48431..cb52efe46d1b 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 816148aa8636..cbd4543663e1 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.ts similarity index 88% rename from src/panels/lovelace/common/process-config-entities.js rename to src/panels/lovelace/common/process-config-entities.ts index 68e6e248c20a..592ad06c77fa 100644 --- a/src/panels/lovelace/common/process-config-entities.js +++ b/src/panels/lovelace/common/process-config-entities.ts @@ -1,7 +1,8 @@ // Parse array of entity objects from config import isValidEntityId from "../../../common/entity/valid_entity_id"; +import { EntityConfig } from "../entity-rows/types"; -export default function processConfigEntities(entities) { +export const processConfigEntities = (entities: EntityConfig[]) => { if (!entities || !Array.isArray(entities)) { throw new Error("Entities need to be an array"); } @@ -35,4 +36,4 @@ export default function processConfigEntities(entities) { return entityConf; }); -} +}; From 6d8056af33f2afec4f72d8b2b2f9258830603bc7 Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Tue, 27 Nov 2018 21:02:41 -0600 Subject: [PATCH 2/5] Address review comments but have issues --- src/panels/lovelace/cards/hui-glance-card.ts | 2 +- src/panels/lovelace/common/process-config-entities.ts | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/panels/lovelace/cards/hui-glance-card.ts b/src/panels/lovelace/cards/hui-glance-card.ts index 029520600099..4712af94bdab 100644 --- a/src/panels/lovelace/cards/hui-glance-card.ts +++ b/src/panels/lovelace/cards/hui-glance-card.ts @@ -68,7 +68,7 @@ export class HuiGlanceCard extends hassLocalizeLitMixin(LitElement) public setConfig(config: Config): void { this._config = { theme: "default", ...config }; - const entities = processConfigEntities(config.entities) as ConfigEntity[]; + const entities = processConfigEntities(config.entities); for (const entity of entities) { if ( diff --git a/src/panels/lovelace/common/process-config-entities.ts b/src/panels/lovelace/common/process-config-entities.ts index 592ad06c77fa..3504d84f9282 100644 --- a/src/panels/lovelace/common/process-config-entities.ts +++ b/src/panels/lovelace/common/process-config-entities.ts @@ -2,7 +2,9 @@ import isValidEntityId from "../../../common/entity/valid_entity_id"; import { EntityConfig } from "../entity-rows/types"; -export const processConfigEntities = (entities: EntityConfig[]) => { +export const processConfigEntities = ( + entities: Array +): T[] => { if (!entities || !Array.isArray(entities)) { throw new Error("Entities need to be an array"); } From 1639d71b546c216a09969335d277c109022c20d2 Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Tue, 27 Nov 2018 21:10:24 -0600 Subject: [PATCH 3/5] Resolve merge conflicts --- src/panels/lovelace/cards/hui-entities-card.ts | 2 +- src/panels/lovelace/cards/hui-glance-card.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/panels/lovelace/cards/hui-entities-card.ts b/src/panels/lovelace/cards/hui-entities-card.ts index 182c26aac5ff..e52bde80fc07 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-glance-card.ts b/src/panels/lovelace/cards/hui-glance-card.ts index 4712af94bdab..5f31799edd36 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"; From a9ee9efe53748401ab54698261c3fc8b3080b37a Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Mon, 3 Dec 2018 17:34:57 -0600 Subject: [PATCH 4/5] Address review comments Still a typing error which seems like it shouldn't exist --- .../common/process-config-entities.ts | 52 +++++++++++-------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/src/panels/lovelace/common/process-config-entities.ts b/src/panels/lovelace/common/process-config-entities.ts index 3504d84f9282..8092629ce30d 100644 --- a/src/panels/lovelace/common/process-config-entities.ts +++ b/src/panels/lovelace/common/process-config-entities.ts @@ -9,33 +9,39 @@ export const processConfigEntities = ( 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; - } + return entities.map( + (entityConf, index): T => { + if ( + typeof entityConf === "object" && + !Array.isArray(entityConf) && + entityConf.type + ) { + return entityConf; + } + + let config: T; + + if (typeof entityConf === "string") { + config = { 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}.`); + } + + config = entityConf as T; - if (typeof entityConf === "string") { - entityConf = { entity: entityConf }; - } else if (typeof entityConf === "object" && !Array.isArray(entityConf)) { - if (!entityConf.entity) { + if (!isValidEntityId(config.entity)) { throw new Error( - `Entity object at position ${index} is missing entity field.` + `Invalid entity ID at position ${index}: ${config.entity}` ); } - } 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 config; } - - return entityConf; - }); + ); }; From f92345a2a7e00075aca66e1bd122a093ee6156a4 Mon Sep 17 00:00:00 2001 From: Ian Richardson Date: Mon, 3 Dec 2018 18:08:25 -0600 Subject: [PATCH 5/5] Hack to bypass type assertion --- src/panels/lovelace/common/process-config-entities.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/panels/lovelace/common/process-config-entities.ts b/src/panels/lovelace/common/process-config-entities.ts index 8092629ce30d..3b13ce4938f6 100644 --- a/src/panels/lovelace/common/process-config-entities.ts +++ b/src/panels/lovelace/common/process-config-entities.ts @@ -22,7 +22,8 @@ export const processConfigEntities = ( let config: T; if (typeof entityConf === "string") { - config = { entity: entityConf }; + // 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(