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.
- package/README.md +1 -1
- package/build/package.json +13 -3
- package/build/src/commands/doctor.js +4 -3
- package/build/src/commands/init.js +3 -3
- package/build/src/commands/remove.js +2 -2
- package/build/src/commands/setup.js +21 -7
- package/build/src/toolbox/setup/ejectfix.js +29 -26
- package/build/src/toolbox/setup/esp32/linux.js +7 -3
- package/build/src/toolbox/setup/esp32/mac.js +5 -3
- package/build/src/toolbox/setup/esp32/windows.js +4 -2
- package/build/src/toolbox/setup/esp32.js +18 -8
- package/build/src/toolbox/setup/esp8266/linux.js +10 -4
- package/build/src/toolbox/setup/esp8266/mac.js +5 -3
- package/build/src/toolbox/setup/esp8266/windows.js +10 -9
- package/build/src/toolbox/setup/esp8266.js +16 -10
- package/build/src/toolbox/setup/lin.js +19 -7
- package/build/src/toolbox/setup/mac.js +14 -9
- package/build/src/toolbox/setup/moddable.js +35 -28
- package/build/src/toolbox/setup/nrf52/windows.js +5 -3
- package/build/src/toolbox/setup/nrf52.js +12 -10
- package/build/src/toolbox/setup/pico/linux.js +6 -2
- package/build/src/toolbox/setup/pico/mac.js +4 -2
- package/build/src/toolbox/setup/pico.js +10 -4
- package/build/src/toolbox/setup/wasm.js +7 -5
- package/build/src/toolbox/setup/windows.js +21 -14
- package/build/src/toolbox/system/__tests__/errors.test.js +163 -0
- package/build/src/toolbox/system/__tests__/exec.test.js +130 -0
- package/build/src/toolbox/system/errors.js +106 -0
- package/build/src/toolbox/system/exec.js +34 -28
- package/build/src/toolbox/system/packages.js +29 -26
- package/build/src/toolbox/system/python.js +11 -4
- package/build/src/toolbox/update/esp32.js +6 -4
- package/build/src/toolbox/update/lin.js +8 -2
- package/build/src/toolbox/update/mac.js +8 -2
- package/build/types/src/toolbox/setup/ejectfix.d.ts +2 -1
- package/build/types/src/toolbox/setup/esp32/linux.d.ts +2 -1
- package/build/types/src/toolbox/setup/esp32/mac.d.ts +2 -1
- package/build/types/src/toolbox/setup/esp32/windows.d.ts +2 -1
- package/build/types/src/toolbox/setup/esp32.d.ts +2 -1
- package/build/types/src/toolbox/setup/esp8266/linux.d.ts +2 -1
- package/build/types/src/toolbox/setup/esp8266/mac.d.ts +2 -1
- package/build/types/src/toolbox/setup/esp8266/windows.d.ts +3 -2
- package/build/types/src/toolbox/setup/esp8266.d.ts +2 -1
- package/build/types/src/toolbox/setup/lin.d.ts +2 -1
- package/build/types/src/toolbox/setup/mac.d.ts +2 -1
- package/build/types/src/toolbox/setup/moddable.d.ts +4 -3
- package/build/types/src/toolbox/setup/nrf52/windows.d.ts +2 -1
- package/build/types/src/toolbox/setup/nrf52.d.ts +2 -1
- package/build/types/src/toolbox/setup/pico/linux.d.ts +2 -1
- package/build/types/src/toolbox/setup/pico/mac.d.ts +2 -1
- package/build/types/src/toolbox/setup/pico.d.ts +2 -1
- package/build/types/src/toolbox/setup/wasm.d.ts +2 -1
- package/build/types/src/toolbox/setup/windows.d.ts +3 -2
- package/build/types/src/toolbox/system/__tests__/errors.test.d.ts +1 -0
- package/build/types/src/toolbox/system/__tests__/exec.test.d.ts +1 -0
- package/build/types/src/toolbox/system/errors.d.ts +51 -0
- package/build/types/src/toolbox/system/exec.d.ts +6 -5
- package/build/types/src/toolbox/system/packages.d.ts +3 -2
- package/build/types/src/toolbox/system/python.d.ts +2 -1
- package/build/types/src/types.d.ts +10 -0
- 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
|
-
|
|
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
|
-
|
|
37
|
+
return (0, errors_1.failure)(`Failed to execute sudo command: ${error}`);
|
|
34
38
|
}
|
|
35
39
|
}
|
|
36
|
-
await
|
|
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
|
|
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
|
|
50
|
-
|
|
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,
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (
|
|
15
|
-
|
|
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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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
|
-
|
|
23
|
-
|
|
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
|
-
|
|
27
|
-
|
|
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
|
-
|
|
47
|
-
|
|
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,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdG9vbGJveC9zeXN0ZW0vcGFja2FnZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFTQSwwREE4QkM7QUFLRCwwQ0FpQkM7QUE1REQseUNBQXVDO0FBQ3ZDLHFDQUFnQztBQUVoQyxxQ0FBNkM7QUFFN0M7O0lBRUk7QUFDRyxLQUFLLFVBQVUsdUJBQXVCLENBQzNDLFlBQTBCO0lBRTFCLE9BQU8sTUFBTSxJQUFBLGtCQUFTLEVBQUMsS0FBSyxJQUFJLEVBQUU7UUFDaEMsTUFBTSxtQkFBbUIsR0FBaUIsRUFBRSxDQUFBO1FBRTVDLEtBQUssTUFBTSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7WUFDL0IsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBRSxDQUFDO2dCQUMxQixJQUFJLGdCQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztvQkFDcEMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDM0IsSUFBSSxDQUFDO29CQUNILE1BQU0sZ0JBQU0sQ0FBQyxHQUFHLENBQUMsdUJBQXVCLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO2dCQUNyRCxDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUMvQixDQUFDO1lBQ0gsQ0FBQztZQUNELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDO29CQUNILE1BQU0sZ0JBQU0sQ0FBQyxHQUFHLENBQUMsYUFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtnQkFDM0MsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLG1CQUFtQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQTtnQkFDL0IsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxtQkFBbUIsQ0FBQTtJQUM1QixDQUFDLENBQUMsQ0FBQTtBQUNKLENBQUM7QUFFRDs7SUFFSTtBQUNHLEtBQUssVUFBVSxlQUFlLENBQ25DLFFBQXNCO0lBRXRCLE1BQU0sY0FBYyxHQUFHLGdCQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRTFDLElBQUksY0FBYyxLQUFLLElBQUksSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFBLGFBQU0sRUFDekIsR0FBRyxjQUFjLGtCQUFrQixRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQ2pGLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FDM0IsQ0FBQTtRQUNELE9BQU8sTUFBTSxDQUFBO0lBQ2YsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLElBQUEsZ0JBQU8sRUFDWiwyRkFBMkY7WUFDekYsd0VBQXdFLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDMUgsQ0FBQTtJQUNILENBQUM7QUFDSCxDQUFDIn0=
|