homebridge-plugin-utils 1.35.0 → 2.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.
Files changed (204) hide show
  1. package/README.md +130 -2
  2. package/build/eslint-plugin/README.md +164 -0
  3. package/build/eslint-plugin/config.mjs +308 -0
  4. package/build/eslint-plugin/index.mjs +7 -0
  5. package/build/eslint-plugin/plugin.mjs +46 -0
  6. package/build/eslint-plugin/rules/blank-line-after-open-brace.mjs +137 -0
  7. package/build/eslint-plugin/rules/blank-line-after-open-brace.test.mjs +112 -0
  8. package/build/eslint-plugin/rules/comment-style.mjs +190 -0
  9. package/build/eslint-plugin/rules/comment-style.test.mjs +190 -0
  10. package/build/eslint-plugin/rules/enforce-node-protocol.mjs +114 -0
  11. package/build/eslint-plugin/rules/enforce-node-protocol.test.mjs +116 -0
  12. package/build/eslint-plugin/rules/paren-comparisons-in-logical.mjs +94 -0
  13. package/build/eslint-plugin/rules/paren-comparisons-in-logical.test.mjs +107 -0
  14. package/build/eslint-plugin/rules/split-type-imports.mjs +354 -0
  15. package/build/eslint-plugin/rules/split-type-imports.test.mjs +268 -0
  16. package/build/eslint-plugin/test-setup.mjs +21 -0
  17. package/build/fs-ops.mjs +184 -0
  18. package/build/tsconfig.json +18 -3
  19. package/dist/backpressure.d.ts +94 -45
  20. package/dist/backpressure.js +229 -93
  21. package/dist/backpressure.js.map +1 -1
  22. package/dist/cli/index.d.ts +166 -0
  23. package/dist/cli/index.js +551 -0
  24. package/dist/cli/index.js.map +1 -0
  25. package/dist/clock-double.d.ts +93 -0
  26. package/dist/clock-double.js +141 -0
  27. package/dist/clock-double.js.map +1 -0
  28. package/dist/clock.d.ts +39 -0
  29. package/dist/clock.js +34 -0
  30. package/dist/clock.js.map +1 -0
  31. package/dist/disposable-stack.d.ts +59 -0
  32. package/dist/disposable-stack.js +155 -0
  33. package/dist/disposable-stack.js.map +1 -0
  34. package/dist/docChrome.d.ts +260 -0
  35. package/dist/docChrome.js +361 -0
  36. package/dist/docChrome.js.map +1 -0
  37. package/dist/eslint-plugin/config.d.mts +193 -0
  38. package/dist/eslint-plugin/index.d.mts +2 -0
  39. package/dist/eslint-plugin/plugin.d.mts +87 -0
  40. package/dist/eslint-plugin/rules/blank-line-after-open-brace.d.mts +19 -0
  41. package/dist/eslint-plugin/rules/comment-style.d.mts +15 -0
  42. package/dist/eslint-plugin/rules/enforce-node-protocol.d.mts +18 -0
  43. package/dist/eslint-plugin/rules/paren-comparisons-in-logical.d.mts +15 -0
  44. package/dist/eslint-plugin/rules/split-type-imports.d.mts +16 -0
  45. package/dist/featureOptions-docs.d.ts +96 -0
  46. package/dist/featureOptions-docs.js +193 -0
  47. package/dist/featureOptions-docs.js.map +1 -0
  48. package/dist/featureOptions.d.ts +674 -0
  49. package/dist/featureOptions.js +870 -0
  50. package/dist/featureOptions.js.map +1 -0
  51. package/dist/ffmpeg/codecs.d.ts +256 -72
  52. package/dist/ffmpeg/codecs.js +477 -262
  53. package/dist/ffmpeg/codecs.js.map +1 -1
  54. package/dist/ffmpeg/dgram-util.d.ts +46 -0
  55. package/dist/ffmpeg/dgram-util.js +38 -0
  56. package/dist/ffmpeg/dgram-util.js.map +1 -0
  57. package/dist/ffmpeg/exec.d.ts +83 -64
  58. package/dist/ffmpeg/exec.js +77 -86
  59. package/dist/ffmpeg/exec.js.map +1 -1
  60. package/dist/ffmpeg/fmp4.d.ts +49 -2
  61. package/dist/ffmpeg/fmp4.js +47 -11
  62. package/dist/ffmpeg/fmp4.js.map +1 -1
  63. package/dist/ffmpeg/hap-enums.d.ts +214 -0
  64. package/dist/ffmpeg/hap-enums.js +92 -0
  65. package/dist/ffmpeg/hap-enums.js.map +1 -0
  66. package/dist/ffmpeg/index.d.ts +16 -9
  67. package/dist/ffmpeg/index.js +6 -0
  68. package/dist/ffmpeg/index.js.map +1 -1
  69. package/dist/ffmpeg/mp4-assembler.d.ts +161 -0
  70. package/dist/ffmpeg/mp4-assembler.js +424 -0
  71. package/dist/ffmpeg/mp4-assembler.js.map +1 -0
  72. package/dist/ffmpeg/mp4-parser.d.ts +94 -0
  73. package/dist/ffmpeg/mp4-parser.js +130 -0
  74. package/dist/ffmpeg/mp4-parser.js.map +1 -0
  75. package/dist/ffmpeg/options.d.ts +62 -149
  76. package/dist/ffmpeg/options.js +608 -499
  77. package/dist/ffmpeg/options.js.map +1 -1
  78. package/dist/ffmpeg/process.d.ts +142 -96
  79. package/dist/ffmpeg/process.js +406 -278
  80. package/dist/ffmpeg/process.js.map +1 -1
  81. package/dist/ffmpeg/record.d.ts +325 -186
  82. package/dist/ffmpeg/record.js +418 -565
  83. package/dist/ffmpeg/record.js.map +1 -1
  84. package/dist/ffmpeg/recording-process-double.d.ts +157 -0
  85. package/dist/ffmpeg/recording-process-double.js +190 -0
  86. package/dist/ffmpeg/recording-process-double.js.map +1 -0
  87. package/dist/ffmpeg/rtp-parser.d.ts +70 -0
  88. package/dist/ffmpeg/rtp-parser.js +77 -0
  89. package/dist/ffmpeg/rtp-parser.js.map +1 -0
  90. package/dist/ffmpeg/rtp.d.ts +198 -141
  91. package/dist/ffmpeg/rtp.js +474 -251
  92. package/dist/ffmpeg/rtp.js.map +1 -1
  93. package/dist/ffmpeg/settings.d.ts +5 -2
  94. package/dist/ffmpeg/settings.js +20 -5
  95. package/dist/ffmpeg/settings.js.map +1 -1
  96. package/dist/ffmpeg/stream.d.ts +57 -107
  97. package/dist/ffmpeg/stream.js +121 -150
  98. package/dist/ffmpeg/stream.js.map +1 -1
  99. package/dist/formatters.d.ts +106 -0
  100. package/dist/formatters.js +174 -0
  101. package/dist/formatters.js.map +1 -0
  102. package/dist/homebridge-enums.d.ts +30 -0
  103. package/dist/homebridge-enums.js +17 -0
  104. package/dist/homebridge-enums.js.map +1 -0
  105. package/dist/index.d.ts +13 -6
  106. package/dist/index.js +8 -2
  107. package/dist/index.js.map +1 -1
  108. package/dist/logclient/auth.d.ts +114 -0
  109. package/dist/logclient/auth.js +199 -0
  110. package/dist/logclient/auth.js.map +1 -0
  111. package/dist/logclient/cli-run.d.ts +76 -0
  112. package/dist/logclient/cli-run.js +639 -0
  113. package/dist/logclient/cli-run.js.map +1 -0
  114. package/dist/logclient/cli.d.ts +3 -0
  115. package/dist/logclient/cli.js +97 -0
  116. package/dist/logclient/cli.js.map +1 -0
  117. package/dist/logclient/client.d.ts +145 -0
  118. package/dist/logclient/client.js +600 -0
  119. package/dist/logclient/client.js.map +1 -0
  120. package/dist/logclient/config.d.ts +173 -0
  121. package/dist/logclient/config.js +199 -0
  122. package/dist/logclient/config.js.map +1 -0
  123. package/dist/logclient/endpoints.d.ts +54 -0
  124. package/dist/logclient/endpoints.js +73 -0
  125. package/dist/logclient/endpoints.js.map +1 -0
  126. package/dist/logclient/filter.d.ts +45 -0
  127. package/dist/logclient/filter.js +51 -0
  128. package/dist/logclient/filter.js.map +1 -0
  129. package/dist/logclient/frame.d.ts +93 -0
  130. package/dist/logclient/frame.js +203 -0
  131. package/dist/logclient/frame.js.map +1 -0
  132. package/dist/logclient/index.d.ts +31 -0
  133. package/dist/logclient/index.js +12 -0
  134. package/dist/logclient/index.js.map +1 -0
  135. package/dist/logclient/parser.d.ts +211 -0
  136. package/dist/logclient/parser.js +393 -0
  137. package/dist/logclient/parser.js.map +1 -0
  138. package/dist/logclient/rest.d.ts +41 -0
  139. package/dist/logclient/rest.js +111 -0
  140. package/dist/logclient/rest.js.map +1 -0
  141. package/dist/logclient/settings.d.ts +15 -0
  142. package/dist/logclient/settings.js +64 -0
  143. package/dist/logclient/settings.js.map +1 -0
  144. package/dist/logclient/socket-double.d.ts +201 -0
  145. package/dist/logclient/socket-double.js +384 -0
  146. package/dist/logclient/socket-double.js.map +1 -0
  147. package/dist/logclient/socket.d.ts +257 -0
  148. package/dist/logclient/socket.js +620 -0
  149. package/dist/logclient/socket.js.map +1 -0
  150. package/dist/logclient/stitch.d.ts +83 -0
  151. package/dist/logclient/stitch.js +146 -0
  152. package/dist/logclient/stitch.js.map +1 -0
  153. package/dist/logclient/time-expression.d.ts +42 -0
  154. package/dist/logclient/time-expression.js +181 -0
  155. package/dist/logclient/time-expression.js.map +1 -0
  156. package/dist/logclient/time-window.d.ts +38 -0
  157. package/dist/logclient/time-window.js +53 -0
  158. package/dist/logclient/time-window.js.map +1 -0
  159. package/dist/logclient/types.d.ts +107 -0
  160. package/dist/logclient/types.js +6 -0
  161. package/dist/logclient/types.js.map +1 -0
  162. package/dist/mqttClient.d.ts +287 -0
  163. package/dist/mqttClient.js +433 -0
  164. package/dist/mqttClient.js.map +1 -0
  165. package/dist/service.d.ts +64 -15
  166. package/dist/service.js +93 -66
  167. package/dist/service.js.map +1 -1
  168. package/dist/ui/featureOptions.js +870 -0
  169. package/dist/ui/featureOptions.js.map +1 -0
  170. package/dist/ui/formatters.js +174 -0
  171. package/dist/ui/formatters.js.map +1 -0
  172. package/dist/ui/pluginConfigSession.mjs +141 -0
  173. package/dist/ui/webUi-featureOptions/categoryState.mjs +135 -0
  174. package/dist/ui/webUi-featureOptions/effects/keyboard.mjs +61 -0
  175. package/dist/ui/webUi-featureOptions/effects/persist.mjs +226 -0
  176. package/dist/ui/webUi-featureOptions/effects/theme.mjs +398 -0
  177. package/dist/ui/webUi-featureOptions/effects/tokens.mjs +152 -0
  178. package/dist/ui/webUi-featureOptions/rendering.mjs +431 -0
  179. package/dist/ui/webUi-featureOptions/selectors.mjs +360 -0
  180. package/dist/ui/webUi-featureOptions/state.mjs +319 -0
  181. package/dist/ui/webUi-featureOptions/store.mjs +181 -0
  182. package/dist/ui/webUi-featureOptions/utils.mjs +213 -0
  183. package/dist/ui/webUi-featureOptions/views/connectionError.mjs +152 -0
  184. package/dist/ui/webUi-featureOptions/views/deviceInfo.mjs +80 -0
  185. package/dist/ui/webUi-featureOptions/views/header.mjs +77 -0
  186. package/dist/ui/webUi-featureOptions/views/nav.mjs +341 -0
  187. package/dist/ui/webUi-featureOptions/views/options.mjs +521 -0
  188. package/dist/ui/webUi-featureOptions/views/search.mjs +395 -0
  189. package/dist/ui/webUi-featureOptions.mjs +702 -0
  190. package/dist/ui/webUi.mjs +225 -88
  191. package/dist/util.d.ts +679 -45
  192. package/dist/util.js +830 -77
  193. package/dist/util.js.map +1 -1
  194. package/package.json +33 -15
  195. package/build/eslint-rules.mjs +0 -511
  196. package/dist/featureoptions.d.ts +0 -264
  197. package/dist/featureoptions.js +0 -480
  198. package/dist/featureoptions.js.map +0 -1
  199. package/dist/mqttclient.d.ts +0 -178
  200. package/dist/mqttclient.js +0 -310
  201. package/dist/mqttclient.js.map +0 -1
  202. package/dist/ui/featureoptions.js +0 -480
  203. package/dist/ui/featureoptions.js.map +0 -1
  204. package/dist/ui/webUi-featureoptions.mjs +0 -3765
