amaran-light-cli 1.1.4 → 1.4.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 (116) hide show
  1. package/CHANGELOG.md +44 -9
  2. package/README.md +32 -5
  3. package/dist/__tests__/autoCct.test.js +89 -20
  4. package/dist/__tests__/autoCct.test.js.map +1 -1
  5. package/dist/__tests__/autostart.test.js +87 -41
  6. package/dist/__tests__/autostart.test.js.map +1 -1
  7. package/dist/__tests__/cctUtil.test.js +26 -27
  8. package/dist/__tests__/cctUtil.test.js.map +1 -1
  9. package/dist/__tests__/cli.smoke.test.js +18 -13
  10. package/dist/__tests__/cli.smoke.test.js.map +1 -1
  11. package/dist/__tests__/intensityApi.test.js +4 -9
  12. package/dist/__tests__/intensityApi.test.js.map +1 -1
  13. package/dist/__tests__/lightControl.test.js +79 -68
  14. package/dist/__tests__/lightControl.test.js.map +1 -1
  15. package/dist/__tests__/setupTests.js +9 -8
  16. package/dist/__tests__/setupTests.js.map +1 -1
  17. package/dist/__tests__/simulateSchedule.test.d.ts +2 -0
  18. package/dist/__tests__/simulateSchedule.test.d.ts.map +1 -0
  19. package/dist/__tests__/simulateSchedule.test.js +87 -0
  20. package/dist/__tests__/simulateSchedule.test.js.map +1 -0
  21. package/dist/autostart.js +19 -60
  22. package/dist/autostart.js.map +1 -1
  23. package/dist/cctUtil.d.ts.map +1 -1
  24. package/dist/cctUtil.js +106 -107
  25. package/dist/cctUtil.js.map +1 -1
  26. package/dist/cli.d.ts +2 -2
  27. package/dist/cli.d.ts.map +1 -1
  28. package/dist/cli.js +52 -247
  29. package/dist/cli.js.map +1 -1
  30. package/dist/commands/__tests__/integration.test.d.ts +2 -0
  31. package/dist/commands/__tests__/integration.test.d.ts.map +1 -0
  32. package/dist/commands/__tests__/integration.test.js +279 -0
  33. package/dist/commands/__tests__/integration.test.js.map +1 -0
  34. package/dist/commands/autoCct.d.ts +1 -1
  35. package/dist/commands/autoCct.d.ts.map +1 -1
  36. package/dist/commands/autoCct.js +74 -76
  37. package/dist/commands/autoCct.js.map +1 -1
  38. package/dist/commands/cct.d.ts +1 -1
  39. package/dist/commands/cct.d.ts.map +1 -1
  40. package/dist/commands/cct.js +17 -23
  41. package/dist/commands/cct.js.map +1 -1
  42. package/dist/commands/color.d.ts +1 -1
  43. package/dist/commands/color.d.ts.map +1 -1
  44. package/dist/commands/color.js +9 -15
  45. package/dist/commands/color.js.map +1 -1
  46. package/dist/commands/config.d.ts +1 -1
  47. package/dist/commands/config.d.ts.map +1 -1
  48. package/dist/commands/config.js +64 -66
  49. package/dist/commands/config.js.map +1 -1
  50. package/dist/commands/discover.d.ts +1 -1
  51. package/dist/commands/discover.d.ts.map +1 -1
  52. package/dist/commands/discover.js +8 -14
  53. package/dist/commands/discover.js.map +1 -1
  54. package/dist/commands/graphSchedule.d.ts +5 -0
  55. package/dist/commands/graphSchedule.d.ts.map +1 -0
  56. package/dist/commands/graphSchedule.js +293 -0
  57. package/dist/commands/graphSchedule.js.map +1 -0
  58. package/dist/commands/hsi.d.ts +1 -1
  59. package/dist/commands/hsi.d.ts.map +1 -1
  60. package/dist/commands/hsi.js +11 -17
  61. package/dist/commands/hsi.js.map +1 -1
  62. package/dist/commands/intensity.d.ts +1 -1
  63. package/dist/commands/intensity.d.ts.map +1 -1
  64. package/dist/commands/intensity.js +9 -15
  65. package/dist/commands/intensity.js.map +1 -1
  66. package/dist/commands/list.d.ts +1 -1
  67. package/dist/commands/list.d.ts.map +1 -1
  68. package/dist/commands/list.js +6 -12
  69. package/dist/commands/list.js.map +1 -1
  70. package/dist/commands/power.d.ts +1 -1
  71. package/dist/commands/power.d.ts.map +1 -1
  72. package/dist/commands/power.js +18 -24
  73. package/dist/commands/power.js.map +1 -1
  74. package/dist/commands/printSchedule.d.ts +5 -0
  75. package/dist/commands/printSchedule.d.ts.map +1 -0
  76. package/dist/commands/{schedule.js → printSchedule.js} +113 -116
  77. package/dist/commands/printSchedule.js.map +1 -0
  78. package/dist/commands/service.d.ts +1 -1
  79. package/dist/commands/service.d.ts.map +1 -1
  80. package/dist/commands/service.js +54 -88
  81. package/dist/commands/service.js.map +1 -1
  82. package/dist/commands/simulateSchedule.d.ts +1 -1
  83. package/dist/commands/simulateSchedule.d.ts.map +1 -1
  84. package/dist/commands/simulateSchedule.js +50 -70
  85. package/dist/commands/simulateSchedule.js.map +1 -1
  86. package/dist/commands/status.d.ts +1 -1
  87. package/dist/commands/status.d.ts.map +1 -1
  88. package/dist/commands/status.js +8 -14
  89. package/dist/commands/status.js.map +1 -1
  90. package/dist/commands.d.ts +1 -1
  91. package/dist/commands.d.ts.map +1 -1
  92. package/dist/commands.js +52 -54
  93. package/dist/commands.js.map +1 -1
  94. package/dist/constants.d.ts +13 -14
  95. package/dist/constants.d.ts.map +1 -1
  96. package/dist/constants.js +21 -27
  97. package/dist/constants.js.map +1 -1
  98. package/dist/discovery.js +8 -15
  99. package/dist/discovery.js.map +1 -1
  100. package/dist/geoipUtil.js +3 -9
  101. package/dist/geoipUtil.js.map +1 -1
  102. package/dist/lightControl.js +18 -20
  103. package/dist/lightControl.js.map +1 -1
  104. package/dist/test/MockLightServer.d.ts +13 -0
  105. package/dist/test/MockLightServer.d.ts.map +1 -0
  106. package/dist/test/MockLightServer.js +140 -0
  107. package/dist/test/MockLightServer.js.map +1 -0
  108. package/dist/types.d.ts +2 -1
  109. package/dist/types.d.ts.map +1 -1
  110. package/dist/types.js +1 -2
  111. package/package.json +17 -15
  112. package/scripts/release.js +8 -4
  113. package/scripts/test.sh +2 -2
  114. package/dist/commands/schedule.d.ts +0 -5
  115. package/dist/commands/schedule.d.ts.map +0 -1
  116. package/dist/commands/schedule.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,20 +1,55 @@
