@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.
Files changed (62) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +1 -2
  3. package/dist/homebridge-ui/public/index.html +2 -3
  4. package/dist/ui-api.d.ts.map +1 -1
  5. package/dist/ui-api.js +15 -0
  6. package/dist/ui-api.js.map +1 -1
  7. package/dist/updateCheckCore.d.ts.map +1 -1
  8. package/dist/updateCheckCore.js +20 -0
  9. package/dist/updateCheckCore.js.map +1 -1
  10. package/dist/updateSensor.d.ts +3 -0
  11. package/dist/updateSensor.d.ts.map +1 -1
  12. package/dist/updateSensor.js +14 -1
  13. package/dist/updateSensor.js.map +1 -1
  14. package/package.json +4 -3
  15. package/dist/Platform.HAP.test.d.ts +0 -2
  16. package/dist/Platform.HAP.test.d.ts.map +0 -1
  17. package/dist/Platform.HAP.test.js +0 -197
  18. package/dist/Platform.HAP.test.js.map +0 -1
  19. package/dist/Platform.Matter.test.d.ts +0 -2
  20. package/dist/Platform.Matter.test.d.ts.map +0 -1
  21. package/dist/Platform.Matter.test.js +0 -124
  22. package/dist/Platform.Matter.test.js.map +0 -1
  23. package/dist/configMigration.test.d.ts +0 -2
  24. package/dist/configMigration.test.d.ts.map +0 -1
  25. package/dist/configMigration.test.js +0 -119
  26. package/dist/configMigration.test.js.map +0 -1
  27. package/dist/configTypes.test.d.ts +0 -2
  28. package/dist/configTypes.test.d.ts.map +0 -1
  29. package/dist/configTypes.test.js +0 -108
  30. package/dist/configTypes.test.js.map +0 -1
  31. package/dist/ignore-plugins.test.d.ts +0 -2
  32. package/dist/ignore-plugins.test.d.ts.map +0 -1
  33. package/dist/ignore-plugins.test.js +0 -121
  34. package/dist/ignore-plugins.test.js.map +0 -1
  35. package/dist/index.test.d.ts +0 -2
  36. package/dist/index.test.d.ts.map +0 -1
  37. package/dist/index.test.js +0 -8
  38. package/dist/index.test.js.map +0 -1
  39. package/dist/schema.test.d.ts +0 -2
  40. package/dist/schema.test.d.ts.map +0 -1
  41. package/dist/schema.test.js +0 -111
  42. package/dist/schema.test.js.map +0 -1
  43. package/dist/updateCheckCore.autoupdate.test.d.ts +0 -2
  44. package/dist/updateCheckCore.autoupdate.test.d.ts.map +0 -1
  45. package/dist/updateCheckCore.autoupdate.test.js +0 -55
  46. package/dist/updateCheckCore.autoupdate.test.js.map +0 -1
  47. package/dist/updateCheckCore.beta.test.d.ts +0 -2
  48. package/dist/updateCheckCore.beta.test.d.ts.map +0 -1
  49. package/dist/updateCheckCore.beta.test.js +0 -48
  50. package/dist/updateCheckCore.beta.test.js.map +0 -1
  51. package/dist/updateCheckCore.route.test.d.ts +0 -2
  52. package/dist/updateCheckCore.route.test.d.ts.map +0 -1
  53. package/dist/updateCheckCore.route.test.js +0 -71
  54. package/dist/updateCheckCore.route.test.js.map +0 -1
  55. package/dist/updateSensor.test.d.ts +0 -2
  56. package/dist/updateSensor.test.d.ts.map +0 -1
  57. package/dist/updateSensor.test.js +0 -179
  58. package/dist/updateSensor.test.js.map +0 -1
  59. package/dist/utils.test.d.ts +0 -2
  60. package/dist/utils.test.d.ts.map +0 -1
  61. package/dist/utils.test.js +0 -150
  62. 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":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=utils.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":""}
@@ -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
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.test.js","sourceRoot":"","sources":["../src/utils.test.ts"],"names":[],"mappings":"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"}