homebridge-plugin-utils 1.35.0 → 2.0.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/README.md +130 -2
- package/build/eslint-plugin/README.md +164 -0
- package/build/eslint-plugin/config.mjs +308 -0
- package/build/eslint-plugin/index.mjs +7 -0
- package/build/eslint-plugin/plugin.mjs +46 -0
- package/build/eslint-plugin/rules/blank-line-after-open-brace.mjs +137 -0
- package/build/eslint-plugin/rules/blank-line-after-open-brace.test.mjs +112 -0
- package/build/eslint-plugin/rules/comment-style.mjs +190 -0
- package/build/eslint-plugin/rules/comment-style.test.mjs +190 -0
- package/build/eslint-plugin/rules/enforce-node-protocol.mjs +114 -0
- package/build/eslint-plugin/rules/enforce-node-protocol.test.mjs +116 -0
- package/build/eslint-plugin/rules/paren-comparisons-in-logical.mjs +94 -0
- package/build/eslint-plugin/rules/paren-comparisons-in-logical.test.mjs +107 -0
- package/build/eslint-plugin/rules/split-type-imports.mjs +354 -0
- package/build/eslint-plugin/rules/split-type-imports.test.mjs +268 -0
- package/build/eslint-plugin/test-setup.mjs +21 -0
- package/build/fs-ops.mjs +184 -0
- package/build/tsconfig.json +18 -3
- package/dist/backpressure.d.ts +94 -45
- package/dist/backpressure.js +229 -93
- package/dist/backpressure.js.map +1 -1
- package/dist/cli/index.d.ts +95 -0
- package/dist/cli/index.js +355 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/clock-double.d.ts +93 -0
- package/dist/clock-double.js +141 -0
- package/dist/clock-double.js.map +1 -0
- package/dist/clock.d.ts +39 -0
- package/dist/clock.js +34 -0
- package/dist/clock.js.map +1 -0
- package/dist/eslint-plugin/config.d.mts +193 -0
- package/dist/eslint-plugin/index.d.mts +2 -0
- package/dist/eslint-plugin/plugin.d.mts +87 -0
- package/dist/eslint-plugin/rules/blank-line-after-open-brace.d.mts +19 -0
- package/dist/eslint-plugin/rules/comment-style.d.mts +15 -0
- package/dist/eslint-plugin/rules/enforce-node-protocol.d.mts +18 -0
- package/dist/eslint-plugin/rules/paren-comparisons-in-logical.d.mts +15 -0
- package/dist/eslint-plugin/rules/split-type-imports.d.mts +16 -0
- package/dist/featureOptions-docs.d.ts +96 -0
- package/dist/featureOptions-docs.js +193 -0
- package/dist/featureOptions-docs.js.map +1 -0
- package/dist/featureOptions.d.ts +674 -0
- package/dist/featureOptions.js +870 -0
- package/dist/featureOptions.js.map +1 -0
- package/dist/ffmpeg/codecs.d.ts +256 -72
- package/dist/ffmpeg/codecs.js +477 -262
- package/dist/ffmpeg/codecs.js.map +1 -1
- package/dist/ffmpeg/dgram-util.d.ts +46 -0
- package/dist/ffmpeg/dgram-util.js +38 -0
- package/dist/ffmpeg/dgram-util.js.map +1 -0
- package/dist/ffmpeg/exec.d.ts +83 -64
- package/dist/ffmpeg/exec.js +77 -86
- package/dist/ffmpeg/exec.js.map +1 -1
- package/dist/ffmpeg/fmp4.d.ts +49 -2
- package/dist/ffmpeg/fmp4.js +47 -11
- package/dist/ffmpeg/fmp4.js.map +1 -1
- package/dist/ffmpeg/hap-enums.d.ts +214 -0
- package/dist/ffmpeg/hap-enums.js +92 -0
- package/dist/ffmpeg/hap-enums.js.map +1 -0
- package/dist/ffmpeg/index.d.ts +16 -9
- package/dist/ffmpeg/index.js +6 -0
- package/dist/ffmpeg/index.js.map +1 -1
- package/dist/ffmpeg/mp4-assembler.d.ts +120 -0
- package/dist/ffmpeg/mp4-assembler.js +387 -0
- package/dist/ffmpeg/mp4-assembler.js.map +1 -0
- package/dist/ffmpeg/mp4-parser.d.ts +94 -0
- package/dist/ffmpeg/mp4-parser.js +130 -0
- package/dist/ffmpeg/mp4-parser.js.map +1 -0
- package/dist/ffmpeg/options.d.ts +62 -149
- package/dist/ffmpeg/options.js +608 -499
- package/dist/ffmpeg/options.js.map +1 -1
- package/dist/ffmpeg/process.d.ts +142 -96
- package/dist/ffmpeg/process.js +406 -278
- package/dist/ffmpeg/process.js.map +1 -1
- package/dist/ffmpeg/record.d.ts +302 -188
- package/dist/ffmpeg/record.js +408 -567
- package/dist/ffmpeg/record.js.map +1 -1
- package/dist/ffmpeg/recording-process-double.d.ts +144 -0
- package/dist/ffmpeg/recording-process-double.js +168 -0
- package/dist/ffmpeg/recording-process-double.js.map +1 -0
- package/dist/ffmpeg/rtp-parser.d.ts +70 -0
- package/dist/ffmpeg/rtp-parser.js +77 -0
- package/dist/ffmpeg/rtp-parser.js.map +1 -0
- package/dist/ffmpeg/rtp.d.ts +198 -141
- package/dist/ffmpeg/rtp.js +473 -251
- package/dist/ffmpeg/rtp.js.map +1 -1
- package/dist/ffmpeg/settings.d.ts +5 -2
- package/dist/ffmpeg/settings.js +20 -5
- package/dist/ffmpeg/settings.js.map +1 -1
- package/dist/ffmpeg/stream.d.ts +57 -107
- package/dist/ffmpeg/stream.js +121 -150
- package/dist/ffmpeg/stream.js.map +1 -1
- package/dist/formatters.d.ts +106 -0
- package/dist/formatters.js +174 -0
- package/dist/formatters.js.map +1 -0
- package/dist/homebridge-enums.d.ts +30 -0
- package/dist/homebridge-enums.js +17 -0
- package/dist/homebridge-enums.js.map +1 -0
- package/dist/index.d.ts +12 -6
- package/dist/index.js +7 -2
- package/dist/index.js.map +1 -1
- package/dist/logclient/auth.d.ts +114 -0
- package/dist/logclient/auth.js +199 -0
- package/dist/logclient/auth.js.map +1 -0
- package/dist/logclient/cli-run.d.ts +76 -0
- package/dist/logclient/cli-run.js +639 -0
- package/dist/logclient/cli-run.js.map +1 -0
- package/dist/logclient/cli.d.ts +3 -0
- package/dist/logclient/cli.js +97 -0
- package/dist/logclient/cli.js.map +1 -0
- package/dist/logclient/client.d.ts +145 -0
- package/dist/logclient/client.js +600 -0
- package/dist/logclient/client.js.map +1 -0
- package/dist/logclient/config.d.ts +173 -0
- package/dist/logclient/config.js +199 -0
- package/dist/logclient/config.js.map +1 -0
- package/dist/logclient/endpoints.d.ts +54 -0
- package/dist/logclient/endpoints.js +73 -0
- package/dist/logclient/endpoints.js.map +1 -0
- package/dist/logclient/filter.d.ts +45 -0
- package/dist/logclient/filter.js +51 -0
- package/dist/logclient/filter.js.map +1 -0
- package/dist/logclient/frame.d.ts +93 -0
- package/dist/logclient/frame.js +203 -0
- package/dist/logclient/frame.js.map +1 -0
- package/dist/logclient/index.d.ts +31 -0
- package/dist/logclient/index.js +12 -0
- package/dist/logclient/index.js.map +1 -0
- package/dist/logclient/parser.d.ts +211 -0
- package/dist/logclient/parser.js +393 -0
- package/dist/logclient/parser.js.map +1 -0
- package/dist/logclient/rest.d.ts +41 -0
- package/dist/logclient/rest.js +111 -0
- package/dist/logclient/rest.js.map +1 -0
- package/dist/logclient/settings.d.ts +15 -0
- package/dist/logclient/settings.js +64 -0
- package/dist/logclient/settings.js.map +1 -0
- package/dist/logclient/socket-double.d.ts +201 -0
- package/dist/logclient/socket-double.js +384 -0
- package/dist/logclient/socket-double.js.map +1 -0
- package/dist/logclient/socket.d.ts +257 -0
- package/dist/logclient/socket.js +620 -0
- package/dist/logclient/socket.js.map +1 -0
- package/dist/logclient/stitch.d.ts +83 -0
- package/dist/logclient/stitch.js +146 -0
- package/dist/logclient/stitch.js.map +1 -0
- package/dist/logclient/time-expression.d.ts +42 -0
- package/dist/logclient/time-expression.js +181 -0
- package/dist/logclient/time-expression.js.map +1 -0
- package/dist/logclient/time-window.d.ts +38 -0
- package/dist/logclient/time-window.js +53 -0
- package/dist/logclient/time-window.js.map +1 -0
- package/dist/logclient/types.d.ts +107 -0
- package/dist/logclient/types.js +6 -0
- package/dist/logclient/types.js.map +1 -0
- package/dist/mqttClient.d.ts +287 -0
- package/dist/mqttClient.js +433 -0
- package/dist/mqttClient.js.map +1 -0
- package/dist/service.d.ts +64 -15
- package/dist/service.js +93 -66
- package/dist/service.js.map +1 -1
- package/dist/ui/featureOptions.js +870 -0
- package/dist/ui/featureOptions.js.map +1 -0
- package/dist/ui/formatters.js +174 -0
- package/dist/ui/formatters.js.map +1 -0
- package/dist/ui/pluginConfigSession.mjs +141 -0
- package/dist/ui/webUi-featureOptions/categoryState.mjs +135 -0
- package/dist/ui/webUi-featureOptions/effects/keyboard.mjs +61 -0
- package/dist/ui/webUi-featureOptions/effects/persist.mjs +226 -0
- package/dist/ui/webUi-featureOptions/effects/theme.mjs +398 -0
- package/dist/ui/webUi-featureOptions/effects/tokens.mjs +152 -0
- package/dist/ui/webUi-featureOptions/rendering.mjs +431 -0
- package/dist/ui/webUi-featureOptions/selectors.mjs +360 -0
- package/dist/ui/webUi-featureOptions/state.mjs +319 -0
- package/dist/ui/webUi-featureOptions/store.mjs +181 -0
- package/dist/ui/webUi-featureOptions/utils.mjs +200 -0
- package/dist/ui/webUi-featureOptions/views/connectionError.mjs +152 -0
- package/dist/ui/webUi-featureOptions/views/deviceInfo.mjs +80 -0
- package/dist/ui/webUi-featureOptions/views/header.mjs +77 -0
- package/dist/ui/webUi-featureOptions/views/nav.mjs +327 -0
- package/dist/ui/webUi-featureOptions/views/options.mjs +521 -0
- package/dist/ui/webUi-featureOptions/views/search.mjs +395 -0
- package/dist/ui/webUi-featureOptions.mjs +677 -0
- package/dist/ui/webUi.mjs +192 -87
- package/dist/util.d.ts +602 -45
- package/dist/util.js +783 -78
- package/dist/util.js.map +1 -1
- package/package.json +33 -15
- package/build/eslint-rules.mjs +0 -511
- package/dist/featureoptions.d.ts +0 -264
- package/dist/featureoptions.js +0 -480
- package/dist/featureoptions.js.map +0 -1
- package/dist/mqttclient.d.ts +0 -178
- package/dist/mqttclient.js +0 -310
- package/dist/mqttclient.js.map +0 -1
- package/dist/ui/featureoptions.js +0 -480
- package/dist/ui/featureoptions.js.map +0 -1
- 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":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQH,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE3D,2IAA2I;AAC3I,MAAM,kBAAkB,GAAG,qGAAqG,CAAC;AAEjI,uKAAuK;AACvK,iKAAiK;AACjK,mJAAmJ;AACnJ,MAAM,oBAAoB,GAAG,IAAI,eAAe,EAAE,CAAC,MAAM,CAAC;AAE1D,qKAAqK;AACrK,gGAAgG;AAChG,MAAM,iBAAiB,GAAG,GAAS,EAAE,GAA8B,CAAC,CAAC;AAErE,gKAAgK;AAChK,mKAAmK;AACnK,kKAAkK;AAClK,yGAAyG;AACzG,MAAM,gBAAgB,GAAe,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAS,EAAE,GAAiF,CAAC,EAAE,CAAC;AAwCzJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAEvC;;OAEG;IACsB,IAAI,CAAkB;IAE/C;;;;;OAKG;IACH,YAAmB,MAAuB,EAAE,UAAiC,EAAE;QAE7E,KAAK,CAAC,OAAO,CAAC,OAAO,IAAI,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;IACrB,CAAC;CACF;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAE7C,OAAO,KAAK,YAAY,cAAc,CAAC;AACzC,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,iBAAiB,CAA4B,KAAc,EAAE,MAAS;IAEpF,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAC,MAAe;IAE7C,IAAG,iBAAiB,CAAC,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC;QAExC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mKAAmK;IACnK,2EAA2E;IAC3E,OAAO,CAAC,MAAM,YAAY,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,cAAc,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgEG;AACH,MAAM,UAAU,OAAO,CAAC,MAAmB,EAAE,OAAmB;IAE9D,IAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAElB,OAAO,EAAE,CAAC;QAEV,kKAAkK;QAClK,2JAA2J;QAC3J,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAE1D,kKAAkK;IAClK,uKAAuK;IACvK,mBAAmB;IACnB,OAAO,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAS,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;AACxF,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,iKAAiK;AACjK,oHAAoH;AACpH,MAAM,UAAU,WAAW,CAAI,OAAmB;IAEhD,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAEjC,OAAO,OAAO,CAAC;AACjB,CAAC;AA4KD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,OAAO,GAA4B;IAE9C,KAAK,EAAE,GAAS,EAAE,GAAgE,CAAC;IACnF,KAAK,EAAE,GAAS,EAAE,GAAgE,CAAC;IACnF,IAAI,EAAE,GAAS,EAAE,GAAgE,CAAC;IAClF,IAAI,EAAE,GAAS,EAAE,GAAgE,CAAC;CACnF,CAAC;AAUF,kKAAkK;AAClK,iKAAiK;AACjK,uFAAuF;AACvF,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEjG;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAE/C,OAAO,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACvF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAe;IAEjD,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAoCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAI,SAA8C,EAAE,UAAwB,EAAE;IAEvG,MAAM,EAAE,QAAQ,GAAG,CAAC,EAAE,OAAO,GAAG,mBAAmB,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAErF,gJAAgJ;IAChJ,IAAG,QAAQ,GAAG,CAAC,EAAE,CAAC;QAEhB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAED,0GAA0G;IAC1G,MAAM,EAAE,cAAc,EAAE,CAAC;IAEzB,+JAA+J;IAC/J,mFAAmF;IACnF,MAAM,eAAe,GAAG,MAAM,IAAI,oBAAoB,CAAC;IAEvD,sKAAsK;IACtK,oKAAoK;IACpK,sHAAsH;IACtH,IAAI,CAAC;QAEH,KAAI,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,QAAQ,EAAE,OAAO,EAAE,EAAE,CAAC;YAEpD,IAAI,CAAC;gBAEH,4CAA4C;gBAC5C,OAAO,MAAM,SAAS,CAAC,eAAe,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAM,KAAc,EAAE,CAAC;gBAEvB,4JAA4J;gBAC5J,6JAA6J;gBAC7J,6JAA6J;gBAC7J,6GAA6G;gBAC7G,IAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,CAAC,EAAE,CAAC;oBAEvE,MAAM,KAAK,CAAC;gBACd,CAAC;gBAED,qJAAqJ;gBACrJ,wIAAwI;gBACxI,4CAA4C;gBAC5C,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3D,CAAC;QACH,CAAC;QAED,8JAA8J;QAC9J,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAAC,OAAM,KAAc,EAAE,CAAC;QAEvB,kKAAkK;QAClK,+JAA+J;QAC/J,uBAAuB;QACvB,MAAM,EAAE,cAAc,EAAE,CAAC;QAEzB,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAI,OAAmB,EAAE,MAAmB;;;QAE9E,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAA4B,OAAO,CAAC,aAAa,EAAE,CAAC;QAE9F,gKAAgK;QAChK,mKAAmK;QACnK,8JAA8J;QAC9J,8IAA8I;QAC9I,MAAM,kBAAkB,kCAAG,OAAO,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAA,CAAC;QAExE,sKAAsK;QACtK,oKAAoK;QACpK,+IAA+I;QAC/I,KAAK,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAEnC,OAAO,MAAM,MAAM,CAAC;;;;;;;;;CACrB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAI,MAAwB,EAAE,CAAS;IAEnE,uKAAuK;IACvK,kBAAkB;IAClB,IAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAEV,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,sKAAsK;IACtK,2FAA2F;IAC3F,MAAM,IAAI,GAAQ,IAAI,KAAK,CAAI,CAAC,CAAC,CAAC;IAElC,oKAAoK;IACpK,+FAA+F;IAC/F,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAEjC,IAAI,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC;QACpB,KAAK,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;QACxB,KAAK,EAAE,CAAC;IACV,CAAC;IAED,wKAAwK;IACxK,IAAG,KAAK,GAAG,CAAC,EAAE,CAAC;QAEb,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC;IAED,gKAAgK;IAChK,gIAAgI;IAChI,MAAM,MAAM,GAAQ,IAAI,KAAK,CAAI,CAAC,CAAC,CAAC;IAEpC,KAAI,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QAEtC,kKAAkK;QAClK,qJAAqJ;QACrJ,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAM,CAAC;IACjD,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,UAAU,cAAc,CAAC,GAAG,OAAoC;IAEpE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IACjE,MAAM,CAAE,KAAK,EAAE,GAAG,IAAI,CAAE,GAAG,OAAO,CAAC;IAEnC,mKAAmK;IACnK,mFAAmF;IACnF,IAAG,KAAK,KAAK,SAAS,EAAE,CAAC;QAEvB,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAC;IAC/E,CAAC;IAED,qKAAqK;IACrK,4GAA4G;IAC5G,IAAG,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAErB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAiH;IAEnJ,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE1C,sKAAsK;IACtK,IAAI,CAAC;QAEH,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAAC,OAAM,KAAc,EAAE,CAAC;QAEvB,gKAAgK;QAChK,+JAA+J;QAC/J,kJAAkJ;QAClJ,IAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAElB,OAAO;QACT,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAA4B,EAAE,KAAa;IAE3E,uKAAuK;IACvK,2IAA2I;IAC3I,OAAO,CAAC,KAAc,EAAQ,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,2GAA2G,EAAE,KAAK,EAC3J,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;AAC/B,CAAC;AAUD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,EAAuC,EAAE,OAA4B;IAEzG,yJAAyJ;IACzJ,6JAA6J;IAC7J,gKAAgK;IAChK,MAAM,YAAY,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,MAAM,aAAa,GAAG,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzG,MAAM,MAAM,GAAG,cAAc,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;IAE3D,kFAAkF;IAClF,IAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAElB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oKAAoK;IACpK,mKAAmK;IACnK,iFAAiF;IACjF,IAAI,CAAC;QAEH,OAAO,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAM,KAAc,EAAE,CAAC;QAEvB,qIAAqI;QACrI,uEAAuE;QACvE,IAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAElB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAqBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,OAAO,QAAQ;IAEV,OAAO,CAAa;IACpB,OAAO,CAAc;IACrB,UAAU,CAAS;IAC5B,MAAM,CAA6B;IAEnC,qKAAqK;IACrK,mKAAmK;IACnK,2EAA2E;IAC3E,SAAS,GAAG,KAAK,CAAC;IAElB;;;;;;;;OAQG;IACH,YAAmB,IAAkB;QAEnC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC;QAEjC,gKAAgK;QAChK,gKAAgK;QAChK,kKAAkK;QAClK,sBAAsB;QACtB,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC5C,CAAC;IAED;;;;OAIG;IACI,GAAG;QAER,IAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAE1C,OAAO;QACT,CAAC;QAED,IAAG,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAE7B,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,GAAG,EAAE;YAE5B,yJAAyJ;YACzJ,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;YAExB,yJAAyJ;YACzJ,gJAAgJ;YAChJ,IAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;gBAE1C,OAAO;YACT,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAED;;;OAGG;IACI,KAAK;QAEV,IAAG,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAE7B,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,CAAC,MAAM,CAAC,OAAO,CAAC;QAErB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;CACF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IAEvC,OAAO,KAAK,CAAC,OAAO,CAAC,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;AACrE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IAEvC,0GAA0G;IAC1G,IAAG,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;QAEtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,iEAAiE;IACjE,EAAE;IACF,mEAAmE;IACnE,uCAAuC;IACvC,0DAA0D;IAC1D,2CAA2C;IAC3C,sDAAsD;IACtD,sEAAsE;IACtE,OAAO,IAAI,CAAC,OAAO,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC;QACxI,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;AACpC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IAEvC,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACvC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "homebridge-plugin-utils",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "2.0.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 &&
|
|
34
|
-
"build-docs": "
|
|
35
|
-
"build-ui": "
|
|
36
|
-
"clean": "
|
|
37
|
-
"lint": "eslint --max-warnings=${ESLINT_MAX_WARNINGS:-\"-1\"} eslint.config.mjs build
|
|
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 --strip-types --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 --strip-types --import ./ui/test-loader.mjs --test --test-timeout=120000 \"test/e2e/**/*.test.ts\" \"test/e2e/**/*.test.mjs\"",
|
|
43
|
+
"test:focus": "node --strip-types --import ./ui/test-loader.mjs --test --test-only --test-timeout=15000 \"src/**/*.test.ts\" \"ui/**/*.test.mjs\" \"build/**/*.test.mjs\"",
|
|
44
|
+
"test:watch": "node --strip-types --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.7",
|
|
43
60
|
"@stylistic/eslint-plugin": "5.10.0",
|
|
44
|
-
"@types/node": "
|
|
61
|
+
"@types/node": "26.1.0",
|
|
62
|
+
"aedes": "1.0.2",
|
|
45
63
|
"eslint": "9.39.2",
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"typedoc": "0.28.
|
|
49
|
-
"typedoc-plugin-markdown": "4.
|
|
64
|
+
"happy-dom": "20.10.6",
|
|
65
|
+
"homebridge": "2.1.0",
|
|
66
|
+
"typedoc": "0.28.20",
|
|
67
|
+
"typedoc-plugin-markdown": "4.12.0",
|
|
50
68
|
"typescript": "5.9.3",
|
|
51
|
-
"typescript-eslint": "8.
|
|
69
|
+
"typescript-eslint": "8.63.0"
|
|
52
70
|
},
|
|
53
71
|
"dependencies": {
|
|
54
|
-
"mqtt": "5.15.
|
|
72
|
+
"mqtt": "5.15.2"
|
|
55
73
|
}
|
|
56
74
|
}
|
package/build/eslint-rules.mjs
DELETED
|
@@ -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 };
|