projax 3.3.57 → 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.
- package/dist/electron/script-runner.js +52 -20
- package/dist/index.js +1 -1
- package/dist/prxi.js +846 -111
- package/dist/prxi.tsx +1236 -181
- package/dist/script-runner.js +52 -20
- package/package.json +1 -1
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/core-bridge.ts.html +0 -292
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -191
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/core-bridge.ts.html +0 -292
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -191
- package/coverage/lcov-report/port-extractor.ts.html +0 -1174
- package/coverage/lcov-report/port-scanner.ts.html +0 -301
- package/coverage/lcov-report/port-utils.ts.html +0 -670
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/script-runner.ts.html +0 -3346
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -210
- package/coverage/lcov-report/test-parser.ts.html +0 -799
- package/coverage/lcov.info +0 -1338
- package/coverage/port-extractor.ts.html +0 -1174
- package/coverage/port-scanner.ts.html +0 -301
- package/coverage/port-utils.ts.html +0 -670
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/script-runner.ts.html +0 -3346
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -210
- package/coverage/test-parser.ts.html +0 -799
- package/dist/__tests__/core-bridge.test.d.ts +0 -1
- package/dist/__tests__/core-bridge.test.js +0 -135
- package/dist/__tests__/port-extractor.test.d.ts +0 -1
- package/dist/__tests__/port-extractor.test.js +0 -407
- package/dist/__tests__/port-scanner.test.d.ts +0 -1
- package/dist/__tests__/port-scanner.test.js +0 -170
- package/dist/__tests__/port-utils.test.d.ts +0 -1
- package/dist/__tests__/port-utils.test.js +0 -127
- package/dist/__tests__/script-runner.test.d.ts +0 -1
- package/dist/__tests__/script-runner.test.js +0 -491
- package/dist/__tests__/test-parser.test.d.ts +0 -1
- package/dist/__tests__/test-parser.test.js +0 -276
- package/dist/api/__tests__/database.test.d.ts +0 -2
- package/dist/api/__tests__/database.test.d.ts.map +0 -1
- package/dist/api/__tests__/database.test.js +0 -485
- package/dist/api/__tests__/database.test.js.map +0 -1
- package/dist/api/__tests__/routes.test.d.ts +0 -2
- package/dist/api/__tests__/routes.test.d.ts.map +0 -1
- package/dist/api/__tests__/routes.test.js +0 -484
- package/dist/api/__tests__/routes.test.js.map +0 -1
- package/dist/api/__tests__/scanner.test.d.ts +0 -2
- package/dist/api/__tests__/scanner.test.d.ts.map +0 -1
- package/dist/api/__tests__/scanner.test.js +0 -403
- package/dist/api/__tests__/scanner.test.js.map +0 -1
- package/dist/core/__tests__/database.test.d.ts +0 -1
- package/dist/core/__tests__/database.test.js +0 -557
- package/dist/core/__tests__/detector.test.d.ts +0 -1
- package/dist/core/__tests__/detector.test.js +0 -375
- package/dist/core/__tests__/index.test.d.ts +0 -1
- package/dist/core/__tests__/index.test.js +0 -469
- package/dist/core/__tests__/scanner.test.d.ts +0 -1
- package/dist/core/__tests__/scanner.test.js +0 -406
- package/dist/core/__tests__/settings.test.d.ts +0 -1
- package/dist/core/__tests__/settings.test.js +0 -280
- package/dist/electron/core/__tests__/database.test.d.ts +0 -1
- package/dist/electron/core/__tests__/database.test.js +0 -557
- package/dist/electron/core/__tests__/detector.test.d.ts +0 -1
- package/dist/electron/core/__tests__/detector.test.js +0 -375
- package/dist/electron/core/__tests__/index.test.d.ts +0 -1
- package/dist/electron/core/__tests__/index.test.js +0 -469
- package/dist/electron/core/__tests__/scanner.test.d.ts +0 -1
- package/dist/electron/core/__tests__/scanner.test.js +0 -406
- package/dist/electron/core/__tests__/settings.test.d.ts +0 -1
- package/dist/electron/core/__tests__/settings.test.js +0 -280
- 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 {};
|