@homebridge-plugins/homebridge-updater 3.1.9 → 3.1.10-beta.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/CHANGELOG.md +18 -0
- package/README.md +1 -2
- package/dist/homebridge-ui/public/index.html +2 -3
- package/dist/ui-api.d.ts.map +1 -1
- package/dist/ui-api.js +15 -0
- package/dist/ui-api.js.map +1 -1
- package/dist/updateCheckCore.d.ts.map +1 -1
- package/dist/updateCheckCore.js +20 -0
- package/dist/updateCheckCore.js.map +1 -1
- package/dist/updateSensor.d.ts +3 -0
- package/dist/updateSensor.d.ts.map +1 -1
- package/dist/updateSensor.js +14 -1
- package/dist/updateSensor.js.map +1 -1
- package/package.json +4 -3
- package/dist/Platform.HAP.test.d.ts +0 -2
- package/dist/Platform.HAP.test.d.ts.map +0 -1
- package/dist/Platform.HAP.test.js +0 -197
- package/dist/Platform.HAP.test.js.map +0 -1
- package/dist/Platform.Matter.test.d.ts +0 -2
- package/dist/Platform.Matter.test.d.ts.map +0 -1
- package/dist/Platform.Matter.test.js +0 -124
- package/dist/Platform.Matter.test.js.map +0 -1
- package/dist/configMigration.test.d.ts +0 -2
- package/dist/configMigration.test.d.ts.map +0 -1
- package/dist/configMigration.test.js +0 -119
- package/dist/configMigration.test.js.map +0 -1
- package/dist/configTypes.test.d.ts +0 -2
- package/dist/configTypes.test.d.ts.map +0 -1
- package/dist/configTypes.test.js +0 -108
- package/dist/configTypes.test.js.map +0 -1
- package/dist/ignore-plugins.test.d.ts +0 -2
- package/dist/ignore-plugins.test.d.ts.map +0 -1
- package/dist/ignore-plugins.test.js +0 -121
- package/dist/ignore-plugins.test.js.map +0 -1
- package/dist/index.test.d.ts +0 -2
- package/dist/index.test.d.ts.map +0 -1
- package/dist/index.test.js +0 -8
- package/dist/index.test.js.map +0 -1
- package/dist/schema.test.d.ts +0 -2
- package/dist/schema.test.d.ts.map +0 -1
- package/dist/schema.test.js +0 -111
- package/dist/schema.test.js.map +0 -1
- package/dist/updateCheckCore.autoupdate.test.d.ts +0 -2
- package/dist/updateCheckCore.autoupdate.test.d.ts.map +0 -1
- package/dist/updateCheckCore.autoupdate.test.js +0 -55
- package/dist/updateCheckCore.autoupdate.test.js.map +0 -1
- package/dist/updateCheckCore.beta.test.d.ts +0 -2
- package/dist/updateCheckCore.beta.test.d.ts.map +0 -1
- package/dist/updateCheckCore.beta.test.js +0 -48
- package/dist/updateCheckCore.beta.test.js.map +0 -1
- package/dist/updateCheckCore.route.test.d.ts +0 -2
- package/dist/updateCheckCore.route.test.d.ts.map +0 -1
- package/dist/updateCheckCore.route.test.js +0 -71
- package/dist/updateCheckCore.route.test.js.map +0 -1
- package/dist/updateSensor.test.d.ts +0 -2
- package/dist/updateSensor.test.d.ts.map +0 -1
- package/dist/updateSensor.test.js +0 -179
- package/dist/updateSensor.test.js.map +0 -1
- package/dist/utils.test.d.ts +0 -2
- package/dist/utils.test.d.ts.map +0 -1
- package/dist/utils.test.js +0 -150
- package/dist/utils.test.js.map +0 -1
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
/**
|
|
3
|
-
* Regression test for: update checks not running after Homebridge restart
|
|
4
|
-
*
|
|
5
|
-
* When Homebridge restarts, cached accessories are restored via `configureAccessory`
|
|
6
|
-
* before `didFinishLaunching` fires. The previous implementation returned early in
|
|
7
|
-
* `addUpdateSensor` when `registered` was already true, which prevented the initial
|
|
8
|
-
* check and scheduled cron jobs from being started.
|
|
9
|
-
*/
|
|
10
|
-
describe('updateSensor cached accessory restore', () => {
|
|
11
|
-
it('should start update checks even when the accessory is restored from cache', async () => {
|
|
12
|
-
// Arrange: track calls to startScheduledChecks and doCheck (via checkUi)
|
|
13
|
-
const checkUiCalls = [];
|
|
14
|
-
const startScheduledChecksCalls = [];
|
|
15
|
-
// Minimal mock for UpdateCheckCore
|
|
16
|
-
const mockUpdateCore = {
|
|
17
|
-
initialCheckDelay: 0,
|
|
18
|
-
checkUi: vi.fn().mockResolvedValue(0),
|
|
19
|
-
startScheduledChecks: vi.fn(() => {
|
|
20
|
-
startScheduledChecksCalls.push(1);
|
|
21
|
-
}),
|
|
22
|
-
getLastAutoUpdateFailed: vi.fn().mockReturnValue(false),
|
|
23
|
-
};
|
|
24
|
-
// Minimal mock for a HAP sensor
|
|
25
|
-
const mockSensor = {
|
|
26
|
-
configure: vi.fn(),
|
|
27
|
-
setState: vi.fn(),
|
|
28
|
-
};
|
|
29
|
-
// Minimal mock for the Homebridge API (HAP path, no Matter)
|
|
30
|
-
const mockAccessory = {
|
|
31
|
-
UUID: 'test-uuid',
|
|
32
|
-
displayName: 'Plugin Update Check',
|
|
33
|
-
on: vi.fn(),
|
|
34
|
-
};
|
|
35
|
-
// Build the UpdateSensor object directly by manipulating internal state
|
|
36
|
-
// to simulate the cached accessory scenario without needing to import the full class
|
|
37
|
-
// (which requires a real Homebridge environment).
|
|
38
|
-
//
|
|
39
|
-
// Instead, we test the *logic* extracted from addUpdateSensor:
|
|
40
|
-
// The fix ensures that checks are started whether or not the accessory was cached.
|
|
41
|
-
let registered = false;
|
|
42
|
-
// Simulate configureAccessory being called (cached accessory restore)
|
|
43
|
-
function configureAccessory(_accessory) {
|
|
44
|
-
mockSensor.configure(_accessory);
|
|
45
|
-
registered = true;
|
|
46
|
-
}
|
|
47
|
-
// Fixed addUpdateSensor: only skips accessory creation, always starts checks
|
|
48
|
-
function addUpdateSensor() {
|
|
49
|
-
if (!registered) {
|
|
50
|
-
// Would create and register the accessory here
|
|
51
|
-
mockSensor.configure(mockAccessory);
|
|
52
|
-
registered = true;
|
|
53
|
-
}
|
|
54
|
-
// Always start checks
|
|
55
|
-
setTimeout(() => {
|
|
56
|
-
mockUpdateCore.checkUi().then((updates) => {
|
|
57
|
-
checkUiCalls.push(updates);
|
|
58
|
-
mockSensor.setState(!!updates);
|
|
59
|
-
});
|
|
60
|
-
}, mockUpdateCore.initialCheckDelay * 1000);
|
|
61
|
-
mockUpdateCore.startScheduledChecks(() => {
|
|
62
|
-
mockUpdateCore.checkUi();
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
// Simulate Homebridge restart: cached accessory is restored first
|
|
66
|
-
configureAccessory(mockAccessory);
|
|
67
|
-
expect(registered).toBe(true);
|
|
68
|
-
// Then addUpdateSensor fires on didFinishLaunching
|
|
69
|
-
addUpdateSensor();
|
|
70
|
-
// The accessory should NOT be reconfigured (already was via restore)
|
|
71
|
-
expect(mockSensor.configure).toHaveBeenCalledTimes(1);
|
|
72
|
-
// Scheduled checks MUST be started
|
|
73
|
-
expect(startScheduledChecksCalls).toHaveLength(1);
|
|
74
|
-
expect(mockUpdateCore.startScheduledChecks).toHaveBeenCalledTimes(1);
|
|
75
|
-
// Wait for setTimeout(0) to fire
|
|
76
|
-
await new Promise(resolve => setTimeout(resolve, 10));
|
|
77
|
-
// The initial check must have run
|
|
78
|
-
expect(mockUpdateCore.checkUi).toHaveBeenCalled();
|
|
79
|
-
expect(checkUiCalls).toHaveLength(1);
|
|
80
|
-
});
|
|
81
|
-
it('should NOT start checks twice when addUpdateSensor is called on first launch (no cached accessory)', async () => {
|
|
82
|
-
const startScheduledChecksCalls = [];
|
|
83
|
-
const configureCalls = [];
|
|
84
|
-
const mockUpdateCore = {
|
|
85
|
-
initialCheckDelay: 0,
|
|
86
|
-
checkUi: vi.fn().mockResolvedValue(1),
|
|
87
|
-
startScheduledChecks: vi.fn(() => {
|
|
88
|
-
startScheduledChecksCalls.push(1);
|
|
89
|
-
}),
|
|
90
|
-
getLastAutoUpdateFailed: vi.fn().mockReturnValue(false),
|
|
91
|
-
};
|
|
92
|
-
const mockSensor = {
|
|
93
|
-
configure: vi.fn(() => configureCalls.push(1)),
|
|
94
|
-
setState: vi.fn(),
|
|
95
|
-
};
|
|
96
|
-
const mockAccessory = {
|
|
97
|
-
UUID: 'test-uuid',
|
|
98
|
-
displayName: 'Plugin Update Check',
|
|
99
|
-
};
|
|
100
|
-
let registered = false;
|
|
101
|
-
// Fixed addUpdateSensor (no prior configureAccessory call)
|
|
102
|
-
function addUpdateSensor() {
|
|
103
|
-
if (!registered) {
|
|
104
|
-
mockSensor.configure(mockAccessory);
|
|
105
|
-
registered = true;
|
|
106
|
-
}
|
|
107
|
-
setTimeout(() => {
|
|
108
|
-
mockUpdateCore.checkUi();
|
|
109
|
-
}, mockUpdateCore.initialCheckDelay * 1000);
|
|
110
|
-
mockUpdateCore.startScheduledChecks(() => {
|
|
111
|
-
mockUpdateCore.checkUi();
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
// First launch: no cached accessory; addUpdateSensor creates it
|
|
115
|
-
addUpdateSensor();
|
|
116
|
-
expect(registered).toBe(true);
|
|
117
|
-
expect(configureCalls).toHaveLength(1);
|
|
118
|
-
expect(startScheduledChecksCalls).toHaveLength(1);
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
/**
|
|
122
|
-
* Regression test for #251: renaming the sensor in the config did not propagate
|
|
123
|
-
* to the cached accessory, so the new name never reached the Homebridge UI or HomeKit.
|
|
124
|
-
*
|
|
125
|
-
* When the accessory is restored from cache, `addUpdateSensor` must sync the
|
|
126
|
-
* cached accessory's displayName (and sensor service name) to the configured name.
|
|
127
|
-
*/
|
|
128
|
-
describe('updateSensor name propagation on rename (#251)', () => {
|
|
129
|
-
function simulateAddUpdateSensor(configName, cachedName) {
|
|
130
|
-
const updateCalls = [];
|
|
131
|
-
const sensorNameUpdates = [];
|
|
132
|
-
const infoNameSets = [];
|
|
133
|
-
const accessory = {
|
|
134
|
-
UUID: 'test-uuid',
|
|
135
|
-
displayName: cachedName,
|
|
136
|
-
getService: vi.fn(() => ({
|
|
137
|
-
setCharacteristic: vi.fn((_c, name) => {
|
|
138
|
-
infoNameSets.push(name);
|
|
139
|
-
}),
|
|
140
|
-
})),
|
|
141
|
-
};
|
|
142
|
-
const sensor = {
|
|
143
|
-
configure: vi.fn(),
|
|
144
|
-
setState: vi.fn(),
|
|
145
|
-
updateName: vi.fn((name) => sensorNameUpdates.push(name)),
|
|
146
|
-
};
|
|
147
|
-
const api = {
|
|
148
|
-
matter: undefined,
|
|
149
|
-
hap: { Service: { AccessoryInformation: {} }, Characteristic: { Name: {} } },
|
|
150
|
-
updatePlatformAccessories: vi.fn((accs) => updateCalls.push(accs)),
|
|
151
|
-
};
|
|
152
|
-
// registered === true because the accessory came from the cache
|
|
153
|
-
const registered = true;
|
|
154
|
-
const deviceName = configName || 'Plugin Update Check';
|
|
155
|
-
if (!registered) {
|
|
156
|
-
// creation path — not exercised here
|
|
157
|
-
}
|
|
158
|
-
else if (accessory && accessory.displayName !== deviceName) {
|
|
159
|
-
accessory.displayName = deviceName;
|
|
160
|
-
accessory.getService(api.hap.Service.AccessoryInformation)?.setCharacteristic(api.hap.Characteristic.Name, deviceName);
|
|
161
|
-
sensor.updateName?.(deviceName);
|
|
162
|
-
api.updatePlatformAccessories([accessory]);
|
|
163
|
-
}
|
|
164
|
-
return { accessory, updateCalls, sensorNameUpdates, infoNameSets };
|
|
165
|
-
}
|
|
166
|
-
it('syncs the cached accessory name to the new config name', () => {
|
|
167
|
-
const { accessory, updateCalls, sensorNameUpdates, infoNameSets } = simulateAddUpdateSensor('Plugin Updates Sensor', 'PluginUpdate');
|
|
168
|
-
expect(accessory.displayName).toBe('Plugin Updates Sensor');
|
|
169
|
-
expect(sensorNameUpdates).toEqual(['Plugin Updates Sensor']);
|
|
170
|
-
expect(infoNameSets).toEqual(['Plugin Updates Sensor']);
|
|
171
|
-
expect(updateCalls).toHaveLength(1);
|
|
172
|
-
});
|
|
173
|
-
it('does nothing when the name is unchanged', () => {
|
|
174
|
-
const { updateCalls, sensorNameUpdates } = simulateAddUpdateSensor('PluginUpdate', 'PluginUpdate');
|
|
175
|
-
expect(sensorNameUpdates).toHaveLength(0);
|
|
176
|
-
expect(updateCalls).toHaveLength(0);
|
|
177
|
-
});
|
|
178
|
-
});
|
|
179
|
-
//# sourceMappingURL=updateSensor.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"updateSensor.test.js","sourceRoot":"","sources":["../src/updateSensor.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEjD;;;;;;;GAOG;AACH,QAAQ,CAAC,uCAAuC,EAAE,GAAG,EAAE;IACrD,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,yEAAyE;QACzE,MAAM,YAAY,GAAa,EAAE,CAAA;QACjC,MAAM,yBAAyB,GAAa,EAAE,CAAA;QAE9C,mCAAmC;QACnC,MAAM,cAAc,GAAG;YACrB,iBAAiB,EAAE,CAAC;YACpB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACrC,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAA2B,GAAG,EAAE;gBACzD,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACnC,CAAC,CAAC;YACF,uBAAuB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;SACxD,CAAA;QAED,gCAAgC;QAChC,MAAM,UAAU,GAAG;YACjB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;YAClB,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;SAClB,CAAA;QAED,4DAA4D;QAC5D,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,qBAAqB;YAClC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;SACZ,CAAA;QAED,wEAAwE;QACxE,qFAAqF;QACrF,kDAAkD;QAClD,EAAE;QACF,+DAA+D;QAC/D,mFAAmF;QAEnF,IAAI,UAAU,GAAG,KAAK,CAAA;QAEtB,sEAAsE;QACtE,SAAS,kBAAkB,CAAC,UAAe;YACzC,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YAChC,UAAU,GAAG,IAAI,CAAA;QACnB,CAAC;QAED,6EAA6E;QAC7E,SAAS,eAAe;YACtB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,+CAA+C;gBAC/C,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;gBACnC,UAAU,GAAG,IAAI,CAAA;YACnB,CAAC;YACD,sBAAsB;YACtB,UAAU,CAAC,GAAG,EAAE;gBACd,cAAc,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,OAAe,EAAE,EAAE;oBAChD,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;oBAC1B,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;gBAChC,CAAC,CAAC,CAAA;YACJ,CAAC,EAAE,cAAc,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;YAC3C,cAAc,CAAC,oBAAoB,CAAC,GAAG,EAAE;gBACvC,cAAc,CAAC,OAAO,EAAE,CAAA;YAC1B,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,kEAAkE;QAClE,kBAAkB,CAAC,aAAa,CAAC,CAAA;QACjC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAE7B,mDAAmD;QACnD,eAAe,EAAE,CAAA;QAEjB,qEAAqE;QACrE,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAErD,mCAAmC;QACnC,MAAM,CAAC,yBAAyB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACjD,MAAM,CAAC,cAAc,CAAC,oBAAoB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAA;QAEpE,iCAAiC;QACjC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;QAErD,kCAAkC;QAClC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAA;QACjD,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACtC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oGAAoG,EAAE,KAAK,IAAI,EAAE;QAClH,MAAM,yBAAyB,GAAa,EAAE,CAAA;QAC9C,MAAM,cAAc,GAAa,EAAE,CAAA;QAEnC,MAAM,cAAc,GAAG;YACrB,iBAAiB,EAAE,CAAC;YACpB,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;YACrC,oBAAoB,EAAE,EAAE,CAAC,EAAE,CAA2B,GAAG,EAAE;gBACzD,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACnC,CAAC,CAAC;YACF,uBAAuB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC;SACxD,CAAA;QAED,MAAM,UAAU,GAAG;YACjB,SAAS,EAAE,EAAE,CAAC,EAAE,CAAsB,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnE,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;SAClB,CAAA;QAED,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,qBAAqB;SACnC,CAAA;QAED,IAAI,UAAU,GAAG,KAAK,CAAA;QAEtB,2DAA2D;QAC3D,SAAS,eAAe;YACtB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,CAAA;gBACnC,UAAU,GAAG,IAAI,CAAA;YACnB,CAAC;YACD,UAAU,CAAC,GAAG,EAAE;gBACd,cAAc,CAAC,OAAO,EAAE,CAAA;YAC1B,CAAC,EAAE,cAAc,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAAA;YAC3C,cAAc,CAAC,oBAAoB,CAAC,GAAG,EAAE;gBACvC,cAAc,CAAC,OAAO,EAAE,CAAA;YAC1B,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,gEAAgE;QAChE,eAAe,EAAE,CAAA;QAEjB,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC7B,MAAM,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACtC,MAAM,CAAC,yBAAyB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF;;;;;;GAMG;AACH,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC9D,SAAS,uBAAuB,CAAC,UAAkB,EAAE,UAAkB;QACrE,MAAM,WAAW,GAAY,EAAE,CAAA;QAC/B,MAAM,iBAAiB,GAAa,EAAE,CAAA;QACtC,MAAM,YAAY,GAAa,EAAE,CAAA;QAEjC,MAAM,SAAS,GAAG;YAChB,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,UAAU;YACvB,UAAU,EAAE,EAAE,CAAC,EAAE,CAAyB,GAAG,EAAE,CAAC,CAAC;gBAC/C,iBAAiB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAO,EAAE,IAAY,EAAE,EAAE;oBACjD,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBACzB,CAAC,CAAC;aACH,CAAC,CAAC;SACJ,CAAA;QAED,MAAM,MAAM,GAAG;YACb,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;YAClB,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;YACjB,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAClE,CAAA;QAED,MAAM,GAAG,GAAG;YACV,MAAM,EAAE,SAAS;YACjB,GAAG,EAAE,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;YAC5E,yBAAyB,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAW,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SAC1E,CAAA;QAED,gEAAgE;QAChE,MAAM,UAAU,GAAG,IAAI,CAAA;QACvB,MAAM,UAAU,GAAG,UAAU,IAAI,qBAAqB,CAAA;QAEtD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,qCAAqC;QACvC,CAAC;aAAM,IAAI,SAAS,IAAI,SAAS,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YAC7D,SAAS,CAAC,WAAW,GAAG,UAAU,CAAA;YAClC,SAAS,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;YACtH,MAAM,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAA;YAC/B,GAAG,CAAC,yBAAyB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAA;QAC5C,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAA;IACpE,CAAC;IAED,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,GAAG,uBAAuB,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAA;QAEpI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QAC3D,MAAM,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAA;QAC5D,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAA;QACvD,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,uBAAuB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAA;QAElG,MAAM,CAAC,iBAAiB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACzC,MAAM,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/dist/utils.test.d.ts
DELETED
package/dist/utils.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":""}
|
package/dist/utils.test.js
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { createPlatformProxy, isFailureSensorEnabled } from './utils.js';
|
|
3
|
-
describe('isFailureSensorEnabled', () => {
|
|
4
|
-
it('should return false when failureSensorType is "none"', () => {
|
|
5
|
-
expect(isFailureSensorEnabled({ failureSensorType: 'none', autoUpdateHomebridge: true })).toBe(false);
|
|
6
|
-
});
|
|
7
|
-
it('should return false when no auto-update option is enabled', () => {
|
|
8
|
-
expect(isFailureSensorEnabled({})).toBe(false);
|
|
9
|
-
expect(isFailureSensorEnabled({ autoUpdateHomebridge: false, autoUpdateHomebridgeUI: false, autoUpdatePlugins: false, autoUpdateNode: false, autoUpdateNpm: false })).toBe(false);
|
|
10
|
-
});
|
|
11
|
-
it('should return true when at least one auto-update option is enabled', () => {
|
|
12
|
-
expect(isFailureSensorEnabled({ autoUpdateHomebridge: true })).toBe(true);
|
|
13
|
-
expect(isFailureSensorEnabled({ autoUpdateHomebridgeUI: true })).toBe(true);
|
|
14
|
-
expect(isFailureSensorEnabled({ autoUpdatePlugins: true })).toBe(true);
|
|
15
|
-
expect(isFailureSensorEnabled({ autoUpdateNode: true })).toBe(true);
|
|
16
|
-
expect(isFailureSensorEnabled({ autoUpdateNpm: true })).toBe(true);
|
|
17
|
-
});
|
|
18
|
-
it('should return false when failureSensorType is "none" even if auto-updates are enabled', () => {
|
|
19
|
-
const config = {
|
|
20
|
-
failureSensorType: 'none',
|
|
21
|
-
autoUpdateHomebridge: true,
|
|
22
|
-
autoUpdateHomebridgeUI: true,
|
|
23
|
-
autoUpdatePlugins: true,
|
|
24
|
-
autoUpdateNode: true,
|
|
25
|
-
autoUpdateNpm: true,
|
|
26
|
-
};
|
|
27
|
-
expect(isFailureSensorEnabled(config)).toBe(false);
|
|
28
|
-
});
|
|
29
|
-
it('should return true when failureSensorType is a valid sensor and auto-update is enabled', () => {
|
|
30
|
-
expect(isFailureSensorEnabled({ failureSensorType: 'motion', autoUpdateHomebridge: true })).toBe(true);
|
|
31
|
-
expect(isFailureSensorEnabled({ failureSensorType: 'contact', autoUpdatePlugins: true })).toBe(true);
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
describe('createPlatformProxy', () => {
|
|
35
|
-
it('should fall back to HAP platform when Matter is not available', () => {
|
|
36
|
-
const hapConstructed = [];
|
|
37
|
-
const matterConstructed = [];
|
|
38
|
-
class MockHAPPlatform {
|
|
39
|
-
constructor(log, config, api) {
|
|
40
|
-
hapConstructed.push({ log, config, api });
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
class MockMatterPlatform {
|
|
44
|
-
constructor(log, config, api) {
|
|
45
|
-
matterConstructed.push({ log, config, api });
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
const ProxyCtor = createPlatformProxy(MockHAPPlatform, MockMatterPlatform);
|
|
49
|
-
// api without Matter support
|
|
50
|
-
const api = {};
|
|
51
|
-
void new ProxyCtor('log', { enableMatter: true }, api);
|
|
52
|
-
expect(hapConstructed).toHaveLength(1);
|
|
53
|
-
expect(matterConstructed).toHaveLength(0);
|
|
54
|
-
});
|
|
55
|
-
it('should use Matter platform when Matter is available and enabled', () => {
|
|
56
|
-
const hapConstructed = [];
|
|
57
|
-
const matterConstructed = [];
|
|
58
|
-
class MockHAPPlatform {
|
|
59
|
-
constructor(log, config, api) {
|
|
60
|
-
hapConstructed.push({ log, config, api });
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
class MockMatterPlatform {
|
|
64
|
-
constructor(log, config, api) {
|
|
65
|
-
matterConstructed.push({ log, config, api });
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
const ProxyCtor = createPlatformProxy(MockHAPPlatform, MockMatterPlatform);
|
|
69
|
-
// api with Matter support available and enabled
|
|
70
|
-
const api = {
|
|
71
|
-
matter: {},
|
|
72
|
-
isMatterAvailable: () => true,
|
|
73
|
-
isMatterEnabled: () => true,
|
|
74
|
-
};
|
|
75
|
-
void new ProxyCtor('log', { enableMatter: true }, api);
|
|
76
|
-
expect(matterConstructed).toHaveLength(1);
|
|
77
|
-
expect(hapConstructed).toHaveLength(0);
|
|
78
|
-
});
|
|
79
|
-
it('should fall back to HAP when enableMatter is false', () => {
|
|
80
|
-
const hapConstructed = [];
|
|
81
|
-
const matterConstructed = [];
|
|
82
|
-
class MockHAPPlatform {
|
|
83
|
-
constructor(log, config, api) {
|
|
84
|
-
hapConstructed.push({ log, config, api });
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
class MockMatterPlatform {
|
|
88
|
-
constructor(log, config, api) {
|
|
89
|
-
matterConstructed.push({ log, config, api });
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
const ProxyCtor = createPlatformProxy(MockHAPPlatform, MockMatterPlatform);
|
|
93
|
-
// Matter available but disabled in config
|
|
94
|
-
const api = {
|
|
95
|
-
matter: {},
|
|
96
|
-
isMatterAvailable: () => true,
|
|
97
|
-
isMatterEnabled: () => true,
|
|
98
|
-
};
|
|
99
|
-
void new ProxyCtor('log', { enableMatter: false }, api);
|
|
100
|
-
expect(hapConstructed).toHaveLength(1);
|
|
101
|
-
expect(matterConstructed).toHaveLength(0);
|
|
102
|
-
});
|
|
103
|
-
it('should use Matter when isMatter* APIs are unavailable but matter API exists', () => {
|
|
104
|
-
const hapConstructed = [];
|
|
105
|
-
const matterConstructed = [];
|
|
106
|
-
class MockHAPPlatform {
|
|
107
|
-
constructor(log, config, api) {
|
|
108
|
-
hapConstructed.push({ log, config, api });
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
class MockMatterPlatform {
|
|
112
|
-
constructor(log, config, api) {
|
|
113
|
-
matterConstructed.push({ log, config, api });
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
const ProxyCtor = createPlatformProxy(MockHAPPlatform, MockMatterPlatform);
|
|
117
|
-
// API shape used in some Homebridge versions/plugins where isMatter* may not exist.
|
|
118
|
-
const api = {
|
|
119
|
-
matter: {},
|
|
120
|
-
};
|
|
121
|
-
void new ProxyCtor('log', { enableMatter: true }, api);
|
|
122
|
-
expect(matterConstructed).toHaveLength(1);
|
|
123
|
-
expect(hapConstructed).toHaveLength(0);
|
|
124
|
-
});
|
|
125
|
-
it('should delegate configureAccessory to the Matter impl (stale HAP cleanup)', () => {
|
|
126
|
-
const configuredAccessories = [];
|
|
127
|
-
class MockHAPPlatform {
|
|
128
|
-
constructor() { }
|
|
129
|
-
configureAccessory(accessory) {
|
|
130
|
-
// Should not be called when Matter is active
|
|
131
|
-
configuredAccessories.push({ platform: 'hap', accessory });
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
class MockMatterPlatform {
|
|
135
|
-
constructor() { }
|
|
136
|
-
configureAccessory(accessory) {
|
|
137
|
-
configuredAccessories.push({ platform: 'matter', accessory });
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
const ProxyCtor = createPlatformProxy(MockHAPPlatform, MockMatterPlatform);
|
|
141
|
-
const api = { matter: {}, isMatterAvailable: () => true, isMatterEnabled: () => true };
|
|
142
|
-
const proxy = new ProxyCtor('log', { enableMatter: true }, api);
|
|
143
|
-
const staleAccessory = { UUID: 'old-hap-uuid', displayName: 'Homebridge Plugin Update' };
|
|
144
|
-
proxy.configureAccessory(staleAccessory);
|
|
145
|
-
expect(configuredAccessories).toHaveLength(1);
|
|
146
|
-
expect(configuredAccessories[0].platform).toBe('matter');
|
|
147
|
-
expect(configuredAccessories[0].accessory).toBe(staleAccessory);
|
|
148
|
-
});
|
|
149
|
-
});
|
|
150
|
-
//# sourceMappingURL=utils.test.js.map
|
package/dist/utils.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":"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"}
|