xs-dev 0.38.1 → 1.0.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 (61) hide show
  1. package/README.md +1 -1
  2. package/build/package.json +13 -3
  3. package/build/src/commands/doctor.js +4 -3
  4. package/build/src/commands/init.js +3 -3
  5. package/build/src/commands/remove.js +2 -2
  6. package/build/src/commands/setup.js +21 -7
  7. package/build/src/toolbox/setup/ejectfix.js +29 -26
  8. package/build/src/toolbox/setup/esp32/linux.js +7 -3
  9. package/build/src/toolbox/setup/esp32/mac.js +5 -3
  10. package/build/src/toolbox/setup/esp32/windows.js +4 -2
  11. package/build/src/toolbox/setup/esp32.js +18 -8
  12. package/build/src/toolbox/setup/esp8266/linux.js +10 -4
  13. package/build/src/toolbox/setup/esp8266/mac.js +5 -3
  14. package/build/src/toolbox/setup/esp8266/windows.js +10 -9
  15. package/build/src/toolbox/setup/esp8266.js +16 -10
  16. package/build/src/toolbox/setup/lin.js +19 -7
  17. package/build/src/toolbox/setup/mac.js +14 -9
  18. package/build/src/toolbox/setup/moddable.js +35 -28
  19. package/build/src/toolbox/setup/nrf52/windows.js +5 -3
  20. package/build/src/toolbox/setup/nrf52.js +12 -10
  21. package/build/src/toolbox/setup/pico/linux.js +6 -2
  22. package/build/src/toolbox/setup/pico/mac.js +4 -2
  23. package/build/src/toolbox/setup/pico.js +10 -4
  24. package/build/src/toolbox/setup/wasm.js +7 -5
  25. package/build/src/toolbox/setup/windows.js +21 -14
  26. package/build/src/toolbox/system/__tests__/errors.test.js +163 -0
  27. package/build/src/toolbox/system/__tests__/exec.test.js +130 -0
  28. package/build/src/toolbox/system/errors.js +106 -0
  29. package/build/src/toolbox/system/exec.js +34 -28
  30. package/build/src/toolbox/system/packages.js +29 -26
  31. package/build/src/toolbox/system/python.js +11 -4
  32. package/build/src/toolbox/update/esp32.js +6 -4
  33. package/build/src/toolbox/update/lin.js +8 -2
  34. package/build/src/toolbox/update/mac.js +8 -2
  35. package/build/types/src/toolbox/setup/ejectfix.d.ts +2 -1
  36. package/build/types/src/toolbox/setup/esp32/linux.d.ts +2 -1
  37. package/build/types/src/toolbox/setup/esp32/mac.d.ts +2 -1
  38. package/build/types/src/toolbox/setup/esp32/windows.d.ts +2 -1
  39. package/build/types/src/toolbox/setup/esp32.d.ts +2 -1
  40. package/build/types/src/toolbox/setup/esp8266/linux.d.ts +2 -1
  41. package/build/types/src/toolbox/setup/esp8266/mac.d.ts +2 -1
  42. package/build/types/src/toolbox/setup/esp8266/windows.d.ts +3 -2
  43. package/build/types/src/toolbox/setup/esp8266.d.ts +2 -1
  44. package/build/types/src/toolbox/setup/lin.d.ts +2 -1
  45. package/build/types/src/toolbox/setup/mac.d.ts +2 -1
  46. package/build/types/src/toolbox/setup/moddable.d.ts +4 -3
  47. package/build/types/src/toolbox/setup/nrf52/windows.d.ts +2 -1
  48. package/build/types/src/toolbox/setup/nrf52.d.ts +2 -1
  49. package/build/types/src/toolbox/setup/pico/linux.d.ts +2 -1
  50. package/build/types/src/toolbox/setup/pico/mac.d.ts +2 -1
  51. package/build/types/src/toolbox/setup/pico.d.ts +2 -1
  52. package/build/types/src/toolbox/setup/wasm.d.ts +2 -1
  53. package/build/types/src/toolbox/setup/windows.d.ts +3 -2
  54. package/build/types/src/toolbox/system/__tests__/errors.test.d.ts +1 -0
  55. package/build/types/src/toolbox/system/__tests__/exec.test.d.ts +1 -0
  56. package/build/types/src/toolbox/system/errors.d.ts +51 -0
  57. package/build/types/src/toolbox/system/exec.d.ts +6 -5
  58. package/build/types/src/toolbox/system/packages.d.ts +3 -2
  59. package/build/types/src/toolbox/system/python.d.ts +2 -1
  60. package/build/types/src/types.d.ts +10 -0
  61. package/package.json +13 -3
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const errors_1 = require("../errors");
4
+ describe('Error Handling Utilities', () => {
5
+ describe('success', () => {
6
+ it('should create a successful result with data', () => {
7
+ const result = (0, errors_1.success)('test data');
8
+ expect(result).toEqual({ success: true, data: 'test data' });
9
+ expect((0, errors_1.isSuccess)(result)).toBe(true);
10
+ expect((0, errors_1.isFailure)(result)).toBe(false);
11
+ });
12
+ it('should work with different data types', () => {
13
+ const numberResult = (0, errors_1.success)(42);
14
+ if ((0, errors_1.isSuccess)(numberResult)) {
15
+ expect(numberResult.data).toBe(42);
16
+ }
17
+ const objectResult = (0, errors_1.success)({ key: 'value' });
18
+ if ((0, errors_1.isSuccess)(objectResult)) {
19
+ expect(objectResult.data).toEqual({ key: 'value' });
20
+ }
21
+ });
22
+ });
23
+ describe('successVoid', () => {
24
+ it('should create a successful result with void data', () => {
25
+ const result = (0, errors_1.successVoid)();
26
+ expect(result).toEqual({ success: true, data: undefined });
27
+ expect((0, errors_1.isSuccess)(result)).toBe(true);
28
+ });
29
+ });
30
+ describe('failure', () => {
31
+ it('should create a failed result with error message', () => {
32
+ const result = (0, errors_1.failure)('error message');
33
+ expect(result).toEqual({ success: false, error: 'error message' });
34
+ expect((0, errors_1.isSuccess)(result)).toBe(false);
35
+ expect((0, errors_1.isFailure)(result)).toBe(true);
36
+ });
37
+ });
38
+ describe('wrapAsync', () => {
39
+ it('should wrap successful async operations', async () => {
40
+ const asyncFn = async () => 'success';
41
+ const result = await (0, errors_1.wrapAsync)(asyncFn);
42
+ expect((0, errors_1.isSuccess)(result)).toBe(true);
43
+ if ((0, errors_1.isSuccess)(result)) {
44
+ expect(result.data).toBe('success');
45
+ }
46
+ });
47
+ it('should wrap failed async operations', async () => {
48
+ const asyncFn = async () => {
49
+ throw new Error('async error');
50
+ };
51
+ const result = await (0, errors_1.wrapAsync)(asyncFn);
52
+ expect((0, errors_1.isFailure)(result)).toBe(true);
53
+ if ((0, errors_1.isFailure)(result)) {
54
+ expect(result.error).toBe('async error');
55
+ }
56
+ });
57
+ it('should handle non-Error thrown values', async () => {
58
+ const asyncFn = async () => {
59
+ throw 'string error';
60
+ };
61
+ const result = await (0, errors_1.wrapAsync)(asyncFn);
62
+ expect((0, errors_1.isFailure)(result)).toBe(true);
63
+ if ((0, errors_1.isFailure)(result)) {
64
+ expect(result.error).toBe('string error');
65
+ }
66
+ });
67
+ });
68
+ describe('wrapSync', () => {
69
+ it('should wrap successful sync operations', () => {
70
+ const syncFn = () => 'success';
71
+ const result = (0, errors_1.wrapSync)(syncFn);
72
+ expect((0, errors_1.isSuccess)(result)).toBe(true);
73
+ if ((0, errors_1.isSuccess)(result)) {
74
+ expect(result.data).toBe('success');
75
+ }
76
+ });
77
+ it('should wrap failed sync operations', () => {
78
+ const syncFn = () => {
79
+ throw new Error('sync error');
80
+ };
81
+ const result = (0, errors_1.wrapSync)(syncFn);
82
+ expect((0, errors_1.isFailure)(result)).toBe(true);
83
+ if ((0, errors_1.isFailure)(result)) {
84
+ expect(result.error).toBe('sync error');
85
+ }
86
+ });
87
+ });
88
+ describe('unwrap', () => {
89
+ it('should extract data from successful results', () => {
90
+ const result = (0, errors_1.success)('test data');
91
+ expect((0, errors_1.unwrap)(result)).toBe('test data');
92
+ });
93
+ it('should throw for failed results', () => {
94
+ const result = (0, errors_1.failure)('error message');
95
+ expect(() => (0, errors_1.unwrap)(result)).toThrow('error message');
96
+ });
97
+ });
98
+ describe('unwrapOr', () => {
99
+ it('should extract data from successful results', () => {
100
+ const result = (0, errors_1.success)('test data');
101
+ expect((0, errors_1.unwrapOr)(result, 'default')).toBe('test data');
102
+ });
103
+ it('should return default value for failed results', () => {
104
+ const result = (0, errors_1.failure)('error message');
105
+ expect((0, errors_1.unwrapOr)(result, 'default')).toBe('default');
106
+ });
107
+ });
108
+ describe('mapResult', () => {
109
+ it('should transform successful results', () => {
110
+ const result = (0, errors_1.success)('test');
111
+ const mapped = (0, errors_1.mapResult)(result, (data) => data.toUpperCase());
112
+ expect((0, errors_1.isSuccess)(mapped)).toBe(true);
113
+ if ((0, errors_1.isSuccess)(mapped)) {
114
+ expect(mapped.data).toBe('TEST');
115
+ }
116
+ });
117
+ it('should pass through failed results', () => {
118
+ const result = (0, errors_1.failure)('error message');
119
+ const mapped = (0, errors_1.mapResult)(result, (data) => data.toUpperCase());
120
+ expect((0, errors_1.isFailure)(mapped)).toBe(true);
121
+ if ((0, errors_1.isFailure)(mapped)) {
122
+ expect(mapped.error).toBe('error message');
123
+ }
124
+ });
125
+ });
126
+ describe('flatMapResult', () => {
127
+ it('should chain successful results', () => {
128
+ const result = (0, errors_1.success)('test');
129
+ const chained = (0, errors_1.flatMapResult)(result, (data) => (0, errors_1.success)(data.length));
130
+ expect((0, errors_1.isSuccess)(chained)).toBe(true);
131
+ if ((0, errors_1.isSuccess)(chained)) {
132
+ expect(chained.data).toBe(4);
133
+ }
134
+ });
135
+ it('should chain to failed results', () => {
136
+ const result = (0, errors_1.success)('test');
137
+ const chained = (0, errors_1.flatMapResult)(result, (_data) => (0, errors_1.failure)('chained error'));
138
+ expect((0, errors_1.isFailure)(chained)).toBe(true);
139
+ if ((0, errors_1.isFailure)(chained)) {
140
+ expect(chained.error).toBe('chained error');
141
+ }
142
+ });
143
+ it('should pass through failed results', () => {
144
+ const result = (0, errors_1.failure)('original error');
145
+ const chained = (0, errors_1.flatMapResult)(result, (data) => (0, errors_1.success)(data.length));
146
+ expect((0, errors_1.isFailure)(chained)).toBe(true);
147
+ if ((0, errors_1.isFailure)(chained)) {
148
+ expect(chained.error).toBe('original error');
149
+ }
150
+ });
151
+ });
152
+ describe('type guards', () => {
153
+ it('should correctly identify success results', () => {
154
+ const successResult = (0, errors_1.success)('data');
155
+ const failureResult = (0, errors_1.failure)('error');
156
+ expect((0, errors_1.isSuccess)(successResult)).toBe(true);
157
+ expect((0, errors_1.isFailure)(successResult)).toBe(false);
158
+ expect((0, errors_1.isSuccess)(failureResult)).toBe(false);
159
+ expect((0, errors_1.isFailure)(failureResult)).toBe(true);
160
+ });
161
+ });
162
+ });
163
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvdG9vbGJveC9zeXN0ZW0vX190ZXN0c19fL2Vycm9ycy50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsc0NBWWtCO0FBRWxCLFFBQVEsQ0FBQywwQkFBMEIsRUFBRSxHQUFHLEVBQUU7SUFDeEMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUU7UUFDdkIsRUFBRSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtZQUNyRCxNQUFNLE1BQU0sR0FBRyxJQUFBLGdCQUFPLEVBQUMsV0FBVyxDQUFDLENBQUE7WUFDbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUE7WUFDNUQsTUFBTSxDQUFDLElBQUEsa0JBQVMsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNwQyxNQUFNLENBQUMsSUFBQSxrQkFBUyxFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3ZDLENBQUMsQ0FBQyxDQUFBO1FBRUYsRUFBRSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtZQUMvQyxNQUFNLFlBQVksR0FBRyxJQUFBLGdCQUFPLEVBQUMsRUFBRSxDQUFDLENBQUE7WUFDaEMsSUFBSSxJQUFBLGtCQUFTLEVBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDcEMsQ0FBQztZQUVELE1BQU0sWUFBWSxHQUFHLElBQUEsZ0JBQU8sRUFBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFBO1lBQzlDLElBQUksSUFBQSxr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
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const gluegun_1 = require("gluegun");
4
+ const exec_1 = require("../exec");
5
+ const errors_1 = require("../errors");
6
+ // Mock gluegun system
7
+ jest.mock('gluegun', () => ({
8
+ system: {
9
+ which: jest.fn(),
10
+ exec: jest.fn(),
11
+ spawn: jest.fn(),
12
+ },
13
+ filesystem: {
14
+ homedir: jest.fn(() => '/home/user'),
15
+ resolve: jest.fn((...paths) => paths.join('/')),
16
+ },
17
+ }));
18
+ // Mock the constants file to avoid filesystem dependency issues
19
+ jest.mock('../../setup/constants', () => ({
20
+ EXPORTS_FILE_PATH: '/home/user/.local/share/xs-dev-exports.sh',
21
+ }));
22
+ const mockSystem = gluegun_1.system;
23
+ describe('Exec Utilities', () => {
24
+ beforeEach(() => {
25
+ jest.clearAllMocks();
26
+ // Reset environment
27
+ delete process.env.SUDO_ASKPASS;
28
+ });
29
+ describe('execWithSudo', () => {
30
+ it('should succeed with non-interactive sudo', async () => {
31
+ mockSystem.exec.mockResolvedValueOnce('success');
32
+ const result = await (0, exec_1.execWithSudo)('test command');
33
+ expect((0, errors_1.isSuccess)(result)).toBe(true);
34
+ expect(mockSystem.exec).toHaveBeenCalledWith('sudo --non-interactive --preserve-env test command', {});
35
+ });
36
+ it('should fall back to askpass when password is required', async () => {
37
+ // First call fails with password error
38
+ mockSystem.exec
39
+ .mockRejectedValueOnce(new Error('password required'))
40
+ .mockResolvedValueOnce('success with askpass');
41
+ // Mock ssh-askpass being available
42
+ mockSystem.which.mockReturnValue('/usr/bin/ssh-askpass');
43
+ const result = await (0, exec_1.execWithSudo)('test command');
44
+ expect((0, errors_1.isSuccess)(result)).toBe(true);
45
+ expect(mockSystem.exec).toHaveBeenCalledTimes(2);
46
+ expect(mockSystem.exec).toHaveBeenNthCalledWith(1, 'sudo --non-interactive --preserve-env test command', {});
47
+ expect(mockSystem.exec).toHaveBeenNthCalledWith(2, 'sudo --askpass --preserve-env test command', {});
48
+ expect(process.env.SUDO_ASKPASS).toBe('/usr/bin/ssh-askpass');
49
+ });
50
+ it('should fail when ssh-askpass is not available', async () => {
51
+ mockSystem.exec.mockRejectedValueOnce(new Error('password required'));
52
+ mockSystem.which.mockReturnValue(undefined);
53
+ const result = await (0, exec_1.execWithSudo)('test command');
54
+ expect((0, errors_1.isFailure)(result)).toBe(true);
55
+ if ((0, errors_1.isFailure)(result)) {
56
+ expect(result.error).toBe('ssh-askpass required to prompt for password');
57
+ }
58
+ });
59
+ it('should fail with non-password errors', async () => {
60
+ mockSystem.exec.mockRejectedValueOnce(new Error('permission denied'));
61
+ const result = await (0, exec_1.execWithSudo)('test command');
62
+ expect((0, errors_1.isFailure)(result)).toBe(true);
63
+ if ((0, errors_1.isFailure)(result)) {
64
+ expect(result.error).toContain('Failed to execute sudo command');
65
+ }
66
+ });
67
+ it('should pass through options', async () => {
68
+ mockSystem.exec.mockResolvedValueOnce('success');
69
+ const options = { stdout: 'pipe' };
70
+ await (0, exec_1.execWithSudo)('test command', options);
71
+ expect(mockSystem.exec).toHaveBeenCalledWith('sudo --non-interactive --preserve-env test command', options);
72
+ });
73
+ });
74
+ describe('pkexec', () => {
75
+ it('should execute command with pkexec', async () => {
76
+ mockSystem.exec.mockResolvedValueOnce('success');
77
+ const result = await (0, exec_1.pkexec)('test command');
78
+ expect((0, errors_1.isSuccess)(result)).toBe(true);
79
+ expect(mockSystem.exec).toHaveBeenCalledWith('pkexec test command', {});
80
+ });
81
+ it('should handle pkexec failures', async () => {
82
+ mockSystem.exec.mockRejectedValueOnce(new Error('pkexec failed'));
83
+ const result = await (0, exec_1.pkexec)('test command');
84
+ expect((0, errors_1.isFailure)(result)).toBe(true);
85
+ });
86
+ it('should pass through options', async () => {
87
+ mockSystem.exec.mockResolvedValueOnce('success');
88
+ const options = { cwd: '/tmp' };
89
+ await (0, exec_1.pkexec)('test command', options);
90
+ expect(mockSystem.exec).toHaveBeenCalledWith('pkexec test command', options);
91
+ });
92
+ });
93
+ describe('sourceEnvironment', () => {
94
+ it('should call system.spawn with correct command', async () => {
95
+ mockSystem.spawn.mockResolvedValueOnce({
96
+ stdout: 'PATH=/usr/bin:/bin\nHOME=/home/user\n',
97
+ });
98
+ const result = await (0, exec_1.sourceEnvironment)();
99
+ expect((0, errors_1.isSuccess)(result)).toBe(true);
100
+ expect(mockSystem.spawn).toHaveBeenCalled();
101
+ });
102
+ it('should handle spawn errors', async () => {
103
+ mockSystem.spawn.mockRejectedValueOnce(new Error('spawn failed'));
104
+ const result = await (0, exec_1.sourceEnvironment)();
105
+ expect((0, errors_1.isFailure)(result)).toBe(true);
106
+ });
107
+ });
108
+ describe('sourceIdf', () => {
109
+ it('should call system.spawn with IDF export command', async () => {
110
+ mockSystem.spawn.mockResolvedValueOnce({
111
+ stdout: 'PATH=/esp/bin:/usr/bin\nIDF_PATH=/esp/esp-idf\n',
112
+ });
113
+ const result = await (0, exec_1.sourceIdf)();
114
+ expect((0, errors_1.isSuccess)(result)).toBe(true);
115
+ expect(mockSystem.spawn).toHaveBeenCalledWith('source $IDF_PATH/export.sh 1> /dev/null && env', { shell: process.env.SHELL });
116
+ });
117
+ });
118
+ describe('sourceIdfPythonEnv', () => {
119
+ it('should call system.spawn with Python environment activation', async () => {
120
+ process.env.IDF_PYTHON_ENV_PATH = '/path/to/python/env';
121
+ mockSystem.spawn.mockResolvedValueOnce({
122
+ stdout: 'PATH=/python/env/bin:/usr/bin\nVIRTUAL_ENV=/python/env\n',
123
+ });
124
+ const result = await (0, exec_1.sourceIdfPythonEnv)();
125
+ expect((0, errors_1.isSuccess)(result)).toBe(true);
126
+ expect(mockSystem.spawn).toHaveBeenCalledWith('source /path/to/python/env/bin/activate && env', { shell: process.env.SHELL });
127
+ });
128
+ });
129
+ });
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Rvb2xib3gvc3lzdGVtL19fdGVzdHNfXy9leGVjLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FBZ0M7QUFDaEMsa0NBTWdCO0FBQ2hCLHNDQUFnRDtBQUVoRCxzQkFBc0I7QUFDdEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMxQixNQUFNLEVBQUU7UUFDTixLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNoQixJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO0tBQ2pCO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDO1FBQ3BDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFlLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDMUQ7Q0FDRixDQUFDLENBQUMsQ0FBQTtBQUVILGdFQUFnRTtBQUNoRSxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDeEMsaUJBQWlCLEVBQUUsMkNBQTJDO0NBQy9ELENBQUMsQ0FBQyxDQUFBO0FBRUgsTUFBTSxVQUFVLEdBQUcsZ0JBQW9DLENBQUE7QUFFdkQsUUFBUSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRTtJQUM5QixVQUFVLENBQUMsR0FBRyxFQUFFO1FBQ2QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3BCLG9CQUFvQjtRQUNwQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFBO0lBQ2pDLENBQUMsQ0FBQyxDQUFB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
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.success = success;
4
+ exports.successVoid = successVoid;
5
+ exports.failure = failure;
6
+ exports.wrapAsync = wrapAsync;
7
+ exports.wrapSync = wrapSync;
8
+ exports.isSuccess = isSuccess;
9
+ exports.isFailure = isFailure;
10
+ exports.unwrap = unwrap;
11
+ exports.unwrapOr = unwrapOr;
12
+ exports.mapResult = mapResult;
13
+ exports.flatMapResult = flatMapResult;
14
+ /**
15
+ * Creates a successful result
16
+ */
17
+ function success(data) {
18
+ return { success: true, data };
19
+ }
20
+ /**
21
+ * Creates a successful result with no data (void)
22
+ */
23
+ function successVoid() {
24
+ return { success: true, data: undefined };
25
+ }
26
+ /**
27
+ * Creates a failed result with error message
28
+ */
29
+ function failure(error) {
30
+ return { success: false, error };
31
+ }
32
+ /**
33
+ * Wraps a function that might throw in a Result type
34
+ */
35
+ async function wrapAsync(fn) {
36
+ try {
37
+ const result = await fn();
38
+ return success(result);
39
+ }
40
+ catch (error) {
41
+ const message = error instanceof Error ? error.message : String(error);
42
+ return failure(message);
43
+ }
44
+ }
45
+ /**
46
+ * Wraps a synchronous function that might throw in a Result type
47
+ */
48
+ function wrapSync(fn) {
49
+ try {
50
+ const result = fn();
51
+ return success(result);
52
+ }
53
+ catch (error) {
54
+ const message = error instanceof Error ? error.message : String(error);
55
+ return failure(message);
56
+ }
57
+ }
58
+ /**
59
+ * Checks if a Result is successful
60
+ */
61
+ function isSuccess(result) {
62
+ return result.success;
63
+ }
64
+ /**
65
+ * Checks if a Result is a failure
66
+ */
67
+ function isFailure(result) {
68
+ return !result.success;
69
+ }
70
+ /**
71
+ * Gets data from a successful result or throws if failed
72
+ */
73
+ function unwrap(result) {
74
+ if (isSuccess(result)) {
75
+ return result.data;
76
+ }
77
+ throw new Error(result.error);
78
+ }
79
+ /**
80
+ * Gets data from a successful result or returns default value if failed
81
+ */
82
+ function unwrapOr(result, defaultValue) {
83
+ if (isSuccess(result)) {
84
+ return result.data;
85
+ }
86
+ return defaultValue;
87
+ }
88
+ /**
89
+ * Maps the data of a successful result, or passes through the error
90
+ */
91
+ function mapResult(result, fn) {
92
+ if (isSuccess(result)) {
93
+ return success(fn(result.data));
94
+ }
95
+ return result;
96
+ }
97
+ /**
98
+ * Chains Result operations together
99
+ */
100
+ function flatMapResult(result, fn) {
101
+ if (isSuccess(result)) {
102
+ return fn(result.data);
103
+ }
104
+ return result;
105
+ }
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3Rvb2xib3gvc3lzdGVtL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUtBLDBCQUVDO0FBS0Qsa0NBRUM7QUFLRCwwQkFFQztBQUtELDhCQVFDO0FBS0QsNEJBUUM7QUFLRCw4QkFJQztBQUtELDhCQUlDO0FBS0Qsd0JBS0M7QUFLRCw0QkFLQztBQUtELDhCQVFDO0FBS0Qsc0NBUUM7QUE3R0Q7O0dBRUc7QUFDSCxTQUFnQixPQUFPLENBQUksSUFBTztJQUNoQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQTtBQUNoQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixXQUFXO0lBQ3pCLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQTtBQUMzQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixPQUFPLENBQVksS0FBYTtJQUM5QyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQTtBQUNsQyxDQUFDO0FBRUQ7O0dBRUc7QUFDSSxLQUFLLFVBQVUsU0FBUyxDQUFJLEVBQW9CO0lBQ3JELElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxFQUFFLENBQUE7UUFDekIsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDeEIsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLE9BQU8sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdEUsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDekIsQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLFFBQVEsQ0FBSSxFQUFXO0lBQ3JDLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFBO1FBQ25CLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQ3hCLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsTUFBTSxPQUFPLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3RFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3pCLENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixTQUFTLENBQ3ZCLE1BQWlCO0lBRWpCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQTtBQUN2QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixTQUFTLENBQ3ZCLE1BQWlCO0lBRWpCLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFBO0FBQ3hCLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLE1BQU0sQ0FBSSxNQUFpQjtJQUN6QyxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQTtJQUNwQixDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7QUFDL0IsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsUUFBUSxDQUFJLE1BQWlCLEVBQUUsWUFBZTtJQUM1RCxJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQTtJQUNwQixDQUFDO0lBQ0QsT0FBTyxZQUFZLENBQUE7QUFDckIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsU0FBUyxDQUN2QixNQUFpQixFQUNqQixFQUFrQjtJQUVsQixJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNqQyxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUE7QUFDZixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFnQixhQUFhLENBQzNCLE1BQWlCLEVBQ2pCLEVBQTBCO0lBRTFCLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3hCLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQTtBQUNmLENBQUMifQ==
@@ -8,13 +8,14 @@ exports.sourceIdfPythonEnv = sourceIdfPythonEnv;
8
8
  const node_os_1 = require("node:os");
