amaran-light-cli 1.0.2 → 1.1.2
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 +24 -0
- package/LICENSE +1 -1
- package/README.md +67 -14
- package/dist/__tests__/autoCct.test.js +10 -0
- package/dist/__tests__/autoCct.test.js.map +1 -1
- package/dist/__tests__/autostart.test.d.ts +2 -0
- package/dist/__tests__/autostart.test.d.ts.map +1 -0
- package/dist/__tests__/autostart.test.js +131 -0
- package/dist/__tests__/autostart.test.js.map +1 -0
- package/dist/__tests__/cctUtil.test.js +52 -39
- package/dist/__tests__/cctUtil.test.js.map +1 -1
- package/dist/__tests__/cli.smoke.test.js +4 -3
- package/dist/__tests__/cli.smoke.test.js.map +1 -1
- package/dist/__tests__/intensityApi.test.js.map +1 -1
- package/dist/__tests__/setupTests.d.ts +2 -0
- package/dist/__tests__/setupTests.d.ts.map +1 -0
- package/dist/__tests__/setupTests.js +21 -0
- package/dist/__tests__/setupTests.js.map +1 -0
- package/dist/autostart.d.ts +29 -0
- package/dist/autostart.d.ts.map +1 -0
- package/dist/autostart.js +194 -0
- package/dist/autostart.js.map +1 -0
- package/dist/cctUtil.d.ts +12 -15
- package/dist/cctUtil.d.ts.map +1 -1
- package/dist/cctUtil.js +411 -68
- package/dist/cctUtil.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +218 -23
- package/dist/cli.js.map +1 -1
- package/dist/commands/autoCct.d.ts +1 -1
- package/dist/commands/autoCct.d.ts.map +1 -1
- package/dist/commands/autoCct.js +36 -15
- package/dist/commands/autoCct.js.map +1 -1
- package/dist/commands/cct.d.ts.map +1 -1
- package/dist/commands/cct.js +12 -6
- package/dist/commands/cct.js.map +1 -1
- package/dist/commands/color.d.ts.map +1 -1
- package/dist/commands/color.js.map +1 -1
- package/dist/commands/discover.d.ts.map +1 -1
- package/dist/commands/discover.js +1 -0
- package/dist/commands/discover.js.map +1 -1
- package/dist/commands/hsi.d.ts.map +1 -1
- package/dist/commands/hsi.js.map +1 -1
- package/dist/commands/intensity.d.ts.map +1 -1
- package/dist/commands/intensity.js.map +1 -1
- package/dist/commands/list.d.ts.map +1 -1
- package/dist/commands/list.js +2 -0
- package/dist/commands/list.js.map +1 -1
- package/dist/commands/power.d.ts.map +1 -1
- package/dist/commands/power.js.map +1 -1
- package/dist/commands/schedule.d.ts +1 -1
- package/dist/commands/schedule.d.ts.map +1 -1
- package/dist/commands/schedule.js +288 -60
- package/dist/commands/schedule.js.map +1 -1
- package/dist/commands/service.d.ts.map +1 -1
- package/dist/commands/service.js +23 -7
- package/dist/commands/service.js.map +1 -1
- package/dist/commands/simulateSchedule.d.ts +5 -0
- package/dist/commands/simulateSchedule.d.ts.map +1 -0
- package/dist/commands/simulateSchedule.js +219 -0
- package/dist/commands/simulateSchedule.js.map +1 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/commands.d.ts.map +1 -1
- package/dist/commands.js +27 -22
- package/dist/commands.js.map +1 -1
- package/dist/constants.d.ts +96 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +57 -0
- package/dist/constants.js.map +1 -0
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js.map +1 -1
- package/dist/lightControl.d.ts +4 -2
- package/dist/lightControl.d.ts.map +1 -1
- package/dist/lightControl.js +49 -26
- package/dist/lightControl.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +7 -4
- package/scripts/test.sh +9 -0
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [1.1.2] - 2024-11-01
|
|
6
|
+
|
|
7
|
+
- Enhanced CLI help output and documentation
|
|
8
|
+
|
|
9
|
+
## [1.1.0] - 2024-10-31
|
|
10
|
+
|
|
11
|
+
- Added more curves for auto-cct
|
|
12
|
+
- Improved schedule table display with all curves
|
|
13
|
+
- Better range for start/stop times for curves
|
|
14
|
+
- Added simulation of full day curve in seconds
|
|
15
|
+
- Added auto-start for the desktop app if closed
|
|
16
|
+
- Added more special times in schedule (e.g., Nautical Dawn)
|
|
17
|
+
- Various tests and refactoring
|
|
18
|
+
|
|
19
|
+
## [1.0.3] - 2024-10-30
|
|
20
|
+
|
|
21
|
+
- Initial stable release with full CLI functionality
|
|
22
|
+
- WebSocket control for Aputure Amaran lights
|
|
23
|
+
- Auto-CCT circadian lighting feature
|
|
24
|
+
- Service automation for continuous lighting adjustment
|
package/LICENSE
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2024 S. Zachariah Sprackett <zac@sprackett.com>
|
|
4
3
|
Copyright (c) 2025 Mahyar McDonald <github@hmmfn.com>
|
|
4
|
+
Copyright (c) 2024 S. Zachariah Sprackett <zac@sprackett.com>
|
|
5
5
|
|
|
6
6
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
7
7
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.md
CHANGED
|
@@ -263,9 +263,74 @@ chmod +x scripts/create-launchd-service.sh
|
|
|
263
263
|
|
|
264
264
|
View how color temperature and intensity will change throughout the day:
|
|
265
265
|
|
|
266
|
-
```
|
|
266
|
+
```console
|
|
267
267
|
# Preview schedule for today at your current location
|
|
268
|
-
amaran-cli schedule
|
|
268
|
+
$ amaran-cli schedule
|
|
269
|
+
|
|
270
|
+
═══════════════════════════════════════════════════════════
|
|
271
|
+
Auto-CCT Schedule Preview
|
|
272
|
+
═══════════════════════════════════════════════════════════
|
|
273
|
+
|
|
274
|
+
Location: 37.7852°, -122.3874° (geoip (136.24.146.157))
|
|
275
|
+
Date: Saturday, November 1, 2025
|
|
276
|
+
Interval: Every 30 minutes
|
|
277
|
+
Curve: All available curves
|
|
278
|
+
|
|
279
|
+
NE Night End : 06:07 AM GH Golden Hour : 05:35 PM
|
|
280
|
+
DN Nautical Dawn : 06:38 AM SB Sunset Start : 06:09 PM
|
|
281
|
+
DA Dawn : 07:09 AM SS Sunset : 06:12 PM
|
|
282
|
+
SR Sunrise : 07:36 AM ND Nautical Dusk : 07:10 PM
|
|
283
|
+
SE Sunrise End : 07:39 AM DU Dusk : 06:39 PM
|
|
284
|
+
GE Golden Hour End : 08:13 AM NI Night : 07:41 PM
|
|
285
|
+
SN Solar Noon : 12:54 PM NA Nadir : 12:54 AM
|
|
286
|
+
|
|
287
|
+
|
|
288
|
+
─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
289
|
+
Time HANN WM_SMALL WM_MEDIUM WM_LARGE CIE SUN_ALT PEREZ
|
|
290
|
+
─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
291
|
+
05:37 AM 1700K/5% 1700K/5% 1700K/5% 1700K/5% 1700K/5% 1700K/5% 1700K/5%
|
|
292
|
+
06:07 AM NE 1700K/5% 1700K/5% 1700K/5% 1700K/5% 1700K/5% 1700K/5% 1700K/5%
|
|
293
|
+
06:37 AM 1751K/6% 2326K/21% 2785K/32% 3780K/57% 1700K/5% 1700K/5% 1700K/5%
|
|
294
|
+
06:38 AM DN 1753K/6% 2339K/21% 2807K/33% 3817K/58% 1700K/5% 1700K/5% 1700K/5%
|
|
295
|
+
07:07 AM 1900K/10% 2935K/36% 3780K/57% 5182K/92% 1700K/5% 1700K/5% 1700K/5%
|
|
296
|
+
07:09 AM DA 1911K/10% 2967K/37% 3829K/58% 5227K/93% 3225K/5% 2867K/5% 3031K/5%
|
|
297
|
+
07:36 AM SR 2130K/16% 3488K/50% 4573K/77% 5500K/100% 3865K/7% 3521K/9% 3793K/6%
|
|
298
|
+
07:37 AM 2141K/16% 3510K/50% 4602K/78% 5500K/100% 3906K/7% 3550K/9% 3859K/6%
|
|
299
|
+
07:39 AM SE 2156K/16% 3540K/51% 4640K/79% 5500K/100% 3963K/8% 3589K/10% 3952K/6%
|
|
300
|
+
08:07 AM 2459K/24% 4036K/63% 5182K/92% 5500K/100% 3785K/9% 3796K/17% 3883K/13%
|
|
301
|
+
08:13 AM GE 2528K/26% 4130K/66% 5261K/94% 5500K/100% 3750K/9% 3836K/19% 3879K/15%
|
|
302
|
+
08:37 AM 2839K/34% 4498K/75% 5471K/99% 5500K/100% 3641K/9% 3999K/25% 3911K/21%
|
|
303
|
+
09:07 AM 3259K/44% 4883K/85% 5500K/100% 5500K/100% 3631K/33% 4193K/35% 4174K/26%
|
|
304
|
+
09:37 AM 3697K/55% 5182K/92% 5500K/100% 5500K/100% 3874K/66% 4375K/44% 4605K/46%
|
|
305
|
+
10:07 AM 4130K/66% 5385K/97% 5500K/100% 5500K/100% 4097K/87% 4543K/52% 4986K/79%
|
|
306
|
+
10:37 AM 4535K/76% 5487K/100% 5500K/100% 5500K/100% 4296K/97% 4692K/60% 4664K/97%
|
|
307
|
+
11:07 AM 4890K/85% 5500K/100% 5500K/100% 5500K/100% 4465K/100% 4793K/100% 4765K/100%
|
|
308
|
+
11:37 AM 5176K/92% 5500K/100% 5500K/100% 5500K/100% 4599K/100% 4860K/100% 4845K/100%
|
|
309
|
+
12:07 PM 5378K/97% 5500K/100% 5500K/100% 5500K/100% 4693K/100% 4906K/100% 4902K/100%
|
|
310
|
+
12:37 PM 5484K/100% 5500K/100% 5500K/100% 5500K/100% 4741K/100% 4931K/100% 4931K/100%
|
|
311
|
+
12:54 PM SN 5500K/100% 5500K/100% 5500K/100% 5500K/100% 4748K/100% 4934K/100% 4935K/100%
|
|
312
|
+
01:07 PM 5490K/100% 5500K/100% 5500K/100% 5500K/100% 4742K/100% 4931K/100% 4931K/100%
|
|
313
|
+
01:37 PM 5395K/97% 5500K/100% 5500K/100% 5500K/100% 4696K/100% 4908K/100% 4903K/100%
|
|
314
|
+
02:07 PM 5204K/93% 5500K/100% 5500K/100% 5500K/100% 4604K/100% 4862K/100% 4848K/100%
|
|
315
|
+
02:37 PM 4927K/86% 5500K/100% 5500K/100% 5500K/100% 4472K/100% 4796K/100% 4769K/100%
|
|
316
|
+
03:07 PM 4579K/77% 5493K/100% 5500K/100% 5500K/100% 4304K/97% 4698K/60% 4668K/97%
|
|
317
|
+
03:37 PM 4179K/67% 5402K/98% 5500K/100% 5500K/100% 4106K/87% 4550K/53% 5000K/80%
|
|
318
|
+
04:07 PM 3748K/56% 5210K/93% 5500K/100% 5500K/100% 3884K/67% 4383K/44% 4624K/48%
|
|
319
|
+
04:37 PM 3309K/45% 4923K/86% 5500K/100% 5500K/100% 3642K/34% 4201K/35% 4191K/26%
|
|
320
|
+
05:07 PM 2886K/35% 4547K/76% 5485K/100% 5500K/100% 3637K/9% 4008K/25% 3917K/21%
|
|
321
|
+
05:35 PM GH 2528K/26% 4130K/66% 5261K/94% 5500K/100% 3763K/9% 3820K/18% 3881K/14%
|
|
322
|
+
05:37 PM 2501K/25% 4093K/65% 5231K/93% 5500K/100% 3777K/9% 3805K/17% 3882K/14%
|
|
323
|
+
06:07 PM 2174K/17% 3574K/52% 4683K/80% 5500K/100% 3950K/8% 3580K/10% 3930K/6%
|
|
324
|
+
06:09 PM SB 2156K/16% 3540K/51% 4640K/79% 5500K/100% 3886K/7% 3536K/9% 3826K/6%
|
|
325
|
+
06:12 PM SS 2130K/16% 3488K/50% 4573K/77% 5500K/100% 3791K/7% 3468K/8% 3679K/6%
|
|
326
|
+
06:37 PM 1924K/11% 3004K/38% 3886K/60% 5276K/94% 3223K/5% 2859K/5% 3031K/5%
|
|
327
|
+
06:39 PM DU 1911K/10% 2967K/37% 3829K/58% 5227K/93% 1700K/5% 1700K/5% 1700K/5%
|
|
328
|
+
07:07 PM 1763K/7% 2398K/22% 2907K/35% 3989K/62% 1700K/5% 1700K/5% 1700K/5%
|
|
329
|
+
07:10 PM ND 1753K/6% 2339K/21% 2807K/33% 3817K/58% 1700K/5% 1700K/5% 1700K/5%
|
|
330
|
+
07:37 PM 1701K/5% 1773K/7% 1828K/8% 1955K/11% 1700K/5% 1700K/5% 1700K/5%
|
|
331
|
+
07:41 PM NI 1700K/5% 1700K/5% 1700K/5% 1700K/5% 1700K/5% 1700K/5% 1700K/5%
|
|
332
|
+
08:07 PM 1700K/5% 1700K/5% 1700K/5% 1700K/5% 1700K/5% 1700K/5% 1700K/5%
|
|
333
|
+
─────────────────────────────────────────────────────────────────────────────────────────────────
|
|
269
334
|
|
|
270
335
|
# Preview with manual location
|
|
271
336
|
amaran-cli schedule --lat 40.7128 --lon -74.0060
|
|
@@ -360,15 +425,3 @@ npm run clean
|
|
|
360
425
|
Devices can be identified by:
|
|
361
426
|
- **Device name**: Case-insensitive partial matching (e.g., "key" matches "Key Light")
|
|
362
427
|
- **Node ID**: Exact match of the device's node_id
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
## License
|
|
366
|
-
|
|
367
|
-
MIT License - see the [LICENSE](LICENSE) file for details.
|
|
368
|
-
|
|
369
|
-
## Credits
|
|
370
|
-
|
|
371
|
-
- Original WebSocket control implementation by S. Zachariah Sprackett
|
|
372
|
-
- CLI, auto-CCT, and additional features by Mahyar McDonald
|
|
373
|
-
- Built for use with Aputure Amaran lights and the Amaran Desktop application. This is not an official Amaran app and is not built by them. This was built as a quick hobby utility.
|
|
374
|
-
|
|
@@ -11,6 +11,16 @@ globals_1.jest.mock('../geoipUtil', () => ({
|
|
|
11
11
|
}));
|
|
12
12
|
globals_1.jest.mock('../cctUtil', () => ({
|
|
13
13
|
calculateCCT: globals_1.jest.fn(() => ({ cct: 5600, intensity: 500 })),
|
|
14
|
+
parseCurveType: globals_1.jest.fn(() => 'HANN'),
|
|
15
|
+
CurveType: {
|
|
16
|
+
HANN: 'hann',
|
|
17
|
+
WIDER_MIDDLE_SMALL: 'wider-middle-small',
|
|
18
|
+
WIDER_MIDDLE_MEDIUM: 'wider-middle-medium',
|
|
19
|
+
WIDER_MIDDLE_LARGE: 'wider-middle-large',
|
|
20
|
+
CIE_DAYLIGHT: 'cie-daylight',
|
|
21
|
+
SUN_ALTITUDE: 'sun-altitude',
|
|
22
|
+
PEREZ_DAYLIGHT: 'perez-daylight',
|
|
23
|
+
},
|
|
14
24
|
}));
|
|
15
25
|
describe('auto-cct command', () => {
|
|
16
26
|
const originalFetch = global.fetch;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"autoCct.test.js","sourceRoot":"","sources":["../../src/__tests__/autoCct.test.ts"],"names":[],"mappings":";;;;;AAAA,2CAAqC;AACrC,yCAAoC;AACpC,2DAA2C;AAG3C,cAAI,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,iBAAiB,EAAE,cAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;CACjE,CAAC,CAAC,CAAC;AAEJ,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;IAC7B,YAAY,EAAE,cAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"autoCct.test.js","sourceRoot":"","sources":["../../src/__tests__/autoCct.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autostart.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/autostart.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const autostart_1 = require("../autostart");
|
|
4
|
+
// Mock the child_process module
|
|
5
|
+
jest.mock('node:util', () => ({
|
|
6
|
+
promisify: jest.fn((fn) => fn),
|
|
7
|
+
}));
|
|
8
|
+
jest.mock('node:child_process', () => ({
|
|
9
|
+
exec: jest.fn(),
|
|
10
|
+
}));
|
|
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),
|
|
23
|
+
}));
|
|
24
|
+
describe('autostart', () => {
|
|
25
|
+
const mockExec = require('node:child_process').exec;
|
|
26
|
+
const mockFs = require('node:fs');
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
jest.clearAllMocks();
|
|
29
|
+
jest.spyOn(console, 'log').mockImplementation();
|
|
30
|
+
jest.spyOn(console, 'warn').mockImplementation();
|
|
31
|
+
});
|
|
32
|
+
afterEach(() => {
|
|
33
|
+
jest.restoreAllMocks();
|
|
34
|
+
});
|
|
35
|
+
describe('isAmaranAppRunning', () => {
|
|
36
|
+
it('should return true when amaran process is found', async () => {
|
|
37
|
+
mockExec.mockImplementation((_command, callback) => {
|
|
38
|
+
callback(null, 'amaran Desktop 12345 0.0 0.1 123456 1234 ?? 10:30AM 0:00.01 /Applications/amaran Desktop.app/Contents/MacOS/amaran Desktop', '');
|
|
39
|
+
});
|
|
40
|
+
const result = await (0, autostart_1.isAmaranAppRunning)(true);
|
|
41
|
+
expect(result).toBe(true);
|
|
42
|
+
expect(mockExec).toHaveBeenCalledWith('ps aux | grep -i "amaran desktop" | grep -v grep', expect.any(Function));
|
|
43
|
+
});
|
|
44
|
+
it('should return false when no amaran process is found', async () => {
|
|
45
|
+
mockExec.mockImplementation((_command, callback) => {
|
|
46
|
+
callback(null, '', '');
|
|
47
|
+
});
|
|
48
|
+
const result = await (0, autostart_1.isAmaranAppRunning)(true);
|
|
49
|
+
expect(result).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
it('should return false when exec fails', async () => {
|
|
52
|
+
mockExec.mockImplementation((_command, callback) => {
|
|
53
|
+
callback(new Error('Command failed'), '', '');
|
|
54
|
+
});
|
|
55
|
+
const result = await (0, autostart_1.isAmaranAppRunning)(true);
|
|
56
|
+
expect(result).toBe(false);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
describe('startAmaranApp', () => {
|
|
60
|
+
it('should start app successfully when autostart is enabled', async () => {
|
|
61
|
+
mockExec.mockImplementation((command, callback) => {
|
|
62
|
+
if (command.includes('open -a "amaran Desktop"')) {
|
|
63
|
+
callback(null, '', '');
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
mockFs.existsSync.mockReturnValue(true);
|
|
67
|
+
mockFs.readFileSync.mockReturnValue(JSON.stringify({ autoStartApp: true }));
|
|
68
|
+
const result = await (0, autostart_1.startAmaranApp)(true);
|
|
69
|
+
expect(result).toBe(true);
|
|
70
|
+
expect(mockExec).toHaveBeenCalledWith('open -a "amaran Desktop" 2>/dev/null', expect.any(Function));
|
|
71
|
+
});
|
|
72
|
+
it('should not start app when autostart is disabled', async () => {
|
|
73
|
+
mockFs.existsSync.mockReturnValue(true);
|
|
74
|
+
mockFs.readFileSync.mockReturnValue(JSON.stringify({ autoStartApp: false }));
|
|
75
|
+
const result = await (0, autostart_1.startAmaranApp)(true);
|
|
76
|
+
expect(result).toBe(false);
|
|
77
|
+
expect(mockExec).not.toHaveBeenCalled();
|
|
78
|
+
});
|
|
79
|
+
it('should try multiple start methods', async () => {
|
|
80
|
+
let callCount = 0;
|
|
81
|
+
mockExec.mockImplementation((_command, callback) => {
|
|
82
|
+
callCount++;
|
|
83
|
+
if (callCount < 3) {
|
|
84
|
+
callback(new Error('Command not found'), '', '');
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
callback(null, '', '');
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
mockFs.existsSync.mockReturnValue(true);
|
|
91
|
+
mockFs.readFileSync.mockReturnValue(JSON.stringify({}));
|
|
92
|
+
const result = await (0, autostart_1.startAmaranApp)(true);
|
|
93
|
+
expect(result).toBe(true);
|
|
94
|
+
expect(mockExec).toHaveBeenCalledTimes(3);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('handleAutostart', () => {
|
|
98
|
+
it('should return false when autostart is disabled', async () => {
|
|
99
|
+
mockFs.existsSync.mockReturnValue(true);
|
|
100
|
+
mockFs.readFileSync.mockReturnValue(JSON.stringify({ autoStartApp: false }));
|
|
101
|
+
const result = await (0, autostart_1.handleAutostart)(true);
|
|
102
|
+
expect(result).toBe(false);
|
|
103
|
+
});
|
|
104
|
+
it('should return true when app is already running', async () => {
|
|
105
|
+
mockExec.mockImplementation((command, callback) => {
|
|
106
|
+
if (command.includes('ps aux')) {
|
|
107
|
+
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
|
+
}
|
|
109
|
+
});
|
|
110
|
+
mockFs.existsSync.mockReturnValue(true);
|
|
111
|
+
mockFs.readFileSync.mockReturnValue(JSON.stringify({}));
|
|
112
|
+
const result = await (0, autostart_1.handleAutostart)(true);
|
|
113
|
+
expect(result).toBe(true);
|
|
114
|
+
});
|
|
115
|
+
it('should attempt to start app when not running', async () => {
|
|
116
|
+
mockExec.mockImplementation((command, callback) => {
|
|
117
|
+
if (command.includes('ps aux')) {
|
|
118
|
+
callback(null, '', '');
|
|
119
|
+
}
|
|
120
|
+
else if (command.includes('open -a "amaran Desktop"')) {
|
|
121
|
+
callback(null, '', '');
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
mockFs.existsSync.mockReturnValue(true);
|
|
125
|
+
mockFs.readFileSync.mockReturnValue(JSON.stringify({}));
|
|
126
|
+
const result = await (0, autostart_1.handleAutostart)(true);
|
|
127
|
+
expect(result).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
});
|
|
131
|
+
//# sourceMappingURL=autostart.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autostart.test.js","sourceRoot":"","sources":["../../src/__tests__/autostart.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,31 +2,37 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const suncalc_1 = require("suncalc");
|
|
4
4
|
const cctUtil_1 = require("../cctUtil");
|
|
5
|
+
const constants_1 = require("../constants");
|
|
5
6
|
describe('calculateCCT', () => {
|
|
6
7
|
const NYC_LAT = 40.7128;
|
|
7
8
|
const NYC_LON = -74.006;
|
|
9
|
+
// Use the actual defaults from the module for all tests
|
|
10
|
+
const MIN_INTENSITY_PCT = constants_1.CCT_DEFAULTS.intensityMinPct;
|
|
11
|
+
const MAX_INTENSITY_PCT = constants_1.CCT_DEFAULTS.intensityMaxPct;
|
|
12
|
+
const MIN_CCT = constants_1.CCT_DEFAULTS.cctMinK;
|
|
13
|
+
const MAX_CCT = constants_1.CCT_DEFAULTS.cctMaxK;
|
|
14
|
+
const MIN_INTENSITY_API = MIN_INTENSITY_PCT * 10; // API format (50)
|
|
15
|
+
const MAX_INTENSITY_API = MAX_INTENSITY_PCT * 10; // API format (1000)
|
|
8
16
|
describe('NYC circadian lighting tests', () => {
|
|
9
17
|
let testDate;
|
|
10
|
-
let
|
|
18
|
+
let _sunrise;
|
|
11
19
|
let sunset;
|
|
12
20
|
let solarNoon;
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const MIN_CCT = 2000;
|
|
16
|
-
const MAX_CCT = 6500;
|
|
17
|
-
const MIN_INTENSITY_API = MIN_INTENSITY_PCT * 10; // API format (50)
|
|
18
|
-
const MAX_INTENSITY_API = MAX_INTENSITY_PCT * 10; // API format (1000)
|
|
21
|
+
let nightEnd;
|
|
22
|
+
let night;
|
|
19
23
|
beforeAll(() => {
|
|
20
24
|
// Use a fixed date for consistent test results
|
|
21
25
|
testDate = new Date('2024-06-21T12:00:00Z'); // Summer solstice
|
|
22
26
|
const times = (0, suncalc_1.getTimes)(testDate, NYC_LAT, NYC_LON);
|
|
23
|
-
|
|
27
|
+
_sunrise = times.sunrise;
|
|
24
28
|
sunset = times.sunset;
|
|
25
29
|
solarNoon = times.solarNoon;
|
|
30
|
+
nightEnd = times.nightEnd;
|
|
31
|
+
night = times.night;
|
|
26
32
|
});
|
|
27
|
-
it('should return minimum CCT and intensity before
|
|
28
|
-
const
|
|
29
|
-
const result = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON,
|
|
33
|
+
it('should return minimum CCT and intensity before nightEnd', () => {
|
|
34
|
+
const beforeNightEnd = new Date(nightEnd.getTime() - 60000); // 1 minute before
|
|
35
|
+
const result = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON, beforeNightEnd, {
|
|
30
36
|
intensityMinPct: MIN_INTENSITY_PCT,
|
|
31
37
|
intensityMaxPct: MAX_INTENSITY_PCT,
|
|
32
38
|
cctMinK: MIN_CCT,
|
|
@@ -35,15 +41,15 @@ describe('calculateCCT', () => {
|
|
|
35
41
|
expect(result.cct).toBe(MIN_CCT);
|
|
36
42
|
expect(result.intensity).toBe(MIN_INTENSITY_API);
|
|
37
43
|
});
|
|
38
|
-
it('should return minimum CCT and intensity at
|
|
39
|
-
const
|
|
40
|
-
const result = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON,
|
|
44
|
+
it('should return minimum CCT and intensity at nightEnd edge', () => {
|
|
45
|
+
const atNightEnd = new Date(nightEnd.getTime());
|
|
46
|
+
const result = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON, atNightEnd, {
|
|
41
47
|
intensityMinPct: MIN_INTENSITY_PCT,
|
|
42
48
|
intensityMaxPct: MAX_INTENSITY_PCT,
|
|
43
49
|
cctMinK: MIN_CCT,
|
|
44
50
|
cctMaxK: MAX_CCT,
|
|
45
51
|
});
|
|
46
|
-
// At the exact
|
|
52
|
+
// At the exact nightEnd moment, should be at minimum for empirical curves
|
|
47
53
|
expect(result.cct).toBe(MIN_CCT);
|
|
48
54
|
expect(result.intensity).toBe(MIN_INTENSITY_API);
|
|
49
55
|
});
|
|
@@ -59,21 +65,21 @@ describe('calculateCCT', () => {
|
|
|
59
65
|
expect(result.cct).toBe(MAX_CCT);
|
|
60
66
|
expect(result.intensity).toBe(MAX_INTENSITY_API);
|
|
61
67
|
});
|
|
62
|
-
it('should return minimum CCT and intensity at
|
|
63
|
-
const
|
|
64
|
-
const result = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON,
|
|
68
|
+
it('should return minimum CCT and intensity at night edge', () => {
|
|
69
|
+
const atNight = new Date(night.getTime());
|
|
70
|
+
const result = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON, atNight, {
|
|
65
71
|
intensityMinPct: MIN_INTENSITY_PCT,
|
|
66
72
|
intensityMaxPct: MAX_INTENSITY_PCT,
|
|
67
73
|
cctMinK: MIN_CCT,
|
|
68
74
|
cctMaxK: MAX_CCT,
|
|
69
75
|
});
|
|
70
|
-
// At the exact
|
|
76
|
+
// At the exact night moment, should be at minimum
|
|
71
77
|
expect(result.cct).toBe(MIN_CCT);
|
|
72
78
|
expect(result.intensity).toBe(MIN_INTENSITY_API);
|
|
73
79
|
});
|
|
74
|
-
it('should return minimum CCT and intensity after
|
|
75
|
-
const
|
|
76
|
-
const result = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON,
|
|
80
|
+
it('should return minimum CCT and intensity after night', () => {
|
|
81
|
+
const afterNight = new Date(night.getTime() + 60000); // 1 minute after
|
|
82
|
+
const result = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON, afterNight, {
|
|
77
83
|
intensityMinPct: MIN_INTENSITY_PCT,
|
|
78
84
|
intensityMaxPct: MAX_INTENSITY_PCT,
|
|
79
85
|
cctMinK: MIN_CCT,
|
|
@@ -82,8 +88,8 @@ describe('calculateCCT', () => {
|
|
|
82
88
|
expect(result.cct).toBe(MIN_CCT);
|
|
83
89
|
expect(result.intensity).toBe(MIN_INTENSITY_API);
|
|
84
90
|
});
|
|
85
|
-
it('should have smooth progression from
|
|
86
|
-
const quarterWay = new Date(
|
|
91
|
+
it('should have smooth progression from nightEnd to noon', () => {
|
|
92
|
+
const quarterWay = new Date(nightEnd.getTime() + (solarNoon.getTime() - nightEnd.getTime()) / 4);
|
|
87
93
|
const result = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON, quarterWay, {
|
|
88
94
|
intensityMinPct: MIN_INTENSITY_PCT,
|
|
89
95
|
intensityMaxPct: MAX_INTENSITY_PCT,
|
|
@@ -115,25 +121,32 @@ describe('calculateCCT', () => {
|
|
|
115
121
|
it('should handle midnight times', () => {
|
|
116
122
|
const midnight = new Date('2024-06-21T04:00:00Z'); // Midnight in NYC
|
|
117
123
|
const result = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON, midnight);
|
|
118
|
-
expect(result.cct).toBe(
|
|
119
|
-
expect(result.intensity).toBe(
|
|
124
|
+
expect(result.cct).toBe(MIN_CCT);
|
|
125
|
+
expect(result.intensity).toBe(MIN_INTENSITY_API);
|
|
120
126
|
});
|
|
121
127
|
it('should return valid results for different locations', () => {
|
|
122
128
|
const LONDON_LAT = 51.5074;
|
|
123
129
|
const LONDON_LON = -0.1278;
|
|
124
130
|
const testDate = new Date('2024-06-21T12:00:00Z');
|
|
125
131
|
const result = (0, cctUtil_1.calculateCCT)(LONDON_LAT, LONDON_LON, testDate);
|
|
126
|
-
expect(result.cct).toBeGreaterThanOrEqual(
|
|
127
|
-
expect(result.cct).toBeLessThanOrEqual(
|
|
128
|
-
expect(result.intensity).toBeGreaterThanOrEqual(
|
|
129
|
-
expect(result.intensity).toBeLessThanOrEqual(
|
|
132
|
+
expect(result.cct).toBeGreaterThanOrEqual(MIN_CCT);
|
|
133
|
+
expect(result.cct).toBeLessThanOrEqual(MAX_CCT);
|
|
134
|
+
expect(result.intensity).toBeGreaterThanOrEqual(MIN_INTENSITY_API); // 5% minimum
|
|
135
|
+
expect(result.intensity).toBeLessThanOrEqual(MAX_INTENSITY_API);
|
|
136
|
+
});
|
|
137
|
+
it('should use default options when none provided', () => {
|
|
138
|
+
const result = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON, new Date('2024-06-21T12:00:00Z'));
|
|
139
|
+
expect(result.cct).toBeGreaterThanOrEqual(MIN_CCT);
|
|
140
|
+
expect(result.cct).toBeLessThanOrEqual(MAX_CCT);
|
|
141
|
+
expect(result.intensity).toBeGreaterThanOrEqual(MIN_INTENSITY_API); // 5% minimum
|
|
142
|
+
expect(result.intensity).toBeLessThanOrEqual(MAX_INTENSITY_API);
|
|
130
143
|
});
|
|
131
144
|
it('should use default date if not provided', () => {
|
|
132
145
|
const result = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON);
|
|
133
|
-
expect(result.cct).toBeGreaterThanOrEqual(
|
|
134
|
-
expect(result.cct).toBeLessThanOrEqual(
|
|
135
|
-
expect(result.intensity).toBeGreaterThanOrEqual(
|
|
136
|
-
expect(result.intensity).toBeLessThanOrEqual(
|
|
146
|
+
expect(result.cct).toBeGreaterThanOrEqual(MIN_CCT);
|
|
147
|
+
expect(result.cct).toBeLessThanOrEqual(MAX_CCT);
|
|
148
|
+
expect(result.intensity).toBeGreaterThanOrEqual(MIN_INTENSITY_API); // 5% minimum
|
|
149
|
+
expect(result.intensity).toBeLessThanOrEqual(MAX_INTENSITY_API);
|
|
137
150
|
});
|
|
138
151
|
});
|
|
139
152
|
describe('Return value format', () => {
|
|
@@ -155,13 +168,13 @@ describe('calculateCCT', () => {
|
|
|
155
168
|
describe('Intensity ranges', () => {
|
|
156
169
|
const NYC_LAT = 40.7128;
|
|
157
170
|
const NYC_LON = -74.006;
|
|
158
|
-
it(
|
|
171
|
+
it(`intensity stays within [${MIN_INTENSITY_API}, ${MAX_INTENSITY_API}] across a whole day (hourly samples)`, () => {
|
|
159
172
|
const base = new Date('2024-06-21T00:00:00Z'); // summer solstice
|
|
160
173
|
for (let hour = 0; hour < 24; hour++) {
|
|
161
174
|
const sample = new Date(base.getTime() + hour * 60 * 60 * 1000);
|
|
162
175
|
const { intensity } = (0, cctUtil_1.calculateCCT)(NYC_LAT, NYC_LON, sample);
|
|
163
|
-
expect(intensity).toBeGreaterThanOrEqual(
|
|
164
|
-
expect(intensity).toBeLessThanOrEqual(
|
|
176
|
+
expect(intensity).toBeGreaterThanOrEqual(MIN_INTENSITY_API); // 5% minimum
|
|
177
|
+
expect(intensity).toBeLessThanOrEqual(MAX_INTENSITY_API);
|
|
165
178
|
}
|
|
166
179
|
});
|
|
167
180
|
it('intensity stays within range across seasons and locations (spot samples)', () => {
|
|
@@ -184,8 +197,8 @@ describe('calculateCCT', () => {
|
|
|
184
197
|
for (const h of offsetsHours) {
|
|
185
198
|
const d = new Date(base.getTime() + h * 60 * 60 * 1000);
|
|
186
199
|
const { intensity } = (0, cctUtil_1.calculateCCT)(lat, lon, d);
|
|
187
|
-
expect(intensity).toBeGreaterThanOrEqual(
|
|
188
|
-
expect(intensity).toBeLessThanOrEqual(
|
|
200
|
+
expect(intensity).toBeGreaterThanOrEqual(MIN_INTENSITY_API); // 5% minimum
|
|
201
|
+
expect(intensity).toBeLessThanOrEqual(MAX_INTENSITY_API);
|
|
189
202
|
}
|
|
190
203
|
}
|
|
191
204
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cctUtil.test.js","sourceRoot":"","sources":["../../src/__tests__/cctUtil.test.ts"],"names":[],"mappings":";;AAAA,qCAAmC;AACnC,wCAA0C;
|
|
1
|
+
{"version":3,"file":"cctUtil.test.js","sourceRoot":"","sources":["../../src/__tests__/cctUtil.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,13 +6,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
const node_child_process_1 = require("node:child_process");
|
|
7
7
|
const node_path_1 = __importDefault(require("node:path"));
|
|
8
8
|
describe('CLI Smoke Test', () => {
|
|
9
|
-
|
|
9
|
+
const runTest = process.platform === 'darwin' ? it : it.skip;
|
|
10
|
+
runTest('should run cli help without error - macOS only', (done) => {
|
|
10
11
|
const cliPath = node_path_1.default.resolve(__dirname, '../../dist/cli.js');
|
|
11
|
-
(0, node_child_process_1.exec)(`node ${cliPath} --help`, (error, stdout, _stderr) => {
|
|
12
|
+
(0, node_child_process_1.exec)(`node ${cliPath} --help`, { timeout: 10000 }, (error, stdout, _stderr) => {
|
|
12
13
|
expect(error).toBeNull();
|
|
13
14
|
expect(stdout).toMatch(/Usage|Help|Options/i);
|
|
14
15
|
done();
|
|
15
16
|
});
|
|
16
|
-
});
|
|
17
|
+
}, 15000);
|
|
17
18
|
});
|
|
18
19
|
//# sourceMappingURL=cli.smoke.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.smoke.test.ts"],"names":[],"mappings":";;;;;AAAA,2DAA0C;AAC1C,0DAA6B;AAE7B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"cli.smoke.test.js","sourceRoot":"","sources":["../../src/__tests__/cli.smoke.test.ts"],"names":[],"mappings":";;;;;AAAA,2DAA0C;AAC1C,0DAA6B;AAE7B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,OAAO,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC;IAE7D,OAAO,CAAC,gDAAgD,EAAE,CAAC,IAAI,EAAE,EAAE;QACjE,MAAM,OAAO,GAAG,mBAAI,CAAC,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;QAC7D,IAAA,yBAAI,EAAC,QAAQ,OAAO,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE;YAC5E,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YACzB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;YAC9C,IAAI,EAAE,CAAC;QACT,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,KAAK,CAAC,CAAC;AACZ,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intensityApi.test.js","sourceRoot":"","sources":["../../src/__tests__/intensityApi.test.ts"],"names":[],"mappings":";;;;;AAAA,yCAAoC;AACpC,2DAA2C;
|
|
1
|
+
{"version":3,"file":"intensityApi.test.js","sourceRoot":"","sources":["../../src/__tests__/intensityApi.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupTests.d.ts","sourceRoot":"","sources":["../../src/__tests__/setupTests.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
// Setup test environment before running tests
|
|
4
|
+
const node_localstorage_1 = require("node-localstorage");
|
|
5
|
+
const path_1 = require("path");
|
|
6
|
+
const fs_1 = require("fs");
|
|
7
|
+
// Create a temporary directory for test local storage
|
|
8
|
+
const TEST_STORAGE_DIR = (0, path_1.join)(__dirname, '.test-storage');
|
|
9
|
+
try {
|
|
10
|
+
// Ensure the test storage directory exists
|
|
11
|
+
(0, fs_1.mkdirSync)(TEST_STORAGE_DIR, { recursive: true });
|
|
12
|
+
// Set up global localStorage for tests
|
|
13
|
+
global.localStorage = new node_localstorage_1.LocalStorage(TEST_STORAGE_DIR);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
console.error('Failed to set up test storage:', error);
|
|
17
|
+
process.exit(1);
|
|
18
|
+
}
|
|
19
|
+
// Mock any other global objects if needed
|
|
20
|
+
process.env.NODE_ENV = 'test';
|
|
21
|
+
//# sourceMappingURL=setupTests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setupTests.js","sourceRoot":"","sources":["../../src/__tests__/setupTests.ts"],"names":[],"mappings":";;AAAA,8CAA8C;AAC9C,yDAAiD;AACjD,+BAA4B;AAC5B,2BAA+B;AAE/B,sDAAsD;AACtD,MAAM,gBAAgB,GAAG,IAAA,WAAI,EAAC,SAAS,EAAE,eAAe,CAAC,CAAC;AAE1D,IAAI,CAAC;IACH,2CAA2C;IAC3C,IAAA,cAAS,EAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjD,uCAAuC;IACvC,MAAM,CAAC,YAAY,GAAG,IAAI,gCAAY,CAAC,gBAAgB,CAAC,CAAC;AAC3D,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;IACvD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,0CAA0C;AAC1C,OAAO,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC"}
|