projax 3.3.58 → 3.3.59

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 (80) hide show
  1. package/dist/electron/script-runner.js +52 -20
  2. package/dist/index.js +1 -1
  3. package/dist/prxi.js +844 -109
  4. package/dist/prxi.tsx +1234 -179
  5. package/dist/script-runner.js +52 -20
  6. package/package.json +1 -1
  7. package/coverage/base.css +0 -224
  8. package/coverage/block-navigation.js +0 -87
  9. package/coverage/core-bridge.ts.html +0 -292
  10. package/coverage/favicon.png +0 -0
  11. package/coverage/index.html +0 -191
  12. package/coverage/lcov-report/base.css +0 -224
  13. package/coverage/lcov-report/block-navigation.js +0 -87
  14. package/coverage/lcov-report/core-bridge.ts.html +0 -292
  15. package/coverage/lcov-report/favicon.png +0 -0
  16. package/coverage/lcov-report/index.html +0 -191
  17. package/coverage/lcov-report/port-extractor.ts.html +0 -1174
  18. package/coverage/lcov-report/port-scanner.ts.html +0 -301
  19. package/coverage/lcov-report/port-utils.ts.html +0 -670
  20. package/coverage/lcov-report/prettify.css +0 -1
  21. package/coverage/lcov-report/prettify.js +0 -2
  22. package/coverage/lcov-report/script-runner.ts.html +0 -3346
  23. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  24. package/coverage/lcov-report/sorter.js +0 -210
  25. package/coverage/lcov-report/test-parser.ts.html +0 -799
  26. package/coverage/lcov.info +0 -1338
  27. package/coverage/port-extractor.ts.html +0 -1174
  28. package/coverage/port-scanner.ts.html +0 -301
  29. package/coverage/port-utils.ts.html +0 -670
  30. package/coverage/prettify.css +0 -1
  31. package/coverage/prettify.js +0 -2
  32. package/coverage/script-runner.ts.html +0 -3346
  33. package/coverage/sort-arrow-sprite.png +0 -0
  34. package/coverage/sorter.js +0 -210
  35. package/coverage/test-parser.ts.html +0 -799
  36. package/dist/__tests__/core-bridge.test.d.ts +0 -1
  37. package/dist/__tests__/core-bridge.test.js +0 -135
  38. package/dist/__tests__/port-extractor.test.d.ts +0 -1
  39. package/dist/__tests__/port-extractor.test.js +0 -407
  40. package/dist/__tests__/port-scanner.test.d.ts +0 -1
  41. package/dist/__tests__/port-scanner.test.js +0 -170
  42. package/dist/__tests__/port-utils.test.d.ts +0 -1
  43. package/dist/__tests__/port-utils.test.js +0 -127
  44. package/dist/__tests__/script-runner.test.d.ts +0 -1
  45. package/dist/__tests__/script-runner.test.js +0 -491
  46. package/dist/__tests__/test-parser.test.d.ts +0 -1
  47. package/dist/__tests__/test-parser.test.js +0 -276
  48. package/dist/api/__tests__/database.test.d.ts +0 -2
  49. package/dist/api/__tests__/database.test.d.ts.map +0 -1
  50. package/dist/api/__tests__/database.test.js +0 -485
  51. package/dist/api/__tests__/database.test.js.map +0 -1
  52. package/dist/api/__tests__/routes.test.d.ts +0 -2
  53. package/dist/api/__tests__/routes.test.d.ts.map +0 -1
  54. package/dist/api/__tests__/routes.test.js +0 -484
  55. package/dist/api/__tests__/routes.test.js.map +0 -1
  56. package/dist/api/__tests__/scanner.test.d.ts +0 -2
  57. package/dist/api/__tests__/scanner.test.d.ts.map +0 -1
  58. package/dist/api/__tests__/scanner.test.js +0 -403
  59. package/dist/api/__tests__/scanner.test.js.map +0 -1
  60. package/dist/core/__tests__/database.test.d.ts +0 -1
  61. package/dist/core/__tests__/database.test.js +0 -557
  62. package/dist/core/__tests__/detector.test.d.ts +0 -1
  63. package/dist/core/__tests__/detector.test.js +0 -375
  64. package/dist/core/__tests__/index.test.d.ts +0 -1
  65. package/dist/core/__tests__/index.test.js +0 -469
  66. package/dist/core/__tests__/scanner.test.d.ts +0 -1
  67. package/dist/core/__tests__/scanner.test.js +0 -406
  68. package/dist/core/__tests__/settings.test.d.ts +0 -1
  69. package/dist/core/__tests__/settings.test.js +0 -280
  70. package/dist/electron/core/__tests__/database.test.d.ts +0 -1
  71. package/dist/electron/core/__tests__/database.test.js +0 -557
  72. package/dist/electron/core/__tests__/detector.test.d.ts +0 -1
  73. package/dist/electron/core/__tests__/detector.test.js +0 -375
  74. package/dist/electron/core/__tests__/index.test.d.ts +0 -1
  75. package/dist/electron/core/__tests__/index.test.js +0 -469
  76. package/dist/electron/core/__tests__/scanner.test.d.ts +0 -1
  77. package/dist/electron/core/__tests__/scanner.test.js +0 -406
  78. package/dist/electron/core/__tests__/settings.test.d.ts +0 -1
  79. package/dist/electron/core/__tests__/settings.test.js +0 -280
  80. package/jest.config.js +0 -26