1
- ## [1.1.4] - 2025-11-02
1
+ ## [1.4.0] - 2025-12-15
2
2
 
3
- test token config
3
+ - **Feature**: Added `graph-schedule` command to generate visual graphs of the lighting schedule.
4
4
 
5
- ## [1.1.3] - 2025-11-02
5
+ ## [1.3.6] - 2025-12-14
6
+
7
+ - **Fix**: Updated workflow to use latest `npm` version for better OIDC support.
8
+
9
+ ## [1.3.5] - 2025-12-14
10
+
11
+ - **Fix**: Re-applied `registry-url` configuration fix (previous attempt in v1.3.4 failed to update workflow).
12
+
13
+ ## [1.3.4] - 2025-12-14
14
+
15
+ - **Fix**: Restored `registry-url` configuration (required for OIDC `ENEEDAUTH` fix).
16
+
17
+ ## [1.3.3] - 2025-12-14
18
+
19
+ - **Fix**: Removed conflicting `registry-url` configuration to enable OIDC authentication.
6
20
 
7
- curve config and refactors
21
+ ## [1.3.2] - 2025-12-14
8
22
 
9
- # Changelog
23
+ - **Fix**: Updated release workflow to use NPM Trusted Publishing (OIDC) instead of auth tokens.
24
+
25
+ ## [1.3.1] - 2025-12-14
26
+
27
+ - **Fix**: Resolved timezone issue in integration tests causing CI failures.
28
+
29
+ ## [1.3.0] - 2025-12-14
30
+
31
+ - **Breaking**: Migrated project to ESM (`type: module`).
32
+ - **Breaking**: Migrated testing framework from Jest to Vitest.
33
+ - **Feature**: Added `intensityMultiplier` support to `auto-cct`.
34
+ - **Feature**: `auto-cct` command now accepts a device argument (defaults to 'all').
35
+ - **Refactor**: Renamed `schedule` command to `print-schedule`.
36
+ - **Fix**: Resolved `suncalc` import issues.
37
+ - **Fix**: Improved CLI output styling for light mode terminals.
38
+ - **Chore**: Comprehensive linting and formatting fixes.
39
+
40
+ ## [1.1.4] - 2025-11-02
41
+
42
+ - test token config
43
+
44
+ ## [1.1.3] - 2025-11-02
10
45
 
