homebridge-plugin-utils 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/eslint-rules.mjs +15 -9
- package/dist/mqttclient.js +2 -8
- package/dist/mqttclient.js.map +1 -1
- package/dist/ui/webUi.mjs +50 -35
- package/package.json +2 -2
package/build/eslint-rules.mjs
CHANGED
|
@@ -6,14 +6,14 @@ import stylistic from "@stylistic/eslint-plugin";
|
|
|
6
6
|
import tsEslint from "@typescript-eslint/eslint-plugin";
|
|
7
7
|
|
|
8
8
|
// ESlint plugins to use.
|
|
9
|
-
const
|
|
9
|
+
const plugins = {
|
|
10
10
|
|
|
11
11
|
"@stylistic": stylistic,
|
|
12
12
|
"@typescript-eslint": tsEslint
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
// TypeScript-specific rules.
|
|
16
|
-
const
|
|
16
|
+
const tsRules = {
|
|
17
17
|
|
|
18
18
|
...tsEslint.configs.strictTypeChecked,
|
|
19
19
|
...tsEslint.configs.stylisticTypeChecked,
|
|
@@ -28,14 +28,14 @@ const eslintTsRules = {
|
|
|
28
28
|
};
|
|
29
29
|
|
|
30
30
|
// JavaScript-specific rules.
|
|
31
|
-
const
|
|
31
|
+
const jsRules = {
|
|
32
32
|
|
|
33
33
|
...tsEslint.configs.disableTypeChecked,
|
|
34
34
|
"@typescript-eslint/no-floating-promises": "off"
|
|
35
35
|
};
|
|
36
36
|
|
|
37
37
|
// Rules that exist across both JavaScript and TypeScript files.
|
|
38
|
-
const
|
|
38
|
+
const commonRules = {
|
|
39
39
|
|
|
40
40
|
...tsEslint.configs.eslintRecommended,
|
|
41
41
|
"@stylistic/brace-style": "error",
|
|
@@ -69,14 +69,20 @@ const eslintCommonRules = {
|
|
|
69
69
|
"sort-vars": "warn"
|
|
70
70
|
};
|
|
71
71
|
|
|
72
|
+
// Globals that tend to exist in Homebridge projects.
|
|
73
|
+
const globalsUi = Object.fromEntries(["console", "document", "fetch", "homebridge"].map(key => [key, "readonly"]));
|
|
74
|
+
|
|
72
75
|
export default {
|
|
73
76
|
|
|
74
|
-
|
|
77
|
+
globals: {
|
|
78
|
+
|
|
79
|
+
ui: globalsUi
|
|
80
|
+
},
|
|
81
|
+
plugins: plugins,
|
|
75
82
|
rules: {
|
|
76
83
|
|
|
77
|
-
common:
|
|
78
|
-
js:
|
|
79
|
-
ts:
|
|
84
|
+
common: commonRules,
|
|
85
|
+
js: jsRules,
|
|
86
|
+
ts: tsRules
|
|
80
87
|
}
|
|
81
88
|
};
|
|
82
|
-
|
package/dist/mqttclient.js
CHANGED
|
@@ -124,18 +124,12 @@ export class MqttClient {
|
|
|
124
124
|
// Return the current status of a given sensor.
|
|
125
125
|
this.subscribe(id, topic + "/set", (message) => {
|
|
126
126
|
const value = message.toString().toLowerCase();
|
|
127
|
-
const logResult = () =>
|
|
128
|
-
log.info("MQTT: set message received for %s: %s.", type, value);
|
|
129
|
-
};
|
|
127
|
+
const logResult = () => log.info("MQTT: set message received for %s: %s.", type, value);
|
|
130
128
|
// Set our value and inform the user.
|
|
131
129
|
const result = setValue(value, message.toString());
|
|
132
130
|
// For callbacks that are promises, we wait until they complete before logging the result.
|
|
133
131
|
if (result && typeof result.then === "function") {
|
|
134
|
-
result.then((
|
|
135
|
-
logResult();
|
|
136
|
-
}).catch(error => {
|
|
137
|
-
log.error("MQTT: error seting message received for %s: %s. %s", type, value, error);
|
|
138
|
-
});
|
|
132
|
+
result.then(logResult).catch(error => log.error("MQTT: error seting message received for %s: %s. %s", type, value, error));
|
|
139
133
|
return;
|
|
140
134
|
}
|
|
141
135
|
// Log the outcome.
|
package/dist/mqttclient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mqttclient.js","sourceRoot":"","sources":["../src/mqttclient.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"mqttclient.js","sourceRoot":"","sources":["../src/mqttclient.ts"],"names":[],"mappings":"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"}
|
package/dist/ui/webUi.mjs
CHANGED
|
@@ -9,16 +9,24 @@ export class webUi {
|
|
|
9
9
|
// Feature options class instance.
|
|
10
10
|
#featureOptions;
|
|
11
11
|
|
|
12
|
+
// First run webUI callback endpoints for customization.
|
|
13
|
+
#firstRunInit;
|
|
14
|
+
#firstRunRequired;
|
|
15
|
+
#firstRunSubmit;
|
|
16
|
+
|
|
12
17
|
// Homebridge class instance.
|
|
13
18
|
#homebridge;
|
|
14
19
|
|
|
15
20
|
// Plugin name.
|
|
16
21
|
#name;
|
|
17
22
|
|
|
18
|
-
constructor({ name, featureOptions, homebridge } = {}) {
|
|
23
|
+
constructor({ name, featureOptions, firstRunInit = true, firstRunRequired = false, firstRunSubmit = true, homebridge } = {}) {
|
|
19
24
|
|
|
20
25
|
this.homebridge = homebridge;
|
|
21
26
|
this.featureOptions = featureOptions;
|
|
27
|
+
this.firstRunInit = firstRunInit;
|
|
28
|
+
this.firstRunRequired = firstRunRequired;
|
|
29
|
+
this.firstRunSubmit = firstRunSubmit;
|
|
22
30
|
this.name = name;
|
|
23
31
|
|
|
24
32
|
// Fire off our UI, catching errors along the way.
|
|
@@ -41,23 +49,23 @@ export class webUi {
|
|
|
41
49
|
|
|
42
50
|
const buttonFirstRun = document.getElementById("firstRun");
|
|
43
51
|
|
|
52
|
+
// Run a custom initialization handler the user may have provided.
|
|
53
|
+
if(!(await this.#processHandler(this.firstRunInit))) {
|
|
54
|
+
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
44
58
|
// First run user experience.
|
|
45
59
|
buttonFirstRun.addEventListener("click", async () => {
|
|
46
60
|
|
|
47
61
|
// Show the beachball while we setup.
|
|
48
62
|
this.homebridge.showSpinner();
|
|
49
63
|
|
|
50
|
-
//
|
|
51
|
-
|
|
64
|
+
// Run a custom submit handler the user may have provided.
|
|
65
|
+
if(!(await this.#processHandler(this.firstRunSubmit))) {
|
|
52
66
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
const aCase = (a.displayName ?? "").toLowerCase();
|
|
57
|
-
const bCase = (b.displayName ?? "").toLowerCase();
|
|
58
|
-
|
|
59
|
-
return aCase > bCase ? 1 : (bCase > aCase ? -1 : 0);
|
|
60
|
-
});
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
61
69
|
|
|
62
70
|
// Create our UI.
|
|
63
71
|
document.getElementById("pageFirstRun").style.display = "none";
|
|
@@ -77,13 +85,10 @@ export class webUi {
|
|
|
77
85
|
// Show the beachball while we setup.
|
|
78
86
|
this.homebridge.showSpinner();
|
|
79
87
|
|
|
80
|
-
//
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
document.getElementById("menuFeatureOptions").classList.add("btn-primary");
|
|
85
|
-
document.getElementById("menuSettings").classList.add("btn-elegant");
|
|
86
|
-
document.getElementById("menuSettings").classList.remove("btn-primary");
|
|
88
|
+
// Highlight the tab in our UI.
|
|
89
|
+
this.#toggleClasses("menuHome", "btn-elegant", "btn-primary");
|
|
90
|
+
this.#toggleClasses("menuFeatureOptions", "btn-elegant", "btn-primary");
|
|
91
|
+
this.#toggleClasses("menuSettings", "btn-primary", "btn-elegant");
|
|
87
92
|
|
|
88
93
|
document.getElementById("pageSupport").style.display = "none";
|
|
89
94
|
document.getElementById("pageFeatureOptions").style.display = "none";
|
|
@@ -101,13 +106,10 @@ export class webUi {
|
|
|
101
106
|
this.homebridge.showSpinner();
|
|
102
107
|
this.homebridge.hideSchemaForm();
|
|
103
108
|
|
|
104
|
-
//
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
document.getElementById("menuFeatureOptions").classList.add("btn-primary");
|
|
109
|
-
document.getElementById("menuSettings").classList.remove("btn-elegant");
|
|
110
|
-
document.getElementById("menuSettings").classList.add("btn-primary");
|
|
109
|
+
// Highlight the tab in our UI.
|
|
110
|
+
this.#toggleClasses("menuHome", "btn-primary", "btn-elegant");
|
|
111
|
+
this.#toggleClasses("menuFeatureOptions", "btn-elegant", "btn-primary");
|
|
112
|
+
this.#toggleClasses("menuSettings", "btn-elegant", "btn-primary");
|
|
111
113
|
|
|
112
114
|
document.getElementById("pageSupport").style.display = "block";
|
|
113
115
|
document.getElementById("pageFeatureOptions").style.display = "none";
|
|
@@ -131,25 +133,38 @@ export class webUi {
|
|
|
131
133
|
const devices = await this.homebridge.getCachedAccessories();
|
|
132
134
|
|
|
133
135
|
// If we've got devices detected, we launch our feature option UI. Otherwise, we launch our first run UI.
|
|
134
|
-
if(this.featureOptions.currentConfig.length && devices?.length) {
|
|
136
|
+
if(this.featureOptions.currentConfig.length && devices?.length && !(await this.#processHandler(this.firstRunRequired))) {
|
|
135
137
|
|
|
136
138
|
document.getElementById("menuWrapper").style.display = "inline-flex";
|
|
137
139
|
this.featureOptions.showUI();
|
|
140
|
+
|
|
138
141
|
return;
|
|
139
142
|
}
|
|
140
143
|
|
|
141
|
-
// If we have
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
this.featureOptions.currentConfig.push({ name: this.name });
|
|
145
|
-
} else if(!("name" in this.featureOptions.currentConfig[0])) {
|
|
146
|
-
|
|
147
|
-
// If we haven't set the name, let's do so now.
|
|
148
|
-
this.featureOptions.currentConfig[0].name = this.name;
|
|
149
|
-
}
|
|
144
|
+
// If we have the name property set for the plugin configuration yet, let's do so now. If we don't have a configuration, let's initialize it as well.
|
|
145
|
+
(this.featureOptions.currentConfig[0] ??= { name: this.name }).name ??= this.name;
|
|
150
146
|
|
|
151
147
|
// Update the plugin configuration and launch the first run UI.
|
|
152
148
|
await this.homebridge.updatePluginConfig(this.featureOptions.currentConfig);
|
|
153
149
|
this.#showFirstRun();
|
|
154
150
|
}
|
|
151
|
+
|
|
152
|
+
// Utility to process user-provided custom handlers that can handle both synchronous and asynchronous handlers.
|
|
153
|
+
async #processHandler(handler) {
|
|
154
|
+
|
|
155
|
+
if(((typeof handler === "function") && !(await handler())) || ((typeof handler !== "function") && !handler)) {
|
|
156
|
+
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Utility to toggle our classes.
|
|
164
|
+
#toggleClasses(id, removeClass, addClass) {
|
|
165
|
+
|
|
166
|
+
const element = document.getElementById(id);
|
|
167
|
+
element.classList.remove(removeClass);
|
|
168
|
+
element.classList.add(addClass);
|
|
169
|
+
}
|
|
155
170
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-plugin-utils",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"displayName": "Homebridge Plugin Utilities",
|
|
5
5
|
"description": "Opinionated utilities to provide common capabilities and create rich configuration webUI experiences for Homebridge plugins.",
|
|
6
6
|
"author": {
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"eslint": "8.57.0",
|
|
45
45
|
"shx": "^0.3.4",
|
|
46
46
|
"typescript": "5.4.5",
|
|
47
|
-
"typescript-eslint": "^7.
|
|
47
|
+
"typescript-eslint": "^7.10.0"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"mqtt": "^5.6.1"
|