@switchbot/homebridge-switchbot 5.2.1-beta.0 → 5.2.1-beta.1

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.
@@ -150,192 +150,95 @@ node -p "const v=require('./package.json').version.split('.'); v[2]=parseInt(v[2
150
150
  3. Proceed with patch increment as fallback
151
151
  4. Create or target the appropriate beta branch based on version increment
152
152
 
153
+ ## Following node-switchbot Changes
154
+
155
+ node-switchbot tracks [pySwitchbot](https://github.com/sblibs/pySwitchbot). After node-switchbot
156
+ ships a change, this repo usually needs a follow-up PR so the plugin can use it:
157
+
158
+ 1. Read the node-switchbot PR/release and list what consumers see: new device types, renamed or
159
+ split model identities (`modelName`, OpenAPI `deviceType`), new status fields, new commands.
160
+ 2. Update `src/device-types.ts` (`DEVICE_TYPES`, `DEVICE_TYPE_NORMALIZATION_MAP`, including
161
+ lowercase product codes such as `woplugjp`), `DEVICE_CLASS_MAP` in `src/deviceFactory.ts`, and
162
+ accessory behaviour in `src/devices/genericDevice.ts`.
163
+ 3. Make sure no existing saved `configDeviceType` stops resolving (normalization map or
164
+ `src/homebridge-ui/utils/device-migration.ts`).
165
+ 4. Bump `node-switchbot` in `package.json` only to a version already published on npm.
166
+ 5. Add `createDevice` tests under `test/device/` asserting each affected type's accessory class.
167
+ 6. Run build, test and lint; commit the regenerated `config.schema.json` if `DEVICE_TYPES` changed.
168
+
153
169
  ## Working Effectively
154
170
 
155
- ### Bootstrap and Build Process
156
- Run these commands in sequence to set up and build the project:
157
-
158
- 1. **Install dependencies:**
159
- ```bash
160
- npm install --legacy-peer-deps
161
- ```
162
- - CRITICAL: Must use `--legacy-peer-deps` flag due to TypeDoc dependency conflicts
163
- - Takes approximately 30-45 seconds
164
- - This is a known workaround documented in the codebase
165
-
166
- 2. **Build the project:**
167
- ```bash
168
- npm run build
169
- ```
170
- - Takes approximately 7-10 seconds
171
- - Compiles TypeScript and copies UI files
172
- - Output goes to `dist/` directory
173
-
174
- 3. **Run tests:**
175
- ```bash
176
- npm run test
177
- ```
178
- - Takes approximately 2-3 seconds
179
- - Currently minimal test suite (1 test file)
180
- - Use `npm run test:watch` for continuous testing during development
181
-
182
- 4. **Generate documentation:**
183
- ```bash
184
- npm run docs
185
- ```
186
- - Takes approximately 5-10 seconds
187
- - Generates TypeDoc documentation in `docs/` directory
188
-
189
- ### Full Build and Validation Workflow
190
- Complete validation workflow (approximately 30-45 seconds total):
191
- ```bash
192
- npm install --legacy-peer-deps && npm run build && npm run test && npm run docs && npm run docs:lint && npm run docs:theme
193
- ```
194
- - NEVER CANCEL: Set timeout to 90+ seconds for this complete workflow
195
- - This validates TypeScript compilation, plugin loading, and documentation generation
196
-
197
- ### Development Commands
198
-
199
- - **Watch mode for development:**
200
- ```bash
201
- npm run watch
202
- ```
203
- - Builds, links plugin locally, and starts nodemon for file watching
204
- - Requires local Homebridge installation
205
-
206
- - **Clean build artifacts:**
207
- ```bash
208
- npm run clean
209
- ```
210
- - Removes `dist/` directory
211
-
212
- - **Check for outdated dependencies:**
213
- ```bash
214
- npm run check
215
- ```
216
- - WARNING: This will fail due to dependency conflicts - use with `--legacy-peer-deps`
217
-
218
- ### Known Issues and Workarounds
219
-
220
- - **Linting fails:** `npm run lint` and `npm run lint:fix` currently fail due to ESLint configuration conflicts with import/extensions rule. Document any code style issues manually.
221
-
222
- - **Dependency conflicts:** Always use `--legacy-peer-deps` flag for npm install due to TypeDoc theme dependency version mismatches.
223
-
224
- - **Coverage and docs artifacts:** Add `coverage/` and `docs/` to `.gitignore` to prevent committing build artifacts.
225
-
226
- ## Validation Scenarios
227
-
228
- ### Manual Plugin Validation
229
- After making changes, ALWAYS run these validation steps:
230
-
231
- 1. **Verify plugin builds and loads:**
232
- ```bash
233
- npm run build && node -e "
234
- try {
235
- const plugin = require('./dist/index.js');
236
- console.log('Plugin loads successfully');
237
- console.log('Plugin type:', typeof plugin.default);
238
- } catch (e) {
239
- console.error('Plugin load failed:', e.message);
240
- }"
241
- ```
242
-
243
- 2. **Test plugin registration:**
244
- - Plugin exports a default function that registers with Homebridge
245
- - Uses `PLUGIN_NAME = '@switchbot/homebridge-switchbot'` and `PLATFORM_NAME = 'SwitchBot'`
246
- - Main platform class is `SwitchBotPlatform`
247
-
248
- 3. **Validate TypeScript compilation:**
249
- - Must have no TypeScript errors
250
- - Check `dist/` directory contains all expected `.js`, `.d.ts`, and `.map` files
251
-
252
- 4. **Test documentation generation:**
253
- ```bash
254
- npm run docs:lint
255
- ```
256
- - Must pass without warnings when using `--treatWarningsAsErrors`
257
-
258
- ### Code Coverage Validation
259
- Run comprehensive test coverage analysis:
171
+ Node `^22 || ^24`. Run these in order; each must pass before you commit:
172
+
260
173
  ```bash
261
- npm run test-coverage
174
+ npm ci # CI uses: npm ci --legacy-peer-deps
175
+ npm run build # syncs DEVICE_TYPES into config.schema.json, cleans dist/, tsc, copies + builds the plugin UI
176
+ npm run test # vitest run
177
+ npm run lint # eslint (src, test, UI html/js) then tsc --noEmit
262
178
  ```
263
- - Current coverage is minimal (~1.36% overall)
264
- - Coverage reports generated in `coverage/` directory
179
+
180
+ - `npm run lint:fix` fixes most style issues.
181
+ - `npm run build` needs `rsync` (used by `plugin-ui`).
182
+ - `npm run docs` / `npm run docs:lint` generate and check TypeDoc output; `prepublishOnly` runs them.
183
+ - `npm run watch` builds, links the plugin and runs nodemon against a local Homebridge;
184
+ `npm run watch:ui` also starts a dev Homebridge with Config UI X.
185
+
186
+ ### Known pitfalls
187
+
188
+ - **Never commit compiled output under `src/`.** `.gitignore` excludes `src/**/*.js` and
189
+ `src/**/*.js.map`. Vitest resolves `./foo.js` imports to a real `src/foo.js` before `src/foo.ts`,
190
+ so a stale compiled copy silently replaces the source in tests.
191
+ - **`config.schema.json` is generated** from `DEVICE_TYPES` in `src/device-types.ts` during
192
+ `npm run build`. When `DEVICE_TYPES` changes, commit the regenerated schema in the same change.
193
+ - **`DEVICE_CLASS_MAP` keys in `src/deviceFactory.ts` are lowercase.** Unmapped types fall back to
194
+ `GenericDevice`, so add a test for every new type.
265
195
 
266
196
  ## Codebase Navigation
267
197
 
268
198
  ### Project Structure
269
199
  ```
270
- ├── src/ # Source TypeScript files
271
- │ ├── device/ # Device implementations (21 files)
272
- │ │ ├── device.ts # Base device class (deviceBase)
273
- │ │ ├── bot.ts # SwitchBot Bot device
274
- │ │ ├── curtain.ts # SwitchBot Curtain device
275
- │ │ └── ... # Other device implementations
276
- │ ├── irdevice/ # IR device implementations (10 files)
277
- │ │ ├── irdevice.ts # Base IR device class
278
- │ │ ├── tv.ts # TV IR control
279
- │ │ └── ... # Other IR device implementations
280
- │ ├── homebridge-ui/ # Plugin configuration UI
281
- │ │ ├── server.ts # UI backend server
282
- │ │ └── public/ # UI frontend files
283
- │ ├── platform.ts # Main platform class (SwitchBotPlatform)
284
- │ ├── settings.ts # Configuration interfaces and constants
285
- │ ├── utils.ts # Utility functions
286
- │ └── index.ts # Plugin entry point
287
- ├── config.schema.json # Homebridge configuration schema
288
- ├── dist/ # Compiled JavaScript output
289
- ├── docs/ # Generated TypeDoc documentation
290
- └── coverage/ # Test coverage reports
200
+ ├── src/
201
+ │ ├── index.ts # Plugin entry point (registers one platform that proxies HAP or Matter)
202
+ │ ├── SwitchBotHAPPlatform.ts # HomeKit (HAP) platform
203
+ │ ├── SwitchBotMatterPlatform.ts # Matter platform
204
+ │ ├── switchbotClient.ts # Wrapper around node-switchbot (BLE + OpenAPI)
205
+ │ ├── deviceFactory.ts # Device type -> accessory class (DEVICE_CLASS_MAP, createDevice)
206
+ │ ├── device-types.ts # DEVICE_TYPES (valid types) + DEVICE_TYPE_NORMALIZATION_MAP (aliases)
207
+ │ ├── deviceCommandMapper.ts # Per-type command handlers
208
+ │ ├── devices/
209
+ │ │ ├── deviceBase.ts # Base accessory class
210
+ │ │ └── genericDevice.ts # GenericDevice and every concrete accessory class
211
+ │ ├── homebridge-ui/ # Config UI X custom UI (server, endpoints, utils, public/)
212
+ │ ├── settings.ts # Config interfaces and constants
213
+ │ ├── errors.ts
214
+ │ └── utils.ts
215
+ ├── test/ # Vitest specs (client, device, platform, homebridge-ui, utils, e2e)
216
+ ├── scripts/ # sync-device-types, build-ui, free-dev-ports
217
+ ├── config.schema.json # Homebridge config schema (configDeviceType enum is generated)
218
+ └── dist/ # Build output (not committed)
291
219
  ```
292
220
 
293
- ### Key Development Areas
294
-
295
- - **Adding new devices:** Extend `src/device/device.ts` base class, implement in new file under `src/device/`
296
- - **Adding IR devices:** Extend `src/irdevice/irdevice.ts` base class, implement in new file under `src/irdevice/`
297
- - **Configuration changes:** Update `src/settings.ts` and `config.schema.json`
298
- - **Platform modifications:** Edit `src/platform.ts` (main class with 2800+ lines)
299
- - **Utility functions:** Modify `src/utils.ts` for shared functionality
300
-
301
- ### Device Connection Types
302
- This plugin supports two connection methods to SwitchBot devices:
303
- 1. **OpenAPI Connection:** Requires SwitchBot Cloud API token/secret, works through SwitchBot Hub
304
- 2. **BLE (Bluetooth Low Energy):** Direct device connection, requires device MAC addresses
305
-
306
221
  ### Common Development Tasks
307
222
 
308
- - **Testing device implementations:** Focus on `src/device/` and `src/irdevice/` directories
309
- - **Configuration UI changes:** Modify `src/homebridge-ui/` files and rebuild with `npm run plugin-ui`
310
- - **Platform logic changes:** Edit `src/platform.ts` - the main orchestration file
311
- - **Adding device support:** Create new device class extending `deviceBase` or IR device class
312
-
313
- ### Important File Relationships
314
- - Always update both device implementation AND platform.ts when adding new device types
315
- - Configuration schema changes require updates to settings.ts interfaces
316
- - Device MAC address validation is handled in utils.ts (`formatDeviceIdAsMac`)
317
- - BLE connection handling is in the base device classes
318
-
319
- ## Build Time Expectations
223
+ - **New device type or identity from node-switchbot:** add it to `DEVICE_TYPES` and/or
224
+ `DEVICE_TYPE_NORMALIZATION_MAP` in `src/device-types.ts`, map it in `DEVICE_CLASS_MAP` in
225
+ `src/deviceFactory.ts`, then add a `createDevice` test under `test/device/`.
226
+ - **New accessory behaviour:** add or extend a class in `src/devices/genericDevice.ts`.
227
+ - **Saved configs that would stop resolving:** handle them in the normalization map or
228
+ `src/homebridge-ui/utils/device-migration.ts`.
229
+ - **Config UI changes:** edit `src/homebridge-ui/`, then `npm run build`.
230
+ - **node-switchbot upgrades:** bump the dependency only to a version already published on npm.
320
231
 
321
- - **npm install --legacy-peer-deps:** 30-45 seconds
322
- - **npm run build:** 7-10 seconds
323
- - **npm run test:** 2-3 seconds
324
- - **npm run docs:** 5-10 seconds
325
- - **Complete validation workflow:** 30-45 seconds total
326
- - **NEVER CANCEL:** Always wait for builds to complete, set timeouts to 90+ seconds for safety
232
+ ### Device Connection Types
233
+ 1. **OpenAPI:** SwitchBot Cloud token/secret; works through a SwitchBot Hub.
234
+ 2. **BLE:** direct Bluetooth connection via node-switchbot (Linux/macOS).
327
235
 
328
236
  ## CI/CD Integration
329
237
 
330
- The project uses GitHub Actions for CI:
331
- - **Build workflow:** `.github/workflows/build.yml` runs Node.js build and test, then ESLint
332
- - **Required checks:** Build must pass, tests must pass
333
- - **Known CI issue:** ESLint currently fails due to configuration conflicts
334
-
335
- Always run the complete validation workflow locally before committing:
336
- ```bash
337
- npm run build && npm run test && npm run docs:lint
338
- ```
238
+ - `.github/workflows/ci.yml`: build, test and lint on Node 22 and 24 for pushes to `latest`/`beta-*`
239
+ and PRs to `latest`/`beta-*`.
240
+ - `.github/workflows/release.yml`: pushes to `beta-*` publish a beta to npm; pushes to `latest`
241
+ publish a stable release.
339
242
 
340
243
  ## Complete Workflow Examples
341
244
 
@@ -4,7 +4,7 @@ on:
4
4
  push:
5
5
  branches: ["main", "latest", "beta-*"]
6
6
  pull_request:
7
- branches: ["main", "latest"]
7
+ branches: ["main", "latest", "beta-*"]
8
8
 
9
9
  permissions:
10
10
  contents: read
@@ -33,3 +33,6 @@ jobs:
33
33
 
34
34
  - name: Run tests
35
35
  run: npm run test
36
+
37
+ - name: Lint
38
+ run: npm run lint
package/CLAUDE.md ADDED
@@ -0,0 +1,13 @@
1
+ # homebridge-switchbot
2
+
3
+ The project guide is shared with Copilot and imported here. It covers reference priority, branch
4
+ targeting, following node-switchbot changes, commands, structure and pitfalls:
5
+
6
+ @.github/copilot-instructions.md
7
+
8
+ ## Claude-specific notes
9
+
10
+ - Conventional Commits (`feat:`, `fix:`, `docs:`, `test:`, `chore:`).
11
+ - If the right target branch is unclear, ask before opening the PR.
12
+ - PR description: what changed, why (link the node-switchbot PR/release), and any config migration
13
+ users need.
@@ -28,7 +28,7 @@
28
28
  </div></li></ul></div>
29
29
  <h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></li></ul></div><aside class="tsd-sources">
30
30
  <ul>
31
- <li>Defined in <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/blob/c9e79f24d8745cf512f94fdbf4dde5c79192ee51/src/index.ts#L22">index.ts:22</a></li></ul></aside></div>
31
+ <li>Defined in <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/blob/f710df77d4eb0c045f97c4955a23fca260364993/src/index.ts#L22">index.ts:22</a></li></ul></aside></div>
32
32
  <div class="col-sidebar">
33
33
  <div class="page-menu">
34
34
  <div class="tsd-navigation settings">
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@switchbot/homebridge-switchbot",
3
3
  "displayName": "SwitchBot",
4
4
  "type": "module",
5
- "version": "5.2.1-beta.0",
5
+ "version": "5.2.1-beta.1",
6
6
  "description": "The SwitchBot plugin allows you to access your SwitchBot device(s) from HomeKit.",
7
7
  "author": "SwitchBot <support@wondertechlabs.com> (https://github.com/SwitchBot)",
8
8
  "contributors": [
@@ -1 +0,0 @@
1
- {"version":3,"file":"device-types.js","sourceRoot":"","sources":["device-types.ts"],"names":[],"mappings":"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"}
@@ -1,319 +0,0 @@
1
- // deviceCommandMapper.ts
2
- // Maps HAP/Matter commands to node-switchbot device methods for all supported device types
3
- export const deviceTypeCommandMap = {
4
- // SwitchBot AI Hub (read-only/generic)
5
- 'ai hub': {},
6
- // SwitchBot Cameras (read-only/generic)
7
- 'indoor cam': {},
8
- 'pan/tilt cam': {},
9
- 'pan/tilt cam 2k': {},
10
- 'pan/tilt cam plus 2k': {},
11
- 'pan/tilt cam plus 3k': {},
12
- // SwitchBot Air Purifiers (read-only/generic)
13
- 'air purifier pm2.5': {},
14
- 'air purifier table pm2.5': {},
15
- 'air purifier voc': {},
16
- 'air purifier table voc': {},
17
- // SwitchBot Home Climate Panel (read-only/generic)
18
- 'home climate panel': {},
19
- // SwitchBot WoIOSensor (read-only/generic)
20
- 'woiosensor': {},
21
- // SwitchBot Candle Warmer Lamp
22
- 'candle warmer lamp': {
23
- turnOn: async (device) => device.turnOn(),
24
- turnOff: async (device) => device.turnOff(),
25
- },
26
- // SwitchBot Hubs (read-only/generic)
27
- 'hub': {},
28
- 'hub 2': {},
29
- 'hub 3': {},
30
- 'hub mini': {},
31
- 'hub plus': {},
32
- // SwitchBot Robot Vacuum Cleaner K20 Plus Pro
33
- 'robot vacuum cleaner k20 plus pro': {
34
- start: async (device) => device.start(),
35
- stop: async (device) => device.stop(),
36
- pause: async (device) => device.pause(),
37
- dock: async (device) => device.dock(),
38
- resume: async (device) => device.resume(),
39
- locate: async (device) => device.locate(),
40
- },
41
- // SwitchBot Robot Vacuum Cleaner S1
42
- 'robot vacuum cleaner s1': {
43
- start: async (device) => device.start(),
44
- stop: async (device) => device.stop(),
45
- pause: async (device) => device.pause(),
46
- dock: async (device) => device.dock(),
47
- resume: async (device) => device.resume(),
48
- locate: async (device) => device.locate(),
49
- },
50
- // SwitchBot Robot Vacuum Cleaner S1 Plus
51
- 'robot vacuum cleaner s1 plus': {
52
- start: async (device) => device.start(),
53
- stop: async (device) => device.stop(),
54
- pause: async (device) => device.pause(),
55
- dock: async (device) => device.dock(),
56
- resume: async (device) => device.resume(),
57
- locate: async (device) => device.locate(),
58
- },
59
- // SwitchBot Robot Vacuum Cleaner S10
60
- 'robot vacuum cleaner s10': {
61
- start: async (device) => device.start(),
62
- stop: async (device) => device.stop(),
63
- pause: async (device) => device.pause(),
64
- dock: async (device) => device.dock(),
65
- resume: async (device) => device.resume(),
66
- locate: async (device) => device.locate(),
67
- },
68
- // SwitchBot Robot Vacuum Cleaner S20
69
- 'robot vacuum cleaner s20': {
70
- start: async (device) => device.start(),
71
- stop: async (device) => device.stop(),
72
- pause: async (device) => device.pause(),
73
- dock: async (device) => device.dock(),
74
- resume: async (device) => device.resume(),
75
- locate: async (device) => device.locate(),
76
- },
77
- // SwitchBot Relay Switch 2PM
78
- 'relay switch 2pm': {
79
- turnOn: async (device) => device.turnOn(),
80
- turnOff: async (device) => device.turnOff(),
81
- },
82
- // SwitchBot K10+
83
- 'k10+': {
84
- start: async (device) => device.start(),
85
- stop: async (device) => device.stop(),
86
- pause: async (device) => device.pause(),
87
- dock: async (device) => device.dock(),
88
- resume: async (device) => device.resume(),
89
- locate: async (device) => device.locate(),
90
- },
91
- // SwitchBot K10+ Pro
92
- 'k10+ pro': {
93
- start: async (device) => device.start(),
94
- stop: async (device) => device.stop(),
95
- pause: async (device) => device.pause(),
96
- dock: async (device) => device.dock(),
97
- resume: async (device) => device.resume(),
98
- locate: async (device) => device.locate(),
99
- },
100
- // SwitchBot Robot Vacuum Cleaner K10+ Pro Combo
101
- 'robot vacuum cleaner k10+ pro combo': {
102
- start: async (device) => device.start(),
103
- stop: async (device) => device.stop(),
104
- pause: async (device) => device.pause(),
105
- dock: async (device) => device.dock(),
106
- resume: async (device) => device.resume(),
107
- locate: async (device) => device.locate(),
108
- },
109
- // SwitchBot Robot Vacuum Cleaner K11+
110
- 'robot vacuum cleaner k11+': {
111
- start: async (device) => device.start(),
112
- stop: async (device) => device.stop(),
113
- pause: async (device) => device.pause(),
114
- dock: async (device) => device.dock(),
115
- resume: async (device) => device.resume(),
116
- locate: async (device) => device.locate(),
117
- },
118
- // SwitchBot MeterPro(CO2) (read-only)
119
- 'meterpro(co2)': {},
120
- // SwitchBot Water Detector (read-only)
121
- 'water detector': {},
122
- // SwitchBot Garage Door Opener
123
- 'garage door opener': {
124
- open: async (device) => device.open(),
125
- close: async (device) => device.close(),
126
- stop: async (device) => device.stop(),
127
- },
128
- // SwitchBot Relay Switch 1
129
- 'relay switch 1': {
130
- turnOn: async (device) => device.turnOn(),
131
- turnOff: async (device) => device.turnOff(),
132
- },
133
- // SwitchBot Relay Switch 1PM
134
- 'relay switch 1pm': {
135
- turnOn: async (device) => device.turnOn(),
136
- turnOff: async (device) => device.turnOff(),
137
- },
138
- // SwitchBot Smart Radiator Thermostat (read-only or not directly controllable)
139
- 'smart radiator thermostat': {},
140
- // SwitchBot Humidifier2
141
- 'humidifier2': {
142
- turnOn: async (device) => device.turnOn(),
143
- turnOff: async (device) => device.turnOff(),
144
- setMode: async (device, body) => device.setMode(body?.parameter),
145
- setHumidity: async (device, body) => device.setHumidity(body?.parameter),
146
- },
147
- // SwitchBot MeterPlus (read-only)
148
- 'meterplus': {},
149
- // SwitchBot Meter Pro (read-only)
150
- 'meter pro': {},
151
- // SwitchBot MeterPro (read-only)
152
- 'meterpro': {},
153
- // SwitchBot RGBICWW Floor Lamp
154
- 'rgbicww floor lamp': {
155
- turnOn: async (device) => device.turnOn(),
156
- turnOff: async (device) => device.turnOff(),
157
- setBrightness: async (device, body) => device.setBrightness(body?.parameter),
158
- setColor: async (device, body) => device.setColor(body?.parameter),
159
- },
160
- // SwitchBot RGBICWW Strip Light
161
- 'rgbicww strip light': {
162
- turnOn: async (device) => device.turnOn(),
163
- turnOff: async (device) => device.turnOff(),
164
- setBrightness: async (device, body) => device.setBrightness(body?.parameter),
165
- setColor: async (device, body) => device.setColor(body?.parameter),
166
- },
167
- // SwitchBot Circulator Fan
168
- 'circulator fan': {
169
- turnOn: async (device) => device.turnOn(),
170
- turnOff: async (device) => device.turnOff(),
171
- setSpeed: async (device, body) => device.setSpeed(body?.parameter),
172
- swing: async (device) => device.swing(),
173
- },
174
- // SwitchBot Battery Circulator Fan
175
- 'battery circulator fan': {
176
- turnOn: async (device) => device.turnOn(),
177
- turnOff: async (device) => device.turnOff(),
178
- setSpeed: async (device, body) => device.setSpeed(body?.parameter),
179
- swing: async (device) => device.swing(),
180
- },
181
- // SwitchBot Standing Circulator Fan
182
- 'standing circulator fan': {
183
- turnOn: async (device) => device.turnOn(),
184
- turnOff: async (device) => device.turnOff(),
185
- setSpeed: async (device, body) => device.setSpeed(body?.parameter),
186
- swing: async (device) => device.swing(),
187
- },
188
- // SwitchBot Bot
189
- 'bot': {
190
- turnOn: async (device) => device.turnOn(),
191
- turnOff: async (device) => device.turnOff(),
192
- press: async (device) => device.press(),
193
- },
194
- // SwitchBot Curtain
195
- 'curtain': {
196
- open: async (device) => device.open(),
197
- close: async (device) => device.close(),
198
- pause: async (device) => device.pause(),
199
- setPosition: async (device, body) => device.setPosition(body?.parameter),
200
- },
201
- // SwitchBot Blind Tilt
202
- 'blind tilt': {
203
- open: async (device) => device.open(),
204
- close: async (device) => device.close(),
205
- pause: async (device) => device.pause(),
206
- setPosition: async (device, body) => device.setPosition(body?.parameter),
207
- },
208
- // SwitchBot Roller Shade
209
- 'roller shade': {
210
- open: async (device) => device.open(),
211
- close: async (device) => device.close(),
212
- pause: async (device) => device.pause(),
213
- setPosition: async (device, body) => device.setPosition(body?.parameter),
214
- },
215
- // SwitchBot Plug
216
- 'plug': {
217
- turnOn: async (device) => device.turnOn(),
218
- turnOff: async (device) => device.turnOff(),
219
- },
220
- // SwitchBot Strip Light 3
221
- 'strip light 3': {
222
- turnOn: async (device) => device.turnOn(),
223
- turnOff: async (device) => device.turnOff(),
224
- setBrightness: async (device, body) => device.setBrightness(body?.parameter),
225
- setColor: async (device, body) => device.setColor(body?.parameter),
226
- },
227
- // SwitchBot Floor Lamp
228
- 'floor lamp': {
229
- turnOn: async (device) => device.turnOn(),
230
- turnOff: async (device) => device.turnOff(),
231
- setBrightness: async (device, body) => device.setBrightness(body?.parameter),
232
- setColor: async (device, body) => device.setColor(body?.parameter),
233
- },
234
- // SwitchBot RGBIC Neon Rope Light
235
- 'rgbic neon rope light': {
236
- turnOn: async (device) => device.turnOn(),
237
- turnOff: async (device) => device.turnOff(),
238
- setBrightness: async (device, body) => device.setBrightness(body?.parameter),
239
- setColor: async (device, body) => device.setColor(body?.parameter),
240
- },
241
- // SwitchBot RGBIC Neon Wire Rope Light
242
- 'rgbic neon wire rope light': {
243
- turnOn: async (device) => device.turnOn(),
244
- turnOff: async (device) => device.turnOff(),
245
- setBrightness: async (device, body) => device.setBrightness(body?.parameter),
246
- setColor: async (device, body) => device.setColor(body?.parameter),
247
- },
248
- // SwitchBot Plug Mini
249
- 'plug mini': {
250
- turnOn: async (device) => device.turnOn(),
251
- turnOff: async (device) => device.turnOff(),
252
- },
253
- // SwitchBot Color Bulb
254
- 'color bulb': {
255
- turnOn: async (device) => device.turnOn(),
256
- turnOff: async (device) => device.turnOff(),
257
- setBrightness: async (device, body) => device.setBrightness(body?.parameter),
258
- setColor: async (device, body) => device.setColor(body?.parameter),
259
- },
260
- // SwitchBot Light Strip
261
- 'light strip': {
262
- turnOn: async (device) => device.turnOn(),
263
- turnOff: async (device) => device.turnOff(),
264
- setBrightness: async (device, body) => device.setBrightness(body?.parameter),
265
- setColor: async (device, body) => device.setColor(body?.parameter),
266
- },
267
- // SwitchBot Fan
268
- 'fan': {
269
- turnOn: async (device) => device.turnOn(),
270
- turnOff: async (device) => device.turnOff(),
271
- setSpeed: async (device, body) => device.setSpeed(body?.parameter),
272
- swing: async (device) => device.swing(),
273
- },
274
- // SwitchBot Lock
275
- 'lock': {
276
- lock: async (device) => device.lock(),
277
- unlock: async (device) => device.unlock(),
278
- },
279
- // SwitchBot Curtain 3
280
- 'curtain3': {
281
- open: async (device) => device.open(),
282
- close: async (device) => device.close(),
283
- pause: async (device) => device.pause(),
284
- setPosition: async (device, body) => device.setPosition(body?.parameter),
285
- },
286
- // SwitchBot Meter
287
- 'meter': {}, // Read-only
288
- // SwitchBot Motion Sensor
289
- 'motion sensor': {}, // Read-only
290
- // SwitchBot Contact Sensor
291
- 'contact sensor': {}, // Read-only
292
- // SwitchBot Humidifier
293
- 'humidifier': {
294
- turnOn: async (device) => device.turnOn(),
295
- turnOff: async (device) => device.turnOff(),
296
- setMode: async (device, body) => device.setMode(body?.parameter),
297
- setHumidity: async (device, body) => device.setHumidity(body?.parameter),
298
- },
299
- // SwitchBot Vacuum
300
- 'vacuum': {
301
- start: async (device) => device.start(),
302
- stop: async (device) => device.stop(),
303
- pause: async (device) => device.pause(),
304
- dock: async (device) => device.dock(),
305
- resume: async (device) => device.resume(),
306
- locate: async (device) => device.locate(),
307
- },
308
- // Add more device types and commands as needed
309
- };
310
- // Helper to get the handler for a device type and command
311
- export function getDeviceCommandHandler(deviceType, command) {
312
- const typeKey = deviceType.toLowerCase();
313
- const typeMap = deviceTypeCommandMap[typeKey];
314
- if (!typeMap) {
315
- return undefined;
316
- }
317
- return typeMap[command];
318
- }
319
- //# sourceMappingURL=deviceCommandMapper.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deviceCommandMapper.js","sourceRoot":"","sources":["deviceCommandMapper.ts"],"names":[],"mappings":"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"}
package/src/errors.js DELETED
@@ -1,32 +0,0 @@
1
- // Error classes for node-switchbot v4 compatibility
2
- // Always use local fallback classes for compatibility; upstream error classes are not guaranteed to exist
3
- const SwitchbotOperationError = class extends Error {
4
- code;
5
- cause;
6
- constructor(message, code, cause) {
7
- super(message);
8
- this.name = 'SwitchbotOperationError';
9
- this.code = code;
10
- this.cause = cause;
11
- }
12
- };
13
- const SwitchbotAuthenticationError = class extends Error {
14
- code;
15
- cause;
16
- constructor(message, code, cause) {
17
- super(message);
18
- this.name = 'SwitchbotAuthenticationError';
19
- this.code = code;
20
- this.cause = cause;
21
- }
22
- };
23
- const CharacteristicMissingError = class extends Error {
24
- characteristic;
25
- constructor(message, characteristic) {
26
- super(message);
27
- this.name = 'CharacteristicMissingError';
28
- this.characteristic = characteristic;
29
- }
30
- };
31
- export { CharacteristicMissingError, SwitchbotAuthenticationError, SwitchbotOperationError };
32
- //# sourceMappingURL=errors.js.map
package/src/errors.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["errors.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,0GAA0G;AAE1G,MAAM,uBAAuB,GAAG,KAAM,SAAQ,KAAK;IACjD,IAAI,CAAS;IACb,KAAK,CAAQ;IACb,YAAY,OAAe,EAAE,IAAa,EAAE,KAAa;QACvD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAA;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;CACF,CAAA;AAED,MAAM,4BAA4B,GAAG,KAAM,SAAQ,KAAK;IACtD,IAAI,CAAS;IACb,KAAK,CAAQ;IACb,YAAY,OAAe,EAAE,IAAa,EAAE,KAAa;QACvD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAA;QAC1C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;IACpB,CAAC;CACF,CAAA;AAED,MAAM,0BAA0B,GAAG,KAAM,SAAQ,KAAK;IACpD,cAAc,CAAQ;IACtB,YAAY,OAAe,EAAE,cAAsB;QACjD,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAA;QACxC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;IACtC,CAAC;CACF,CAAA;AAED,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,CAAA"}
package/src/settings.js DELETED
@@ -1,8 +0,0 @@
1
- export const PLUGIN_NAME = '@switchbot/homebridge-switchbot';
2
- export const PLATFORM_NAME = 'SwitchBot';
3
- export const DEFAULT_CONFIG = {
4
- preferMatter: true,
5
- enableMatter: true,
6
- enableBLE: true,
7
- };
8
- //# sourceMappingURL=settings.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings.js","sourceRoot":"","sources":["settings.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,WAAW,GAAG,iCAAiC,CAAA;AAC5D,MAAM,CAAC,MAAM,aAAa,GAAG,WAAW,CAAA;AAYxC,MAAM,CAAC,MAAM,cAAc,GAAmC;IAC5D,YAAY,EAAE,IAAI;IAClB,YAAY,EAAE,IAAI;IAClB,SAAS,EAAE,IAAI;CAChB,CAAA"}
@@ -1,247 +0,0 @@
1
- import { getDeviceCommandHandler } from './deviceCommandMapper.js';
2
- import { CharacteristicMissingError, SwitchbotAuthenticationError, SwitchbotOperationError } from './errors.js';
3
- /**
4
- * Thin wrapper around node-switchbot v4.0.0+
5
- * Leverages upstream resilience features (retry, circuit breaker, connection intelligence)
6
- * while maintaining plugin-specific features like write debouncing and OpenAPI fallback.
7
- */
8
- export class SwitchBotClient {
9
- cfg;
10
- client = null;
11
- writeDebounceMs = 100;
12
- discoveryCacheTtlMs = 30_000;
13
- lastDiscoveryAt = 0;
14
- logger;
15
- pendingWrites = new Map();
16
- constructor(cfg) {
17
- this.cfg = cfg;
18
- this.logger = cfg?.logger;
19
- if (!this.logger) {
20
- throw new Error('SwitchBotClient requires a logger (Homebridge logger) in config');
21
- }
22
- if (typeof cfg?.writeDebounceMs === 'number') {
23
- this.writeDebounceMs = cfg.writeDebounceMs;
24
- }
25
- if (typeof cfg?.discoveryCacheTtlMs === 'number') {
26
- this.discoveryCacheTtlMs = Math.max(0, cfg.discoveryCacheTtlMs);
27
- }
28
- }
29
- async init() {
30
- if (this.client) {
31
- return;
32
- }
33
- try {
34
- // Dynamic import of node-switchbot v4 with native resilience features
35
- const { SwitchBot } = await import('node-switchbot');
36
- const rawNodeClientConfig = typeof this.cfg?.nodeClientConfig === 'object' ? this.cfg.nodeClientConfig : {};
37
- const scanTimeout = this.resolveScanTimeoutMs(rawNodeClientConfig);
38
- this.client = new SwitchBot({
39
- token: this.cfg.openApiToken,
40
- secret: this.cfg.openApiSecret,
41
- // Enable built-in resilience features from node-switchbot v4.
42
- enableFallback: true, // Auto-fallback from BLE to API
43
- enableRetry: true, // Retry with exponential backoff
44
- enableCircuitBreaker: true, // Circuit breaker per connection type
45
- enableConnectionIntelligence: true, // Connection tracking and route preference
46
- enableBLE: this.cfg.enableBLE !== false, // Use config value, default true
47
- scanTimeout,
48
- ...rawNodeClientConfig,
49
- });
50
- this.lastDiscoveryAt = 0;
51
- this.logger?.info?.('SwitchBot client initialized with native resilience features');
52
- }
53
- catch (e) {
54
- this.logger?.warn?.('Failed to load node-switchbot; will use OpenAPI fallback:', e);
55
- this.client = null;
56
- }
57
- }
58
- async getDevice(id) {
59
- if (this.client) {
60
- try {
61
- const fromManager = this.getManagedDevice(id);
62
- if (fromManager) {
63
- return fromManager;
64
- }
65
- const devices = await this.ensureDiscovered(false);
66
- const fromDiscovery = devices.find((d) => d.id === id);
67
- if (fromDiscovery) {
68
- return fromDiscovery;
69
- }
70
- const refreshDevices = await this.ensureDiscovered(true);
71
- return refreshDevices.find((d) => d.id === id);
72
- }
73
- catch (e) {
74
- if (e instanceof SwitchbotAuthenticationError) {
75
- this.logger?.error?.(`Authentication error for getDevice(${id}):`, e.message);
76
- throw e;
77
- }
78
- else if (e instanceof SwitchbotOperationError) {
79
- this.logger?.warn?.(`Operation error for getDevice(${id}):`, e.message, e.code);
80
- throw e;
81
- }
82
- else if (e instanceof CharacteristicMissingError) {
83
- this.logger?.warn?.(`Characteristic missing for getDevice(${id}):`, e.characteristic);
84
- throw e;
85
- }
86
- else {
87
- this.logger?.warn?.(`Client getDevice failed for ${id}:`, e);
88
- throw e;
89
- }
90
- }
91
- }
92
- throw new SwitchbotOperationError('No SwitchBot client available', 'no_client');
93
- }
94
- async getDevices() {
95
- if (this.client) {
96
- try {
97
- const fromManager = this.getManagedDevices();
98
- if (fromManager.length > 0) {
99
- return fromManager;
100
- }
101
- return await this.ensureDiscovered(false);
102
- }
103
- catch (e) {
104
- this.logger?.warn?.('Client getDevices failed:', e);
105
- throw e;
106
- }
107
- }
108
- throw new SwitchbotOperationError('No SwitchBot client available', 'no_client');
109
- }
110
- async setDeviceState(id, body) {
111
- // Plugin-level debounce: coalesce rapid writes per device
112
- if (!this.writeDebounceMs || this.writeDebounceMs <= 0) {
113
- return this._doSetDeviceState(id, body);
114
- }
115
- return new Promise((resolve, reject) => {
116
- const existing = this.pendingWrites.get(id);
117
- if (existing) {
118
- existing.body = body;
119
- existing.resolvers.push({ resolve, reject });
120
- return;
121
- }
122
- const resolvers = [{ resolve, reject }];
123
- const timer = setTimeout(async () => {
124
- const entry = this.pendingWrites.get(id);
125
- if (!entry) {
126
- return;
127
- }
128
- this.pendingWrites.delete(id);
129
- try {
130
- const out = await this._doSetDeviceState(id, entry.body);
131
- for (const r of entry.resolvers)
132
- r.resolve(out);
133
- }
134
- catch (e) {
135
- if (e instanceof SwitchbotAuthenticationError) {
136
- this.logger?.error?.(`Authentication error for setDeviceState(${id}):`, e.message);
137
- }
138
- else if (e instanceof SwitchbotOperationError) {
139
- this.logger?.warn?.(`Operation error for setDeviceState(${id}):`, e.message, e.code);
140
- }
141
- else if (e instanceof CharacteristicMissingError) {
142
- this.logger?.warn?.(`Characteristic missing for setDeviceState(${id}):`, e.characteristic);
143
- }
144
- for (const r of entry.resolvers)
145
- r.reject(e);
146
- }
147
- }, this.writeDebounceMs);
148
- this.pendingWrites.set(id, { timer, body, resolvers });
149
- });
150
- }
151
- async _doSetDeviceState(id, body) {
152
- if (!this.client) {
153
- throw new SwitchbotOperationError('No SwitchBot client available for setDeviceState', 'no_client');
154
- }
155
- try {
156
- const device = await this.getDevice(id);
157
- if (!device) {
158
- throw new SwitchbotOperationError(`Device ${id} not found`, 'device_not_found');
159
- }
160
- const deviceType = (device.deviceType ?? '').toLowerCase();
161
- const command = body?.command;
162
- if (!command) {
163
- throw new SwitchbotOperationError('No command specified in body', 'no_command');
164
- }
165
- const handler = getDeviceCommandHandler(deviceType, command);
166
- if (!handler) {
167
- throw new SwitchbotOperationError(`Unsupported command '${command}' for device type '${deviceType}'`, 'unsupported_command');
168
- }
169
- this.logger?.debug?.(`[${id}] Calling mapped command '${command}' for device type '${deviceType}'`);
170
- return await handler(device, body);
171
- }
172
- catch (e) {
173
- if (e instanceof SwitchbotAuthenticationError) {
174
- this.logger?.error?.(`Authentication error for setDeviceState(${id}):`, e.message);
175
- throw e;
176
- }
177
- else if (e instanceof SwitchbotOperationError) {
178
- this.logger?.warn?.(`Operation error for setDeviceState(${id}):`, e.message, e.code);
179
- throw e;
180
- }
181
- else if (e instanceof CharacteristicMissingError) {
182
- this.logger?.warn?.(`Characteristic missing for setDeviceState(${id}):`, e.characteristic);
183
- throw e;
184
- }
185
- else {
186
- this.logger?.warn?.(`Device command failed for ${id}:`, e);
187
- throw e;
188
- }
189
- }
190
- }
191
- async destroy() {
192
- for (const [, pending] of this.pendingWrites) {
193
- clearTimeout(pending.timer);
194
- const err = new SwitchbotOperationError('Client destroyed before pending write was sent', 'client_destroyed');
195
- for (const r of pending.resolvers) {
196
- r.reject(err);
197
- }
198
- }
199
- this.pendingWrites.clear();
200
- if (this.client?.cleanup) {
201
- await this.client.cleanup();
202
- }
203
- this.client = null;
204
- this.lastDiscoveryAt = 0;
205
- }
206
- resolveScanTimeoutMs(rawNodeClientConfig) {
207
- if (typeof rawNodeClientConfig.scanTimeout === 'number' && Number.isFinite(rawNodeClientConfig.scanTimeout)) {
208
- return Math.max(500, rawNodeClientConfig.scanTimeout);
209
- }
210
- if (typeof rawNodeClientConfig.scanDuration === 'number' && Number.isFinite(rawNodeClientConfig.scanDuration)) {
211
- return Math.max(500, rawNodeClientConfig.scanDuration);
212
- }
213
- if (typeof this.cfg?.bleScanDurationSeconds === 'number') {
214
- return Math.max(500, this.cfg.bleScanDurationSeconds * 1000);
215
- }
216
- return 5000;
217
- }
218
- getManagedDevice(id) {
219
- const manager = this.client?.devices;
220
- if (manager?.get) {
221
- return manager.get(id);
222
- }
223
- return undefined;
224
- }
225
- getManagedDevices() {
226
- const manager = this.client?.devices;
227
- if (manager?.list) {
228
- const list = manager.list();
229
- return Array.isArray(list) ? list : [];
230
- }
231
- return [];
232
- }
233
- async ensureDiscovered(force) {
234
- if (!this.client) {
235
- throw new SwitchbotOperationError('No SwitchBot client available', 'no_client');
236
- }
237
- const fromManager = this.getManagedDevices();
238
- const cacheValid = this.discoveryCacheTtlMs > 0 && (Date.now() - this.lastDiscoveryAt) < this.discoveryCacheTtlMs;
239
- if (!force && cacheValid && fromManager.length > 0) {
240
- return fromManager;
241
- }
242
- const discovered = await this.client.discover();
243
- this.lastDiscoveryAt = Date.now();
244
- return discovered;
245
- }
246
- }
247
- //# sourceMappingURL=switchbotClient.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"switchbotClient.js","sourceRoot":"","sources":["switchbotClient.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA;AAU/G;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAClB,GAAG,CAAuB;IAC1B,MAAM,GAAqB,IAAI,CAAA;IAC/B,eAAe,GAAG,GAAG,CAAA;IACrB,mBAAmB,GAAG,MAAM,CAAA;IAC5B,eAAe,GAAG,CAAC,CAAA;IACnB,MAAM,CAA6B;IACnC,aAAa,GAAsH,IAAI,GAAG,EAAE,CAAA;IAEpJ,YAAY,GAA0B;QACpC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAA;QACd,IAAI,CAAC,MAAM,GAAI,GAAW,EAAE,MAAqC,CAAA;QACjE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAA;QACpF,CAAC;QACD,IAAI,OAAQ,GAAW,EAAE,eAAe,KAAK,QAAQ,EAAE,CAAC;YACtD,IAAI,CAAC,eAAe,GAAI,GAAW,CAAC,eAAe,CAAA;QACrD,CAAC;QACD,IAAI,OAAQ,GAAW,EAAE,mBAAmB,KAAK,QAAQ,EAAE,CAAC;YAC1D,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAG,GAAW,CAAC,mBAAmB,CAAC,CAAA;QAC1E,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,OAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,sEAAsE;YACtE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAA;YACpD,MAAM,mBAAmB,GAAG,OAAQ,IAAI,CAAC,GAAW,EAAE,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAE,IAAI,CAAC,GAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAAA;YAC7H,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,mBAAmB,CAAC,CAAA;YAClE,IAAI,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC;gBAC1B,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY;gBAC5B,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,aAAa;gBAC9B,8DAA8D;gBAC9D,cAAc,EAAE,IAAI,EAAE,gCAAgC;gBACtD,WAAW,EAAE,IAAI,EAAE,iCAAiC;gBACpD,oBAAoB,EAAE,IAAI,EAAE,sCAAsC;gBAClE,4BAA4B,EAAE,IAAI,EAAE,2CAA2C;gBAC/E,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,KAAK,KAAK,EAAE,iCAAiC;gBAC1E,WAAW;gBACX,GAAG,mBAAmB;aACvB,CAAC,CAAA;YACF,IAAI,CAAC,eAAe,GAAG,CAAC,CAAA;YACxB,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,8DAA8D,CAAC,CAAA;QACrF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,2DAA2D,EAAE,CAAC,CAAC,CAAA;YACnF,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QACpB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAA;gBAC7C,IAAI,WAAW,EAAE,CAAC;oBAChB,OAAO,WAAW,CAAA;gBACpB,CAAC;gBAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;gBAClD,MAAM,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;gBAC3D,IAAI,aAAa,EAAE,CAAC;oBAClB,OAAO,aAAa,CAAA;gBACtB,CAAC;gBAED,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAA;gBACxD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YACrD,CAAC;YAAC,OAAO,CAAM,EAAE,CAAC;gBAChB,IAAI,CAAC,YAAY,4BAA4B,EAAE,CAAC;oBAC9C,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,sCAAsC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;oBAC7E,MAAM,CAAC,CAAA;gBACT,CAAC;qBAAM,IAAI,CAAC,YAAY,uBAAuB,EAAE,CAAC;oBAChD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,iCAAiC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;oBAC/E,MAAM,CAAC,CAAA;gBACT,CAAC;qBAAM,IAAI,CAAC,YAAY,0BAA0B,EAAE,CAAC;oBACnD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,wCAAwC,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,CAAC,CAAA;oBACrF,MAAM,CAAC,CAAA;gBACT,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;oBAC5D,MAAM,CAAC,CAAA;gBACT,CAAC;YACH,CAAC;QACH,CAAC;QACD,MAAM,IAAI,uBAAuB,CAAC,+BAA+B,EAAE,WAAW,CAAC,CAAA;IACjF,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;gBAC5C,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC3B,OAAO,WAAW,CAAA;gBACpB,CAAC;gBACD,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;YAC3C,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,2BAA2B,EAAE,CAAC,CAAC,CAAA;gBACnD,MAAM,CAAC,CAAA;YACT,CAAC;QACH,CAAC;QACD,MAAM,IAAI,uBAAuB,CAAC,+BAA+B,EAAE,WAAW,CAAC,CAAA;IACjF,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,EAAU,EAAE,IAAS;QACxC,0DAA0D;QAC1D,IAAI,CAAC,IAAI,CAAC,eAAe,IAAI,IAAI,CAAC,eAAe,IAAI,CAAC,EAAE,CAAC;YACvD,OAAO,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QACzC,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAC3C,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAA;gBACpB,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;gBAC5C,OAAM;YACR,CAAC;YAED,MAAM,SAAS,GAAmE,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;YACvG,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,IAAI,EAAE;gBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBACxC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAM;gBACR,CAAC;gBACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBAC7B,IAAI,CAAC;oBACH,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;oBACxD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS;wBAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBACjD,CAAC;gBAAC,OAAO,CAAM,EAAE,CAAC;oBAChB,IAAI,CAAC,YAAY,4BAA4B,EAAE,CAAC;wBAC9C,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,2CAA2C,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;oBACpF,CAAC;yBAAM,IAAI,CAAC,YAAY,uBAAuB,EAAE,CAAC;wBAChD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,sCAAsC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;oBACtF,CAAC;yBAAM,IAAI,CAAC,YAAY,0BAA0B,EAAE,CAAC;wBACnD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,6CAA6C,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,CAAC,CAAA;oBAC5F,CAAC;oBACD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS;wBAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;gBAC9C,CAAC;YACH,CAAC,EAAE,IAAI,CAAC,eAAe,CAAC,CAAA;YAExB,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,EAAU,EAAE,IAAS;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,uBAAuB,CAAC,kDAAkD,EAAE,WAAW,CAAC,CAAA;QACpG,CAAC;QACD,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;YACvC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,uBAAuB,CAAC,UAAU,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAA;YACjF,CAAC;YACD,MAAM,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;YAC1D,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,CAAA;YAC7B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,uBAAuB,CAAC,8BAA8B,EAAE,YAAY,CAAC,CAAA;YACjF,CAAC;YACD,MAAM,OAAO,GAAG,uBAAuB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAA;YAC5D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,uBAAuB,CAAC,wBAAwB,OAAO,sBAAsB,UAAU,GAAG,EAAE,qBAAqB,CAAC,CAAA;YAC9H,CAAC;YACD,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,IAAI,EAAE,6BAA6B,OAAO,sBAAsB,UAAU,GAAG,CAAC,CAAA;YACnG,OAAO,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;QACpC,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,YAAY,4BAA4B,EAAE,CAAC;gBAC9C,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,2CAA2C,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAA;gBAClF,MAAM,CAAC,CAAA;YACT,CAAC;iBAAM,IAAI,CAAC,YAAY,uBAAuB,EAAE,CAAC;gBAChD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,sCAAsC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;gBACpF,MAAM,CAAC,CAAA;YACT,CAAC;iBAAM,IAAI,CAAC,YAAY,0BAA0B,EAAE,CAAC;gBACnD,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,6CAA6C,EAAE,IAAI,EAAE,CAAC,CAAC,cAAc,CAAC,CAAA;gBAC1F,MAAM,CAAC,CAAA;YACT,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;gBAC1D,MAAM,CAAC,CAAA;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,OAAO;QACX,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC7C,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAC3B,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC,gDAAgD,EAAE,kBAAkB,CAAC,CAAA;YAC7G,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;gBAClC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACf,CAAC;QACH,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAA;QAE1B,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;QAC7B,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAA;IAC1B,CAAC;IAEO,oBAAoB,CAAC,mBAAwC;QACnE,IAAI,OAAO,mBAAmB,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5G,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAA;QACvD,CAAC;QAED,IAAI,OAAO,mBAAmB,CAAC,YAAY,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,mBAAmB,CAAC,YAAY,CAAC,EAAE,CAAC;YAC9G,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,mBAAmB,CAAC,YAAY,CAAC,CAAA;QACxD,CAAC;QAED,IAAI,OAAQ,IAAI,CAAC,GAAW,EAAE,sBAAsB,KAAK,QAAQ,EAAE,CAAC;YAClE,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAG,IAAI,CAAC,GAAW,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAAA;QACvE,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,gBAAgB,CAAC,EAAU;QACjC,MAAM,OAAO,GAAI,IAAI,CAAC,MAAc,EAAE,OAAO,CAAA;QAC7C,IAAI,OAAO,EAAE,GAAG,EAAE,CAAC;YACjB,OAAO,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACxB,CAAC;QACD,OAAO,SAAS,CAAA;IAClB,CAAC;IAEO,iBAAiB;QACvB,MAAM,OAAO,GAAI,IAAI,CAAC,MAAc,EAAE,OAAO,CAAA;QAC7C,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;YAC3B,OAAO,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAA;QACxC,CAAC;QACD,OAAO,EAAE,CAAA;IACX,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,KAAc;QAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,uBAAuB,CAAC,+BAA+B,EAAE,WAAW,CAAC,CAAA;QACjF,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAA;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,mBAAmB,CAAA;QACjH,IAAI,CAAC,KAAK,IAAI,UAAU,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnD,OAAO,WAAW,CAAA;QACpB,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;QAC/C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACjC,OAAO,UAAU,CAAA;IACnB,CAAC;CACF"}