projax 3.3.58 → 3.3.63

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 (84) hide show
  1. package/README.md +10 -1
  2. package/dist/electron/preload.d.ts +1 -0
  3. package/dist/electron/renderer/assets/index-CmtZriN5.js +66 -0
  4. package/dist/electron/renderer/index.html +1 -1
  5. package/dist/electron/script-runner.js +52 -20
  6. package/dist/index.js +14 -10
  7. package/dist/prxi.js +877 -109
  8. package/dist/prxi.tsx +1249 -177
  9. package/dist/script-runner.js +52 -20
  10. package/package.json +1 -1
  11. package/coverage/base.css +0 -224
  12. package/coverage/block-navigation.js +0 -87
  13. package/coverage/core-bridge.ts.html +0 -292
  14. package/coverage/favicon.png +0 -0
  15. package/coverage/index.html +0 -191
  16. package/coverage/lcov-report/base.css +0 -224
  17. package/coverage/lcov-report/block-navigation.js +0 -87
  18. package/coverage/lcov-report/core-bridge.ts.html +0 -292
  19. package/coverage/lcov-report/favicon.png +0 -0
  20. package/coverage/lcov-report/index.html +0 -191
  21. package/coverage/lcov-report/port-extractor.ts.html +0 -1174
  22. package/coverage/lcov-report/port-scanner.ts.html +0 -301
  23. package/coverage/lcov-report/port-utils.ts.html +0 -670
  24. package/coverage/lcov-report/prettify.css +0 -1
  25. package/coverage/lcov-report/prettify.js +0 -2
  26. package/coverage/lcov-report/script-runner.ts.html +0 -3346
  27. package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
  28. package/coverage/lcov-report/sorter.js +0 -210
  29. package/coverage/lcov-report/test-parser.ts.html +0 -799
  30. package/coverage/lcov.info +0 -1338
  31. package/coverage/port-extractor.ts.html +0 -1174
  32. package/coverage/port-scanner.ts.html +0 -301
  33. package/coverage/port-utils.ts.html +0 -670
  34. package/coverage/prettify.css +0 -1
  35. package/coverage/prettify.js +0 -2
  36. package/coverage/script-runner.ts.html +0 -3346
  37. package/coverage/sort-arrow-sprite.png +0 -0
  38. package/coverage/sorter.js +0 -210
  39. package/coverage/test-parser.ts.html +0 -799
  40. package/dist/__tests__/core-bridge.test.d.ts +0 -1
  41. package/dist/__tests__/core-bridge.test.js +0 -135
  42. package/dist/__tests__/port-extractor.test.d.ts +0 -1
  43. package/dist/__tests__/port-extractor.test.js +0 -407
  44. package/dist/__tests__/port-scanner.test.d.ts +0 -1
  45. package/dist/__tests__/port-scanner.test.js +0 -170
  46. package/dist/__tests__/port-utils.test.d.ts +0 -1
  47. package/dist/__tests__/port-utils.test.js +0 -127
  48. package/dist/__tests__/script-runner.test.d.ts +0 -1
  49. package/dist/__tests__/script-runner.test.js +0 -491
  50. package/dist/__tests__/test-parser.test.d.ts +0 -1
  51. package/dist/__tests__/test-parser.test.js +0 -276
  52. package/dist/api/__tests__/database.test.d.ts +0 -2
  53. package/dist/api/__tests__/database.test.d.ts.map +0 -1
  54. package/dist/api/__tests__/database.test.js +0 -485
  55. package/dist/api/__tests__/database.test.js.map +0 -1
  56. package/dist/api/__tests__/routes.test.d.ts +0 -2
  57. package/dist/api/__tests__/routes.test.d.ts.map +0 -1
  58. package/dist/api/__tests__/routes.test.js +0 -484
  59. package/dist/api/__tests__/routes.test.js.map +0 -1
  60. package/dist/api/__tests__/scanner.test.d.ts +0 -2
  61. package/dist/api/__tests__/scanner.test.d.ts.map +0 -1
  62. package/dist/api/__tests__/scanner.test.js +0 -403
  63. package/dist/api/__tests__/scanner.test.js.map +0 -1
  64. package/dist/core/__tests__/database.test.d.ts +0 -1
  65. package/dist/core/__tests__/database.test.js +0 -557
  66. package/dist/core/__tests__/detector.test.d.ts +0 -1
  67. package/dist/core/__tests__/detector.test.js +0 -375
  68. package/dist/core/__tests__/index.test.d.ts +0 -1
  69. package/dist/core/__tests__/index.test.js +0 -469
  70. package/dist/core/__tests__/scanner.test.d.ts +0 -1
  71. package/dist/core/__tests__/scanner.test.js +0 -406
  72. package/dist/core/__tests__/settings.test.d.ts +0 -1
  73. package/dist/core/__tests__/settings.test.js +0 -280
  74. package/dist/electron/core/__tests__/database.test.d.ts +0 -1
  75. package/dist/electron/core/__tests__/database.test.js +0 -557
  76. package/dist/electron/core/__tests__/detector.test.d.ts +0 -1
  77. package/dist/electron/core/__tests__/detector.test.js +0 -375
  78. package/dist/electron/core/__tests__/index.test.d.ts +0 -1
  79. package/dist/electron/core/__tests__/index.test.js +0 -469
  80. package/dist/electron/core/__tests__/scanner.test.d.ts +0 -1
  81. package/dist/electron/core/__tests__/scanner.test.js +0 -406
  82. package/dist/electron/core/__tests__/settings.test.d.ts +0 -1
  83. package/dist/electron/core/__tests__/settings.test.js +0 -280
  84. 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 {};