xs-dev 1.0.2 → 1.1.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 (58) hide show
  1. package/build/package.json +5 -18
  2. package/build/src/app.js +50 -0
  3. package/build/src/cli.js +3 -43
  4. package/build/src/commands/doctor.js +8 -1
  5. package/build/src/commands/init.js +1 -1
  6. package/build/src/commands/scan.js +1 -1
  7. package/build/src/commands/setup.js +5 -4
  8. package/build/src/commands/teardown.js +2 -1
  9. package/build/src/toolbox/build/index.js +8 -1
  10. package/build/src/toolbox/prompt/devices.js +2 -1
  11. package/build/src/toolbox/setup/ejectfix.js +1 -1
  12. package/build/src/toolbox/setup/esp32/linux.js +2 -6
  13. package/build/src/toolbox/setup/esp32/mac.js +1 -1
  14. package/build/src/toolbox/setup/esp32.js +1 -1
  15. package/build/src/toolbox/setup/esp8266/linux.js +2 -6
  16. package/build/src/toolbox/setup/esp8266/mac.js +1 -1
  17. package/build/src/toolbox/setup/esp8266.js +1 -1
  18. package/build/src/toolbox/setup/lin.js +2 -2
  19. package/build/src/toolbox/setup/mac.js +1 -1
  20. package/build/src/toolbox/setup/moddable.js +1 -1
  21. package/build/src/toolbox/setup/nrf52.js +1 -1
  22. package/build/src/toolbox/setup/pico.js +1 -1
  23. package/build/src/toolbox/setup/wasm.js +1 -1
  24. package/build/src/toolbox/setup/windows.js +1 -1
  25. package/build/src/toolbox/setup/zephyr/linux.js +15 -0
  26. package/build/src/toolbox/setup/zephyr/mac.js +24 -0
  27. package/build/src/toolbox/setup/zephyr.js +103 -0
  28. package/build/src/toolbox/system/errors.js +1 -1
  29. package/build/src/toolbox/system/exec.js +3 -2
  30. package/build/src/toolbox/system/packages.js +1 -1
  31. package/build/src/toolbox/system/python.js +1 -1
  32. package/build/src/toolbox/update/esp32.js +1 -1
  33. package/build/types/src/app.d.ts +6 -0
  34. package/build/types/src/cli.d.ts +1 -5
  35. package/build/types/src/commands/build.d.ts +1 -1
  36. package/build/types/src/commands/clean.d.ts +1 -1
  37. package/build/types/src/commands/debug.d.ts +1 -1
  38. package/build/types/src/commands/doctor.d.ts +1 -1
  39. package/build/types/src/commands/include.d.ts +1 -1
  40. package/build/types/src/commands/init.d.ts +1 -1
  41. package/build/types/src/commands/remove.d.ts +1 -1
  42. package/build/types/src/commands/run.d.ts +1 -1
  43. package/build/types/src/commands/scan.d.ts +1 -1
  44. package/build/types/src/commands/setup.d.ts +1 -1
  45. package/build/types/src/commands/teardown.d.ts +1 -1
  46. package/build/types/src/commands/update.d.ts +1 -1
  47. package/build/types/src/toolbox/setup/zephyr/linux.d.ts +3 -0
  48. package/build/types/src/toolbox/setup/zephyr/mac.d.ts +3 -0
  49. package/build/types/src/toolbox/setup/zephyr.d.ts +2 -0
  50. package/build/types/src/types.d.ts +0 -8
  51. package/package.json +5 -18
  52. package/tsconfig.json +17 -4
  53. package/build/src/commands/xs-dev.js +0 -14
  54. package/build/src/toolbox/system/__tests__/errors.test.js +0 -163
  55. package/build/src/toolbox/system/__tests__/exec.test.js +0 -130
  56. package/build/types/src/commands/xs-dev.d.ts +0 -3
  57. package/build/types/src/toolbox/system/__tests__/errors.test.d.ts +0 -1
  58. package/build/types/src/toolbox/system/__tests__/exec.test.d.ts +0 -1
@@ -1,3 +1,3 @@
1
- import type { LocalContext } from '../cli';
1
+ import type { LocalContext } from '../app';
2
2
  declare const command: import("@stricli/core").Command<LocalContext>;
3
3
  export default command;
@@ -1,3 +1,3 @@
1
- import type { LocalContext } from '../cli';
1
+ import type { LocalContext } from '../app';
2
2
  declare const command: import("@stricli/core").Command<LocalContext>;
3
3
  export default command;
@@ -1,3 +1,3 @@
1
- import type { LocalContext } from '../cli';
1
+ import type { LocalContext } from '../app';
2
2
  declare const command: import("@stricli/core").Command<LocalContext>;