package/dist/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "homebridge-plugin-utils",
3
- "version": "1.35.0",
3
+ "version": "2.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": {
@@ -18,7 +18,7 @@
18
18
  },
19
19
  "type": "module",
20
20
  "engines": {
21
- "node": ">=22"
21
+ "node": ">=22.20"
22
22
  },
23
23
  "keywords": [
24
24
  "homebridge",
@@ -30,27 +30,45 @@
30
30
  "camera"
31
31
  ],
32
32
  "scripts": {
33
- "build": "npm run clean && tsc && shx cp dist/featureoptions.js{,.map} dist/ui",
34
- "build-docs": "shx rm -f ./docs/[^CO]*.md ./docs/ffmpeg/*.md && npx typedoc",
35
- "build-ui": "shx mkdir -p dist/ui && shx cp ui/**.mjs dist/ui",
36
- "clean": "shx rm -rf dist && npm run build-ui",
37
- "lint": "eslint --max-warnings=${ESLINT_MAX_WARNINGS:-\"-1\"} eslint.config.mjs build/**.mjs src \"ui/**/*.@(js|mjs)\"",
33
+ "build": "npm run clean && tsc -p tsconfig.build.json && tsc -p tsconfig.eslint-plugin.json && node build/fs-ops.mjs finalize",
34
+ "build-docs": "node build/fs-ops.mjs clean-docs && npx typedoc",
35
+ "build-ui": "node build/fs-ops.mjs build-ui",
36
+ "clean": "node build/fs-ops.mjs clean dist && npm run build-ui",
37
+ "lint": "eslint --max-warnings=${ESLINT_MAX_WARNINGS:-\"-1\"} eslint.config.mjs build src ui",
38
38
  "postpublish": "npm run clean",
39
- "prepublishOnly": "npm run lint && npm run build"
39
+ "prepublishOnly": "npm run lint && npm run typecheck && npm run build",
40
+ "test": "node --import ./ui/test-loader.mjs --test --experimental-test-coverage --test-coverage-include='src/**/*.ts' --test-coverage-include='ui/**/*.mjs' --test-coverage-exclude='src/**/*.test.ts' --test-coverage-exclude='ui/**/*.test.mjs' --test-coverage-exclude='ui/**/*.helpers.mjs' --test-coverage-exclude='ui/test-loader.mjs' --test-coverage-lines=85 --test-coverage-branches=80 --test-coverage-functions=85 --test-timeout=15000 \"src/**/*.test.ts\" \"ui/**/*.test.mjs\" \"build/**/*.test.mjs\"",
41
+ "test:all": "npm run test && npm run test:e2e",
42
+ "test:e2e": "node --import ./ui/test-loader.mjs --test --test-timeout=120000 \"test/e2e/**/*.test.ts\" \"test/e2e/**/*.test.mjs\"",
43
+ "test:focus": "node --import ./ui/test-loader.mjs --test --test-only --test-timeout=15000 \"src/**/*.test.ts\" \"ui/**/*.test.mjs\" \"build/**/*.test.mjs\"",
44
+ "test:watch": "node --import ./ui/test-loader.mjs --test --watch \"src/**/*.test.ts\" \"ui/**/*.test.mjs\" \"build/**/*.test.mjs\"",
45
+ "typecheck": "tsc --noEmit"
40
46
  },