11
- All notable changes to this project will be documented in this file.
46
+ - curve config and refactors
12
47
 
13
- ## [1.1.2] - 2024-11-01
48
+ ## [1.1.2] - 2025-11-01
14
49
 
15
50
  - Enhanced CLI help output and documentation
16
51
 
17
- ## [1.1.0] - 2024-10-31
52
+ ## [1.1.0] - 2025-10-31
18
53
 
19
54
  - Added more curves for auto-cct
20
55
  - Improved schedule table display with all curves
@@ -24,7 +59,7 @@ All notable changes to this project will be documented in this file.
24
59
  - Added more special times in schedule (e.g., Nautical Dawn)
25
60
  - Various tests and refactoring
26
61
 
27
- ## [1.0.3] - 2024-10-30
62
+ ## [1.0.3] - 2025-10-30
28
63
 
29
64
  - Initial stable release with full CLI functionality
30
65
  - WebSocket control for Aputure Amaran lights
package/README.md CHANGED
@@ -288,7 +288,7 @@ View how color temperature and intensity will change throughout the day:
288
288
 
289
289
  ```console
290
290
  # Preview schedule for today at your current location
291
- $ amaran-cli schedule
291
+ $ amaran-cli print-schedule
292
292
 
293
293
  ═══════════════════════════════════════════════════════════
294
294
  Auto-CCT Schedule Preview
@@ -354,16 +354,16 @@ Time HANN WM_SMALL WM_MEDIUM WM_LARGE CIE SUN_ALT
354
354
  ─────────────────────────────────────────────────────────────────────────────────────────────────
355
355
 
356
356
  # Preview with manual location
357
- amaran-cli schedule --lat 40.7128 --lon -74.0060
357
+ amaran-cli print-schedule --lat 40.7128 --lon -74.0060
358
358
 
359
359
  # Preview for a specific date
360
- amaran-cli schedule --date 2025-12-21
360
+ amaran-cli print-schedule --date 2025-12-21
361
361
 
362
362
  # Change time interval (default: 30 minutes)
363
- amaran-cli schedule --interval 15
363
+ amaran-cli print-schedule --interval 15
364
364
 
365
365
  # Combine options
366
- amaran-cli schedule --lat 51.5074 --lon -0.1278 --date 2025-06-21 --interval 60
366
+ amaran-cli print-schedule --lat 51.5074 --lon -0.1278 --date 2025-06-21 --interval 60
367
367
  ```
368
368
 
369
369
  The schedule shows CCT and intensity values from 30 minutes before sunrise to 30 minutes after sunset, with special highlighting for:
@@ -376,6 +376,33 @@ This helps you visualize and plan your automated lighting schedule before implem
376
376
 
377
377
  Note: The schedule respects any configured bounds set via `amaran-cli config --cct-min/--cct-max` and `--intensity-min/--intensity-max`. If no bounds are set, it uses the default curve from `calculateCCT`.
378
378
 
379
+ ### Generate Schedule Graph
380
+
381
+ Generate a visual graph of your auto-cct schedule over the day:
382
+
383
+ ```bash
384
+ # Generate graph for today (saved as schedule-YYYY-MM-DD.png)
385
+ amaran-cli graph-schedule
386
+
387
+ # Specify output filename
388
+ amaran-cli graph-schedule -o my-schedule.png
389
+
390
+ # Customize graph dimensions
391
+ amaran-cli graph-schedule -W 1920 -H 1080
392
+
393
+ # Graph specific curves
394
+ amaran-cli graph-schedule --curve cie-daylight
395
+ amaran-cli graph-schedule --curve "perez-daylight, sun-altitude"
396
+
397
+ # View all available curves on one graph
398
+ amaran-cli graph-schedule --curve all
399
+
400
+ # Preview for a specific date and location
401
+ amaran-cli graph-schedule --date 2025-06-21 --lat 64.1466 --lon -21.9426
402
+ ```
403
+
404
+ This creates a PNG image showing the CCT and/or intensity curves, which is great for visualizing how different algorithms behave.
405
+
379
406
  ### Get light status
380
407
 