@@ -1,491 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
- Object.defineProperty(exports, "__esModule", { value: true });
36
- const fs = __importStar(require("fs"));
37
- const path = __importStar(require("path"));
38
- const os = __importStar(require("os"));
39
- // Configuration object for test data directory
40
- const testConfig = { processDataDir: '' };
41
- // Mock os module to support homedir mocking in Node 18
42
- jest.mock('os', () => ({
43
- ...jest.requireActual('os'),
44
- homedir: jest.fn(() => testConfig.processDataDir || os.tmpdir()),
45
- }));
46
- // Mock the core-bridge module before importing script-runner
47
- jest.mock('../core-bridge', () => ({
48
- loadCore: () => ({
49
- scanner: {
50
- scanProject: jest.fn(),
51
- },
52
- database: {
53
- JSONDatabase: jest.fn(),
54
- },
55
- }),
56
- }));
57
- const script_runner_1 = require("../script-runner");
58
- describe('Script Runner', () => {
59
- let testDir;
60
- beforeEach(() => {
61
- testDir = path.join(os.tmpdir(), `projax-script-test-${Date.now()}`);
62
- fs.mkdirSync(testDir, { recursive: true });
63
- });
64
- afterEach(() => {
65
- if (fs.existsSync(testDir)) {
66
- fs.rmSync(testDir, { recursive: true, force: true });
67
- }
68
- });
69
- describe('detectProjectType', () => {
70
- it('should detect Node.js project', () => {
71
- fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify({ name: 'test' }));
72
- expect((0, script_runner_1.detectProjectType)(testDir)).toBe('node');
73
- });
74
- it('should detect Python project with pyproject.toml', () => {
75
- fs.writeFileSync(path.join(testDir, 'pyproject.toml'), '[project]\nname = "test"');
76
- expect((0, script_runner_1.detectProjectType)(testDir)).toBe('python');
77
- });
78
- it('should detect Rust project', () => {
79
- fs.writeFileSync(path.join(testDir, 'Cargo.toml'), '[package]\nname = "test"');
80
- expect((0, script_runner_1.detectProjectType)(testDir)).toBe('rust');
81
- });
82
- it('should detect Go project', () => {
83
- fs.writeFileSync(path.join(testDir, 'go.mod'), 'module test');
84
- expect((0, script_runner_1.detectProjectType)(testDir)).toBe('go');
85
- });
86
- it('should detect Makefile project', () => {
87
- fs.writeFileSync(path.join(testDir, 'Makefile'), 'all:\n\techo "test"');
88
- expect((0, script_runner_1.detectProjectType)(testDir)).toBe('makefile');
89
- });
90
- it('should detect makefile (lowercase)', () => {
91
- fs.writeFileSync(path.join(testDir, 'makefile'), 'all:\n\techo "test"');
92
- expect((0, script_runner_1.detectProjectType)(testDir)).toBe('makefile');
93
- });
94
- it('should return unknown for unrecognized project', () => {
95
- expect((0, script_runner_1.detectProjectType)(testDir)).toBe('unknown');
96
- });
97
- it('should prioritize package.json over other markers', () => {
98
- fs.writeFileSync(path.join(testDir, 'package.json'), '{}');
99
- fs.writeFileSync(path.join(testDir, 'Makefile'), 'all:');
100
- expect((0, script_runner_1.detectProjectType)(testDir)).toBe('node');
101
- });
102
- });
103
- describe('getProjectScripts - Node.js', () => {
104
- it('should parse scripts from package.json', () => {
105
- const packageJson = {
106
- name: 'test-project',
107
- scripts: {
108
- dev: 'next dev',
109
- build: 'next build',
110
- start: 'next start',
111
- test: 'jest',
112
- },
113
- };
114
- fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify(packageJson));
115
- const result = (0, script_runner_1.getProjectScripts)(testDir);
116
- expect(result.type).toBe('node');
117
- expect(result.scripts.size).toBe(4);
118
- expect(result.scripts.get('dev')).toMatchObject({
119
- name: 'dev',
120
- command: 'next dev',
121
- runner: 'npm',
122
- projectType: 'node',
123
- });
124
- });
125
- it('should handle empty scripts object', () => {
126
- const packageJson = {
127
- name: 'test-project',
128
- scripts: {},
129
- };
130
- fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify(packageJson));
131
- const result = (0, script_runner_1.getProjectScripts)(testDir);
132
- expect(result.type).toBe('node');
133
- expect(result.scripts.size).toBe(0);
134
- });
135
- it('should handle missing scripts field', () => {
136
- const packageJson = {
137
- name: 'test-project',
138
- };
139
- fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify(packageJson));
140
- const result = (0, script_runner_1.getProjectScripts)(testDir);
141
- expect(result.type).toBe('node');
142
- expect(result.scripts.size).toBe(0);
143
- });
144
- it('should skip non-string script values', () => {
145
- const packageJson = {
146
- scripts: {
147
- valid: 'echo "test"',
148
- invalid: { nested: 'object' },
149
- },
150
- };
151
- fs.writeFileSync(path.join(testDir, 'package.json'), JSON.stringify(packageJson));
152
- const result = (0, script_runner_1.getProjectScripts)(testDir);
153
- expect(result.scripts.size).toBe(1);
154
- expect(result.scripts.has('valid')).toBe(true);
155
- expect(result.scripts.has('invalid')).toBe(false);
156
- });
157
- it('should handle malformed package.json', () => {
158
- fs.writeFileSync(path.join(testDir, 'package.json'), 'invalid json {{{');
159
- const result = (0, script_runner_1.getProjectScripts)(testDir);
160
- expect(result.scripts.size).toBe(0);
161
- });
162
- });
163
- describe('getProjectScripts - Python', () => {
164
- it('should parse scripts from pyproject.toml [project.scripts]', () => {
165
- const pyproject = `
166
- [project.scripts]
167
- serve = "myapp:main"
168
- cli = "myapp.cli:run"
169
- `;
170
- fs.writeFileSync(path.join(testDir, 'pyproject.toml'), pyproject);
171
- const result = (0, script_runner_1.getProjectScripts)(testDir);
172
- expect(result.type).toBe('python');
173
- expect(result.scripts.size).toBe(2);
174
- expect(result.scripts.get('serve')).toMatchObject({
175
- name: 'serve',
176
- command: 'myapp:main',
177
- runner: 'python',
178
- projectType: 'python',
179
- });
180
- });
181
- it('should parse scripts from pyproject.toml [tool.poetry.scripts]', () => {
182
- const pyproject = `
183
- [tool.poetry.scripts]
184
- myapp = "myapp:main"
185
- cli = "myapp.cli:run"
186
- `;
187
- fs.writeFileSync(path.join(testDir, 'pyproject.toml'), pyproject);
188
- const result = (0, script_runner_1.getProjectScripts)(testDir);
189
- expect(result.type).toBe('python');
190
- expect(result.scripts.size).toBe(2);
191
- expect(result.scripts.get('myapp')).toMatchObject({
192
- name: 'myapp',
193
- command: 'myapp:main',
194
- runner: 'poetry',
195
- projectType: 'python',
196
- });
197
- });
198
- it('should handle both project and poetry scripts', () => {
199
- const pyproject = `
200
- [project.scripts]
201
- app = "app:main"
202
-
203
- [tool.poetry.scripts]
204
- cli = "app.cli:run"
205
- `;
206
- fs.writeFileSync(path.join(testDir, 'pyproject.toml'), pyproject);
207
- const result = (0, script_runner_1.getProjectScripts)(testDir);
208
- expect(result.scripts.size).toBe(2);
209
- });
210
- it('should handle empty pyproject.toml', () => {
211
- fs.writeFileSync(path.join(testDir, 'pyproject.toml'), '');
212
- const result = (0, script_runner_1.getProjectScripts)(testDir);
213
- expect(result.scripts.size).toBe(0);
214
- });
215
- });
216
- describe('getProjectScripts - Rust', () => {
217
- it('should provide common cargo commands', () => {
218
- fs.writeFileSync(path.join(testDir, 'Cargo.toml'), '[package]\nname = "test"');
219
- const result = (0, script_runner_1.getProjectScripts)(testDir);
220
- expect(result.type).toBe('rust');
221
- expect(result.scripts.size).toBeGreaterThan(0);
222
- expect(result.scripts.get('build')).toMatchObject({
223
- name: 'build',
224
- command: 'cargo build',
225
- runner: 'cargo',
226
- projectType: 'rust',
227
- });
228
- expect(result.scripts.get('run')).toBeDefined();
229
- expect(result.scripts.get('test')).toBeDefined();
230
- expect(result.scripts.get('check')).toBeDefined();
231
- expect(result.scripts.get('clippy')).toBeDefined();
232
- expect(result.scripts.get('fmt')).toBeDefined();
233
- });
234
- });
235
- describe('getProjectScripts - Go', () => {
236
- it('should provide common go commands when no Makefile', () => {
237
- fs.writeFileSync(path.join(testDir, 'go.mod'), 'module test');
238
- const result = (0, script_runner_1.getProjectScripts)(testDir);
239
- expect(result.type).toBe('go');
240
- expect(result.scripts.get('run')).toMatchObject({
241
- command: 'go run .',
242
- runner: 'go',
243
- projectType: 'go',
244
- });
245
- expect(result.scripts.get('build')).toBeDefined();
246
- expect(result.scripts.get('test')).toBeDefined();
247
- });
248
- it('should use Makefile commands if available', () => {
249
- fs.writeFileSync(path.join(testDir, 'go.mod'), 'module test');
250
- fs.writeFileSync(path.join(testDir, 'Makefile'), 'build:\n\tgo build\n\ntest:\n\tgo test');
251
- const result = (0, script_runner_1.getProjectScripts)(testDir);
252
- expect(result.type).toBe('go');
253
- expect(result.scripts.get('build')).toMatchObject({
254
- command: 'make build',
255
- runner: 'make',
256
- });
257
- });
258
- });
259
- describe('getProjectScripts - Makefile', () => {
260
- it('should parse Makefile targets', () => {
261
- const makefile = `
262
- build:
263
- \tgcc -o app main.c
264
-
265
- test:
266
- \t./app test
267
-
268
- clean:
269
- \trm -f app
270
- `;
271
- fs.writeFileSync(path.join(testDir, 'Makefile'), makefile);
272
- const result = (0, script_runner_1.getProjectScripts)(testDir);
273
- expect(result.type).toBe('makefile');
274
- expect(result.scripts.size).toBe(3);
275
- expect(result.scripts.get('build')).toMatchObject({
276
- name: 'build',
277
- command: 'make build',
278
- runner: 'make',
279
- projectType: 'makefile',
280
- });
281
- expect(result.scripts.has('test')).toBe(true);
282
- expect(result.scripts.has('clean')).toBe(true);
283
- });
284
- it('should skip special targets like .PHONY', () => {
285
- const makefile = `
286
- .PHONY: all clean
287
-
288
- all:
289
- \techo "all"
290
-
291
- clean:
292
- \trm -rf build
293
- `;
294
- fs.writeFileSync(path.join(testDir, 'Makefile'), makefile);
295
- const result = (0, script_runner_1.getProjectScripts)(testDir);
296
- expect(result.scripts.has('.PHONY')).toBe(false);
297
- expect(result.scripts.has('all')).toBe(true);
298
- expect(result.scripts.has('clean')).toBe(true);
299
- });
300
- it('should skip targets starting with dot', () => {
301
- const makefile = `
302
- .internal:
303
- \techo "internal"
304
-
305
- public:
306
- \techo "public"
307
- `;
308
- fs.writeFileSync(path.join(testDir, 'Makefile'), makefile);
309
- const result = (0, script_runner_1.getProjectScripts)(testDir);
310
- expect(result.scripts.has('.internal')).toBe(false);
311
- expect(result.scripts.has('public')).toBe(true);
312
- });
313
- it('should handle targets with dependencies', () => {
314
- const makefile = `
315
- all: build test
316
-
317
- build:
318
- \techo "build"
319
-
320
- test: build
321
- \techo "test"
322
- `;
323
- fs.writeFileSync(path.join(testDir, 'Makefile'), makefile);
324
- const result = (0, script_runner_1.getProjectScripts)(testDir);
325
- expect(result.scripts.size).toBe(3);
326
- expect(result.scripts.has('all')).toBe(true);
327
- expect(result.scripts.has('build')).toBe(true);
328
- expect(result.scripts.has('test')).toBe(true);
329
- });
330
- });
331
- describe('getProjectScripts - Unknown', () => {
332
- it('should check for Makefile as fallback', () => {
333
- fs.writeFileSync(path.join(testDir, 'Makefile'), 'test:\n\techo "test"');
334
- const result = (0, script_runner_1.getProjectScripts)(testDir);
335
- // When Makefile exists, type is 'makefile', not 'unknown'
336
- expect(result.type).toBe('makefile');
337
- expect(result.scripts.size).toBe(1);
338
- expect(result.scripts.get('test')).toBeDefined();
339
- });
340
- it('should return empty scripts for truly unknown projects', () => {
341
- const result = (0, script_runner_1.getProjectScripts)(testDir);
342
- expect(result.type).toBe('unknown');
343
- expect(result.scripts.size).toBe(0);
344
- });
345
- });
346
- describe('Process Tracking', () => {
347
- let testDataDir;
348
- beforeEach(() => {
349
- const uniqueId = `${Date.now()}-${process.hrtime.bigint()}-${Math.random().toString(36).substring(7)}`;
350
- testDataDir = path.join(os.tmpdir(), `projax-process-test-${uniqueId}`);
351
- testConfig.processDataDir = testDataDir;
352
- if (fs.existsSync(testDataDir)) {
353
- fs.rmSync(testDataDir, { recursive: true, force: true });
354
- }
355
- fs.mkdirSync(testDataDir, { recursive: true });
356
- });
357
- afterEach(() => {
358
- if (fs.existsSync(testDataDir)) {
359
- fs.rmSync(testDataDir, { recursive: true, force: true });
360
- }
361
- });
362
- describe('loadProcesses', () => {
363
- it('should return empty array when no processes file exists', () => {
364
- const processes = (0, script_runner_1.loadProcesses)();
365
- expect(processes).toEqual([]);
366
- });
367
- it('should load processes from file', () => {
368
- const processesDir = path.join(testDataDir, '.projax');
369
- fs.mkdirSync(processesDir, { recursive: true });
370
- const mockProcesses = [
371
- {
372
- pid: 1234,
373
- projectPath: '/test/path',
374
- projectName: 'Test Project',
375
- scriptName: 'dev',
376
- command: 'npm run dev',
377
- startedAt: Date.now(),
378
- logFile: '/tmp/log.txt',
379
- },
380
- ];
381
- fs.writeFileSync(path.join(processesDir, 'processes.json'), JSON.stringify(mockProcesses));
382
- const processes = (0, script_runner_1.loadProcesses)();
383
- expect(processes).toHaveLength(1);
384
- expect(processes[0].pid).toBe(1234);
385
- });
386
- it('should return empty array for corrupted file', () => {
387
- const processesDir = path.join(testDataDir, '.projax');
388
- fs.mkdirSync(processesDir, { recursive: true });
389
- fs.writeFileSync(path.join(processesDir, 'processes.json'), 'invalid json');
390
- const processes = (0, script_runner_1.loadProcesses)();
391
- expect(processes).toEqual([]);
392
- });
393
- });
394
- describe('removeProcess', () => {
395
- it('should remove a process by PID', () => {
396
- const processesDir = path.join(testDataDir, '.projax');
397
- fs.mkdirSync(processesDir, { recursive: true });
398
- const mockProcesses = [
399
- {
400
- pid: 1234,
401
- projectPath: '/test/1',
402
- projectName: 'Project 1',
403
- scriptName: 'dev',
404
- command: 'npm run dev',
405
- startedAt: Date.now(),
406
- logFile: '/tmp/log1.txt',
407
- },
408
- {
409
- pid: 5678,
410
- projectPath: '/test/2',
411
- projectName: 'Project 2',
412
- scriptName: 'start',
413
- command: 'npm start',
414
- startedAt: Date.now(),
415
- logFile: '/tmp/log2.txt',
416
- },
417
- ];
418
- fs.writeFileSync(path.join(processesDir, 'processes.json'), JSON.stringify(mockProcesses));
419
- (0, script_runner_1.removeProcess)(1234);
420
- const remaining = (0, script_runner_1.loadProcesses)();
421
- expect(remaining).toHaveLength(1);
422
- expect(remaining[0].pid).toBe(5678);
423
- });
424
- it('should handle removing non-existent PID gracefully', () => {
425
- const processesDir = path.join(testDataDir, '.projax');
426
- fs.mkdirSync(processesDir, { recursive: true });
427
- const mockProcesses = [
428
- {
429
- pid: 1234,
430
- projectPath: '/test',
431
- projectName: 'Project',
432
- scriptName: 'dev',
433
- command: 'npm run dev',
434
- startedAt: Date.now(),
435
- logFile: '/tmp/log.txt',
436
- },
437
- ];
438
- fs.writeFileSync(path.join(processesDir, 'processes.json'), JSON.stringify(mockProcesses));
439
- (0, script_runner_1.removeProcess)(9999);
440
- const remaining = (0, script_runner_1.loadProcesses)();
441
- expect(remaining).toHaveLength(1);
442
- });
443
- });
444
- describe('getProjectProcesses', () => {
445
- it('should return processes for a specific project', () => {
446
- const processesDir = path.join(testDataDir, '.projax');
447
- fs.mkdirSync(processesDir, { recursive: true });
448
- const mockProcesses = [
449
- {
450
- pid: 1234,
451
- projectPath: '/test/project1',
452
- projectName: 'Project 1',
453
- scriptName: 'dev',
454
- command: 'npm run dev',
455
- startedAt: Date.now(),
456
- logFile: '/tmp/log1.txt',
457
- },
458
- {
459
- pid: 5678,
460
- projectPath: '/test/project2',
461
- projectName: 'Project 2',
462
- scriptName: 'start',
463
- command: 'npm start',
464
- startedAt: Date.now(),
465
- logFile: '/tmp/log2.txt',
466
- },
467
- {
468
- pid: 9012,
469
- projectPath: '/test/project1',
470
- projectName: 'Project 1',
471
- scriptName: 'test',
472
- command: 'npm test',
473
- startedAt: Date.now(),
474
- logFile: '/tmp/log3.txt',
475
- },
476
- ];
477
- fs.writeFileSync(path.join(processesDir, 'processes.json'), JSON.stringify(mockProcesses));
478
- const project1Processes = (0, script_runner_1.getProjectProcesses)('/test/project1');
479
- expect(project1Processes).toHaveLength(2);
480
- expect(project1Processes.map(p => p.pid)).toEqual([1234, 9012]);
481
- const project2Processes = (0, script_runner_1.getProjectProcesses)('/test/project2');
482
- expect(project2Processes).toHaveLength(1);
483
- expect(project2Processes[0].pid).toBe(5678);
484
- });
485
- it('should return empty array when no processes for project', () => {
486
- const processes = (0, script_runner_1.getProjectProcesses)('/non/existent');
487
- expect(processes).toEqual([]);
488
- });
489
- });
490
- });
491
- });
@@ -1 +0,0 @@
1
- export {};