41
47
  "main": "dist/index.js",
48
+ "exports": {
49
+ ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js" },
50
+ "./eslint": { "types": "./dist/eslint-plugin/index.d.mts", "import": "./build/eslint-plugin/index.mjs" },
51
+ "./logclient": { "types": "./dist/logclient/index.d.ts", "import": "./dist/logclient/index.js" },
52
+ "./package.json": "./package.json"
53
+ },
54
+ "bin": {
55
+ "homebridge-plugin-utils": "dist/cli/index.js",
56
+ "hblog": "dist/logclient/cli.js"
57
+ },
42
58
  "devDependencies": {
59
+ "@homebridge/hap-nodejs": "2.1.8",
43
60
  "@stylistic/eslint-plugin": "5.10.0",
44
- "@types/node": "25.5.2",
61
+ "@types/node": "26.1.1",
62
+ "aedes": "1.0.2",
45
63
  "eslint": "9.39.2",
46
- "homebridge": "1.11.4",
47
- "shx": "0.4.0",
48
- "typedoc": "0.28.18",
49
- "typedoc-plugin-markdown": "4.11.0",
64
+ "happy-dom": "20.10.6",
65
+ "homebridge": "2.1.1",
66
+ "typedoc": "0.28.20",
67
+ "typedoc-plugin-markdown": "4.12.0",
50
68
  "typescript": "5.9.3",
51
- "typescript-eslint": "8.58.1"
69
+ "typescript-eslint": "8.64.0"
52
70
  },
