@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,121 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
// Test for the plugin filtering logic
|
|
3
|
-
describe('plugin Update Filtering', () => {
|
|
4
|
-
it('should filter plugins correctly based on ignore list', () => {
|
|
5
|
-
// Mock plugin data similar to what would come from the API
|
|
6
|
-
const mockPlugins = [
|
|
7
|
-
{
|
|
8
|
-
name: 'homebridge-plugin-1',
|
|
9
|
-
installedVersion: '1.0.0',
|
|
10
|
-
latestVersion: '1.1.0',
|
|
11
|
-
updateAvailable: true,
|
|
12
|
-
},
|
|
13
|
-
{
|
|
14
|
-
name: 'homebridge-plugin-2',
|
|
15
|
-
installedVersion: '2.0.0',
|
|
16
|
-
latestVersion: '2.1.0',
|
|
17
|
-
updateAvailable: true,
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
name: 'homebridge-config-ui-x',
|
|
21
|
-
installedVersion: '4.0.0',
|
|
22
|
-
latestVersion: '4.1.0',
|
|
23
|
-
updateAvailable: true,
|
|
24
|
-
},
|
|
25
|
-
{
|
|
26
|
-
name: 'homebridge-plugin-3',
|
|
27
|
-
installedVersion: '3.0.0',
|
|
28
|
-
latestVersion: '3.1.0',
|
|
29
|
-
updateAvailable: true,
|
|
30
|
-
},
|
|
31
|
-
];
|
|
32
|
-
const ignoredPlugins = ['homebridge-plugin-2', 'homebridge-plugin-3'];
|
|
33
|
-
// Test the filtering logic that would be used in checkUi()
|
|
34
|
-
const filteredPlugins = mockPlugins.filter(plugin => plugin.name !== 'homebridge-config-ui-x'
|
|
35
|
-
&& !ignoredPlugins.includes(plugin.name));
|
|
36
|
-
expect(filteredPlugins).toHaveLength(1);
|
|
37
|
-
expect(filteredPlugins[0].name).toBe('homebridge-plugin-1');
|
|
38
|
-
});
|
|
39
|
-
it('should include all plugins when ignore list is empty', () => {
|
|
40
|
-
const mockPlugins = [
|
|
41
|
-
{
|
|
42
|
-
name: 'homebridge-plugin-1',
|
|
43
|
-
installedVersion: '1.0.0',
|
|
44
|
-
latestVersion: '1.1.0',
|
|
45
|
-
updateAvailable: true,
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
name: 'homebridge-plugin-2',
|
|
49
|
-
installedVersion: '2.0.0',
|
|
50
|
-
latestVersion: '2.1.0',
|
|
51
|
-
updateAvailable: true,
|
|
52
|
-
},
|
|
53
|
-
];
|
|
54
|
-
const ignoredPlugins = [];
|
|
55
|
-
const filteredPlugins = mockPlugins.filter(plugin => plugin.name !== 'homebridge-config-ui-x'
|
|
56
|
-
&& !ignoredPlugins.includes(plugin.name));
|
|
57
|
-
expect(filteredPlugins).toHaveLength(2);
|
|
58
|
-
expect(filteredPlugins.map(p => p.name)).toEqual(['homebridge-plugin-1', 'homebridge-plugin-2']);
|
|
59
|
-
});
|
|
60
|
-
it('should correctly identify ignored plugins with updates', () => {
|
|
61
|
-
const mockPlugins = [
|
|
62
|
-
{
|
|
63
|
-
name: 'homebridge-plugin-1',
|
|
64
|
-
installedVersion: '1.0.0',
|
|
65
|
-
latestVersion: '1.1.0',
|
|
66
|
-
updateAvailable: true,
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
name: 'homebridge-plugin-ignored',
|
|
70
|
-
installedVersion: '2.0.0',
|
|
71
|
-
latestVersion: '2.1.0',
|
|
72
|
-
updateAvailable: true,
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
name: 'homebridge-plugin-no-update',
|
|
76
|
-
installedVersion: '3.0.0',
|
|
77
|
-
latestVersion: '3.0.0',
|
|
78
|
-
updateAvailable: false,
|
|
79
|
-
},
|
|
80
|
-
];
|
|
81
|
-
const ignoredPlugins = ['homebridge-plugin-ignored'];
|
|
82
|
-
// Test identifying ignored plugins with available updates
|
|
83
|
-
const ignoredWithUpdates = mockPlugins.filter(plugin => ignoredPlugins.includes(plugin.name) && plugin.updateAvailable);
|
|
84
|
-
expect(ignoredWithUpdates).toHaveLength(1);
|
|
85
|
-
expect(ignoredWithUpdates[0].name).toBe('homebridge-plugin-ignored');
|
|
86
|
-
});
|
|
87
|
-
it('should filter homebridge-config-ui-x when in ignore list', () => {
|
|
88
|
-
const mockPlugins = [
|
|
89
|
-
{
|
|
90
|
-
name: 'homebridge-config-ui-x',
|
|
91
|
-
installedVersion: '4.0.0',
|
|
92
|
-
latestVersion: '4.1.0',
|
|
93
|
-
updateAvailable: true,
|
|
94
|
-
},
|
|
95
|
-
];
|
|
96
|
-
const ignoredPlugins = ['homebridge-config-ui-x'];
|
|
97
|
-
// Test filtering homebridge-config-ui-x updates when ignored
|
|
98
|
-
const shouldFilterUI = ignoredPlugins.includes('homebridge-config-ui-x');
|
|
99
|
-
expect(shouldFilterUI).toBe(true);
|
|
100
|
-
// Simulate what would happen in the checkUi() method
|
|
101
|
-
const uiPlugin = mockPlugins.find(plugin => plugin.name === 'homebridge-config-ui-x');
|
|
102
|
-
const shouldAddUpdate = uiPlugin && uiPlugin.updateAvailable && !shouldFilterUI;
|
|
103
|
-
expect(shouldAddUpdate).toBe(false);
|
|
104
|
-
});
|
|
105
|
-
it('should filter homebridge core updates when in ignore list', () => {
|
|
106
|
-
const mockHomebridge = {
|
|
107
|
-
name: 'homebridge',
|
|
108
|
-
installedVersion: '1.0.0',
|
|
109
|
-
latestVersion: '1.1.0',
|
|
110
|
-
updateAvailable: true,
|
|
111
|
-
};
|
|
112
|
-
const ignoredPlugins = ['homebridge'];
|
|
113
|
-
// Test filtering homebridge core updates when ignored
|
|
114
|
-
const shouldFilterHomebridge = ignoredPlugins.includes('homebridge');
|
|
115
|
-
expect(shouldFilterHomebridge).toBe(true);
|
|
116
|
-
// Simulate what would happen in the checkUi() method
|
|
117
|
-
const shouldAddUpdate = mockHomebridge.updateAvailable && !shouldFilterHomebridge;
|
|
118
|
-
expect(shouldAddUpdate).toBe(false);
|
|
119
|
-
});
|
|
120
|
-
});
|
|
121
|
-
//# sourceMappingURL=ignore-plugins.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ignore-plugins.test.js","sourceRoot":"","sources":["../src/ignore-plugins.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,sCAAsC;AACtC,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;IACvC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,2DAA2D;QAC3D,MAAM,WAAW,GAAG;YAClB;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,gBAAgB,EAAE,OAAO;gBACzB,aAAa,EAAE,OAAO;gBACtB,eAAe,EAAE,IAAI;aACtB;YACD;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,gBAAgB,EAAE,OAAO;gBACzB,aAAa,EAAE,OAAO;gBACtB,eAAe,EAAE,IAAI;aACtB;YACD;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,gBAAgB,EAAE,OAAO;gBACzB,aAAa,EAAE,OAAO;gBACtB,eAAe,EAAE,IAAI;aACtB;YACD;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,gBAAgB,EAAE,OAAO;gBACzB,aAAa,EAAE,OAAO;gBACtB,eAAe,EAAE,IAAI;aACtB;SACF,CAAA;QAED,MAAM,cAAc,GAAG,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAA;QAErE,2DAA2D;QAC3D,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAClD,MAAM,CAAC,IAAI,KAAK,wBAAwB;eACrC,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CACzC,CAAA;QAED,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACvC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,WAAW,GAAG;YAClB;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,gBAAgB,EAAE,OAAO;gBACzB,aAAa,EAAE,OAAO;gBACtB,eAAe,EAAE,IAAI;aACtB;YACD;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,gBAAgB,EAAE,OAAO;gBACzB,aAAa,EAAE,OAAO;gBACtB,eAAe,EAAE,IAAI;aACtB;SACF,CAAA;QAED,MAAM,cAAc,GAAa,EAAE,CAAA;QAEnC,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAClD,MAAM,CAAC,IAAI,KAAK,wBAAwB;eACrC,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CACzC,CAAA;QAED,MAAM,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACvC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,qBAAqB,EAAE,qBAAqB,CAAC,CAAC,CAAA;IAClG,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,WAAW,GAAG;YAClB;gBACE,IAAI,EAAE,qBAAqB;gBAC3B,gBAAgB,EAAE,OAAO;gBACzB,aAAa,EAAE,OAAO;gBACtB,eAAe,EAAE,IAAI;aACtB;YACD;gBACE,IAAI,EAAE,2BAA2B;gBACjC,gBAAgB,EAAE,OAAO;gBACzB,aAAa,EAAE,OAAO;gBACtB,eAAe,EAAE,IAAI;aACtB;YACD;gBACE,IAAI,EAAE,6BAA6B;gBACnC,gBAAgB,EAAE,OAAO;gBACzB,aAAa,EAAE,OAAO;gBACtB,eAAe,EAAE,KAAK;aACvB;SACF,CAAA;QAED,MAAM,cAAc,GAAG,CAAC,2BAA2B,CAAC,CAAA;QAEpD,0DAA0D;QAC1D,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CACrD,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,eAAe,CAC/D,CAAA;QAED,MAAM,CAAC,kBAAkB,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC1C,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,WAAW,GAAG;YAClB;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,gBAAgB,EAAE,OAAO;gBACzB,aAAa,EAAE,OAAO;gBACtB,eAAe,EAAE,IAAI;aACtB;SACF,CAAA;QAED,MAAM,cAAc,GAAG,CAAC,wBAAwB,CAAC,CAAA;QAEjD,6DAA6D;QAC7D,MAAM,cAAc,GAAG,cAAc,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAA;QACxE,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEjC,qDAAqD;QACrD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,wBAAwB,CAAC,CAAA;QACrF,MAAM,eAAe,GAAG,QAAQ,IAAI,QAAQ,CAAC,eAAe,IAAI,CAAC,cAAc,CAAA;QAC/E,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,cAAc,GAAG;YACrB,IAAI,EAAE,YAAY;YAClB,gBAAgB,EAAE,OAAO;YACzB,aAAa,EAAE,OAAO;YACtB,eAAe,EAAE,IAAI;SACtB,CAAA;QAED,MAAM,cAAc,GAAG,CAAC,YAAY,CAAC,CAAA;QAErC,sDAAsD;QACtD,MAAM,sBAAsB,GAAG,cAAc,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAA;QACpE,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAEzC,qDAAqD;QACrD,MAAM,eAAe,GAAG,cAAc,CAAC,eAAe,IAAI,CAAC,sBAAsB,CAAA;QACjF,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/dist/index.test.d.ts
DELETED
package/dist/index.test.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
|
package/dist/index.test.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
describe('plugin Configuration', () => {
|
|
3
|
-
it('should be able to import without errors', () => {
|
|
4
|
-
// Basic test to ensure the module can be imported
|
|
5
|
-
expect(true).toBe(true);
|
|
6
|
-
});
|
|
7
|
-
});
|
|
8
|
-
//# sourceMappingURL=index.test.js.map
|
package/dist/index.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,kDAAkD;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
package/dist/schema.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.test.d.ts","sourceRoot":"","sources":["../src/schema.test.ts"],"names":[],"mappings":""}
|
package/dist/schema.test.js
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import Ajv from 'ajv';
|
|
5
|
-
import { beforeAll, describe, expect, it } from 'vitest';
|
|
6
|
-
// ESM equivalent of __dirname
|
|
7
|
-
const __filename = fileURLToPath(import.meta.url);
|
|
8
|
-
const __dirname = path.dirname(__filename);
|
|
9
|
-
describe('config schema validation', () => {
|
|
10
|
-
let schema;
|
|
11
|
-
let ajv;
|
|
12
|
-
beforeAll(() => {
|
|
13
|
-
// Load the config schema
|
|
14
|
-
const schemaPath = path.resolve(__dirname, '../config.schema.json');
|
|
15
|
-
const schemaContent = fs.readFileSync(schemaPath, 'utf8');
|
|
16
|
-
const fullSchema = JSON.parse(schemaContent);
|
|
17
|
-
schema = fullSchema.schema;
|
|
18
|
-
ajv = new Ajv();
|
|
19
|
-
// Homebridge config schemas include UI-only layout metadata.
|
|
20
|
-
ajv.addKeyword('layout', {});
|
|
21
|
-
});
|
|
22
|
-
describe('name field validation', () => {
|
|
23
|
-
it('should accept valid names with letters, numbers, spaces, hyphens, and underscores', () => {
|
|
24
|
-
const validNames = [
|
|
25
|
-
'Plugin Update',
|
|
26
|
-
'PluginUpdate V2',
|
|
27
|
-
'Plugin-Update',
|
|
28
|
-
'Plugin_Update',
|
|
29
|
-
'Update123',
|
|
30
|
-
'My Plugin Name',
|
|
31
|
-
'Plugin-Update_V2 Test',
|
|
32
|
-
];
|
|
33
|
-
validNames.forEach((name) => {
|
|
34
|
-
const config = {
|
|
35
|
-
name,
|
|
36
|
-
sensorType: 'motion',
|
|
37
|
-
failureSensorType: 'motion',
|
|
38
|
-
platform: 'HomebridgeUpdater',
|
|
39
|
-
};
|
|
40
|
-
const validate = ajv.compile(schema);
|
|
41
|
-
const valid = validate(config);
|
|
42
|
-
expect(valid, `Expected "${name}" to be valid, but got errors: ${JSON.stringify(validate.errors)}`).toBe(true);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
it('should reject names with periods and other invalid characters', () => {
|
|
46
|
-
const invalidNames = [
|
|
47
|
-
'Plugin Update V2.0', // Period - the reported issue
|
|
48
|
-
'Plugin.Update', // Period
|
|
49
|
-
'Plugin@Update', // @ symbol
|
|
50
|
-
'Plugin#Update', // # symbol
|
|
51
|
-
'Plugin$Update', // $ symbol
|
|
52
|
-
'Plugin%Update', // % symbol
|
|
53
|
-
'Plugin&Update', // & symbol
|
|
54
|
-
'Plugin*Update', // * symbol
|
|
55
|
-
'Plugin+Update', // + symbol
|
|
56
|
-
'Plugin=Update', // = symbol
|
|
57
|
-
'Plugin/Update', // slash character
|
|
58
|
-
'Plugin\\Update', // \ backslash
|
|
59
|
-
'Plugin|Update', // | pipe
|
|
60
|
-
'Plugin<Update>', // < > brackets
|
|
61
|
-
'Plugin[Update]', // [ ] square brackets
|
|
62
|
-
'Plugin{Update}', // { } curly brackets
|
|
63
|
-
'Plugin(Update)', // ( ) parentheses
|
|
64
|
-
];
|
|
65
|
-
invalidNames.forEach((name) => {
|
|
66
|
-
const config = {
|
|
67
|
-
name,
|
|
68
|
-
sensorType: 'motion',
|
|
69
|
-
platform: 'HomebridgeUpdater',
|
|
70
|
-
};
|
|
71
|
-
const validate = ajv.compile(schema);
|
|
72
|
-
const valid = validate(config);
|
|
73
|
-
expect(valid, `Expected "${name}" to be invalid, but validation passed`).toBe(false);
|
|
74
|
-
});
|
|
75
|
-
});
|
|
76
|
-
it('should reject empty names', () => {
|
|
77
|
-
const config = {
|
|
78
|
-
name: '',
|
|
79
|
-
sensorType: 'motion',
|
|
80
|
-
platform: 'HomebridgeUpdater',
|
|
81
|
-
};
|
|
82
|
-
const validate = ajv.compile(schema);
|
|
83
|
-
const valid = validate(config);
|
|
84
|
-
expect(valid).toBe(false);
|
|
85
|
-
});
|
|
86
|
-
it('should reject names that are too long', () => {
|
|
87
|
-
const longName = 'A'.repeat(65); // 65 characters, exceeds maxLength of 64
|
|
88
|
-
const config = {
|
|
89
|
-
name: longName,
|
|
90
|
-
sensorType: 'motion',
|
|
91
|
-
platform: 'HomebridgeUpdater',
|
|
92
|
-
};
|
|
93
|
-
const validate = ajv.compile(schema);
|
|
94
|
-
const valid = validate(config);
|
|
95
|
-
expect(valid).toBe(false);
|
|
96
|
-
});
|
|
97
|
-
it('should accept names at the maximum length', () => {
|
|
98
|
-
const maxLengthName = 'A'.repeat(64); // Exactly 64 characters
|
|
99
|
-
const config = {
|
|
100
|
-
name: maxLengthName,
|
|
101
|
-
sensorType: 'motion',
|
|
102
|
-
failureSensorType: 'motion',
|
|
103
|
-
platform: 'HomebridgeUpdater',
|
|
104
|
-
};
|
|
105
|
-
const validate = ajv.compile(schema);
|
|
106
|
-
const valid = validate(config);
|
|
107
|
-
expect(valid).toBe(true);
|
|
108
|
-
});
|
|
109
|
-
});
|
|
110
|
-
});
|
|
111
|
-
//# sourceMappingURL=schema.test.js.map
|
package/dist/schema.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../src/schema.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"updateCheckCore.autoupdate.test.d.ts","sourceRoot":"","sources":["../src/updateCheckCore.autoupdate.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { major, valid } from 'semver';
|
|
2
|
-
import { describe, expect, it } from 'vitest';
|
|
3
|
-
const COOLDOWN_MS = 24 * 60 * 60 * 1000;
|
|
4
|
-
function isLooping(record, targetVersion, now) {
|
|
5
|
-
return !!record
|
|
6
|
-
&& record.version === targetVersion
|
|
7
|
-
&& record.attempts >= 1
|
|
8
|
-
&& (now - record.lastAttempt) < COOLDOWN_MS;
|
|
9
|
-
}
|
|
10
|
-
describe('auto-update loop guard (#257)', () => {
|
|
11
|
-
const now = 1_000_000_000_000;
|
|
12
|
-
it('applies a target with no prior attempt', () => {
|
|
13
|
-
expect(isLooping(undefined, '2.0.0', now)).toBe(false);
|
|
14
|
-
});
|
|
15
|
-
it('skips a target already attempted at the same version within cooldown', () => {
|
|
16
|
-
const record = { version: '2.0.0', attempts: 1, firstAttempt: now - 60_000, lastAttempt: now - 60_000 };
|
|
17
|
-
expect(isLooping(record, '2.0.0', now)).toBe(true);
|
|
18
|
-
});
|
|
19
|
-
it('applies when a newer version than the last attempt is offered', () => {
|
|
20
|
-
const record = { version: '2.0.0', attempts: 3, firstAttempt: now - 60_000, lastAttempt: now - 60_000 };
|
|
21
|
-
expect(isLooping(record, '2.1.0', now)).toBe(false);
|
|
22
|
-
});
|
|
23
|
-
it('retries once the cooldown has elapsed', () => {
|
|
24
|
-
const record = { version: '2.0.0', attempts: 5, firstAttempt: now - (2 * COOLDOWN_MS), lastAttempt: now - COOLDOWN_MS - 1 };
|
|
25
|
-
expect(isLooping(record, '2.0.0', now)).toBe(false);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
/**
|
|
29
|
-
* Locks the major-version detection used to hold back major updates from
|
|
30
|
-
* auto-update when autoUpdateSkipMajorVersions is enabled (#263). Only applies
|
|
31
|
-
* to valid semver on both sides, so date-based versions are never a "major".
|
|
32
|
-
*/
|
|
33
|
-
function isMajorUpdate(installedVersion, latestVersion) {
|
|
34
|
-
const from = valid(installedVersion);
|
|
35
|
-
const to = valid(latestVersion);
|
|
36
|
-
if (!from || !to) {
|
|
37
|
-
return false;
|
|
38
|
-
}
|
|
39
|
-
return major(to) > major(from);
|
|
40
|
-
}
|
|
41
|
-
describe('skip major versions detection (#263)', () => {
|
|
42
|
-
it('treats a major bump as major', () => {
|
|
43
|
-
expect(isMajorUpdate('2.4.1', '3.0.0')).toBe(true);
|
|
44
|
-
});
|
|
45
|
-
it('treats a minor bump as not major', () => {
|
|
46
|
-
expect(isMajorUpdate('2.4.1', '2.5.0')).toBe(false);
|
|
47
|
-
});
|
|
48
|
-
it('treats a patch bump as not major', () => {
|
|
49
|
-
expect(isMajorUpdate('2.4.1', '2.4.2')).toBe(false);
|
|
50
|
-
});
|
|
51
|
-
it('never treats date-based (non-semver) versions as major', () => {
|
|
52
|
-
expect(isMajorUpdate('2026-05-01', '2026-06-01')).toBe(false);
|
|
53
|
-
});
|
|
54
|
-
});
|
|
55
|
-
//# sourceMappingURL=updateCheckCore.autoupdate.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"updateCheckCore.autoupdate.test.js","sourceRoot":"","sources":["../src/updateCheckCore.autoupdate.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAW7C,MAAM,WAAW,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAEvC,SAAS,SAAS,CAAC,MAAqC,EAAE,aAAqB,EAAE,GAAW;IAC1F,OAAO,CAAC,CAAC,MAAM;WACV,MAAM,CAAC,OAAO,KAAK,aAAa;WAChC,MAAM,CAAC,QAAQ,IAAI,CAAC;WACpB,CAAC,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,WAAW,CAAA;AAC/C,CAAC;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,MAAM,GAAG,GAAG,iBAAiB,CAAA;IAE7B,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACxD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,MAAM,EAAE,CAAA;QACvG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,GAAG,MAAM,EAAE,WAAW,EAAE,GAAG,GAAG,MAAM,EAAE,CAAA;QACvG,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,WAAW,CAAC,EAAE,WAAW,EAAE,GAAG,GAAG,WAAW,GAAG,CAAC,EAAE,CAAA;QAC3H,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF;;;;GAIG;AACH,SAAS,aAAa,CAAC,gBAAwB,EAAE,aAAqB;IACpE,MAAM,IAAI,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAA;IACpC,MAAM,EAAE,GAAG,KAAK,CAAC,aAAa,CAAC,CAAA;IAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;QACjB,OAAO,KAAK,CAAA;IACd,CAAC;IACD,OAAO,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAA;AAChC,CAAC;AAED,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"updateCheckCore.beta.test.d.ts","sourceRoot":"","sources":["../src/updateCheckCore.beta.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { gt, prerelease } from 'semver';
|
|
2
|
-
import { describe, expect, it } from 'vitest';
|
|
3
|
-
/**
|
|
4
|
-
* Locks the decision rule used by applyHomebridgeUiBetaPolicy (#255), which
|
|
5
|
-
* mirrors the beta check the Homebridge UI applies to itself: with the UI's own
|
|
6
|
-
* update policy set to `beta`, offer the version on the beta dist-tag only when
|
|
7
|
-
* it beats BOTH the installed version and the stable release, so a beta user is
|
|
8
|
-
* never sent backwards to an older stable.
|
|
9
|
-
*/
|
|
10
|
-
function decideUiBeta(installedVersion, stableLatest, stableUpdateAvailable, distTags) {
|
|
11
|
-
const installedTag = prerelease(installedVersion)?.[0]?.toString();
|
|
12
|
-
const targetTag = installedTag ?? 'beta';
|
|
13
|
-
const candidate = distTags[targetTag];
|
|
14
|
-
if (!candidate) {
|
|
15
|
-
return { updateAvailable: stableUpdateAvailable, latestVersion: stableLatest };
|
|
16
|
-
}
|
|
17
|
-
const beatsInstalled = gt(candidate, installedVersion);
|
|
18
|
-
const beatsStable = !stableUpdateAvailable || !stableLatest || gt(candidate, stableLatest);
|
|
19
|
-
if (beatsInstalled && beatsStable) {
|
|
20
|
-
return { updateAvailable: true, latestVersion: candidate };
|
|
21
|
-
}
|
|
22
|
-
return { updateAvailable: stableUpdateAvailable, latestVersion: stableLatest };
|
|
23
|
-
}
|
|
24
|
-
describe('homebridge UI beta update policy (#255)', () => {
|
|
25
|
-
it('offers a newer beta when on a stable release', () => {
|
|
26
|
-
const result = decideUiBeta('5.22.0', '5.22.0', false, { latest: '5.22.0', beta: '5.23.0-beta.1' });
|
|
27
|
-
expect(result).toEqual({ updateAvailable: true, latestVersion: '5.23.0-beta.1' });
|
|
28
|
-
});
|
|
29
|
-
it('keeps the stable release when the beta is older than the newest stable', () => {
|
|
30
|
-
// A stable update is already available and is newer than the beta line.
|
|
31
|
-
const result = decideUiBeta('5.22.0', '5.24.0', true, { latest: '5.24.0', beta: '5.23.0-beta.1' });
|
|
32
|
-
expect(result).toEqual({ updateAvailable: true, latestVersion: '5.24.0' });
|
|
33
|
-
});
|
|
34
|
-
it('does not send a beta user backwards to an older stable', () => {
|
|
35
|
-
// Installed a beta that is ahead of the latest stable; no newer beta exists.
|
|
36
|
-
const result = decideUiBeta('5.23.0-beta.2', '5.22.0', false, { latest: '5.22.0', beta: '5.23.0-beta.2' });
|
|
37
|
-
expect(result).toEqual({ updateAvailable: false, latestVersion: '5.22.0' });
|
|
38
|
-
});
|
|
39
|
-
it('follows the same prerelease line when already on a beta', () => {
|
|
40
|
-
const result = decideUiBeta('5.23.0-beta.1', '5.22.0', false, { latest: '5.22.0', beta: '5.23.0-beta.3' });
|
|
41
|
-
expect(result).toEqual({ updateAvailable: true, latestVersion: '5.23.0-beta.3' });
|
|
42
|
-
});
|
|
43
|
-
it('leaves the result untouched when there is no beta tag', () => {
|
|
44
|
-
const result = decideUiBeta('5.22.0', '5.22.0', false, { latest: '5.22.0' });
|
|
45
|
-
expect(result).toEqual({ updateAvailable: false, latestVersion: '5.22.0' });
|
|
46
|
-
});
|
|
47
|
-
});
|
|
48
|
-
//# sourceMappingURL=updateCheckCore.beta.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"updateCheckCore.beta.test.js","sourceRoot":"","sources":["../src/updateCheckCore.beta.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"updateCheckCore.route.test.d.ts","sourceRoot":"","sources":["../src/updateCheckCore.route.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
function makeUiApi(configured) {
|
|
3
|
-
return {
|
|
4
|
-
isConfigured: () => configured,
|
|
5
|
-
triggerUpdate: vi.fn(async () => true),
|
|
6
|
-
updateNpm: vi.fn(async () => true),
|
|
7
|
-
updateHomebridge: vi.fn(async () => true),
|
|
8
|
-
updatePlugin: vi.fn(async () => true),
|
|
9
|
-
restartHomebridge: vi.fn(async () => true),
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
async function applyAutoUpdate(uiApi, target) {
|
|
13
|
-
if (target.name === 'npm') {
|
|
14
|
-
return { updated: await uiApi.updateNpm(target.latestVersion), selfRestarted: false };
|
|
15
|
-
}
|
|
16
|
-
if (uiApi.isConfigured()) {
|
|
17
|
-
const queued = await uiApi.triggerUpdate(target.name, target.latestVersion);
|
|
18
|
-
return { updated: queued, selfRestarted: queued };
|
|
19
|
-
}
|
|
20
|
-
if (target.name === 'homebridge') {
|
|
21
|
-
return { updated: await uiApi.updateHomebridge(target.latestVersion), selfRestarted: false };
|
|
22
|
-
}
|
|
23
|
-
return { updated: await uiApi.updatePlugin(target.name, target.latestVersion), selfRestarted: false };
|
|
24
|
-
}
|
|
25
|
-
async function run(uiApi, targets, autoRestart) {
|
|
26
|
-
let successfulUpdates = 0;
|
|
27
|
-
let uiApiHandledRestart = false;
|
|
28
|
-
for (const target of targets) {
|
|
29
|
-
const { updated, selfRestarted } = await applyAutoUpdate(uiApi, target);
|
|
30
|
-
if (updated) {
|
|
31
|
-
successfulUpdates++;
|
|
32
|
-
if (selfRestarted) {
|
|
33
|
-
uiApiHandledRestart = true;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
if (successfulUpdates > 0 && !uiApiHandledRestart && autoRestart) {
|
|
38
|
-
await uiApi.restartHomebridge();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
describe('auto-update routing via the UI API', () => {
|
|
42
|
-
it('updates a plugin through the UI API and does not restart itself', async () => {
|
|
43
|
-
const uiApi = makeUiApi(true);
|
|
44
|
-
await run(uiApi, [{ name: '@homebridge-plugins/homebridge-foo', latestVersion: '2.0.0' }], true);
|
|
45
|
-
expect(uiApi.triggerUpdate).toHaveBeenCalledWith('@homebridge-plugins/homebridge-foo', '2.0.0');
|
|
46
|
-
expect(uiApi.updatePlugin).not.toHaveBeenCalled();
|
|
47
|
-
expect(uiApi.restartHomebridge).not.toHaveBeenCalled();
|
|
48
|
-
});
|
|
49
|
-
it('updates homebridge through the UI API rather than npm when configured', async () => {
|
|
50
|
-
const uiApi = makeUiApi(true);
|
|
51
|
-
await run(uiApi, [{ name: 'homebridge', latestVersion: '2.1.0' }], true);
|
|
52
|
-
expect(uiApi.triggerUpdate).toHaveBeenCalledWith('homebridge', '2.1.0');
|
|
53
|
-
expect(uiApi.updateHomebridge).not.toHaveBeenCalled();
|
|
54
|
-
expect(uiApi.restartHomebridge).not.toHaveBeenCalled();
|
|
55
|
-
});
|
|
56
|
-
it('always updates npm via the direct path and restarts itself for it', async () => {
|
|
57
|
-
const uiApi = makeUiApi(true);
|
|
58
|
-
await run(uiApi, [{ name: 'npm', latestVersion: '11.0.0' }], true);
|
|
59
|
-
expect(uiApi.updateNpm).toHaveBeenCalledWith('11.0.0');
|
|
60
|
-
expect(uiApi.triggerUpdate).not.toHaveBeenCalled();
|
|
61
|
-
expect(uiApi.restartHomebridge).toHaveBeenCalledTimes(1);
|
|
62
|
-
});
|
|
63
|
-
it('falls back to direct npm and restarts itself when the UI API is not configured', async () => {
|
|
64
|
-
const uiApi = makeUiApi(false);
|
|
65
|
-
await run(uiApi, [{ name: '@homebridge-plugins/homebridge-foo', latestVersion: '2.0.0' }], true);
|
|
66
|
-
expect(uiApi.updatePlugin).toHaveBeenCalledWith('@homebridge-plugins/homebridge-foo', '2.0.0');
|
|
67
|
-
expect(uiApi.triggerUpdate).not.toHaveBeenCalled();
|
|
68
|
-
expect(uiApi.restartHomebridge).toHaveBeenCalledTimes(1);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
//# sourceMappingURL=updateCheckCore.route.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"updateCheckCore.route.test.js","sourceRoot":"","sources":["../src/updateCheckCore.route.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"updateSensor.test.d.ts","sourceRoot":"","sources":["../src/updateSensor.test.ts"],"names":[],"mappings":""}
|