From c52cf61da85d75f04ddbd00ae1b1d0620c40a7fb Mon Sep 17 00:00:00 2001 From: Zoe Codez Date: Tue, 16 Apr 2024 21:19:23 -0500 Subject: [PATCH] final version --- package-lock.json | 100 ++++++++++++------------ package.json | 8 +- src/build.extension.ts | 31 +++++++- src/i-call-service.extension.ts | 25 +++--- src/identifiers.extension.ts | 130 +++++++++++++++++++++++++++----- 5 files changed, 211 insertions(+), 83 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1284ef6..b511967 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,16 +1,16 @@ { "name": "@digital-alchemy/type-writer", - "version": "0.3.6", + "version": "0.3.7", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@digital-alchemy/type-writer", - "version": "0.3.6", + "version": "0.3.7", "license": "MIT", "dependencies": { "@digital-alchemy/core": "^0.3.11", - "@digital-alchemy/hass": "^0.3.10", + "@digital-alchemy/hass": "^0.3.12", "js-yaml": "^4.1.0" }, "bin": { @@ -25,8 +25,8 @@ "@types/mute-stream": "^0.0.4", "@types/node": "^20.12.7", "@types/uuid": "^9.0.8", - "@typescript-eslint/eslint-plugin": "7.6.0", - "@typescript-eslint/parser": "7.6.0", + "@typescript-eslint/eslint-plugin": "7.7.0", + "@typescript-eslint/parser": "7.7.0", "eslint": "8.57.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "^2.29.1", @@ -1136,9 +1136,9 @@ } }, "node_modules/@digital-alchemy/hass": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/@digital-alchemy/hass/-/hass-0.3.10.tgz", - "integrity": "sha512-HjPHZGWq+Lo2SPw41/xTosaA2hZTQE3ZSYxf7a0gZHhCjneGwIBL3wBduG8Xy8r3TA/KaAp9Z4EmvdMESrHxMg==", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@digital-alchemy/hass/-/hass-0.3.12.tgz", + "integrity": "sha512-3Zl7ptMy428/5aKpAeRIbm5GUIwmE2VDxDBrkxbh0Y3NKwT367qFj79fiGVAk2K8mcq3KNNqULeKXhvqDz+1+Q==", "dependencies": { "@digital-alchemy/core": "^0.3.11", "dayjs": "^1.11.10", @@ -3067,16 +3067,16 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz", - "integrity": "sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz", + "integrity": "sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.6.0", - "@typescript-eslint/type-utils": "7.6.0", - "@typescript-eslint/utils": "7.6.0", - "@typescript-eslint/visitor-keys": "7.6.0", + "@typescript-eslint/scope-manager": "7.7.0", + "@typescript-eslint/type-utils": "7.7.0", + "@typescript-eslint/utils": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.3.1", @@ -3102,15 +3102,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.6.0.tgz", - "integrity": "sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.0.tgz", + "integrity": "sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.6.0", - "@typescript-eslint/types": "7.6.0", - "@typescript-eslint/typescript-estree": "7.6.0", - "@typescript-eslint/visitor-keys": "7.6.0", + "@typescript-eslint/scope-manager": "7.7.0", + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/typescript-estree": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", "debug": "^4.3.4" }, "engines": { @@ -3130,13 +3130,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz", - "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz", + "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.6.0", - "@typescript-eslint/visitor-keys": "7.6.0" + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -3147,13 +3147,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.6.0.tgz", - "integrity": "sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz", + "integrity": "sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.6.0", - "@typescript-eslint/utils": "7.6.0", + "@typescript-eslint/typescript-estree": "7.7.0", + "@typescript-eslint/utils": "7.7.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -3174,9 +3174,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz", - "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", + "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -3187,13 +3187,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz", - "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", + "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.6.0", - "@typescript-eslint/visitor-keys": "7.6.0", + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3215,17 +3215,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.6.0.tgz", - "integrity": "sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.0.tgz", + "integrity": "sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.15", "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.6.0", - "@typescript-eslint/types": "7.6.0", - "@typescript-eslint/typescript-estree": "7.6.0", + "@typescript-eslint/scope-manager": "7.7.0", + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/typescript-estree": "7.7.0", "semver": "^7.6.0" }, "engines": { @@ -3240,12 +3240,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz", - "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", + "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/types": "7.7.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { diff --git a/package.json b/package.json index dbf9b59..11e5862 100644 --- a/package.json +++ b/package.json @@ -25,8 +25,8 @@ }, "license": "MIT", "dependencies": { - "@digital-alchemy/core": "^0.3.12", - "@digital-alchemy/hass": "^0.3.10", + "@digital-alchemy/core": "^0.3.11", + "@digital-alchemy/hass": "^0.3.12", "js-yaml": "^4.1.0" }, "devDependencies": { @@ -38,8 +38,8 @@ "@types/mute-stream": "^0.0.4", "@types/node": "^20.12.7", "@types/uuid": "^9.0.8", - "@typescript-eslint/eslint-plugin": "7.6.0", - "@typescript-eslint/parser": "7.6.0", + "@typescript-eslint/eslint-plugin": "7.7.0", + "@typescript-eslint/parser": "7.7.0", "eslint": "8.57.0", "eslint-config-prettier": "9.1.0", "eslint-plugin-import": "^2.29.1", diff --git a/src/build.extension.ts b/src/build.extension.ts index da3010f..cf53ecd 100644 --- a/src/build.extension.ts +++ b/src/build.extension.ts @@ -54,9 +54,36 @@ export function BuildTypes({ `// This file is generated, and is automatically updated as a npm post install step`, "// Do not edit this file, it will only affect type definitions, not functional code", `import { PICK_ENTITY } from "./helpers";`, + ``, + `// #MARK: ENTITY_SETUP`, `export const ENTITY_SETUP = ${JSON.stringify(entitySetup, undefined, " ")};`, + ``, + `// #MARK: iCallService`, typeInterface, - type_writer.identifiers(), - ].join(`\n\n`); + ``, + `// #MARK: REGISTRY_SETUP`, + type_writer.identifiers.RegistryDetails(), + ``, + `// #MARK: TAreaId`, + type_writer.identifiers.area(), + ``, + `// #MARK: TDeviceId`, + type_writer.identifiers.device(), + ``, + `// #MARK: TFloorId`, + type_writer.identifiers.floor(), + ``, + `// #MARK: TLabelId`, + type_writer.identifiers.label(), + ``, + `// #MARK: TZoneId`, + type_writer.identifiers.zone(), + ``, + `// #MARK: TRawEntityIds`, + type_writer.identifiers.entityIds(entities), + ``, + `// #MARK: TRawDomains`, + type_writer.identifiers.domains(entities), + ].join(`\n`); } } diff --git a/src/i-call-service.extension.ts b/src/i-call-service.extension.ts index d0a4a89..75351ad 100644 --- a/src/i-call-service.extension.ts +++ b/src/i-call-service.extension.ts @@ -359,17 +359,22 @@ export async function ICallServiceExtension({ // #MARK: BuildDomain function buildDomain({ domain, services }: HassServiceDTO) { - return factory.createPropertySignature( - undefined, - factory.createIdentifier(domain), - undefined, - factory.createTypeLiteralNode( - // Create functions based on provided services - // { [...service_name](service_data): Promise } - Object.entries(services) - .sort(([a], [b]) => (a > b ? UP : DOWN)) - .map(([key, value]) => buildService(domain, key, value)), + return addSyntheticLeadingComment( + factory.createPropertySignature( + undefined, + factory.createIdentifier(domain), + undefined, + factory.createTypeLiteralNode( + // Create functions based on provided services + // { [...service_name](service_data): Promise } + Object.entries(services) + .sort(([a], [b]) => (a > b ? UP : DOWN)) + .map(([key, value]) => buildService(domain, key, value)), + ), ), + SyntaxKind.SingleLineCommentTrivia, + `#MARK: ${domain}`, + true, ); } diff --git a/src/identifiers.extension.ts b/src/identifiers.extension.ts index 0d85319..4515f29 100644 --- a/src/identifiers.extension.ts +++ b/src/identifiers.extension.ts @@ -1,7 +1,7 @@ /* eslint-disable unicorn/consistent-function-scoping */ -import { TServiceParams } from "@digital-alchemy/core"; -import { PICK_ENTITY } from "@digital-alchemy/hass"; -import { factory, PropertySignature } from "typescript"; +import { is, TServiceParams } from "@digital-alchemy/core"; +import { domain, ENTITY_STATE, PICK_ENTITY } from "@digital-alchemy/hass"; +import { factory, PropertySignature, SyntaxKind } from "typescript"; export function Identifiers({ hass, type_writer }: TServiceParams) { function RegistryType(type: string, value: PropertySignature[]) { @@ -13,15 +13,13 @@ export function Identifiers({ hass, type_writer }: TServiceParams) { ); } - function EntityObject(list: PICK_ENTITY[]) { - return factory.createTypeLiteralNode( + function EntityUnion(list: PICK_ENTITY[]) { + if (is.empty(list)) { + return factory.createKeywordTypeNode(SyntaxKind.NeverKeyword); + } + return factory.createUnionTypeNode( list.map(i => - factory.createPropertySignature( - undefined, - factory.createStringLiteral(i), - undefined, - factory.createLiteralTypeNode(factory.createTrue()), - ), + factory.createLiteralTypeNode(factory.createStringLiteral(i)), ), ); } @@ -31,39 +29,137 @@ export function Identifiers({ hass, type_writer }: TServiceParams) { undefined, factory.createIdentifier(name), undefined, - EntityObject(entities), + EntityUnion(entities), ); } - return function () { + function RegistryDetails() { return type_writer.printer( "REGISTRY_SETUP", factory.createTypeLiteralNode([ RegistryType( "area", hass.area.current.map(({ area_id }) => - ItemObject(area_id, hass.entity.byArea(area_id)), + ItemObject(`_${area_id}`, hass.entity.byArea(area_id)), ), ), RegistryType( "label", hass.label.current.map(({ label_id }) => - ItemObject(label_id, hass.entity.byLabel(label_id)), + ItemObject(`_${label_id}`, hass.entity.byLabel(label_id)), ), ), RegistryType( "floor", hass.floor.current.map(({ floor_id }) => - ItemObject(floor_id, hass.entity.byFloor(floor_id)), + ItemObject(`_${floor_id}`, hass.entity.byFloor(floor_id)), ), ), RegistryType( "device", hass.device.current.map(({ id }) => - ItemObject(id, hass.entity.byDevice(id)), + ItemObject(`_${id}`, hass.entity.byDevice(id)), ), ), ]), ); + } + + return { + RegistryDetails, + area() { + return type_writer.printer( + "TAreaId", + is.empty(hass.area.current) + ? factory.createKeywordTypeNode(SyntaxKind.StringKeyword) + : factory.createUnionTypeNode( + hass.area.current.map(i => + factory.createLiteralTypeNode( + factory.createStringLiteral(i.area_id), + ), + ), + ), + ); + }, + device() { + return type_writer.printer( + "TDeviceId", + is.empty(hass.device.current) + ? factory.createKeywordTypeNode(SyntaxKind.StringKeyword) + : factory.createUnionTypeNode( + hass.device.current.map(i => + factory.createLiteralTypeNode( + factory.createStringLiteral(i.id), + ), + ), + ), + ); + }, + domains(list: ENTITY_STATE[]) { + return type_writer.printer( + "TRawDomains", + factory.createUnionTypeNode( + is + .unique(list.map(i => domain(i.entity_id))) + .map(i => + factory.createLiteralTypeNode(factory.createStringLiteral(i)), + ), + ), + ); + }, + entityIds(list: ENTITY_STATE[]) { + return type_writer.printer( + "TRawEntityIds", + factory.createUnionTypeNode( + list.map(i => + factory.createLiteralTypeNode( + factory.createStringLiteral(i.entity_id), + ), + ), + ), + ); + }, + floor() { + return type_writer.printer( + "TFloorId", + is.empty(hass.floor.current) + ? factory.createKeywordTypeNode(SyntaxKind.StringKeyword) + : factory.createUnionTypeNode( + hass.floor.current.map(i => + factory.createLiteralTypeNode( + factory.createStringLiteral(i.floor_id), + ), + ), + ), + ); + }, + label() { + return type_writer.printer( + "TLabelId", + is.empty(hass.label.current) + ? factory.createKeywordTypeNode(SyntaxKind.StringKeyword) + : factory.createUnionTypeNode( + hass.label.current.map(i => + factory.createLiteralTypeNode( + factory.createStringLiteral(i.label_id), + ), + ), + ), + ); + }, + zone() { + return type_writer.printer( + "TZoneId", + is.empty(hass.zone.current) + ? factory.createKeywordTypeNode(SyntaxKind.StringKeyword) + : factory.createUnionTypeNode( + hass.zone.current.map(i => + factory.createLiteralTypeNode( + factory.createStringLiteral(i.id), + ), + ), + ), + ); + }, }; }