381
408
  ```bash
@@ -1,17 +1,12 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const globals_1 = require("@jest/globals");
7
- const commander_1 = require("commander");
8
- const commands_1 = __importDefault(require("../commands"));
9
- globals_1.jest.mock('../geoipUtil', () => ({
10
- getLocationFromIP: globals_1.jest.fn(() => ({ ll: [37.7749, -122.4194] })),
1
+ import { Command } from 'commander';
2
+ import { vi } from 'vitest';
3
+ import registerCommands from '../commands.js';
4
+ vi.mock('../geoipUtil', () => ({
5
+ getLocationFromIP: vi.fn(() => ({ ll: [37.7749, -122.4194] })),
11
6
  }));
12
- globals_1.jest.mock('../cctUtil', () => ({
13
- calculateCCT: globals_1.jest.fn(() => ({ cct: 5600, intensity: 500 })),
14
- parseCurveType: globals_1.jest.fn(() => 'HANN'),
7
+ vi.mock('../cctUtil', () => ({
8
+ calculateCCT: vi.fn(() => ({ cct: 5600, intensity: 500 })),
9
+ parseCurveType: vi.fn(() => 'HANN'),
15
10
  CurveType: {
16
11
  HANN: 'hann',
17
12
  WIDER_MIDDLE_SMALL: 'wider-middle-small',
@@ -24,7 +19,7 @@ globals_1.jest.mock('../cctUtil', () => ({
24
19
  }));
25
20
  describe('auto-cct command', () => {
26
21
  const originalFetch = global.fetch;
27
- const mockFetch = globals_1.jest.fn();
22
+ const mockFetch = vi.fn();
28
23
  beforeAll(() => {
29
24
  mockFetch.mockImplementation(async () => ({
30
25
  json: async () => ({ ip: '1.2.3.4' }),
@@ -38,18 +33,18 @@ describe('auto-cct command', () => {
38
33
  global.fetch = originalFetch;
39
34
  });
40
35
  test('skips sleeping lights when running auto-cct', async () => {
41
- const setCCT = globals_1.jest.fn();
42
- const disconnect = globals_1.jest.fn(async () => Promise.resolve());
36
+ const setCCT = vi.fn();
37
+ const disconnect = vi.fn(async () => Promise.resolve());
43
38
  const sleepState = {
44
39
  '400J5-F2C008': false,
45
40
  '400J5-F2C009': true,
46
41
  };
47
42
  const controllerStub = {
48
- getDevices: globals_1.jest.fn(() => [
43
+ getDevices: vi.fn(() => [
49
44
  { node_id: '400J5-F2C008', device_name: 'On Light' },
50
45
  { node_id: '400J5-F2C009', device_name: 'Off Light' },
51
46
  ]),
52
- getLightSleepStatus: globals_1.jest.fn((nodeId, cb) => {
47
+ getLightSleepStatus: vi.fn((nodeId, cb) => {
53
48
  setImmediate(() => cb(true, 'ok', { sleep: sleepState[nodeId] }));
54
49
  }),
55
50
  setCCT,
@@ -62,14 +57,88 @@ describe('auto-cct command', () => {
62
57
  loadConfig: () => ({}),
63
58
  saveWsUrl: undefined,
64
59
  };
65
- const program = new commander_1.Command();
60
+ const program = new Command();
66
61
  program.exitOverride();
67
- (0, commands_1.default)(program, deps);
62
+ registerCommands(program, deps);
68
63
  await program.parseAsync(['node', 'test', 'auto-cct']);
69
64
  expect(setCCT).toHaveBeenCalledTimes(1);
70
65
  // auto-cct should pass through calculateCCT result
71
66
  expect(setCCT).toHaveBeenCalledWith('400J5-F2C008', 5600, 500);
72
67
  expect(disconnect).toHaveBeenCalledTimes(1);
73
68
  });
69
+ test('applies intensity multiplier from config', async () => {
70
+ const setCCT = vi.fn();
71
+ const disconnect = vi.fn(async () => Promise.resolve());
72
+ const controllerStub = {
73
+ getDevices: vi.fn(() => [
74
+ { node_id: '400J5-F2C008', device_name: 'Key Light' },
75
+ { node_id: '400J5-F2C009', device_name: 'Fill Light' },
76
+ ]),
77
+ getLightSleepStatus: vi.fn((_nodeId, cb) => {
78
+ setImmediate(() => cb(true, 'ok', { sleep: false }));
79
+ }),
80
+ setCCT,
81
+ disconnect,
82
+ };
83
+ const deps = {
84
+ createController: async () => controllerStub,
85
+ findDevice: (_controller, _deviceQuery) => null,
86
+ asyncCommand: (fn) => (...args) => fn(...args),
87
+ loadConfig: () => ({
88
+ intensityMultiplier: {
89
+ '400J5-F2C008': 0.5, // 50% multiplier
90
+ // 400J5-F2C009 has no multiplier, defaults to 1.0
91
+ },
92
+ }),
93
+ saveWsUrl: undefined,
94
+ };
95
+ const program = new Command();
96
+ program.exitOverride();
97
+ registerCommands(program, deps);
98
+ await program.parseAsync(['node', 'test', 'auto-cct']);
99
+ expect(setCCT).toHaveBeenCalledTimes(2);
100
+ // 5600K at 50% intensity (base 500 * 0.5 = 250)
101
+ // Note: The logic in autoCct computes percent first, then multiplies.
102
+ // Base intensity 500 -> 50%. 50% * 0.5 = 25%.
103
+ // Then it converts back to raw intensity: 500 * (25 / 50) = 250.
104
+ expect(setCCT).toHaveBeenCalledWith('400J5-F2C008', 5600, 250);
105
+ // Normal intensity for the other light
106
+ expect(setCCT).toHaveBeenCalledWith('400J5-F2C009', 5600, 500);
107
+ expect(disconnect).toHaveBeenCalledTimes(1);
108
+ });
109
+ test('targets specific device when argument is provided', async () => {
110
+ const setCCT = vi.fn();
111
+ const disconnect = vi.fn(async () => Promise.resolve());
112
+ const targetDevice = { node_id: '400J5-F2C008', device_name: 'Target Light' };
113
+ const otherDevice = { node_id: '400J5-F2C009', device_name: 'Other Light' };
114
+ const controllerStub = {
115
+ getDevices: vi.fn(() => [targetDevice, otherDevice]),
116
+ getLightSleepStatus: vi.fn((_nodeId, cb) => {
117
+ setImmediate(() => cb(true, 'ok', { sleep: false }));
118
+ }),
119
+ setCCT,
120
+ disconnect,
121
+ };
122
+ const findDeviceMock = vi.fn((_controller, query) => {
123
+ if (query === 'Target')
124
+ return targetDevice;
125
+ return null;
126
+ });
127
+ const deps = {
128
+ createController: async () => controllerStub,
129
+ findDevice: findDeviceMock,
130
+ asyncCommand: (fn) => (...args) => fn(...args),
131
+ loadConfig: () => ({}),
132
+ saveWsUrl: undefined,
133
+ };
134
+ const program = new Command();
135
+ program.exitOverride();
136
+ registerCommands(program, deps);
137
+ await program.parseAsync(['node', 'test', 'auto-cct', 'Target']);
138
+ expect(findDeviceMock).toHaveBeenCalledWith(controllerStub, 'Target');
139
+ expect(setCCT).toHaveBeenCalledTimes(1);
140
+ expect(setCCT).toHaveBeenCalledWith('400J5-F2C008', 5600, 500);
141
+ expect(disconnect).toHaveBeenCalledTimes(1);
142
+ });
74
143
  });
75
144
  //# sourceMappingURL=autoCct.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"autoCct.test.js","sourceRoot":"","sources":["../../src/__tests__/autoCct.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"autoCct.test.js","sourceRoot":"","sources":["../../src/__tests__/autoCct.test.ts"],"names":[],"mappings":"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"}
@@ -1,84 +1,116 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const autostart_1 = require("../autostart");
1
+ import { exec } from 'node:child_process';
2
+ import * as fs from 'node:fs';
3
+ import { vi } from 'vitest';
4
+ import { handleAutostart, isAmaranAppRunning, startAmaranApp } from '../autostart.js';
4
5
  // Mock the child_process module
5
- jest.mock('node:util', () => ({
6
- promisify: jest.fn((fn) => fn),
6
+ vi.mock('node:util', () => ({
7
+ promisify: vi.fn((fn) => fn),
7
8
  }));
8
- jest.mock('node:child_process', () => ({
9
- exec: jest.fn(),
9
+ vi.mock('node:child_process', () => ({
10
+ exec: vi.fn(),
10
11
  }));
11
- jest.mock('node:fs', () => ({
12
- existsSync: jest.fn(),
13
- readFileSync: jest.fn(),
14
- writeFileSync: jest.fn(),
15
- appendFileSync: jest.fn(),
16
- }));
17
- jest.mock('chalk', () => ({
18
- yellow: jest.fn((text) => text),
19
- green: jest.fn((text) => text),
20
- gray: jest.fn((text) => text),
21
- red: jest.fn((text) => text),
22
- blue: jest.fn((text) => text),
12
+ vi.mock('node:fs', () => ({
13
+ existsSync: vi.fn(),
14
+ readFileSync: vi.fn(),
15
+ writeFileSync: vi.fn(),
16
+ appendFileSync: vi.fn(),
23
17
  }));
18
+ vi.mock('chalk', () => {
19
+ const mocks = {
20
+ yellow: vi.fn((text) => text),
21
+ green: vi.fn((text) => text),
22
+ gray: vi.fn((text) => text),
23
+ red: vi.fn((text) => text),
24
+ blue: vi.fn((text) => text),
25
+ };
26
+ return { default: mocks };
27
+ });
24
28
  describe('autostart', () => {
25
- const mockExec = require('node:child_process').exec;
26
- const mockFs = require('node:fs');
29
+ // The imported 'exec' and 'fs' are already the mocked versions due to vi.mock calls.
30
+ // We use vi.mocked() to get the typed mock objects.
31
+ const mockExec = vi.mocked(exec);
32
+ const mockFs = vi.mocked(fs);
27
33
  beforeEach(() => {
28
- jest.clearAllMocks();
29
- jest.spyOn(console, 'log').mockImplementation();
30
- jest.spyOn(console, 'warn').mockImplementation();
34
+ vi.useFakeTimers();
35
+ vi.clearAllMocks();
36
+ vi.spyOn(console, 'log').mockImplementation(() => {
37
+ // no-op
38
+ });
39
+ vi.spyOn(console, 'warn').mockImplementation(() => {
40
+ // no-op
41
+ });
31
42
  });
32
43
  afterEach(() => {
33
- jest.restoreAllMocks();
44
+ vi.useRealTimers();
45
+ vi.restoreAllMocks();
34
46
  });
35
47
  describe('isAmaranAppRunning', () => {
36
48
  it('should return true when amaran process is found', async () => {
37
- mockExec.mockImplementation((_command, callback) => {
49
+ // biome-ignore lint/suspicious/noExplicitAny: mocking overloaded function
50
+ mockExec.mockImplementation((_command, ...args) => {
51
+ const callback = args.find((arg) => typeof arg === 'function');
38
52
  callback(null, 'amaran Desktop 12345 0.0 0.1 123456 1234 ?? 10:30AM 0:00.01 /Applications/amaran Desktop.app/Contents/MacOS/amaran Desktop', '');
53
+ // biome-ignore lint/suspicious/noExplicitAny: mock return
54
+ return {};
39
55
  });
40
- const result = await (0, autostart_1.isAmaranAppRunning)(true);
56
+ const result = await isAmaranAppRunning(true);
41
57
  expect(result).toBe(true);
42
58
  expect(mockExec).toHaveBeenCalledWith('ps aux | grep -i "amaran desktop" | grep -v grep', expect.any(Function));
43
59
  });
44
60
  it('should return false when no amaran process is found', async () => {
45
- mockExec.mockImplementation((_command, callback) => {
61
+ // biome-ignore lint/suspicious/noExplicitAny: mocking overloaded function
62
+ mockExec.mockImplementation((_command, ...args) => {
63
+ const callback = args.find((arg) => typeof arg === 'function');
46
64
  callback(null, '', '');
65
+ // biome-ignore lint/suspicious/noExplicitAny: mock return
66
+ return {};
47
67
  });
48
- const result = await (0, autostart_1.isAmaranAppRunning)(true);
68
+ const result = await isAmaranAppRunning(true);
49
69
  expect(result).toBe(false);
50
70
  });
51
71
  it('should return false when exec fails', async () => {
52
- mockExec.mockImplementation((_command, callback) => {
72
+ // biome-ignore lint/suspicious/noExplicitAny: mocking overloaded function
73
+ mockExec.mockImplementation((_command, ...args) => {
74
+ const callback = args.find((arg) => typeof arg === 'function');
53
75
  callback(new Error('Command failed'), '', '');
76
+ // biome-ignore lint/suspicious/noExplicitAny: mock return
77
+ return {};
54
78
  });
55
- const result = await (0, autostart_1.isAmaranAppRunning)(true);
79
+ const result = await isAmaranAppRunning(true);
56
80
  expect(result).toBe(false);
57
81
  });
58
82
  });
59
83
  describe('startAmaranApp', () => {
60
84
  it('should start app successfully when autostart is enabled', async () => {
61
- mockExec.mockImplementation((command, callback) => {
85
+ // biome-ignore lint/suspicious/noExplicitAny: mocking overloaded function
86
+ mockExec.mockImplementation((command, ...args) => {
87
+ const callback = args.find((arg) => typeof arg === 'function');
62
88
  if (command.includes('open -a "amaran Desktop"')) {
63
89
  callback(null, '', '');
64
90
  }
91
+ // biome-ignore lint/suspicious/noExplicitAny: mock return
92
+ return {};
65
93
  });
66
94
  mockFs.existsSync.mockReturnValue(true);
67
95
  mockFs.readFileSync.mockReturnValue(JSON.stringify({ autoStartApp: true }));
68
- const result = await (0, autostart_1.startAmaranApp)(true);
96
+ const promise = startAmaranApp(true);
97
+ await vi.runAllTimersAsync();
98
+ const result = await promise;
69
99
  expect(result).toBe(true);
70
100
  expect(mockExec).toHaveBeenCalledWith('open -a "amaran Desktop" 2>/dev/null', expect.any(Function));
71
101
  });
72
102
  it('should not start app when autostart is disabled', async () => {
73
103
  mockFs.existsSync.mockReturnValue(true);
74
104
  mockFs.readFileSync.mockReturnValue(JSON.stringify({ autoStartApp: false }));
75
- const result = await (0, autostart_1.startAmaranApp)(true);
105
+ const result = await startAmaranApp(true);
76
106
  expect(result).toBe(false);
77
107
  expect(mockExec).not.toHaveBeenCalled();
78
108
  });
79
109
  it('should try multiple start methods', async () => {
80
110
  let callCount = 0;
81
- mockExec.mockImplementation((_command, callback) => {
111
+ // biome-ignore lint/suspicious/noExplicitAny: mocking overloaded function
112
+ mockExec.mockImplementation((_command, ...args) => {
113
+ const callback = args.find((arg) => typeof arg === 'function');
82
114
  callCount++;
83
115
  if (callCount < 3) {
84
116
  callback(new Error('Command not found'), '', '');
@@ -86,10 +118,14 @@ describe('autostart', () => {
86
118
  else {
87
119
  callback(null, '', '');
88
120
  }
121
+ // biome-ignore lint/suspicious/noExplicitAny: mock return
122
+ return {};
89
123
  });
90
124
  mockFs.existsSync.mockReturnValue(true);
91
125
  mockFs.readFileSync.mockReturnValue(JSON.stringify({}));
92
- const result = await (0, autostart_1.startAmaranApp)(true);
126
+ const promise = startAmaranApp(true);
127
+ await vi.runAllTimersAsync();
128
+ const result = await promise;
93
129
  expect(result).toBe(true);
94
130
  expect(mockExec).toHaveBeenCalledTimes(3);
95
131
  });
@@ -98,32 +134,42 @@ describe('autostart', () => {
98
134
  it('should return false when autostart is disabled', async () => {
99
135
  mockFs.existsSync.mockReturnValue(true);
100
136
  mockFs.readFileSync.mockReturnValue(JSON.stringify({ autoStartApp: false }));
101
- const result = await (0, autostart_1.handleAutostart)(true);
137
+ const result = await handleAutostart(true);
102
138
  expect(result).toBe(false);
103
139
  });
104
140
  it('should return true when app is already running', async () => {
105
- mockExec.mockImplementation((command, callback) => {
141
+ // biome-ignore lint/suspicious/noExplicitAny: mocking overloaded function
142
+ mockExec.mockImplementation((command, ...args) => {
143
+ const callback = args.find((arg) => typeof arg === 'function');
106
144
  if (command.includes('ps aux')) {
107
145
  callback(null, 'amaran Desktop 12345 0.0 0.1 123456 1234 ?? 10:30AM 0:00.01 /Applications/amaran Desktop.app/Contents/MacOS/amaran Desktop', '');
108
146
  }
147
+ // biome-ignore lint/suspicious/noExplicitAny: mock return
148
+ return {};
109
149
  });
110
150
  mockFs.existsSync.mockReturnValue(true);
111
151
  mockFs.readFileSync.mockReturnValue(JSON.stringify({}));
112
- const result = await (0, autostart_1.handleAutostart)(true);
152
+ const result = await handleAutostart(true);
113
153
  expect(result).toBe(true);
114
154
  });
115
155
  it('should attempt to start app when not running', async () => {
116
- mockExec.mockImplementation((command, callback) => {
156
+ // biome-ignore lint/suspicious/noExplicitAny: mocking overloaded function
157
+ mockExec.mockImplementation((command, ...args) => {
158
+ const callback = args.find((arg) => typeof arg === 'function');
117
159
  if (command.includes('ps aux')) {
118
160
  callback(null, '', '');
119
161
  }
120
162
  else if (command.includes('open -a "amaran Desktop"')) {
121
163
  callback(null, '', '');
122
164
  }
165
+ // biome-ignore lint/suspicious/noExplicitAny: mock return
166
+ return {};
123
167
  });
124
168
  mockFs.existsSync.mockReturnValue(true);
125
169
  mockFs.readFileSync.mockReturnValue(JSON.stringify({}));
126
- const result = await (0, autostart_1.handleAutostart)(true);
170
+ const promise = handleAutostart(true);
171
+ await vi.runAllTimersAsync();
172
+ const result = await promise;
127
173
  expect(result).toBe(true);
128
174
  });
129
175
  });
@@ -1 +1 @@
1
- {"version":3,"file":"autostart.test.js","sourceRoot":"","sources":["../../src/__tests__/autostart.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"autostart.test.js","sourceRoot":"","sources":["../../src/__tests__/autostart.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAItF,gCAAgC;AAChC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC1B,SAAS,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;CAC7B,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE;CACd,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;IACrB,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;IACtB,cAAc,EAAE,EAAE,CAAC,EAAE,EAAE;CACxB,CAAC,CAAC,CAAC;AAEJ,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;IACpB,MAAM,KAAK,GAAG;QACZ,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;QAC7B,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;QAC5B,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;QAC3B,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;QAC1B,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC;KAC5B,CAAC;IACF,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,qFAAqF;IACrF,oDAAoD;IACpD,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAE7B,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAC/C,QAAQ;QACV,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YAChD,QAAQ;QACV,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,0EAA0E;YAC1E,QAAQ,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAW,EAAE,EAAE;gBACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAiB,CAAC;gBAC/E,QAAQ,CACN,IAAI,EACJ,gIAAgI,EAChI,EAAE,CACH,CAAC;gBACF,0DAA0D;gBAC1D,OAAO,EAAS,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,kDAAkD,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QAClH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,0EAA0E;YAC1E,QAAQ,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAW,EAAE,EAAE;gBACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAiB,CAAC;gBAC/E,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBACvB,0DAA0D;gBAC1D,OAAO,EAAS,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,0EAA0E;YAC1E,QAAQ,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAW,EAAE,EAAE;gBACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAiB,CAAC;gBAC/E,QAAQ,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC9C,0DAA0D;gBAC1D,OAAO,EAAS,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAE9C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;YACvE,0EAA0E;YAC1E,QAAQ,CAAC,kBAAkB,CAAC,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE;gBAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC;gBAC/D,IAAI,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;oBACjD,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBACzB,CAAC;gBACD,0DAA0D;gBAC1D,OAAO,EAAS,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAE5E,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAE7B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,sCAAsC,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAE7E,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;YAE1C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3B,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QAC1C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,IAAI,SAAS,GAAG,CAAC,CAAC;YAClB,0EAA0E;YAC1E,QAAQ,CAAC,kBAAkB,CAAC,CAAC,QAAQ,EAAE,GAAG,IAAW,EAAE,EAAE;gBACvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAiB,CAAC;gBAC/E,SAAS,EAAE,CAAC;gBACZ,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;oBAClB,QAAQ,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBACnD,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBACzB,CAAC;gBACD,0DAA0D;gBAC1D,OAAO,EAAS,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YAExD,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACrC,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAE7B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YAE7E,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,0EAA0E;YAC1E,QAAQ,CAAC,kBAAkB,CAAC,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE;gBAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC;gBAC/D,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,QAAQ,CACN,IAAI,EACJ,gIAAgI,EAChI,EAAE,CACH,CAAC;gBACJ,CAAC;gBACD,0DAA0D;gBAC1D,OAAO,EAAS,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YAExD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,0EAA0E;YAC1E,QAAQ,CAAC,kBAAkB,CAAC,CAAC,OAAe,EAAE,GAAG,IAAW,EAAE,EAAE;gBAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC;gBAC/D,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBACzB,CAAC;qBAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;oBACxD,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBACzB,CAAC;gBACD,0DAA0D;gBAC1D,OAAO,EAAS,CAAC;YACnB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,CAAC,YAAY,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YAExD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,EAAE,CAAC,iBAAiB,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;YAE7B,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}