3
3
  export default command;
@@ -1,3 +1,3 @@
1
- import type { LocalContext } from '../cli';
1
+ import type { LocalContext } from '../app';
2
2
  declare const command: import("@stricli/core").Command<LocalContext>;
3
3
  export default command;
@@ -1,3 +1,3 @@
1
- import type { LocalContext } from '../cli';
1
+ import type { LocalContext } from '../app';
2
2
  declare const command: import("@stricli/core").Command<LocalContext>;
3
3
  export default command;
@@ -1,3 +1,3 @@
1
- import type { LocalContext } from '../cli';
1
+ import type { LocalContext } from '../app';
2
2
  declare const command: import("@stricli/core").Command<LocalContext>;
3
3
  export default command;
@@ -1,3 +1,3 @@
1
- import type { LocalContext } from '../cli';
1
+ import type { LocalContext } from '../app';
2
2
  declare const command: import("@stricli/core").Command<LocalContext>;
3
3
  export default command;
@@ -1,3 +1,3 @@
1
- import type { LocalContext } from '../cli';
1
+ import type { LocalContext } from '../app';
2
2
  declare const command: import("@stricli/core").Command<LocalContext>;
3
3
  export default command;
@@ -1,3 +1,3 @@
1
- import type { LocalContext } from '../cli';
1
+ import type { LocalContext } from '../app';
2
2
  declare const command: import("@stricli/core").Command<LocalContext>;
3
3
  export default command;
@@ -1,3 +1,3 @@
1
- import type { LocalContext } from '../cli';
1
+ import type { LocalContext } from '../app';
2
2
  declare const command: import("@stricli/core").Command<LocalContext>;
3
3
  export default command;
@@ -1,3 +1,3 @@
1
- import type { LocalContext } from '../cli';
1
+ import type { LocalContext } from '../app';
2
2
  declare const command: import("@stricli/core").Command<LocalContext>;
3
3
  export default command;
@@ -1,3 +1,3 @@
1
- import type { LocalContext } from '../cli';
1
+ import type { LocalContext } from '../app';
2
2
  declare const command: import("@stricli/core").Command<LocalContext>;
3
3
  export default command;
@@ -0,0 +1,3 @@
1
+ import type { GluegunPrint } from 'gluegun';
2
+ import type { SetupResult } from '../../../types';
3
+ export declare function installDeps(spinner: ReturnType<GluegunPrint['spin']>): Promise<SetupResult>;
@@ -0,0 +1,3 @@
1
+ import { type GluegunPrint } from 'gluegun';
2
+ import type { SetupResult } from '../../../types';
3
+ export declare function installDeps(spinner: ReturnType<GluegunPrint['spin']>): Promise<SetupResult>;
@@ -0,0 +1,2 @@
1
+ import type { SetupResult } from '../../types';
2
+ export default function (): Promise<SetupResult>;
@@ -1,6 +1,3 @@
1
- import type { GluegunToolbox } from 'gluegun';
2
- import type { PlatformSetupArgs, SetupArgs } from './toolbox/setup/types';
3
- import type { BuildArgs } from './toolbox/build/index';
4
1
  export type Device = 'darwin' | 'mac' | 'linux' | 'lin' | 'windows_nt' | 'windows' | 'win' | 'esp8266' | 'esp32' | 'wasm' | 'pico' | 'nrf52';
