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.
@@ -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 eslintPlugins = {
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 eslintTsRules = {
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 eslintJsRules = {
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 eslintCommonRules = {
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
- plugins: eslintPlugins,
77
+ globals: {
78
+
79
+ ui: globalsUi
80
+ },
81
+ plugins: plugins,
75
82
  rules: {
76
83
 
77
- common: eslintCommonRules,
78
- js: eslintJsRules,
79
- ts: eslintTsRules
84
+ common: commonRules,
85
+ js: jsRules,
86
+ ts: tsRules
80
87
  }
81
88
  };
82
-
@@ -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.
@@ -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
- // Get the list of devices the plugin knows about.
51
- const devices = await this.homebridge.getCachedAccessories();
64
+ // Run a custom submit handler the user may have provided.
65
+ if(!(await this.#processHandler(this.firstRunSubmit))) {
52
66
 
53
- // Sort it for posterity.
54
- devices?.sort((a, b) => {
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
- // Create our UI.
81
- document.getElementById("menuHome").classList.remove("btn-elegant");
82
- document.getElementById("menuHome").classList.add("btn-primary");
83
- document.getElementById("menuFeatureOptions").classList.remove("btn-elegant");
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
- // Create our UI.
105
- document.getElementById("menuHome").classList.add("btn-elegant");
106
- document.getElementById("menuHome").classList.remove("btn-primary");
107
- document.getElementById("menuFeatureOptions").classList.remove("btn-elegant");
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 no configuration, let's create one.
142
- if(!this.featureOptions.currentConfig.length) {
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.0.0",
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.9.0"
47
+ "typescript-eslint": "^7.10.0"
48
48
  },
49
49
  "dependencies": {
50
50
  "mqtt": "^5.6.1"