9
9
  const gluegun_1 = require("gluegun");
10
10
  const constants_1 = require("../setup/constants");
11
+ const errors_1 = require("./errors");
11
12
  function ensureAskPass() {
12
13
  const SUDO_ASKPASS = gluegun_1.system.which('ssh-askpass');
13
14
  if (SUDO_ASKPASS === null || SUDO_ASKPASS === undefined) {
14
- gluegun_1.print.warning('ssh-askpass required to prompt for password');
15
- process.exit(1);
15
+ return (0, errors_1.failure)('ssh-askpass required to prompt for password');
16
16
  }
17
17
  process.env.SUDO_ASKPASS = SUDO_ASKPASS;
18
+ return (0, errors_1.success)(undefined);
18
19
  }
19
20
  /**
20
21
  * Ensure command can be run with sudo,
@@ -23,64 +24,69 @@ function ensureAskPass() {
23
24
  async function execWithSudo(command, options = {}) {
24
25
  try {
25
26
  await gluegun_1.system.exec(`sudo --non-interactive --preserve-env ${command}`, options);
26
- return;
27
+ return (0, errors_1.success)(undefined);
27
28
  }
28
29
  catch (error) {
29
30
  if (error.toString().includes('password') === true) {
30
- ensureAskPass();
31
+ const askPassResult = ensureAskPass();
32
+ if (!askPassResult.success) {
33
+ return askPassResult;
34
+ }
31
35
  }
32
36
  else {
33
- throw error;
37
+ return (0, errors_1.failure)(`Failed to execute sudo command: ${error}`);
34
38
  }
35
39
  }
36
- await gluegun_1.system.exec(`sudo --askpass --preserve-env ${command}`, options);
40
+ return await (0, errors_1.wrapAsync)(async () => {
41
+ await gluegun_1.system.exec(`sudo --askpass --preserve-env ${command}`, options);
42
+ });
37
43
  }
38
44
  /**
39
45
  * Use Policykit pkexec to run the command as an admin user
40
46
  */
