@matterbridge/vitest-utils 3.9.1-dev-20260614-89d7aeb → 3.9.1-dev-20260617-b1e1b99

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/README.md CHANGED
@@ -6,10 +6,12 @@
6
6
  [![Docker Pulls](https://img.shields.io/docker/pulls/luligu/matterbridge?label=docker%20pulls)](https://hub.docker.com/r/luligu/matterbridge)
7
7
  ![Node.js CI](https://github.com/Luligu/matterbridge/actions/workflows/build.yml/badge.svg)
8
8
  ![CodeQL](https://github.com/Luligu/matterbridge/actions/workflows/codeql.yml/badge.svg)
9
- [![codecov](https://codecov.io/gh/Luligu/matterbridge/branch/main/graph/badge.svg)](https://codecov.io/gh/Luligu/matterbridge)
10
- [![styled with prettier](https://img.shields.io/badge/styled_with-Prettier-f8bc45.svg?logo=prettier)](https://prettier.io/)
11
- [![linted with eslint](https://img.shields.io/badge/linted_with-ES_Lint-4B32C3.svg?logo=eslint)](https://eslint.org/)
9
+ [![Codecov](https://codecov.io/gh/Luligu/matterbridge/branch/main/graph/badge.svg)](https://codecov.io/gh/Luligu/matterbridge)
10
+ [![tested with Vitest](https://img.shields.io/badge/tested_with-Vitest-6E9F18.svg?logo=vitest&logoColor=white)](https://vitest.dev)
11
+ [![styled with Oxc](https://img.shields.io/badge/styled_with-Oxc-9BE4E0.svg?logo=oxc&logoColor=white)](https://oxc.rs/docs/guide/usage/formatter.html)
12
+ [![linted with Oxc](https://img.shields.io/badge/linted_with-Oxc-9BE4E0.svg?logo=oxc&logoColor=white)](https://oxc.rs/docs/guide/usage/linter.html)
12
13
  [![TypeScript](https://img.shields.io/badge/TypeScript-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/)
14
+ [![TypeScript Native](https://img.shields.io/badge/TypeScript_Native-3178C6?logo=typescript&logoColor=white)](https://github.com/microsoft/typescript-go)
13
15
  [![ESM](https://img.shields.io/badge/ESM-Node.js-339933?logo=node.js&logoColor=white)](https://nodejs.org/)
14
16
  [![matterbridge.io](https://img.shields.io/badge/matterbridge.io-online-brightgreen)](https://matterbridge.io)
15
17
 
@@ -1,5 +1,5 @@
1
1
  import { ColorControl } from '@matter/types/clusters/color-control';
2
- import { type LevelControl } from '@matter/types/clusters/level-control';
2
+ import type { LevelControl } from '@matter/types/clusters/level-control';
3
3
  export declare function getMoveToLevelRequest(level: number, transitionTime: number, executeIfOff: boolean): LevelControl.MoveToLevelRequest;
4
4
  export declare function getMoveToColorTemperatureRequest(colorTemperatureMireds: number, transitionTime: number, executeIfOff: boolean): ColorControl.MoveToColorTemperatureRequest;
5
5
  export declare function getMoveToHueRequest(hue: number, transitionTime: number, executeIfOff: boolean): ColorControl.MoveToHueRequest;
@@ -10,14 +10,10 @@ export declare let aggregator: Endpoint<AggregatorEndpoint>;
10
10
  export declare function createTestEnvironment(): Promise<Environment>;
11
11
  export declare function destroyTestEnvironment(): Promise<void>;
12
12
  export declare function getMatterbridge(): PlatformMatterbridge;
13
- export declare const addBridgedEndpoint: import("vitest").Mock<(pluginName: string, device: Endpoint) => Promise<boolean>>;
14
- export declare const removeBridgedEndpoint: import("vitest").Mock<(pluginName: string, device: Endpoint) => Promise<boolean>>;
15
- export declare const removeAllBridgedEndpoints: import("vitest").Mock<(pluginName: string, _delay?: number) => Promise<boolean>>;
16
- export declare const addVirtualEndpoint: import("vitest").Mock<(pluginName: string, name: string, type: 'light' | 'outlet' | 'switch' | 'mounted_switch', callback: () => Promise<void>) => Promise<boolean>>;
17
- export declare const addBridgedEndpointMatterbridgeSpy: import("vitest").Mock<(pluginName: string, device: Endpoint) => Promise<boolean>>;
18
- export declare const removeBridgedEndpointMatterbridgeSpy: import("vitest").Mock<(pluginName: string, device: Endpoint) => Promise<boolean>>;
19
- export declare const removeAllBridgedEndpointsMatterbridgeSpy: import("vitest").Mock<(pluginName: string, _delay?: number) => Promise<boolean>>;
20
- export declare const addVirtualEndpointMatterbridgeSpy: import("vitest").Mock<(pluginName: string, name: string, type: 'light' | 'outlet' | 'switch' | 'mounted_switch', callback: () => Promise<void>) => Promise<boolean>>;
13
+ export declare const addBridgedEndpoint: (pluginName: string, device: Endpoint) => Promise<boolean>;
14
+ export declare const removeBridgedEndpoint: (pluginName: string, device: Endpoint) => Promise<boolean>;
15
+ export declare const removeAllBridgedEndpoints: (_pluginName: string, _delay?: number) => Promise<boolean>;
16
+ export declare const addVirtualEndpoint: (pluginName: string, name: string, type: "light" | "outlet" | "switch" | "mounted_switch", callback: () => Promise<void>) => Promise<boolean>;
21
17
  export declare function addMatterbridge(platform: object): void;
22
18
  export declare function flushAllEndpointNumberPersistence(targetServer: ServerNode, rounds?: number, ticks?: number, microTurns?: number, pause?: number): Promise<void>;
23
19
  export declare function assertAllEndpointNumbersPersisted(targetServer: ServerNode): Promise<number>;
@@ -1,6 +1,5 @@
1
1
  import '@matter/nodejs';
2
2
  import path from 'node:path';
3
- import { inspect } from 'node:util';
4
3
  import { Environment, Lifecycle, LogFormat as MatterLogFormat, LogLevel as MatterLogLevel } from '@matter/general';
5
4
  import { Endpoint, ServerNode, ServerNodeStore } from '@matter/node';
6
5
  import { BridgedDeviceBasicInformationServer } from '@matter/node/behaviors/bridged-device-basic-information';
@@ -10,12 +9,14 @@ import { MountedOnOffControlDevice } from '@matter/node/devices/mounted-on-off-c
10
9
  import { AggregatorEndpoint } from '@matter/node/endpoints';
11
10
  import { DeviceTypeId, VendorId } from '@matter/types/datatype';
12
11
  import { MATTER_STORAGE_DIR } from '@matterbridge/types';
12
+ import { inspectError } from '@matterbridge/utils/error';
13
13
  import { er, rs } from 'node-ansi-logger';
14
14
  import { flushAsync } from './flushAsync.js';
15
- import { HOMEDIR, NAME } from './vitestSetupTest.js';
15
+ import { HOMEDIR, log, NAME } from './vitestSetupTest.js';
16
16
  export let environment;
17
17
  export let server;
18
18
  export let aggregator;
19
+ const noop = () => undefined;
19
20
  export async function createTestEnvironment() {
20
21
  expect(NAME).toBeDefined();
21
22
  expect(typeof NAME).toBe('string');
@@ -75,7 +76,7 @@ export function getMatterbridge() {
75
76
  };
76
77
  return matterbridge;
77
78
  }
78
- export const addBridgedEndpoint = vi.fn(async (pluginName, device) => {
79
+ export const addBridgedEndpoint = async (pluginName, device) => {
79
80
  try {
80
81
  await aggregator.add(device);
81
82
  return Promise.resolve(true);
@@ -83,8 +84,8 @@ export const addBridgedEndpoint = vi.fn(async (pluginName, device) => {
83
84
  catch (error) {
84
85
  return Promise.reject(error);
85
86
  }
86
- });
87
- export const removeBridgedEndpoint = vi.fn(async (pluginName, device) => {
87
+ };
88
+ export const removeBridgedEndpoint = async (pluginName, device) => {
88
89
  try {
89
90
  await device.delete();
90
91
  return Promise.resolve(true);
@@ -92,8 +93,8 @@ export const removeBridgedEndpoint = vi.fn(async (pluginName, device) => {
92
93
  catch (error) {
93
94
  return Promise.reject(error);
94
95
  }
95
- });
96
- export const removeAllBridgedEndpoints = vi.fn(async (pluginName, _delay = 0) => {
96
+ };
97
+ export const removeAllBridgedEndpoints = async (_pluginName, _delay = 0) => {
97
98
  try {
98
99
  for (const device of aggregator.parts) {
99
100
  await device.delete();
@@ -103,8 +104,8 @@ export const removeAllBridgedEndpoints = vi.fn(async (pluginName, _delay = 0) =>
103
104
  catch (error) {
104
105
  return Promise.reject(error);
105
106
  }
106
- });
107
- export const addVirtualEndpoint = vi.fn(async (pluginName, name, type, callback) => {
107
+ };
108
+ export const addVirtualEndpoint = async (pluginName, name, type, callback) => {
108
109
  try {
109
110
  const device = new Endpoint(MountedOnOffControlDevice.with(BridgedDeviceBasicInformationServer), {
110
111
  id: name.replaceAll(' ', '') + ':' + type,
@@ -120,8 +121,8 @@ export const addVirtualEndpoint = vi.fn(async (pluginName, name, type, callback)
120
121
  });
121
122
  device.events.onOff.onOff$Changed.on((value) => {
122
123
  if (value) {
123
- void callback().catch(() => { });
124
- void device.setStateOf(OnOffServer, { onOff: false }).catch(() => { });
124
+ void callback().catch(noop);
125
+ void device.setStateOf(OnOffServer, { onOff: false }).catch(noop);
125
126
  }
126
127
  });
127
128
  await aggregator.add(device);
@@ -135,11 +136,7 @@ export const addVirtualEndpoint = vi.fn(async (pluginName, name, type, callback)
135
136
  catch (error) {
136
137
  return Promise.reject(error);
137
138
  }
138
- });
139
- export const addBridgedEndpointMatterbridgeSpy = addBridgedEndpoint;
140
- export const removeBridgedEndpointMatterbridgeSpy = removeBridgedEndpoint;
141
- export const removeAllBridgedEndpointsMatterbridgeSpy = removeAllBridgedEndpoints;
142
- export const addVirtualEndpointMatterbridgeSpy = addVirtualEndpoint;
139
+ };
143
140
  export function addMatterbridge(platform) {
144
141
  expect(platform).toBeDefined();
145
142
  platform.setMatterNode(addBridgedEndpoint, removeBridgedEndpoint, removeAllBridgedEndpoints, addVirtualEndpoint);
@@ -162,10 +159,8 @@ function collectAllEndpoints(root) {
162
159
  const list = [];
163
160
  const walk = (ep) => {
164
161
  list.push(ep);
165
- if (ep.parts) {
166
- for (const child of ep.parts) {
167
- walk(child);
168
- }
162
+ for (const child of ep.parts) {
163
+ walk(child);
169
164
  }
170
165
  };
171
166
  walk(root);
@@ -187,9 +182,8 @@ export async function assertAllEndpointNumbersPersisted(targetServer) {
187
182
  return all.length;
188
183
  }
189
184
  export async function closeServerNodeStores(targetServer) {
190
- if (!targetServer)
191
- targetServer = server;
192
- await targetServer?.env.get(ServerNodeStore)?.endpointStores.close();
185
+ const resolvedTargetServer = targetServer ?? server;
186
+ await resolvedTargetServer?.env.get(ServerNodeStore)?.endpointStores.close();
193
187
  }
194
188
  export async function createServerNode(port, deviceType = DeviceTypeId(0x000e), ticks = 1, microTurns = 1, pause = 10) {
195
189
  const { randomBytes } = await import('node:crypto');
@@ -299,9 +293,8 @@ export async function addDevice(owner, device, rounds = 3, pause = 10) {
299
293
  await owner.add(device);
300
294
  }
301
295
  catch (error) {
302
- const errorMessage = error instanceof Error ? error.message : error;
303
- const errorInspect = inspect(error, { depth: 10 });
304
- process.stderr.write(`${er}Error adding device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}${rs}\nStack: ${errorInspect}\n`);
296
+ inspectError(log, `Error adding device ${device.maybeId}.${device.maybeNumber}`, error);
297
+ process.stderr.write(`${er}Error adding device ${device.maybeId}.${device.maybeNumber}${rs}\n`);
305
298
  return false;
306
299
  }
307
300
  await device.construction.ready;
@@ -327,9 +320,8 @@ export async function deleteDevice(owner, device, rounds = 3, pause = 10) {
327
320
  await device.delete();
328
321
  }
329
322
  catch (error) {
330
- const errorMessage = error instanceof Error ? error.message : error;
331
- const errorInspect = inspect(error, { depth: 10 });
332
- process.stderr.write(`${er}Error deleting device ${device.maybeId}.${device.maybeNumber}: ${errorMessage}${rs}\nStack: ${errorInspect}\n`);
323
+ inspectError(log, `Error deleting device ${device.maybeId}.${device.maybeNumber}`, error);
324
+ process.stderr.write(`${er}Error deleting device ${device.maybeId}.${device.maybeNumber}${rs}\n`);
333
325
  return false;
334
326
  }
335
327
  expect(owner.parts.has(device)).toBeFalsy();
@@ -17,5 +17,5 @@ export declare let consoleErrorSpy: MockInstance<typeof console.error>;
17
17
  export declare let NAME: string;
18
18
  export declare let HOMEDIR: string;
19
19
  export declare let log: AnsiLogger;
20
- export declare function setupTest(name: string, debug?: boolean): Promise<void>;
20
+ export declare function setupTest(name: string, debug?: boolean, argv?: string[], env?: Record<string, string>): Promise<void>;
21
21
  export declare function setDebug(debug: boolean): Promise<void>;
@@ -18,13 +18,17 @@ export let consoleErrorSpy;
18
18
  export let NAME;
19
19
  export let HOMEDIR;
20
20
  export let log;
21
- export async function setupTest(name, debug = false) {
21
+ const noop = () => undefined;
22
+ export async function setupTest(name, debug = false, argv = [], env = {}) {
22
23
  expect(name).toBeDefined();
23
24
  expect(typeof name).toBe('string');
24
25
  expect(name.length).toBeGreaterThanOrEqual(4);
25
26
  NAME = name;
26
27
  HOMEDIR = path.join('.cache', 'vitest', name);
27
- process.argv = ['vitest', name];
28
+ process.argv = ['vitest', name, ...argv];
29
+ for (const [key, value] of Object.entries(env)) {
30
+ process.env[key] = value;
31
+ }
28
32
  log = new AnsiLogger({ logName: 'Vitest', logTimestampFormat: 4, logLevel: "info" });
29
33
  rmSync(HOMEDIR, { recursive: true, force: true });
30
34
  mkdirSync(HOMEDIR, { recursive: true });
@@ -44,12 +48,12 @@ export async function setupTest(name, debug = false) {
44
48
  consoleErrorSpy = vi.spyOn(console, 'error');
45
49
  }
46
50
  else {
47
- loggerLogSpy = vi.spyOn(AnsiLogger.prototype, 'log').mockImplementation(() => { });
48
- consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
49
- consoleDebugSpy = vi.spyOn(console, 'debug').mockImplementation(() => { });
50
- consoleInfoSpy = vi.spyOn(console, 'info').mockImplementation(() => { });
51
- consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
52
- consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
51
+ loggerLogSpy = vi.spyOn(AnsiLogger.prototype, 'log').mockImplementation(noop);
52
+ consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(noop);
53
+ consoleDebugSpy = vi.spyOn(console, 'debug').mockImplementation(noop);
54
+ consoleInfoSpy = vi.spyOn(console, 'info').mockImplementation(noop);
55
+ consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(noop);
56
+ consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(noop);
53
57
  }
54
58
  }
55
59
  export async function setDebug(debug) {
@@ -69,11 +73,11 @@ export async function setDebug(debug) {
69
73
  consoleErrorSpy = vi.spyOn(console, 'error');
70
74
  }
71
75
  else {
72
- loggerLogSpy = vi.spyOn(AnsiLogger.prototype, 'log').mockImplementation(() => { });
73
- consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(() => { });
74
- consoleDebugSpy = vi.spyOn(console, 'debug').mockImplementation(() => { });
75
- consoleInfoSpy = vi.spyOn(console, 'info').mockImplementation(() => { });
76
- consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
77
- consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(() => { });
76
+ loggerLogSpy = vi.spyOn(AnsiLogger.prototype, 'log').mockImplementation(noop);
77
+ consoleLogSpy = vi.spyOn(console, 'log').mockImplementation(noop);
78
+ consoleDebugSpy = vi.spyOn(console, 'debug').mockImplementation(noop);
79
+ consoleInfoSpy = vi.spyOn(console, 'info').mockImplementation(noop);
80
+ consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(noop);
81
+ consoleErrorSpy = vi.spyOn(console, 'error').mockImplementation(noop);
78
82
  }
79
83
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matterbridge/vitest-utils",
3
- "version": "3.9.1-dev-20260614-89d7aeb",
3
+ "version": "3.9.1-dev-20260617-b1e1b99",
4
4
  "description": "Matterbridge vitest utility library",
5
5
  "author": "https://github.com/Luligu",
6
6
  "homepage": "https://matterbridge.io/",
@@ -65,7 +65,9 @@
65
65
  "CHANGELOG.md"
66
66
  ],
67
67
  "dependencies": {
68
- "@matterbridge/types": "3.9.1-dev-20260614-89d7aeb",
68
+ "@matter/main": "0.17.3",
69
+ "@matterbridge/types": "3.9.1-dev-20260617-b1e1b99",
70
+ "@matterbridge/utils": "3.9.1-dev-20260617-b1e1b99",
69
71
  "node-ansi-logger": "3.3.0-dev-20260607-585945a"
70
72
  }
71
73
  }