@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,197 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { FAILURE_SENSOR_UUID_KEY, LEGACY_UPDATE_SENSOR_UUID_KEY, PLATFORM_NAME, PLUGIN_NAME, UPDATE_SENSOR_UUID_KEY } from './settings.js';
|
|
3
|
-
/**
|
|
4
|
-
* Unit tests for the legacy UUID migration logic in PluginUpdatePlatform.
|
|
5
|
-
*
|
|
6
|
-
* These tests validate the three key scenarios handled by handleLegacyMigration:
|
|
7
|
-
* 1. Only legacy UUID (v2.x) in cache — must restore without creating a duplicate.
|
|
8
|
-
* 2. Both legacy and current UUID in cache — must unregister the stale legacy accessory.
|
|
9
|
-
* 3. Normal v3 operation (no legacy) — must leave the current accessory untouched.
|
|
10
|
-
*/
|
|
11
|
-
describe('pluginUpdatePlatform legacy UUID migration', () => {
|
|
12
|
-
function buildMocks(options = {}) {
|
|
13
|
-
// Map uuid key → deterministic UUID value
|
|
14
|
-
const uuidMap = {
|
|
15
|
-
[UPDATE_SENSOR_UUID_KEY]: 'uuid-v3-update',
|
|
16
|
-
[FAILURE_SENSOR_UUID_KEY]: 'uuid-v3-failure',
|
|
17
|
-
[LEGACY_UPDATE_SENSOR_UUID_KEY]: 'uuid-legacy-update',
|
|
18
|
-
...options.generateReturnsByKey,
|
|
19
|
-
};
|
|
20
|
-
const didFinishListeners = [];
|
|
21
|
-
const mockLog = {
|
|
22
|
-
info: vi.fn(),
|
|
23
|
-
warn: vi.fn(),
|
|
24
|
-
error: vi.fn(),
|
|
25
|
-
debug: vi.fn(),
|
|
26
|
-
};
|
|
27
|
-
const mockApi = {
|
|
28
|
-
hap: {
|
|
29
|
-
uuid: {
|
|
30
|
-
generate: vi.fn((key) => uuidMap[key] ?? `uuid-${key}`),
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
on: vi.fn((event, cb) => {
|
|
34
|
-
if (event === 'didFinishLaunching') {
|
|
35
|
-
didFinishListeners.push(cb);
|
|
36
|
-
}
|
|
37
|
-
}),
|
|
38
|
-
platformAccessory: vi.fn(),
|
|
39
|
-
registerPlatformAccessories: vi.fn(),
|
|
40
|
-
unregisterPlatformAccessories: vi.fn(),
|
|
41
|
-
};
|
|
42
|
-
const mockConfig = {
|
|
43
|
-
sensorType: 'motion',
|
|
44
|
-
failureSensorType: undefined,
|
|
45
|
-
autoUpdateHomebridge: false,
|
|
46
|
-
autoUpdateHomebridgeUI: false,
|
|
47
|
-
autoUpdatePlugins: false,
|
|
48
|
-
autoUpdateNode: false,
|
|
49
|
-
name: 'PluginUpdate',
|
|
50
|
-
};
|
|
51
|
-
const mockUpdateSensor = {
|
|
52
|
-
configureAccessory: vi.fn(),
|
|
53
|
-
addUpdateSensor: vi.fn(),
|
|
54
|
-
};
|
|
55
|
-
const mockFailureSensor = {
|
|
56
|
-
configure: vi.fn(),
|
|
57
|
-
setState: vi.fn(),
|
|
58
|
-
};
|
|
59
|
-
function fireDidFinishLaunching() {
|
|
60
|
-
for (const cb of didFinishListeners) {
|
|
61
|
-
cb();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
return { mockLog, mockApi, mockConfig, mockUpdateSensor, mockFailureSensor, uuidMap, didFinishListeners, fireDidFinishLaunching };
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Simulate the Platform.HAP.ts logic directly using extracted functions so we can
|
|
68
|
-
* test it without requiring a full Homebridge runtime import.
|
|
69
|
-
*/
|
|
70
|
-
function runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, cachedAccessories) {
|
|
71
|
-
const updateSensorUuid = mockApi.hap.uuid.generate(UPDATE_SENSOR_UUID_KEY);
|
|
72
|
-
const legacyUpdateSensorUuid = mockApi.hap.uuid.generate(LEGACY_UPDATE_SENSOR_UUID_KEY);
|
|
73
|
-
let cachedLegacyUpdateAccessory;
|
|
74
|
-
let cachedCurrentUpdateAccessory;
|
|
75
|
-
let updateSensorCached = false;
|
|
76
|
-
// Simulate configureAccessory for each cached accessory
|
|
77
|
-
for (const accessory of cachedAccessories) {
|
|
78
|
-
if (accessory.UUID === updateSensorUuid) {
|
|
79
|
-
mockUpdateSensor.configureAccessory(accessory);
|
|
80
|
-
updateSensorCached = true;
|
|
81
|
-
cachedCurrentUpdateAccessory = accessory;
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
if (accessory.UUID === legacyUpdateSensorUuid) {
|
|
85
|
-
cachedLegacyUpdateAccessory = accessory;
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
mockLog.warn(`Ignoring unknown cached accessory: ${accessory.displayName}`);
|
|
89
|
-
}
|
|
90
|
-
// handleLegacyMigration (fires first on didFinishLaunching)
|
|
91
|
-
let registered = updateSensorCached;
|
|
92
|
-
function handleLegacyMigration() {
|
|
93
|
-
if (!cachedLegacyUpdateAccessory) {
|
|
94
|
-
return;
|
|
95
|
-
}
|
|
96
|
-
if (updateSensorCached) {
|
|
97
|
-
// Both UUIDs found — remove the newer empty accessory, promote the legacy one
|
|
98
|
-
// so the user's HomeKit customisations are preserved.
|
|
99
|
-
if (cachedCurrentUpdateAccessory) {
|
|
100
|
-
mockApi.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [cachedCurrentUpdateAccessory]);
|
|
101
|
-
cachedCurrentUpdateAccessory = undefined;
|
|
102
|
-
}
|
|
103
|
-
mockUpdateSensor.configureAccessory(cachedLegacyUpdateAccessory);
|
|
104
|
-
cachedLegacyUpdateAccessory = undefined;
|
|
105
|
-
mockLog.info('Migrated update sensor to legacy cached accessory (preserved HomeKit customisations)');
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
mockUpdateSensor.configureAccessory(cachedLegacyUpdateAccessory);
|
|
109
|
-
registered = true;
|
|
110
|
-
mockLog.info('Restored update sensor from legacy cached accessory');
|
|
111
|
-
cachedLegacyUpdateAccessory = undefined;
|
|
112
|
-
}
|
|
113
|
-
// addUpdateSensor (fires after handleLegacyMigration)
|
|
114
|
-
function addUpdateSensor() {
|
|
115
|
-
if (!registered) {
|
|
116
|
-
// would create a new accessory and register it
|
|
117
|
-
mockApi.registerPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [{ displayName: 'new-accessory' }]);
|
|
118
|
-
registered = true;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
handleLegacyMigration();
|
|
122
|
-
addUpdateSensor();
|
|
123
|
-
return { registered, cachedLegacyUpdateAccessory };
|
|
124
|
-
}
|
|
125
|
-
it('scenario A: only legacy UUID in cache — must restore without creating a duplicate', () => {
|
|
126
|
-
const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
|
|
127
|
-
const legacyAccessory = { UUID: uuidMap[LEGACY_UPDATE_SENSOR_UUID_KEY], displayName: 'Plugin Update Check' };
|
|
128
|
-
const { registered } = runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [legacyAccessory]);
|
|
129
|
-
// Legacy accessory used as update sensor
|
|
130
|
-
expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledWith(legacyAccessory);
|
|
131
|
-
expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledTimes(1);
|
|
132
|
-
// registered was set to true so no new accessory was created
|
|
133
|
-
expect(mockApi.registerPlatformAccessories).not.toHaveBeenCalled();
|
|
134
|
-
// No stale unregister
|
|
135
|
-
expect(mockApi.unregisterPlatformAccessories).not.toHaveBeenCalled();
|
|
136
|
-
// Info log emitted
|
|
137
|
-
expect(mockLog.info).toHaveBeenCalledWith(expect.stringContaining('Restored update sensor from legacy cached accessory'));
|
|
138
|
-
// No unknown-accessory warning
|
|
139
|
-
expect(mockLog.warn).not.toHaveBeenCalled();
|
|
140
|
-
expect(registered).toBe(true);
|
|
141
|
-
});
|
|
142
|
-
it('scenario B: both legacy and current UUID in cache — must preserve legacy accessory and remove the newer empty duplicate', () => {
|
|
143
|
-
const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
|
|
144
|
-
const v3Accessory = { UUID: uuidMap[UPDATE_SENSOR_UUID_KEY], displayName: 'PluginUpdate' };
|
|
145
|
-
const legacyAccessory = { UUID: uuidMap[LEGACY_UPDATE_SENSOR_UUID_KEY], displayName: 'Plugin Update Check' };
|
|
146
|
-
runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [v3Accessory, legacyAccessory]);
|
|
147
|
-
// configureAccessory called exactly twice: once for the v3 (during restore) then
|
|
148
|
-
// again for the legacy during migration — legacy must be the final (last) call.
|
|
149
|
-
expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledTimes(2);
|
|
150
|
-
expect(mockUpdateSensor.configureAccessory).toHaveBeenNthCalledWith(1, v3Accessory);
|
|
151
|
-
expect(mockUpdateSensor.configureAccessory).toHaveBeenLastCalledWith(legacyAccessory);
|
|
152
|
-
// Current-UUID empty duplicate is removed
|
|
153
|
-
expect(mockApi.unregisterPlatformAccessories).toHaveBeenCalledWith(PLUGIN_NAME, PLATFORM_NAME, [v3Accessory]);
|
|
154
|
-
// No new accessory created
|
|
155
|
-
expect(mockApi.registerPlatformAccessories).not.toHaveBeenCalled();
|
|
156
|
-
expect(mockLog.info).toHaveBeenCalledWith(expect.stringContaining('Migrated update sensor to legacy cached accessory'));
|
|
157
|
-
});
|
|
158
|
-
it('scenario B (legacy processed first): same result regardless of configureAccessory order', () => {
|
|
159
|
-
const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
|
|
160
|
-
const v3Accessory = { UUID: uuidMap[UPDATE_SENSOR_UUID_KEY], displayName: 'PluginUpdate' };
|
|
161
|
-
const legacyAccessory = { UUID: uuidMap[LEGACY_UPDATE_SENSOR_UUID_KEY], displayName: 'Plugin Update Check' };
|
|
162
|
-
// Legacy accessory arrives first in configureAccessory order
|
|
163
|
-
runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [legacyAccessory, v3Accessory]);
|
|
164
|
-
// Only the v3 accessory is processed during restore (legacy is held), then the
|
|
165
|
-
// migration promotes the legacy one — so configureAccessory is still called twice
|
|
166
|
-
// and the legacy accessory is always the last call.
|
|
167
|
-
expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledTimes(2);
|
|
168
|
-
expect(mockUpdateSensor.configureAccessory).toHaveBeenLastCalledWith(legacyAccessory);
|
|
169
|
-
expect(mockApi.unregisterPlatformAccessories).toHaveBeenCalledWith(PLUGIN_NAME, PLATFORM_NAME, [v3Accessory]);
|
|
170
|
-
expect(mockApi.registerPlatformAccessories).not.toHaveBeenCalled();
|
|
171
|
-
});
|
|
172
|
-
it('scenario C: normal v3 operation — no legacy accessory, no side effects', () => {
|
|
173
|
-
const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
|
|
174
|
-
const v3Accessory = { UUID: uuidMap[UPDATE_SENSOR_UUID_KEY], displayName: 'PluginUpdate' };
|
|
175
|
-
runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [v3Accessory]);
|
|
176
|
-
expect(mockUpdateSensor.configureAccessory).toHaveBeenCalledWith(v3Accessory);
|
|
177
|
-
expect(mockApi.unregisterPlatformAccessories).not.toHaveBeenCalled();
|
|
178
|
-
expect(mockApi.registerPlatformAccessories).not.toHaveBeenCalled();
|
|
179
|
-
expect(mockLog.info).not.toHaveBeenCalled();
|
|
180
|
-
expect(mockLog.warn).not.toHaveBeenCalled();
|
|
181
|
-
});
|
|
182
|
-
it('scenario D: no cached accessories at all — creates new accessory normally', () => {
|
|
183
|
-
const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
|
|
184
|
-
const { registered } = runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, []);
|
|
185
|
-
expect(mockUpdateSensor.configureAccessory).not.toHaveBeenCalled();
|
|
186
|
-
expect(mockApi.registerPlatformAccessories).toHaveBeenCalledTimes(1);
|
|
187
|
-
expect(registered).toBe(true);
|
|
188
|
-
expect(mockLog.warn).not.toHaveBeenCalled();
|
|
189
|
-
});
|
|
190
|
-
it('truly unknown accessories still emit a warning', () => {
|
|
191
|
-
const { mockLog, mockApi, mockUpdateSensor, uuidMap } = buildMocks();
|
|
192
|
-
const unknownAccessory = { UUID: 'some-other-uuid', displayName: 'Some Other Accessory' };
|
|
193
|
-
runMigrationSimulation(mockApi, mockLog, mockUpdateSensor, uuidMap, [unknownAccessory]);
|
|
194
|
-
expect(mockLog.warn).toHaveBeenCalledWith(expect.stringContaining('Ignoring unknown cached accessory: Some Other Accessory'));
|
|
195
|
-
});
|
|
196
|
-
});
|
|
197
|
-
//# sourceMappingURL=Platform.HAP.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Platform.HAP.test.js","sourceRoot":"","sources":["../src/Platform.HAP.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Platform.Matter.test.d.ts","sourceRoot":"","sources":["../src/Platform.Matter.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
-
import { PLATFORM_NAME, PLUGIN_NAME } from './settings.js';
|
|
3
|
-
/**
|
|
4
|
-
* Unit tests for the stale HAP accessory cleanup in PluginUpdateMatterPlatform.
|
|
5
|
-
*
|
|
6
|
-
* When the platform runs in Matter mode, any cached HAP accessories from a previous
|
|
7
|
-
* HAP-mode run (including legacy v2 accessories) are stale and must be unregistered
|
|
8
|
-
* to prevent ghost/duplicate sensors in HomeKit.
|
|
9
|
-
*
|
|
10
|
-
* Removal is intentionally deferred to `didFinishLaunching` — calling
|
|
11
|
-
* `unregisterPlatformAccessories` during the `configureAccessory` phase (before the
|
|
12
|
-
* bridge is fully initialized) causes Homebridge to throw
|
|
13
|
-
* "Cannot find the bridged Accessory to remove."
|
|
14
|
-
*/
|
|
15
|
-
describe('pluginUpdateMatterPlatform stale HAP cleanup', () => {
|
|
16
|
-
function buildMocks() {
|
|
17
|
-
const unregisterCalls = [];
|
|
18
|
-
const didFinishListeners = [];
|
|
19
|
-
const mockLog = {
|
|
20
|
-
info: vi.fn(),
|
|
21
|
-
warn: vi.fn(),
|
|
22
|
-
error: vi.fn(),
|
|
23
|
-
debug: vi.fn(),
|
|
24
|
-
};
|
|
25
|
-
const mockApi = {
|
|
26
|
-
matter: { registerPlatformAccessories: vi.fn(), uuid: { generate: vi.fn().mockReturnValue('matter-uuid') } },
|
|
27
|
-
hap: { uuid: { generate: vi.fn().mockReturnValue('hap-uuid') } },
|
|
28
|
-
on: vi.fn((event, cb) => {
|
|
29
|
-
if (event === 'didFinishLaunching') {
|
|
30
|
-
didFinishListeners.push(cb);
|
|
31
|
-
}
|
|
32
|
-
}),
|
|
33
|
-
user: { storagePath: vi.fn().mockReturnValue('/tmp') },
|
|
34
|
-
unregisterPlatformAccessories: vi.fn((...args) => {
|
|
35
|
-
unregisterCalls.push({ pluginName: args[0], platformName: args[1], accessories: args[2] });
|
|
36
|
-
}),
|
|
37
|
-
};
|
|
38
|
-
const mockConfig = {
|
|
39
|
-
name: 'PluginUpdate',
|
|
40
|
-
sensorType: 'motion',
|
|
41
|
-
failureSensorType: undefined,
|
|
42
|
-
autoUpdateHomebridge: false,
|
|
43
|
-
autoUpdateHomebridgeUI: false,
|
|
44
|
-
autoUpdatePlugins: false,
|
|
45
|
-
autoUpdateNode: false,
|
|
46
|
-
};
|
|
47
|
-
function fireDidFinishLaunching() {
|
|
48
|
-
for (const cb of didFinishListeners) {
|
|
49
|
-
cb();
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return { mockLog, mockApi, mockConfig, unregisterCalls, fireDidFinishLaunching };
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Build a simulator that mirrors PluginUpdateMatterPlatform's stale-accessory
|
|
56
|
-
* handling without importing the real class (which would pull in Homebridge modules).
|
|
57
|
-
*
|
|
58
|
-
* - configureAccessory: collects accessories into a stale list (no immediate removal)
|
|
59
|
-
* - removeStaleAccessories: called on didFinishLaunching; batches all collected
|
|
60
|
-
* accessories into a single unregisterPlatformAccessories call
|
|
61
|
-
*/
|
|
62
|
-
function buildSimulator(api) {
|
|
63
|
-
const staleAccessories = [];
|
|
64
|
-
function configureAccessory(accessory) {
|
|
65
|
-
staleAccessories.push(accessory);
|
|
66
|
-
}
|
|
67
|
-
function removeStaleAccessories() {
|
|
68
|
-
if (staleAccessories.length === 0) {
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
api.unregisterPlatformAccessories(PLUGIN_NAME, PLATFORM_NAME, [...staleAccessories]);
|
|
72
|
-
staleAccessories.length = 0;
|
|
73
|
-
}
|
|
74
|
-
return { configureAccessory, removeStaleAccessories };
|
|
75
|
-
}
|
|
76
|
-
it('does not unregister stale accessories immediately during configureAccessory', () => {
|
|
77
|
-
const { mockApi, unregisterCalls } = buildMocks();
|
|
78
|
-
const { configureAccessory } = buildSimulator(mockApi);
|
|
79
|
-
const legacyAccessory = { UUID: mockApi.hap.uuid.generate('PluginUpdate'), displayName: 'Homebridge Plugin Update' };
|
|
80
|
-
configureAccessory(legacyAccessory);
|
|
81
|
-
// Must NOT be called yet — bridge is not fully initialized until didFinishLaunching
|
|
82
|
-
expect(unregisterCalls).toHaveLength(0);
|
|
83
|
-
});
|
|
84
|
-
it('unregisters a stale legacy v2 HAP accessory (PluginUpdate UUID) after didFinishLaunching', () => {
|
|
85
|
-
const { mockApi, unregisterCalls } = buildMocks();
|
|
86
|
-
const { configureAccessory, removeStaleAccessories } = buildSimulator(mockApi);
|
|
87
|
-
const legacyAccessory = { UUID: mockApi.hap.uuid.generate('PluginUpdate'), displayName: 'Homebridge Plugin Update' };
|
|
88
|
-
configureAccessory(legacyAccessory);
|
|
89
|
-
removeStaleAccessories();
|
|
90
|
-
expect(unregisterCalls).toHaveLength(1);
|
|
91
|
-
expect(unregisterCalls[0].pluginName).toBe(PLUGIN_NAME);
|
|
92
|
-
expect(unregisterCalls[0].platformName).toBe(PLATFORM_NAME);
|
|
93
|
-
expect(unregisterCalls[0].accessories).toContain(legacyAccessory);
|
|
94
|
-
});
|
|
95
|
-
it('unregisters a stale v3 HAP update-sensor accessory (PluginUpdateCheck-UpdateSensor UUID) after didFinishLaunching', () => {
|
|
96
|
-
const { mockApi, unregisterCalls } = buildMocks();
|
|
97
|
-
const { configureAccessory, removeStaleAccessories } = buildSimulator(mockApi);
|
|
98
|
-
const v3Accessory = { UUID: mockApi.hap.uuid.generate('PluginUpdateCheck-UpdateSensor'), displayName: 'PluginUpdate' };
|
|
99
|
-
configureAccessory(v3Accessory);
|
|
100
|
-
removeStaleAccessories();
|
|
101
|
-
expect(unregisterCalls).toHaveLength(1);
|
|
102
|
-
expect(unregisterCalls[0].accessories).toContain(v3Accessory);
|
|
103
|
-
});
|
|
104
|
-
it('unregisters multiple stale accessories in a single batch after didFinishLaunching', () => {
|
|
105
|
-
const { mockApi, unregisterCalls } = buildMocks();
|
|
106
|
-
const { configureAccessory, removeStaleAccessories } = buildSimulator(mockApi);
|
|
107
|
-
const accessory1 = { UUID: 'uuid-1', displayName: 'Accessory 1' };
|
|
108
|
-
const accessory2 = { UUID: 'uuid-2', displayName: 'Accessory 2' };
|
|
109
|
-
configureAccessory(accessory1);
|
|
110
|
-
configureAccessory(accessory2);
|
|
111
|
-
removeStaleAccessories();
|
|
112
|
-
// All stale accessories are batched into a single unregister call
|
|
113
|
-
expect(unregisterCalls).toHaveLength(1);
|
|
114
|
-
expect(unregisterCalls[0].accessories).toContain(accessory1);
|
|
115
|
-
expect(unregisterCalls[0].accessories).toContain(accessory2);
|
|
116
|
-
});
|
|
117
|
-
it('does not call unregisterPlatformAccessories when there are no cached accessories', () => {
|
|
118
|
-
const { mockApi, unregisterCalls } = buildMocks();
|
|
119
|
-
const { removeStaleAccessories } = buildSimulator(mockApi);
|
|
120
|
-
removeStaleAccessories();
|
|
121
|
-
expect(unregisterCalls).toHaveLength(0);
|
|
122
|
-
});
|
|
123
|
-
});
|
|
124
|
-
//# sourceMappingURL=Platform.Matter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Platform.Matter.test.js","sourceRoot":"","sources":["../src/Platform.Matter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"configMigration.test.d.ts","sourceRoot":"","sources":["../src/configMigration.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,119 +0,0 @@
|
|
|
1
|
-
import * as fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
-
import { migrateLegacyPlatformAlias, migratePlatformAliasInPluginConfigs } from './configMigration.js';
|
|
5
|
-
// Mock node:fs before any imports that use it — vitest hoists vi.mock automatically.
|
|
6
|
-
vi.mock('node:fs', () => ({
|
|
7
|
-
readFileSync: vi.fn(),
|
|
8
|
-
writeFileSync: vi.fn(),
|
|
9
|
-
}));
|
|
10
|
-
describe('config migration', () => {
|
|
11
|
-
it('should migrate legacy platform alias in plugin config entries', () => {
|
|
12
|
-
const pluginConfigs = [
|
|
13
|
-
{ platform: 'PluginUpdate', name: 'Legacy Updater' },
|
|
14
|
-
{ platform: 'OtherPlugin', name: 'Other' },
|
|
15
|
-
];
|
|
16
|
-
const updated = migratePlatformAliasInPluginConfigs(pluginConfigs);
|
|
17
|
-
expect(updated).toBe(1);
|
|
18
|
-
expect(pluginConfigs[0].platform).toBe('HomebridgeUpdater');
|
|
19
|
-
expect(pluginConfigs[1].platform).toBe('OtherPlugin');
|
|
20
|
-
});
|
|
21
|
-
it('should keep entries unchanged when no legacy alias exists', () => {
|
|
22
|
-
const pluginConfigs = [
|
|
23
|
-
{ platform: 'HomebridgeUpdater', name: 'Updater' },
|
|
24
|
-
];
|
|
25
|
-
const updated = migratePlatformAliasInPluginConfigs(pluginConfigs);
|
|
26
|
-
expect(updated).toBe(0);
|
|
27
|
-
expect(pluginConfigs[0].platform).toBe('HomebridgeUpdater');
|
|
28
|
-
});
|
|
29
|
-
it('should return 0 for a non-array input', () => {
|
|
30
|
-
expect(migratePlatformAliasInPluginConfigs(null)).toBe(0);
|
|
31
|
-
expect(migratePlatformAliasInPluginConfigs(undefined)).toBe(0);
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
describe('migrateLegacyPlatformAlias (direct file migration)', () => {
|
|
35
|
-
const FAKE_STORAGE = path.join(path.sep, 'fake', 'homebridge');
|
|
36
|
-
const FAKE_CONFIG_PATH = path.resolve(FAKE_STORAGE, 'config.json');
|
|
37
|
-
const readFileSyncMock = vi.mocked(fs.readFileSync);
|
|
38
|
-
const writeFileSyncMock = vi.mocked(fs.writeFileSync);
|
|
39
|
-
function makeApi(storagePath) {
|
|
40
|
-
return {
|
|
41
|
-
user: { storagePath: () => storagePath },
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
beforeEach(() => {
|
|
45
|
-
vi.clearAllMocks();
|
|
46
|
-
});
|
|
47
|
-
it('should do nothing when storagePath is missing', async () => {
|
|
48
|
-
await migrateLegacyPlatformAlias(makeApi(undefined));
|
|
49
|
-
expect(readFileSyncMock).not.toHaveBeenCalled();
|
|
50
|
-
expect(writeFileSyncMock).not.toHaveBeenCalled();
|
|
51
|
-
});
|
|
52
|
-
it('should migrate PluginUpdate → HomebridgeUpdater entries directly in config.json', async () => {
|
|
53
|
-
const originalConfig = {
|
|
54
|
-
bridge: { name: 'Homebridge', username: 'AA:BB:CC:DD:EE:FF', port: 51826 },
|
|
55
|
-
platforms: [
|
|
56
|
-
{ platform: 'PluginUpdate', name: 'Plugin Update', checkPluginUpdates: true },
|
|
57
|
-
{ platform: 'OtherPlugin', name: 'Other' },
|
|
58
|
-
],
|
|
59
|
-
};
|
|
60
|
-
readFileSyncMock.mockReturnValue(JSON.stringify(originalConfig));
|
|
61
|
-
writeFileSyncMock.mockImplementation(() => { });
|
|
62
|
-
await migrateLegacyPlatformAlias(makeApi(FAKE_STORAGE));
|
|
63
|
-
expect(writeFileSyncMock).toHaveBeenCalledTimes(1);
|
|
64
|
-
const [writtenPath, writtenData] = writeFileSyncMock.mock.calls[0];
|
|
65
|
-
expect(writtenPath).toBe(FAKE_CONFIG_PATH);
|
|
66
|
-
const written = JSON.parse(writtenData);
|
|
67
|
-
expect(written.platforms[0].platform).toBe('HomebridgeUpdater');
|
|
68
|
-
expect(written.platforms[0].name).toBe('Plugin Update');
|
|
69
|
-
expect(written.platforms[0].checkPluginUpdates).toBe(true);
|
|
70
|
-
// Unrelated platform entries must remain untouched
|
|
71
|
-
expect(written.platforms[1].platform).toBe('OtherPlugin');
|
|
72
|
-
});
|
|
73
|
-
it('should not write config.json when no legacy entries exist', async () => {
|
|
74
|
-
const currentConfig = {
|
|
75
|
-
bridge: { name: 'Homebridge', username: 'AA:BB:CC:DD:EE:FF', port: 51826 },
|
|
76
|
-
platforms: [
|
|
77
|
-
{ platform: 'HomebridgeUpdater', name: 'Updater' },
|
|
78
|
-
],
|
|
79
|
-
};
|
|
80
|
-
readFileSyncMock.mockReturnValue(JSON.stringify(currentConfig));
|
|
81
|
-
writeFileSyncMock.mockImplementation(() => { });
|
|
82
|
-
await migrateLegacyPlatformAlias(makeApi(FAKE_STORAGE));
|
|
83
|
-
expect(writeFileSyncMock).not.toHaveBeenCalled();
|
|
84
|
-
});
|
|
85
|
-
it('should not throw when config.json cannot be read', async () => {
|
|
86
|
-
readFileSyncMock.mockImplementation(() => {
|
|
87
|
-
throw new Error('ENOENT: no such file');
|
|
88
|
-
});
|
|
89
|
-
writeFileSyncMock.mockImplementation(() => { });
|
|
90
|
-
await expect(migrateLegacyPlatformAlias(makeApi(FAKE_STORAGE))).resolves.toBeUndefined();
|
|
91
|
-
expect(writeFileSyncMock).not.toHaveBeenCalled();
|
|
92
|
-
});
|
|
93
|
-
it('should preserve all config fields (_bridge, etc.) when migrating', async () => {
|
|
94
|
-
const configWithBridge = {
|
|
95
|
-
bridge: { name: 'Homebridge', username: 'AA:BB:CC:DD:EE:FF', port: 51826 },
|
|
96
|
-
platforms: [
|
|
97
|
-
{
|
|
98
|
-
platform: 'PluginUpdate',
|
|
99
|
-
name: 'Plugin Update',
|
|
100
|
-
_bridge: { username: '11:22:33:44:55:66', port: 51828, name: 'Plugin Update Child Bridge' },
|
|
101
|
-
checkPluginUpdates: true,
|
|
102
|
-
autoUpdatePlugins: false,
|
|
103
|
-
},
|
|
104
|
-
],
|
|
105
|
-
};
|
|
106
|
-
readFileSyncMock.mockReturnValue(JSON.stringify(configWithBridge));
|
|
107
|
-
writeFileSyncMock.mockImplementation(() => { });
|
|
108
|
-
await migrateLegacyPlatformAlias(makeApi(FAKE_STORAGE));
|
|
109
|
-
expect(writeFileSyncMock).toHaveBeenCalledTimes(1);
|
|
110
|
-
const written = JSON.parse(writeFileSyncMock.mock.calls[0][1]);
|
|
111
|
-
const migratedPlatform = written.platforms[0];
|
|
112
|
-
expect(migratedPlatform.platform).toBe('HomebridgeUpdater');
|
|
113
|
-
// Child bridge config must be preserved intact
|
|
114
|
-
expect(migratedPlatform._bridge).toEqual(configWithBridge.platforms[0]._bridge);
|
|
115
|
-
expect(migratedPlatform.checkPluginUpdates).toBe(true);
|
|
116
|
-
expect(migratedPlatform.autoUpdatePlugins).toBe(false);
|
|
117
|
-
});
|
|
118
|
-
});
|
|
119
|
-
//# sourceMappingURL=configMigration.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"configMigration.test.js","sourceRoot":"","sources":["../src/configMigration.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"configTypes.test.d.ts","sourceRoot":"","sources":["../src/configTypes.test.ts"],"names":[],"mappings":""}
|
package/dist/configTypes.test.js
DELETED
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
describe('pluginUpdatePlatformConfig', () => {
|
|
3
|
-
it('should allow valid platform name and identifier', () => {
|
|
4
|
-
const config = {
|
|
5
|
-
name: 'Example Platform',
|
|
6
|
-
platform: 'ExamplePlatform',
|
|
7
|
-
};
|
|
8
|
-
expect(config.name).toBe('Example Platform');
|
|
9
|
-
expect(config.platform).toBe('ExamplePlatform');
|
|
10
|
-
});
|
|
11
|
-
it('should allow optional sensorType property', () => {
|
|
12
|
-
const config = {
|
|
13
|
-
name: 'Example Platform',
|
|
14
|
-
platform: 'ExamplePlatform',
|
|
15
|
-
sensorType: 'temperature',
|
|
16
|
-
};
|
|
17
|
-
expect(config.sensorType).toBe('temperature');
|
|
18
|
-
});
|
|
19
|
-
it('should allow optional initialCheckDelay property', () => {
|
|
20
|
-
const config = {
|
|
21
|
-
name: 'Example Platform',
|
|
22
|
-
platform: 'ExamplePlatform',
|
|
23
|
-
initialCheckDelay: 30,
|
|
24
|
-
};
|
|
25
|
-
expect(config.initialCheckDelay).toBe(30);
|
|
26
|
-
});
|
|
27
|
-
it('should allow all properties to be set', () => {
|
|
28
|
-
const config = {
|
|
29
|
-
name: 'Example Platform',
|
|
30
|
-
platform: 'ExamplePlatform',
|
|
31
|
-
sensorType: 'humidity',
|
|
32
|
-
checkHomebridgeUpdates: true,
|
|
33
|
-
checkHomebridgeUIUpdates: true,
|
|
34
|
-
checkPluginUpdates: true,
|
|
35
|
-
checkDockerUpdates: true,
|
|
36
|
-
checkNpmUpdates: true,
|
|
37
|
-
initialCheckDelay: 15,
|
|
38
|
-
autoUpdateNpm: false,
|
|
39
|
-
autoUpdateHomebridge: true,
|
|
40
|
-
autoUpdateHomebridgeUI: false,
|
|
41
|
-
autoUpdatePlugins: true,
|
|
42
|
-
allowDirectNpmUpdates: false,
|
|
43
|
-
};
|
|
44
|
-
expect(config.platform).toBe('ExamplePlatform');
|
|
45
|
-
expect(config.sensorType).toBe('humidity');
|
|
46
|
-
expect(config.checkHomebridgeUpdates).toBe(true);
|
|
47
|
-
expect(config.checkHomebridgeUIUpdates).toBe(true);
|
|
48
|
-
expect(config.checkPluginUpdates).toBe(true);
|
|
49
|
-
expect(config.checkDockerUpdates).toBe(true);
|
|
50
|
-
expect(config.checkNpmUpdates).toBe(true);
|
|
51
|
-
expect(config.initialCheckDelay).toBe(15);
|
|
52
|
-
expect(config.autoUpdateNpm).toBe(false);
|
|
53
|
-
expect(config.autoUpdateHomebridge).toBe(true);
|
|
54
|
-
expect(config.autoUpdateHomebridgeUI).toBe(false);
|
|
55
|
-
expect(config.autoUpdatePlugins).toBe(true);
|
|
56
|
-
expect(config.allowDirectNpmUpdates).toBe(false);
|
|
57
|
-
});
|
|
58
|
-
it('should allow auto-update properties to be set independently', () => {
|
|
59
|
-
const config = {
|
|
60
|
-
name: 'Example Platform',
|
|
61
|
-
platform: 'ExamplePlatform',
|
|
62
|
-
autoUpdateHomebridge: true,
|
|
63
|
-
autoUpdateHomebridgeUI: false,
|
|
64
|
-
autoUpdatePlugins: true,
|
|
65
|
-
autoUpdateNpm: false,
|
|
66
|
-
};
|
|
67
|
-
expect(config.name).toBe('Example Platform');
|
|
68
|
-
expect(config.autoUpdateHomebridge).toBe(true);
|
|
69
|
-
expect(config.autoUpdateHomebridgeUI).toBe(false);
|
|
70
|
-
expect(config.autoUpdatePlugins).toBe(true);
|
|
71
|
-
expect(config.autoUpdateNpm).toBe(false);
|
|
72
|
-
});
|
|
73
|
-
it('should allow npm update properties to be set independently', () => {
|
|
74
|
-
const config = {
|
|
75
|
-
name: 'Example Platform',
|
|
76
|
-
platform: 'ExamplePlatform',
|
|
77
|
-
checkNpmUpdates: true,
|
|
78
|
-
autoUpdateNpm: true,
|
|
79
|
-
};
|
|
80
|
-
expect(config.checkNpmUpdates).toBe(true);
|
|
81
|
-
expect(config.autoUpdateNpm).toBe(true);
|
|
82
|
-
});
|
|
83
|
-
it('should allow allowDirectNpmUpdates property to be set', () => {
|
|
84
|
-
const config = {
|
|
85
|
-
name: 'Example Platform',
|
|
86
|
-
platform: 'ExamplePlatform',
|
|
87
|
-
allowDirectNpmUpdates: true,
|
|
88
|
-
};
|
|
89
|
-
expect(config.allowDirectNpmUpdates).toBe(true);
|
|
90
|
-
});
|
|
91
|
-
it('should allow autoRestartAfterUpdates property to be set', () => {
|
|
92
|
-
const config = {
|
|
93
|
-
name: 'Example Platform',
|
|
94
|
-
platform: 'ExamplePlatform',
|
|
95
|
-
autoRestartAfterUpdates: true,
|
|
96
|
-
};
|
|
97
|
-
expect(config.autoRestartAfterUpdates).toBe(true);
|
|
98
|
-
});
|
|
99
|
-
it('should allow enableMatter property to be set', () => {
|
|
100
|
-
const config = {
|
|
101
|
-
name: 'Example Platform',
|
|
102
|
-
platform: 'ExamplePlatform',
|
|
103
|
-
enableMatter: false,
|
|
104
|
-
};
|
|
105
|
-
expect(config.enableMatter).toBe(false);
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
//# sourceMappingURL=configTypes.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"configTypes.test.js","sourceRoot":"","sources":["../src/configTypes.test.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,MAAM,GAA+B;YACzC,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,iBAAiB;SAC5B,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QAC5C,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,MAAM,GAA+B;YACzC,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,iBAAiB;YAC3B,UAAU,EAAE,aAAa;SAC1B,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,MAAM,GAA+B;YACzC,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,iBAAiB;YAC3B,iBAAiB,EAAE,EAAE;SACtB,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAA+B;YACzC,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,iBAAiB;YAC3B,UAAU,EAAE,UAAU;YACtB,sBAAsB,EAAE,IAAI;YAC5B,wBAAwB,EAAE,IAAI;YAC9B,kBAAkB,EAAE,IAAI;YACxB,kBAAkB,EAAE,IAAI;YACxB,eAAe,EAAE,IAAI;YACrB,iBAAiB,EAAE,EAAE;YACrB,aAAa,EAAE,KAAK;YACpB,oBAAoB,EAAE,IAAI;YAC1B,sBAAsB,EAAE,KAAK;YAC7B,iBAAiB,EAAE,IAAI;YACvB,qBAAqB,EAAE,KAAK;SAC7B,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;QAC/C,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC1C,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChD,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5C,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACzC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACxC,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjD,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3C,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,MAAM,GAA+B;YACzC,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,iBAAiB;YAC3B,oBAAoB,EAAE,IAAI;YAC1B,sBAAsB,EAAE,KAAK;YAC7B,iBAAiB,EAAE,IAAI;YACvB,aAAa,EAAE,KAAK;SACrB,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QAC5C,MAAM,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9C,MAAM,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACjD,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,MAAM,GAA+B;YACzC,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,iBAAiB;YAC3B,eAAe,EAAE,IAAI;YACrB,aAAa,EAAE,IAAI;SACpB,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACzC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,MAAM,GAA+B;YACzC,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,iBAAiB;YAC3B,qBAAqB,EAAE,IAAI;SAC5B,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,MAAM,GAA+B;YACzC,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,iBAAiB;YAC3B,uBAAuB,EAAE,IAAI;SAC9B,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,MAAM,GAA+B;YACzC,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,iBAAiB;YAC3B,YAAY,EAAE,KAAK;SACpB,CAAA;QACD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ignore-plugins.test.d.ts","sourceRoot":"","sources":["../src/ignore-plugins.test.ts"],"names":[],"mappings":""}
|