53
71
  "dependencies": {
54
- "mqtt": "5.15.1"
72
+ "mqtt": "5.15.2"
55
73
  }
56
74
  }
@@ -1,511 +0,0 @@
1
- /* Copyright(C) 2017-2026, HJD (https://github.com/hjdhjd). All rights reserved.
2
- *
3
- * eslint-rules.mjs: Opinionated default linting rules for Homebridge plugins.
4
- */
5
- import eslintJs from "@eslint/js";
6
- import stylistic from "@stylistic/eslint-plugin";
7
- import ts from "typescript-eslint";
8
-
9
- const ruleBlankAfterOpenBrace = {
10
-
11
- create(context) {
12
-
13
- function checkNode(node) {
14
-
15
- const sourceCode = context.sourceCode;
16
- const openBrace = sourceCode.getFirstToken(node);
17
- const nextToken = sourceCode.getTokenAfter(openBrace);
18
-
19
- if(openBrace.loc.end.line < nextToken.loc.start.line) {
20
-
21
- const nextLine = sourceCode.lines[openBrace.loc.end.line];
22
-
23
- if(nextLine.trim() !== "") {
24
-
25
- context.report({
26
-
27
- fix(fixer) {
28
-
29
- return fixer.insertTextAfter(openBrace, "\n\n");
30
- },
31
- loc: openBrace.loc,
32
- message: "Expected blank line after left brace and newline.",
33
- node
34
- });
35
- }
36
- }
37
- }
38
-
39
- return {
40
-
41
- // Validate block statements.
42
- BlockStatement(node) {
43
-
44
- checkNode(node);
45
- },
46
-
47
- // Validate class declarations and any embedded methods or objects.
48
- ClassBody(node) {
49
-
50
- checkNode(node);
51
-
52
- for(const element of node.body) {
53
-
54
- if((![ "MethodDefinition", "PropertyDefinition" ].includes(element.type)) || (element.value?.type !== "ObjectExpression")) {
55
-
56
- continue;
57
- }
58
-
59
- checkNode(node);
60
- }
61
- },
62
-
63
- // Validate object expressions.
64
- ObjectExpression(node) {
65
-
66
- checkNode(node);
67
- },
68
-
69
- // Validate interface declarations and any embedded objects.
70
- TSInterfaceBody(node) {
71
-
72
- checkNode(node);
73
-
74
- for(const property of node.body) {
75
-
76
- if(!property.typeAnnotation || (property.type !== "TSPropertySignature") || (property.typeAnnotation.typeAnnotation.type !== "TSTypeLiteral")) {
77
-
78
- continue;
79
- }
80
-
81
- checkNode(property.typeAnnotation.typeAnnotation);
82
- }
83
- },
84
-
85
- // Validate type declarations and any embedded objects.
86
- TSTypeAliasDeclaration(node) {
87
-
88
- if(node.typeAnnotation.type !== "TSTypeLiteral") {
89
-
90
- return;
91
- }
92
-
93
- checkNode(node.typeAnnotation);
94
-
95
- for(const member of node.typeAnnotation.members) {
96
-
97
- if(!member.typeAnnotation || (member.type !== "TSPropertySignature") || (member.typeAnnotation.typeAnnotation.type !== "TSTypeLiteral")) {
98
-
99
- continue;
100
- }
101
-
102
- checkNode(member.typeAnnotation.typeAnnotation);
103
- }
104
- }
105
- };
106
- },
107
- meta: {
108
-
109
- docs: {
110
-
111
- category: "Stylistic Issues",
112
- description: "require a blank line after an opening brace if it is immediately followed by a newline",
113
- recommended: false
114
- },
115
- fixable: "whitespace",
116
- schema: [],
117
- type: "layout"
118
- }
119
- };
120
-
121
- const ruleParenComparisonsInLogical = {
122
-
123
- create(context) {
124
-
125
- const sourceCode = context.sourceCode;
126
-
127
- // Comparison operators to wrap when used inside && / || compounds.
128
- const comparisonOperators = new Set([ "==", "!=", "===", "!==", "<", "<=", ">", ">=", "in", "instanceof" ]);
129
- const logicalOperators = new Set([ "&&", "||" ]);
130
-
131
- function isComparison(node) {
132
-
133
- return !!node &&
134
- (node.type === "BinaryExpression") &&
135
- comparisonOperators.has(node.operator);
136
- }
137
-
138
- function isParenthesized(node) {
139
-
140
- // Prefer ESLint's helper when available.
141
- if(typeof sourceCode.isParenthesized === "function") {
142
-
143
- return sourceCode.isParenthesized(node);
144
- }
145
-
146
- // Fallback token check.
147
- const before = sourceCode.getTokenBefore(node);
148
- const after = sourceCode.getTokenAfter(node);
149
-
150
- return !!before && !!after && (before.value === "(") && (after.value === ")");
151
- }
152
-
153
- function checkOperand(node) {
154
-
155
- if(!isComparison(node) || isParenthesized(node)) {
156
-
157
- return;
158
- }
159
-
160
- context.report({
161
-
162
- fix(fixer) {
163
-
164
- return fixer.replaceText(node, "(" + sourceCode.getText(node) + ")");
165
- },
166
- message: "Wrap comparison operands in parentheses inside compound logical expressions (&&, ||).",
167
- node
168
- });
169
- }
170
-
171
- return {
172
-
173
- LogicalExpression(node) {
174
-
175
- if(!logicalOperators.has(node.operator)) {
176
-
177
- return;
178
- }
179
-
180
- // Only wrap direct operands of && / || when they are comparisons.
181
- checkOperand(node.left);
182
- checkOperand(node.right);
183
- }
184
- };
185
- },
186
- meta: {
187
-
188
- docs: {
189
-
190
- category: "Stylistic Issues",
191
- description: "require parentheses around comparison operands when used inside compound logical expressions (&&, ||)",
192
- recommended: false
193
- },
194
- fixable: "code",
195
- schema: [],
196
- type: "layout"
197
- }
198
- };
199
-
200
- // Enforce no space between `catch` and `(` when a parameter is present. Parameterless catch clauses (e.g., `catch {`) are ignored and handled by space-before-blocks.
201
- const ruleCatchParenSpacing = {
202
-
203
- create(context) {
204
-
205
- const sourceCode = context.sourceCode;
206
-
207
- return {
208
-
209
- CatchClause(node) {
210
-
211
- // Only check catch clauses that have a parameter.
212
- if(!node.param) {
213
-
214
- return;
215
- }
216
-
217
- // Get the `catch` keyword token and the opening parenthesis token.
218
- const catchKeyword = sourceCode.getFirstToken(node);
219
- const openParen = sourceCode.getTokenAfter(catchKeyword);
220
-
221
- // Check if there is whitespace between `catch` and `(`.
222
- if((openParen.value === "(") && (catchKeyword.range[1] < openParen.range[0])) {
223
-
224
- context.report({
225
-
226
- fix(fixer) {
227
-
228
- return fixer.removeRange([ catchKeyword.range[1], openParen.range[0] ]);
229
- },
230
- loc: {
231
-
232
- end: openParen.loc.start,
233
- start: catchKeyword.loc.end
234
- },
235
- message: "Unexpected space between `catch` and `(`.",
236
- node
237
- });
238
- }
239
- }
240
- };
241
- },
242
- meta: {
243
-
244
- docs: {
245
-
246
- category: "Stylistic Issues",
247
- description: "disallow space between `catch` and `(` when a parameter is present",
248
- recommended: false
249
- },
250
- fixable: "whitespace",
251
- schema: [],
252
- type: "layout"
253
- }
254
- };
255
-
256
- // Extract rules by name from a typescript-eslint config array. Throws if the named entry is missing so that a typescript-eslint version bump that renames config entries
257
- // fails loudly rather than silently dropping rules.
258
- function configRules(configs, name) {
259
-
260
- const entry = configs.find((c) => c.name === name);
261
-
262
- if(!entry) {
263
-
264
- throw new Error("typescript-eslint config entry not found: " + name);
265
- }
266
-
267
- return entry.rules;
268
- }
269
-
270
- // ESlint plugins to use.
271
- const plugins = {
272
-
273
- "@hjdhjd": {
274
-
275
- "rules": {
276
-
277
- "blank-line-after-open-brace": ruleBlankAfterOpenBrace,
278
- "catch-paren-spacing": ruleCatchParenSpacing,
279
- "paren-comparisons-in-logical": ruleParenComparisonsInLogical
280
- }
281
- },
282
- "@stylistic": stylistic,
283
- "@typescript-eslint": ts.plugin
284
- };
285
-
286
- // TypeScript-specific rules.
287
- const tsRules = {
288
-
289
- ...configRules(ts.configs.strictTypeChecked, "typescript-eslint/strict-type-checked"),
290
- ...configRules(ts.configs.stylisticTypeChecked, "typescript-eslint/stylistic-type-checked"),
291
- "@stylistic/member-delimiter-style": "warn",
292
- "@typescript-eslint/await-thenable": "warn",
293
- "@typescript-eslint/consistent-type-imports": "warn",
294
- "@typescript-eslint/explicit-function-return-type": "warn",
295
- "@typescript-eslint/explicit-module-boundary-types": "warn",
296
- "@typescript-eslint/no-explicit-any": "warn",
297
- "@typescript-eslint/no-floating-promises": [ "warn", { "ignoreIIFE": true } ],
298
- "@typescript-eslint/no-non-null-assertion": "warn",
299
- "@typescript-eslint/no-unnecessary-condition": "warn",
300
- "@typescript-eslint/no-unused-expressions": "warn",
301
- "@typescript-eslint/no-unused-vars": [ "warn", { "caughtErrors": "none" } ],
302
- "@typescript-eslint/prefer-nullish-coalescing": "warn",
303
- "@typescript-eslint/promise-function-async": "warn",
304
- "require-await": "off",
305
- // eslint-disable-next-line sort-keys
306
- "@typescript-eslint/require-await": "warn",
307
- "no-dupe-class-members": "off",
308
- "no-redeclare": "off",
309
- "no-undef": "off",
310
- "no-unused-expressions": "off",
311
- "no-unused-vars": "off"
312
- };
313
-
314
- // JavaScript-specific rules.
315
- const jsRules = {
316
-
317
- ...ts.configs.disableTypeChecked.rules,
318
- "@typescript-eslint/no-floating-promises": "off",
319
- "require-await": "warn"
320
- };
321
-
322
- // Rules that exist across both JavaScript and TypeScript files.
323
- const commonRules = {
324
-
325
- ...ts.configs.eslintRecommended.rules,
326
- "@hjdhjd/blank-line-after-open-brace": "warn",
327
- "@hjdhjd/catch-paren-spacing": "warn",
328
- "@hjdhjd/paren-comparisons-in-logical": "warn",
329
- "@stylistic/array-bracket-spacing": [ "warn", "always", { "arraysInArrays": true, "objectsInArrays": true, "singleValue": false } ],
330
- "@stylistic/block-spacing": "warn",
331
- "@stylistic/brace-style": [ "warn", "1tbs", { "allowSingleLine": true } ],
332
- "@stylistic/comma-dangle": "warn",
333
- "@stylistic/eol-last": [ "warn", "always" ],
334
- "@stylistic/generator-star-spacing": "warn",
335
- "@stylistic/implicit-arrow-linebreak": "warn",
336
- "@stylistic/indent": [ "warn", 2, { "SwitchCase": 1 } ],
337
- "@stylistic/keyword-spacing": [ "warn",
338
- { "overrides": { "for": { "after": false }, "if": { "after": false }, "switch": { "after": false}, "while": { "after": false } } } ],
339
- "@stylistic/linebreak-style": [ "warn", "unix" ],
340
- "@stylistic/lines-between-class-members": [ "warn", "always", { "exceptAfterSingleLine": true } ],
341
- "@stylistic/max-len": [ "warn", 170 ],
342
- "@stylistic/no-tabs": "warn",
343
- "@stylistic/no-trailing-spaces": "warn",
344
- "@stylistic/operator-linebreak": [ "warn", "after", { "overrides": { ":": "after", "?": "after" } } ],
345
- "@stylistic/padding-line-between-statements": [ "warn",
346
-
347
- // Require a blank line before every statement type in next.
348
- { "blankLine": "always", "next": [ "break", "case", "class", "continue", "default", "export", "for", "function", "if", "import", "return" ], "prev": "*" },
349
-
350
- // Require blank lines after every statement type in prev.
351
- { "blankLine": "always", "next": "*", "prev": [ "const", "directive", "let", "var" ] },
352
-
353
- // Multiple sequential case declarations may be grouped together.
354
- { "blankLine": "any", "next": [ "case", "default" ], "prev": [ "case", "default" ] },
355
-
356
- // Multiple sequential variable declarations may be grouped together.
357
- { "blankLine": "any", "next": [ "const", "let", "var" ], "prev": [ "const", "let", "var" ] },
358
-
359
- // Multiple sequential export declarations may be grouped together.
360
- { "blankLine": "any", "next": "export", "prev": "export" },
361
-
362
- // Multiple sequential import declarations must be grouped together.
363
- { "blankLine": "never", "next": "import", "prev": "import" },
364
-
365
- // Multiple sequential directive prologues must be grouped together.
366
- { "blankLine": "never", "next": "directive", "prev": "directive" }
367
- ],
368
- "@stylistic/semi": [ "warn", "always" ],
369
- "@stylistic/space-before-function-paren": [ "warn", { "anonymous": "never", "asyncArrow": "always", "catch": "never", "named": "never" } ],
370
- "@stylistic/space-in-parens": "warn",
371
- "@stylistic/space-infix-ops": "warn",
372
- "@stylistic/space-unary-ops": "warn",
373
- "@typescript-eslint/no-this-alias": "warn",
374
- "camelcase": "warn",
375
- "curly": [ "warn", "all" ],
376
- "dot-notation": "warn",
377
- "eqeqeq": "warn",
378
- "logical-assignment-operators": [ "warn", "always", { "enforceForIfStatements": true } ],
379
- "no-await-in-loop": "warn",
380
- "no-console": "warn",
381
- "no-restricted-syntax": [ "warn", "TemplateLiteral" ],
382
- "prefer-arrow-callback": "warn",
383
- "prefer-const": "warn",
384
- "quotes": [ "warn", "double", { "allowTemplateLiterals": false, "avoidEscape": false } ],
385
- "sort-imports": "warn",
386
- "sort-keys": "warn",
387
- "sort-vars": "warn"
388
- };
389
-
390
- // Globals that tend to exist in Homebridge plugins with a webUI.
391
- const globalsUi = Object.fromEntries([ "clearTimeout", "console", "container", "document", "fetch", "getComputedStyle", "homebridge", "setTimeout", "window" ]
392
- .map(key => [ key, "readonly" ]));
393
-
394
- /* Build a ready-to-use ESLint flat config array. Consumers call this function and export default the result.
395
- *
396
- * @param {object} options - Configuration options.
397
- * @param {string[]} options.ts - Glob patterns for TypeScript files (strict + stylistic type-checked rules).
398
- * @param {string[]} options.js - Glob patterns for JavaScript files (disable-type-checked rules).
399
- * @param {string[]} options.ui - Glob patterns for browser UI files (adds browser globals).
400
- * @param {string[]} options.allowDefaultProject - Globs passed to parserOptions.projectService.allowDefaultProject.
401
- * @param {string[]} options.ignores - Global ignore patterns (in addition to the hardcoded "dist" ignore on the common block).
402
- * @param {object[]} options.extraConfigs - Additional flat config objects appended to the output.
403
- * @returns {object[]} A flat config array suitable for `export default` in eslint.config.mjs. Block ordering is significant — do not reorder.
404
- */
405
- function config({
406
- allowDefaultProject = [],
407
- extraConfigs = [],
408
- ignores = [],
409
- js = [],
410
- ts: tsFiles = [],
411
- ui = []
412
- } = {}) {
413
-
414
- const allFiles = [ ...tsFiles, ...js, ...ui ];
415
- const configs = [];
416
-
417
- // Global ignores block.
418
- if(ignores.length > 0) {
419
-
420
- configs.push({ ignores });
421
- }
422
-
423
- // Core ESLint recommended rules. This block must precede the TS/JS blocks so that their rule overrides (e.g., no-unused-vars: "off") take priority.
424
- if(allFiles.length > 0) {
425
-
426
- configs.push(eslintJs.configs.recommended);
427
- }
428
-
429
- // TypeScript-specific rules.
430
- if(tsFiles.length > 0) {
431
-
432
- configs.push({
433
-
434
- files: tsFiles,
435
- rules: { ...tsRules }
436
- });
437
- }
438
-
439
- // JavaScript-specific rules.
440
- if(js.length > 0) {
441
-
442
- configs.push({
443
-
444
- files: js,
445
- rules: { ...jsRules }
446
- });
447
- }
448
-
449
- // Common rules applied to all linted files.
450
- if(allFiles.length > 0) {
451
-
452
- configs.push({
453
-
454
- files: allFiles,
455
-
456
- ignores: ["dist"],
457
-
458
- languageOptions: {
459
-
460
- ecmaVersion: "latest",
461
- parser: ts.parser,
462
- parserOptions: {
463
-
464
- ecmaVersion: "latest",
465
-
466
- projectService: {
467
-
468
- allowDefaultProject,
469
- defaultProject: "./tsconfig.json"
470
- }
471
- },
472
-
473
- sourceType: "module"
474
- },
475
-
476
- linterOptions: {
477
-
478
- reportUnusedDisableDirectives: "error"
479
- },
480
-
481
- plugins: { ...plugins },
482
-
483
- rules: { ...commonRules }
484
- });
485
- }
486
-
487
- // UI globals block.
488
- if(ui.length > 0) {
489
-
490
- configs.push({
491
-
492
- files: ui,
493
-
494
- languageOptions: {
495
-
496
- globals: { ...globalsUi }
497
- }
498
- });
499
- }
500
-
501
- // Escape hatch for project-specific config blocks.
502
- configs.push(...extraConfigs);
503
-
504
- return configs;
505
- }
506
-
507
- // Default export is the config function.
508
- export default config;
509
-
510
- // Named exports for advanced customization or gradual migration.
511
- export { commonRules, config, globalsUi, jsRules, plugins, tsRules };