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
This commit is contained in:
Ian Richardson 2018-12-04 03:01:13 -06:00 committed by Paulus Schoutsen
parent f461ad6d31
commit 5dc05129ef
8 changed files with 55 additions and 45 deletions

View File

@ -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";

View File

@ -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) => {

View File

@ -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<ConfigEntity>(config.entities);
for (const entity of entities) {
if (

View File

@ -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() {

View File

@ -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";

View File

@ -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";

View File

@ -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;
});
}

View File

@ -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 = <T extends EntityConfig>(
entities: Array<T | string>
): 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;
}
);
};