41
47
  async function pkexec(command, options = {}) {
42
- await gluegun_1.system.exec(`pkexec ${command}`, options);
48
+ return await (0, errors_1.wrapAsync)(async () => {
49
+ await gluegun_1.system.exec(`pkexec ${command}`, options);
50
+ });
43
51
  }
44
52
  /**
45
53
  * Utility for updating in-memory process.env after running a command
46
54
  */
47
55
  async function updateProcessEnv(command) {
48
56
  const OS = (0, node_os_1.type)().toLowerCase();
49
- if (OS !== 'windows_nt') {
50
- try {
51
- const result = await gluegun_1.system.spawn(`${command} && env`, {
52
- shell: process.env.SHELL,
53
- });
54
- if (typeof result.stdout === 'string' ||
55
- result.stdout instanceof Buffer) {
56
- const localEnv = Object.fromEntries(result.stdout.toString()
57
- .split('\n')
58
- .map((field) => field?.split('=')));
59
- if ('PATH' in localEnv)
60
- process.env = localEnv;
61
- }
62
- }
63
- catch (error) {
64
- console.warn('Unable to update environment:', error);
65
- }
57
+ if (OS === 'windows_nt') {
58
+ return (0, errors_1.success)(undefined); // No-op on Windows
66
59
  }
60
+ return await (0, errors_1.wrapAsync)(async () => {
61
+ const result = await gluegun_1.system.spawn(`${command} && env`, {
62
+ shell: process.env.SHELL,
63
+ });
64
+ if (typeof result.stdout === 'string' || result.stdout instanceof Buffer) {
65
+ const localEnv = Object.fromEntries(result.stdout.toString()
66
+ .split('\n')
67
+ .map((field) => field?.split('='))
68
+ .filter((pair) => pair.length === 2));
69
+ if ('PATH' in localEnv)
70
+ process.env = localEnv;
71
+ }
72
+ });
67
73
  }
68
74
  /**
69
75
  * Set updated env from user shell as process.env
70
76
  */
71
77
  async function sourceEnvironment() {
72
- await updateProcessEnv(`source ${constants_1.EXPORTS_FILE_PATH}`);
78
+ return await updateProcessEnv(`source ${constants_1.EXPORTS_FILE_PATH}`);
73
79
  }
74
80
  /**
75
81
  * Set updated env from IDF_PATH/export.sh as process.env
76
82
  */
77
83
  async function sourceIdf() {
78
- await updateProcessEnv(`source $IDF_PATH/export.sh 1> /dev/null`);
84
+ return await updateProcessEnv(`source $IDF_PATH/export.sh 1> /dev/null`);
79
85
  }
80
86
  /**
81
87
  * Set updated env from IDF_PYTHON_ENV_PATH as process.env
82
88
  */
83
89
  async function sourceIdfPythonEnv() {
84
- await updateProcessEnv(`source ${process.env.IDF_PYTHON_ENV_PATH ?? ''}/bin/activate`);
90
+ return await updateProcessEnv(`source ${process.env.IDF_PYTHON_ENV_PATH ?? ''}/bin/activate`);
85
91
  }
86
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90b29sYm94L3N5c3RlbS9leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBa0JBLG9DQW1CQztBQUtELHdCQUtDO0FBaUNELDhDQUVDO0FBS0QsOEJBRUM7QUFLRCxnREFJQztBQWxHRCxxQ0FBOEM7QUFDOUMscUNBQXVDO0FBQ3ZDLGtEQUFzRDtBQUd0RCxTQUFTLGFBQWE7SUFDcEIsTUFBTSxZQUFZLEdBQUcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDaEQsSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN4RCxlQUFLLENBQUMsT0FBTyxDQUFDLDZDQUE2QyxDQUFDLENBQUE7UUFDNUQsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUNqQixDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFBO0FBQ3pDLENBQUM7QUFFRDs7O0lBR0k7QUFDRyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxPQUFlLEVBQ2YsVUFBbUMsRUFBRTtJQUVyQyxJQUFJLENBQUM7UUFDSCxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUNmLHlDQUF5QyxPQUFPLEVBQUUsRUFDbEQsT0FBTyxDQUNSLENBQUE7UUFDRCxPQUFNO0lBQ1IsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDbkQsYUFBYSxFQUFFLENBQUE7UUFDakIsQ0FBQzthQUFNLENBQUM7WUFDTixNQUFNLEtBQWMsQ0FBQTtRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVELE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsaUNBQWlDLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0FBQ3hFLENBQUM7QUFFRDs7R0FFRztBQUNJLEtBQUssVUFBVSxNQUFNLENBQzFCLE9BQWUsRUFDZixVQUFtQyxFQUFFO0lBRXJDLE1BQU0sZ0JBQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxPQUFPLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUNqRCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsT0FBZTtJQUM3QyxNQUFNLEVBQUUsR0FBRyxJQUFBLGNBQVksR0FBRSxDQUFDLFdBQVcsRUFBWSxDQUFBO0lBRWpELElBQUksRUFBRSxLQUFLLFlBQVksRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sZ0JBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLFNBQVMsRUFBRTtnQkFDckQsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSzthQUN6QixDQUFDLENBQUE7WUFDRixJQUNFLE9BQU8sTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRO2dCQUNqQyxNQUFNLENBQUMsTUFBTSxZQUFZLE1BQU0sRUFDL0IsQ0FBQztnQkFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUNoQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBYTtxQkFDakMsS0FBSyxDQUFDLElBQUksQ0FBQztxQkFDWCxHQUFHLENBQUMsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FDN0MsQ0FBQTtnQkFDRCxJQUFJLE1BQU0sSUFBSSxRQUFRO29CQUFFLE9BQU8sQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFBO1lBQ2hELENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsK0JBQStCLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDdEQsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSSxLQUFLLFVBQVUsaUJBQWlCO0lBQ3JDLE1BQU0sZ0JBQWdCLENBQUMsVUFBVSw2QkFBaUIsRUFBRSxDQUFDLENBQUE7QUFDdkQsQ0FBQztBQUVEOztHQUVHO0FBQ0ksS0FBSyxVQUFVLFNBQVM7SUFDN0IsTUFBTSxnQkFBZ0IsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFBO0FBQ25FLENBQUM7QUFFRDs7R0FFRztBQUNJLEtBQUssVUFBVSxrQkFBa0I7SUFDdEMsTUFBTSxnQkFBZ0IsQ0FDcEIsVUFBVSxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixJQUFJLEVBQUUsZUFBZSxDQUMvRCxDQUFBO0FBQ0gsQ0FBQyJ9
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90b29sYm94L3N5c3RlbS9leGVjLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBbUJBLG9DQXdCQztBQUtELHdCQU9DO0FBK0JELDhDQUVDO0FBS0QsOEJBRUM7QUFLRCxnREFJQztBQXhHRCxxQ0FBOEM7QUFDOUMscUNBQWdDO0FBQ2hDLGtEQUFzRDtBQUV0RCxxQ0FBc0Q7QUFFdEQsU0FBUyxhQUFhO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLGdCQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ2hELElBQUksWUFBWSxLQUFLLElBQUksSUFBSSxZQUFZLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDeEQsT0FBTyxJQUFBLGdCQUFPLEVBQUMsNkNBQTZDLENBQUMsQ0FBQTtJQUMvRCxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFBO0lBQ3ZDLE9BQU8sSUFBQSxnQkFBTyxFQUFDLFNBQVMsQ0FBQyxDQUFBO0FBQzNCLENBQUM7QUFFRDs7O0lBR0k7QUFDRyxLQUFLLFVBQVUsWUFBWSxDQUNoQyxPQUFlLEVBQ2YsVUFBbUMsRUFBRTtJQUVyQyxJQUFJLENBQUM7UUFDSCxNQUFNLGdCQUFNLENBQUMsSUFBSSxDQUNmLHlDQUF5QyxPQUFPLEVBQUUsRUFDbEQsT0FBTyxDQUNSLENBQUE7UUFDRCxPQUFPLElBQUEsZ0JBQU8sRUFBQyxTQUFTLENBQUMsQ0FBQTtJQUMzQixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNuRCxNQUFNLGFBQWEsR0FBRyxhQUFhLEVBQUUsQ0FBQTtZQUNyQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUMzQixPQUFP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
@@ -4,35 +4,38 @@ exports.findMissingDependencies = findMissingDependencies;
4
4
  exports.installPackages = installPackages;
5
5
  const exec_1 = require("../system/exec");
6
6
  const gluegun_1 = require("gluegun");
7
+ const errors_1 = require("./errors");
7
8
  /**
8
9
  * Check if the list of dependencies are installed on the system.
9
10
  **/
10
11
  async function findMissingDependencies(dependencies) {
11
- const missingDependencies = [];
12
- for (const dep of dependencies) {
13
- if (dep.type === 'binary') {
14
- if (gluegun_1.system.which(dep.name) === null) {
15
- missingDependencies.push(dep);
12
+ return await (0, errors_1.wrapAsync)(async () => {
13
+ const missingDependencies = [];
14
+ for (const dep of dependencies) {
15
+ if (dep.type === 'binary') {
16
+ if (gluegun_1.system.which(dep.name) === null) {
17
+ missingDependencies.push(dep);
18
+ }
16
19
  }
17
- }
18
- if (dep.type === 'library') {
19
- try {
20
- await gluegun_1.system.run(`pkg-config --exists ${dep.name}`);
20
+ if (dep.type === 'library') {
21
+ try {
22
+ await gluegun_1.system.run(`pkg-config --exists ${dep.name}`);
23
+ }
24
+ catch (error) {
25
+ missingDependencies.push(dep);
26
+ }
21
27
  }
22
- catch (error) {
23
- missingDependencies.push(dep);
28
+ if (dep.type === 'pylib') {
29
+ try {
30
+ await gluegun_1.system.run(`pip3 show ${dep.name}`);
31
+ }
32
+ catch (error) {
33
+ missingDependencies.push(dep);
34
+ }
24
35
  }
25
36
  }
26
- if (dep.type === 'pylib') {
27
- try {
28
- await gluegun_1.system.run(`pip3 show ${dep.name}`);
29
- }
30
- catch (error) {
31
- missingDependencies.push(dep);
32
- }
33
- }
34
- }
35
- return missingDependencies;
37
+ return missingDependencies;
38
+ });
36
39
  }
37
40
  /**
38
41
  * Attempt to install packages on the linux platform.
@@ -40,12 +43,12 @@ async function findMissingDependencies(dependencies) {
40
43
  async function installPackages(packages) {
41
44
  const packageManager = gluegun_1.system.which('apt');
42
45
  if (packageManager !== null && packageManager !== undefined) {
43
- await (0, exec_1.pkexec)(`${packageManager} install --yes ${packages.map((p) => p.packageName).join(' ')}`, { stdout: process.stdout });
46
+ const result = await (0, exec_1.pkexec)(`${packageManager} install --yes ${packages.map((p) => p.packageName).join(' ')}`, { stdout: process.stdout });
47
+ return result;
44
48
  }
45
49
  else {
46
- gluegun_1.print.warning('xs-dev attempted to install dependencies, but does not yet support your package manager');
47
- gluegun_1.print.warning(`Please install these dependencies before running this command again: ${packages.map((p) => p.packageName).join(', ')}`);
48
- process.exit(1);
50
+ return (0, errors_1.failure)(`xs-dev attempted to install dependencies, but does not yet support your package manager. ` +
51
+ `Please install these dependencies before running this command again: ${packages.map((p) => p.packageName).join(', ')}`);
49
52
  }
50
53
  }
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbGJveC9zeXN0ZW0vcGFja2FnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSwwREE0QkM7QUFLRCwwQ0FpQkM7QUF4REQseUNBQXVDO0FBQ3ZDLHFDQUF1QztBQUV2Qzs7SUFFSTtBQUNHLEtBQUssVUFBVSx1QkFBdUIsQ0FDM0MsWUFBMEI7SUFFMUIsTUFBTSxtQkFBbUIsR0FBaUIsRUFBRSxDQUFBO0lBRTVDLEtBQUssTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDL0IsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFCLElBQUksZ0JBQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUNwQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDL0IsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDO2dCQUNILE1BQU0sZ0JBQU0sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBQ3JELENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMvQixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxnQkFBTSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1lBQzNDLENBQUM7WUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNmLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMvQixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLG1CQUFtQixDQUFBO0FBQzVCLENBQUM7QUFFRDs7SUFFSTtBQUNHLEtBQUssVUFBVSxlQUFlLENBQUMsUUFBc0I7SUFDMUQsTUFBTSxjQUFjLEdBQUcsZ0JBQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFMUMsSUFBSSxjQUFjLEtBQUssSUFBSSxJQUFJLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM1RCxNQUFNLElBQUEsYUFBTSxFQUNWLEdBQUcsY0FBYyxrQkFBa0IsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUNqRixFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQzNCLENBQUE7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLGVBQUssQ0FBQyxPQUFPLENBQ1gseUZBQXlGLENBQzFGLENBQUE7UUFDRCxlQUFLLENBQUMsT0FBTyxDQUNYLHdFQUF3RSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQ3hILENBQUE7UUFDRCxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQ2pCLENBQUM7QUFDSCxDQUFDIn0=
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbGJveC9zeXN0ZW0vcGFja2FnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFTQSwwREE4QkM7QUFLRCwwQ0FpQkM7QUE1REQseUNBQXVDO0FBQ3ZDLHFDQUFnQztBQUVoQyxxQ0FBNkM7QUFFN0M7O0lBRUk7QUFDRyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLFlBQTBCO0lBRTFCLE9BQU8sTUFBTSxJQUFBLGtCQUFTLEVBQUMsS0FBSyxJQUFJLEVBQUU7UUFDaEMsTUFBTSxtQkFBbUIsR0FBaUIsRUFBRSxDQUFBO1FBRTVDLEtBQUssTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7WUFDL0IsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMxQixJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDcEMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDO29CQUNILE1BQU0sZ0JBQU0sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO2dCQUNyRCxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDO29CQUNILE1BQU0sZ0JBQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtnQkFDM0MsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDL0IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQTtJQUM1QixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRDs7SUFFSTtBQUNHLEtBQUssVUFBVSxlQUFlLENBQ25DLFFBQXNCO0lBRXRCLE1BQU0sY0FBYyxHQUFHLGdCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTFDLElBQUksY0FBYyxLQUFLLElBQUksSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLGFBQU0sRUFDekIsR0FBRyxjQUFjLGtCQUFrQixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQ2pGLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FDM0IsQ0FBQTtRQUNELE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLElBQUEsZ0JBQU8sRUFDWiwyRkFBMkY7WUFDekYsd0VBQXdFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDMUgsQ0FBQTtJQUNILENBQUM7QUFDSCxDQUFDIn0=