5
2
  export type Result<T, E = string> = {
6
3
  success: true;
@@ -12,8 +9,3 @@ export type Result<T, E = string> = {
12
9
  export type SetupResult = Result<void>;
13
10
  export type BuildResult = Result<string>;
14
11
  export type UpdateResult = Result<void>;
15
- export interface XSDevToolbox extends GluegunToolbox {
16
- setup: Record<Device, (() => Promise<void>) | ((args: SetupArgs | PlatformSetupArgs) => Promise<void>)>;
17
- update: Record<Device, (() => Promise<void>) | ((args: SetupArgs) => Promise<void>)>;
18
- build: (args: BuildArgs) => Promise<void>;
19
- }
package/package.json CHANGED
@@ -1,8 +1,9 @@
1
1
  {
2
2
  "name": "xs-dev",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "CLI for automating the setup and usage of Moddable XS tools",
5
5
  "types": "build/types/types.d.ts",
6
+ "packageManager": "pnpm@10.17.1",
6
7
  "engines": {
7
8
  "node": ">=20"
8
9
  },
@@ -18,10 +19,9 @@
18
19
  "compile": "tsc -p .",
19
20
  "build": "pnpm run format && pnpm run lint && pnpm run clean-build && pnpm run compile",
20
21
  "prepublishOnly": "pnpm run build",
21
- "test": "jest",
22
- "watch": "jest --watch",
23
- "snapupdate": "jest --updateSnapshot",
24
- "coverage": "jest --coverage",
22
+ "test": "tsx --test --experimental-test-module-mocks",
23
+ "watch": "pnpm test --watch",
24
+ "coverage": "pnpm test --experimental-test-coverage",
25
25
  "start:docs": "astro dev --root ./docs",
26
26
  "build:docs": "astro build --root ./docs",
27
27
  "preview:docs": "astro preview --root ./docs",
@@ -68,7 +68,6 @@
68
68
  "@babel/core": ">=7.20.12 <8.0.0",
69
69
  "@changesets/cli": "^2.19.0",
70
70
  "@justinribeiro/lite-youtube": "^1.5.0",
71
- "@types/jest": "^27.4.0",
72
71
  "@types/node": "^18.11.19",
73
72
  "@types/serve-handler": "^6.1.1",
74
73
  "@types/tar-fs": "^2.0.1",
@@ -85,27 +84,15 @@
85
84
  "eslint-plugin-node": "^11.1.0",
86
85
  "eslint-plugin-prettier": "^5.2.1",
87
86
  "eslint-plugin-promise": "^7.1.0",
88
- "jest": "^29.7.0",
89
87
  "prettier": "^3.3.3",
90
88
  "rollup": "^2.78.1",
91
89
  "solid-js": "^1.4.3",
92
90
  "tailwindcss": "^3.0.24",
93
- "ts-jest": "^29.2.4",
94
91
  "ts-node": "^10.9.2",
95
92
  "tsx": "^4.19.2",
96
93
  "typescript": "^5.5.4",
97
94
  "typescript-eslint": "^8.1.0"
98
95
  },
99
- "jest": {
100
- "preset": "ts-jest",
101
- "testEnvironment": "node",
102
- "testPathIgnorePatterns": [
103
- "<rootDir>/build/"
104
- ]
105
- },
106
- "volta": {
107
- "node": "18.14.0"
108
- },
109
96
  "prettier": {
110
97
  "semi": false,
111
98
  "singleQuote": true
package/tsconfig.json CHANGED
@@ -2,7 +2,10 @@
2
2
  "compilerOptions": {
3
3
  "allowSyntheticDefaultImports": true,
4
4
  "experimentalDecorators": true,
5
- "lib": ["esnext", "scripthost"],
5
+ "lib": [
6
+ "esnext",
7
+ "scripthost"
8
+ ],
6
9
  "module": "commonjs",
7
10
  "moduleResolution": "node",
8
11
  "noImplicitAny": true,
@@ -18,8 +21,18 @@
18
21
  "target": "es2022",
19
22
  "declaration": true,
20
23
  "declarationDir": "build/types",
21
- "esModuleInterop": true
24
+ "esModuleInterop": true,
25
+ "paths": {
26
+ "#src/*": [
27
+ "./src/*"
28
+ ]
29
+ }
22
30
  },
23
- "include": ["src/**/*"],
24
- "exclude": ["node_modules"]
31
+ "include": [
32
+ "src/**/*"
33
+ ],
34
+ "exclude": [
35
+ "node_modules",
36
+ "tests/"
37
+ ]
25
38
  }
@@ -1,14 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const command = {
4
- name: 'xs-dev',
5
- description: 'CLI for automating the setup and usage of Moddable XS tools',
6
- // eslint-disable-next-line @typescript-eslint/no-misused-promises
7
- run: async (toolbox) => {
8
- const { print } = toolbox;
9
- print.info('Welcome to XS Dev! Run xs-dev --help to learn more.');
10
- print.printHelp(toolbox);
11
- },
12
- };
13
- exports.default = command;
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieHMtZGV2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL3hzLWRldi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUVBLE1BQU0sT0FBTyxHQUFtQjtJQUM5QixJQUFJLEVBQUUsUUFBUTtJQUNkLFdBQVcsRUFBRSw2REFBNkQ7SUFDMUUsa0VBQWtFO0lBQ2xFLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDckIsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQTtRQUV6QixLQUFLLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUE7UUFDakUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUMxQixDQUFDO0NBQ0YsQ0FBQTtBQUVELGtCQUFlLE9BQU8sQ0FBQSJ9
@@ -1,163 +0,0 @@
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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
@@ -1,130 +0,0 @@
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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
@@ -1,3 +0,0 @@
1
- import type { GluegunCommand } from 'gluegun';
2
- declare const command: GluegunCommand;
3
- export default command;