Skip to content

Commit 8d82d5a

Browse files
committed
Fixes (file passes strict: true)
1 parent e7bca38 commit 8d82d5a

File tree

1 file changed

+50
-44
lines changed

1 file changed

+50
-44
lines changed

src/index.ts

+50-44
Original file line numberDiff line numberDiff line change
@@ -80,40 +80,43 @@ function arrayEquals<T>(as: T[], bs: T[]): boolean {
8080
return true;
8181
}
8282

83-
function addToLookup(zigbeeModel: string, definition: Definition): void {
84-
zigbeeModel = zigbeeModel ? zigbeeModel.toLowerCase() : null;
83+
function addToLookup(zigbeeModel: string | undefined, definition: Definition): void {
84+
const lookupModel = zigbeeModel ? zigbeeModel.toLowerCase() : 'null';
8585

86-
if (!lookup.has(zigbeeModel)) {
87-
lookup.set(zigbeeModel, []);
86+
if (!lookup.has(lookupModel)) {
87+
lookup.set(lookupModel, []);
8888
}
8989

90-
if (!lookup.get(zigbeeModel).includes(definition)) {
91-
lookup.get(zigbeeModel).splice(0, 0, definition);
90+
// key created above as needed
91+
if (!lookup.get(lookupModel)!.includes(definition)) {
92+
lookup.get(lookupModel)!.splice(0, 0, definition);
9293
}
9394
}
9495

95-
function removeFromLookup(zigbeeModel: string, definition: Definition): void {
96-
if (lookup.has(zigbeeModel)) {
97-
const i = lookup.get(zigbeeModel).indexOf(definition);
96+
function removeFromLookup(zigbeeModel: string | undefined, definition: Definition): void {
97+
const lookupModel = zigbeeModel ? zigbeeModel.toLowerCase() : 'null';
98+
99+
if (lookup.has(lookupModel)) {
100+
const i = lookup.get(lookupModel)!.indexOf(definition);
98101

99102
if (i > -1) {
100-
lookup.get(zigbeeModel).splice(i, 1);
103+
lookup.get(lookupModel)!.splice(i, 1);
101104
}
102-
}
103105

104-
if (lookup.get(zigbeeModel).length === 0) {
105-
lookup.delete(zigbeeModel);
106+
if (lookup.get(lookupModel)!.length === 0) {
107+
lookup.delete(lookupModel);
108+
}
106109
}
107110
}
108111

109-
function getFromLookup(zigbeeModel: string): Definition[] | undefined {
110-
zigbeeModel = zigbeeModel ? zigbeeModel.toLowerCase() : null;
112+
function getFromLookup(zigbeeModel: string | undefined): Definition[] | undefined {
113+
const lookupModel = zigbeeModel ? zigbeeModel.toLowerCase() : 'null';
111114

112-
if (lookup.has(zigbeeModel)) {
113-
return lookup.get(zigbeeModel);
115+
if (lookup.has(lookupModel)) {
116+
return lookup.get(lookupModel);
114117
}
115118

116-
return lookup.get(zigbeeModel ? zigbeeModel.replace(/\0(.|\n)*$/g, '').trim() : null);
119+
return lookup.get(lookupModel.replace(/\0(.|\n)*$/g, '').trim());
117120
}
118121

119122
const converterRequiredFields = {
@@ -126,13 +129,11 @@ const converterRequiredFields = {
126129

127130
function validateDefinition(definition: Definition): asserts definition is Definition {
128131
for (const [field, expectedType] of Object.entries(converterRequiredFields)) {
129-
assert.notStrictEqual(null, definition[field as keyof Definition], `Converter field ${field} is null`);
130-
assert.notStrictEqual(undefined, definition[field as keyof Definition], `Converter field ${field} is undefined`);
131-
assert.strictEqual(
132-
definition[field as keyof Definition].constructor.name,
133-
expectedType,
134-
`Converter field ${field} expected type doenst match to ${definition[field as keyof Definition]}`,
135-
);
132+
const val = definition[field as keyof Definition];
133+
134+
assert(val !== null, `Converter field ${field} is null`);
135+
assert(val !== undefined, `Converter field ${field} is undefined`);
136+
assert(val.constructor.name === expectedType, `Converter field ${field} expected type doenst match to ${val}`);
136137
}
137138

138139
assert.ok(Array.isArray(definition.exposes) || typeof definition.exposes === 'function', 'Exposes incorrect');
@@ -247,7 +248,7 @@ function processExtensions(definition: DefinitionWithExtend): Definition {
247248
allExposes.push(exposesLib.presets.action(uniqueActions));
248249
}
249250

250-
let configure: Configure = null;
251+
let configure: Configure | undefined;
251252

252253
if (configures.length !== 0) {
253254
configure = async (device, coordinatorEndpoint, configureDefinition) => {
@@ -257,7 +258,7 @@ function processExtensions(definition: DefinitionWithExtend): Definition {
257258
};
258259
}
259260

260-
let onEvent: OnEvent = null;
261+
let onEvent: OnEvent | undefined;
261262

262263
if (onEvents.length !== 0) {
263264
onEvent = async (type, data, device, settings, state) => {
@@ -325,7 +326,7 @@ function prepareDefinition(definition: DefinitionWithExtend): Definition {
325326
const optionKeys = definition.options.map((o) => o.name);
326327

327328
// Add calibration/precision options based on expose
328-
for (const expose of Array.isArray(definition.exposes) ? definition.exposes : definition.exposes(null, null)) {
329+
for (const expose of Array.isArray(definition.exposes) ? definition.exposes : definition.exposes(undefined, undefined)) {
329330
if (
330331
!optionKeys.includes(expose.name) &&
331332
utils.isNumericExpose(expose) &&
@@ -367,14 +368,14 @@ function prepareDefinition(definition: DefinitionWithExtend): Definition {
367368
export function postProcessConvertedFromZigbeeMessage(definition: Definition, payload: KeyValue, options: KeyValue): void {
368369
// Apply calibration/precision options
369370
for (const [key, value] of Object.entries(payload)) {
370-
const definitionExposes = Array.isArray(definition.exposes) ? definition.exposes : definition.exposes(null, null);
371+
const definitionExposes = Array.isArray(definition.exposes) ? definition.exposes : definition.exposes(undefined, undefined);
371372
const expose = definitionExposes.find((e) => e.property === key);
372373

373-
if (expose?.name in utils.calibrateAndPrecisionRoundOptionsDefaultPrecision && value !== '' && utils.isNumber(value)) {
374+
if (expose?.name && expose.name in utils.calibrateAndPrecisionRoundOptionsDefaultPrecision && value !== '' && utils.isNumber(value)) {
374375
try {
375376
payload[key] = utils.calibrateAndPrecisionRoundOptions(value, options, expose.name);
376377
} catch (error) {
377-
logger.logger.error(`Failed to apply calibration to '${expose.name}': ${error.message}`, NS);
378+
logger.logger.error(`Failed to apply calibration to '${expose.name}': ${(error as Error).message}`, NS);
378379
}
379380
}
380381
}
@@ -388,13 +389,13 @@ export function removeExternalDefinitions(converterName?: string): void {
388389
continue;
389390
}
390391

391-
if ('zigbeeModel' in definition) {
392+
if ('zigbeeModel' in definition && definition.zigbeeModel) {
392393
for (const zigbeeModel of definition.zigbeeModel) {
393394
removeFromLookup(zigbeeModel, definition);
394395
}
395396
}
396397

397-
if ('fingerprint' in definition) {
398+
if ('fingerprint' in definition && definition.fingerprint) {
398399
for (const fingerprint of definition.fingerprint) {
399400
removeFromLookup(fingerprint.modelID, definition);
400401
}
@@ -416,13 +417,13 @@ export function addDefinition(definition: DefinitionWithExtend): void {
416417
externalDefinitionsCount++;
417418
}
418419

419-
if ('fingerprint' in definition) {
420+
if ('fingerprint' in definition && definition.fingerprint) {
420421
for (const fingerprint of definition.fingerprint) {
421422
addToLookup(fingerprint.modelID, definition);
422423
}
423424
}
424425

425-
if ('zigbeeModel' in definition) {
426+
if ('zigbeeModel' in definition && definition.zigbeeModel) {
426427
for (const zigbeeModel of definition.zigbeeModel) {
427428
addToLookup(zigbeeModel, definition);
428429
}
@@ -471,13 +472,16 @@ export async function findDefinition(device: Zh.Device, generateForUnknown: bool
471472
return candidates[0];
472473
} else {
473474
// First try to match based on fingerprint, return the first matching one.
474-
const fingerprintMatch: {priority: number; definition: Definition} = {priority: null, definition: null};
475+
const fingerprintMatch: {priority?: number; definition?: Definition} = {priority: undefined, definition: undefined};
475476

476477
for (const candidate of candidates) {
477478
if (candidate.fingerprint) {
478479
for (const fingerprint of candidate.fingerprint) {
479480
const priority = fingerprint.priority ?? 0;
480-
if (isFingerprintMatch(fingerprint, device) && (!fingerprintMatch.definition || priority > fingerprintMatch.priority)) {
481+
if (
482+
isFingerprintMatch(fingerprint, device) &&
483+
(fingerprintMatch.priority === undefined || priority > fingerprintMatch.priority)
484+
) {
481485
fingerprintMatch.definition = candidate;
482486
fingerprintMatch.priority = priority;
483487
}
@@ -491,7 +495,7 @@ export async function findDefinition(device: Zh.Device, generateForUnknown: bool
491495

492496
// Match based on fingerprint failed, return first matching definition based on zigbeeModel
493497
for (const candidate of candidates) {
494-
if (candidate.zigbeeModel && candidate.zigbeeModel.includes(device.modelID)) {
498+
if (candidate.zigbeeModel && device.modelID && candidate.zigbeeModel.includes(device.modelID)) {
495499
return candidate;
496500
}
497501
}
@@ -517,7 +521,7 @@ function isFingerprintMatch(fingerprint: Fingerprint, device: Zh.Device): boolea
517521
(!fingerprint.softwareBuildID || device.softwareBuildID === fingerprint.softwareBuildID) &&
518522
(!fingerprint.stackVersion || device.stackVersion === fingerprint.stackVersion) &&
519523
(!fingerprint.zclVersion || device.zclVersion === fingerprint.zclVersion) &&
520-
(!fingerprint.ieeeAddr || device.ieeeAddr.match(fingerprint.ieeeAddr)) &&
524+
(!fingerprint.ieeeAddr || device.ieeeAddr.match(fingerprint.ieeeAddr) !== null) &&
521525
(!fingerprint.endpoints ||
522526
arrayEquals(
523527
device.endpoints.map((e) => e.ID),
@@ -526,13 +530,15 @@ function isFingerprintMatch(fingerprint: Fingerprint, device: Zh.Device): boolea
526530

527531
if (match && fingerprint.endpoints) {
528532
for (const fingerprintEndpoint of fingerprint.endpoints) {
529-
const deviceEndpoint = device.getEndpoint(fingerprintEndpoint.ID);
533+
const deviceEndpoint = fingerprintEndpoint.ID !== undefined ? device.getEndpoint(fingerprintEndpoint.ID) : undefined;
530534
match =
531535
match &&
532-
(!fingerprintEndpoint.deviceID || deviceEndpoint.deviceID === fingerprintEndpoint.deviceID) &&
533-
(!fingerprintEndpoint.profileID || deviceEndpoint.profileID === fingerprintEndpoint.profileID) &&
534-
(!fingerprintEndpoint.inputClusters || arrayEquals(deviceEndpoint.inputClusters, fingerprintEndpoint.inputClusters)) &&
535-
(!fingerprintEndpoint.outputClusters || arrayEquals(deviceEndpoint.outputClusters, fingerprintEndpoint.outputClusters));
536+
(!fingerprintEndpoint.deviceID || (deviceEndpoint !== undefined && deviceEndpoint.deviceID === fingerprintEndpoint.deviceID)) &&
537+
(!fingerprintEndpoint.profileID || (deviceEndpoint !== undefined && deviceEndpoint.profileID === fingerprintEndpoint.profileID)) &&
538+
(!fingerprintEndpoint.inputClusters ||
539+
(deviceEndpoint !== undefined && arrayEquals(deviceEndpoint.inputClusters, fingerprintEndpoint.inputClusters))) &&
540+
(!fingerprintEndpoint.outputClusters ||
541+
(deviceEndpoint !== undefined && arrayEquals(deviceEndpoint.outputClusters, fingerprintEndpoint.outputClusters)));
536542
}
537543
}
538544

0 commit comments

Comments
 (0)