projax 1.0.1 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/database.d.ts +34 -0
- package/dist/api/database.d.ts.map +1 -0
- package/dist/api/database.js +318 -0
- package/dist/api/database.js.map +1 -0
- package/dist/api/index.d.ts +5 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +130 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/migrate.d.ts +2 -0
- package/dist/api/migrate.d.ts.map +1 -0
- package/dist/api/migrate.js +158 -0
- package/dist/api/migrate.js.map +1 -0
- package/dist/api/package.json +27 -0
- package/dist/api/routes/index.d.ts +3 -0
- package/dist/api/routes/index.d.ts.map +1 -0
- package/dist/api/routes/index.js +17 -0
- package/dist/api/routes/index.js.map +1 -0
- package/dist/api/routes/projects.d.ts +3 -0
- package/dist/api/routes/projects.d.ts.map +1 -0
- package/dist/api/routes/projects.js +198 -0
- package/dist/api/routes/projects.js.map +1 -0
- package/dist/api/routes/settings.d.ts +3 -0
- package/dist/api/routes/settings.d.ts.map +1 -0
- package/dist/api/routes/settings.js +33 -0
- package/dist/api/routes/settings.js.map +1 -0
- package/dist/api/services/scanner.d.ts +9 -0
- package/dist/api/services/scanner.d.ts.map +1 -0
- package/dist/api/services/scanner.js +172 -0
- package/dist/api/services/scanner.js.map +1 -0
- package/dist/api/types.d.ts +48 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +3 -0
- package/dist/api/types.js.map +1 -0
- package/dist/core/database.d.ts +15 -5
- package/dist/core/database.js +136 -208
- package/dist/core/detector.d.ts +5 -0
- package/dist/core/detector.js +135 -0
- package/dist/core/index.d.ts +1 -2
- package/dist/core/index.js +2 -4
- package/dist/core/scanner.js +2 -105
- package/dist/core/settings.d.ts +50 -0
- package/dist/core/settings.js +102 -0
- package/dist/electron/main.js +86 -28
- package/dist/electron/port-scanner.js +4 -4
- package/dist/electron/preload.d.ts +1 -1
- package/dist/electron/renderer/assets/index-7KIJIiIM.js +42 -0
- package/dist/electron/renderer/assets/{index-CdMlFqhB.js → index-BRymlmJj.js} +10 -10
- package/dist/electron/renderer/assets/{index-DohAcUCg.css → index-ezVMxZrM.css} +1 -1
- package/dist/electron/renderer/index.html +2 -2
- package/dist/electron/script-runner.js +4 -4
- package/dist/index.js +253 -88
- package/dist/port-scanner.js +4 -4
- package/dist/script-runner.js +4 -4
- package/package.json +13 -11
- package/dist/electron/renderer/assets/index-BZ6USRnW.js +0 -42
- package/dist/electron/renderer/assets/index-DNtxfrZe.js +0 -42
- package/dist/electron/renderer/assets/index-khk3K-qG.css +0 -1
|
@@ -0,0 +1,158 @@
|
|
|
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
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.migrateFromSQLite = migrateFromSQLite;
|
|
40
|
+
const path = __importStar(require("path"));
|
|
41
|
+
const os = __importStar(require("os"));
|
|
42
|
+
const fs = __importStar(require("fs"));
|
|
43
|
+
const better_sqlite3_1 = __importDefault(require("better-sqlite3"));
|
|
44
|
+
const database_1 = require("./database");
|
|
45
|
+
function migrateFromSQLite() {
|
|
46
|
+
const dataDir = path.join(os.homedir(), '.projax');
|
|
47
|
+
const sqlitePath = path.join(dataDir, 'dashboard.db');
|
|
48
|
+
const jsonPath = path.join(dataDir, 'data.json');
|
|
49
|
+
const backupPath = path.join(dataDir, 'dashboard.db.backup');
|
|
50
|
+
// Check if SQLite database exists
|
|
51
|
+
if (!fs.existsSync(sqlitePath)) {
|
|
52
|
+
console.log('No SQLite database found. Skipping migration.');
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
// Check if JSON database already exists
|
|
56
|
+
if (fs.existsSync(jsonPath)) {
|
|
57
|
+
console.log('JSON database already exists. Skipping migration.');
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
console.log('Starting migration from SQLite to JSON...');
|
|
61
|
+
try {
|
|
62
|
+
// Open SQLite database
|
|
63
|
+
const sqliteDb = new better_sqlite3_1.default(sqlitePath);
|
|
64
|
+
// Helper to safely query table
|
|
65
|
+
const safeQuery = (query) => {
|
|
66
|
+
try {
|
|
67
|
+
return sqliteDb.prepare(query).all();
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.warn(`Table not found or empty, skipping: ${query}`);
|
|
71
|
+
return [];
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
// Read all data from SQLite
|
|
75
|
+
const projects = safeQuery('SELECT * FROM projects');
|
|
76
|
+
const tests = safeQuery('SELECT * FROM tests');
|
|
77
|
+
const jenkinsJobs = safeQuery('SELECT * FROM jenkins_jobs');
|
|
78
|
+
const projectPorts = safeQuery('SELECT * FROM project_ports');
|
|
79
|
+
const settings = safeQuery('SELECT * FROM settings');
|
|
80
|
+
sqliteDb.close();
|
|
81
|
+
// Get JSON database instance
|
|
82
|
+
const jsonDb = (0, database_1.getDatabase)();
|
|
83
|
+
// Migrate projects
|
|
84
|
+
console.log(`Migrating ${projects.length} projects...`);
|
|
85
|
+
for (const project of projects) {
|
|
86
|
+
try {
|
|
87
|
+
jsonDb.addProject(project.name, project.path);
|
|
88
|
+
// Update timestamps manually since addProject creates new timestamps
|
|
89
|
+
const migratedProject = jsonDb.getProjectByPath(project.path);
|
|
90
|
+
if (migratedProject) {
|
|
91
|
+
// We need to update the project directly in the database
|
|
92
|
+
// Since we don't have a direct update method, we'll need to modify the database
|
|
93
|
+
// For now, let's just migrate the data - timestamps will be new
|
|
94
|
+
// This is acceptable as the important data (name, path) is preserved
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.warn(`Failed to migrate project ${project.name}:`, error);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Migrate tests
|
|
102
|
+
console.log(`Migrating ${tests.length} tests...`);
|
|
103
|
+
for (const test of tests) {
|
|
104
|
+
try {
|
|
105
|
+
jsonDb.addTest(test.project_id, test.file_path, test.framework);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.warn(`Failed to migrate test ${test.id}:`, error);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// Migrate Jenkins jobs
|
|
112
|
+
console.log(`Migrating ${jenkinsJobs.length} Jenkins jobs...`);
|
|
113
|
+
for (const job of jenkinsJobs) {
|
|
114
|
+
try {
|
|
115
|
+
jsonDb.addJenkinsJob(job.project_id, job.job_name, job.job_url);
|
|
116
|
+
}
|
|
117
|
+
catch (error) {
|
|
118
|
+
console.warn(`Failed to migrate Jenkins job ${job.id}:`, error);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// Migrate project ports
|
|
122
|
+
console.log(`Migrating ${projectPorts.length} project ports...`);
|
|
123
|
+
for (const port of projectPorts) {
|
|
124
|
+
try {
|
|
125
|
+
jsonDb.addProjectPort(port.project_id, port.port, port.config_source, port.script_name);
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.warn(`Failed to migrate project port ${port.id}:`, error);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Migrate settings
|
|
132
|
+
console.log(`Migrating ${settings.length} settings...`);
|
|
133
|
+
for (const setting of settings) {
|
|
134
|
+
try {
|
|
135
|
+
jsonDb.setSetting(setting.key, setting.value);
|
|
136
|
+
}
|
|
137
|
+
catch (error) {
|
|
138
|
+
console.warn(`Failed to migrate setting ${setting.key}:`, error);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Backup SQLite database
|
|
142
|
+
console.log('Creating backup of SQLite database...');
|
|
143
|
+
fs.copyFileSync(sqlitePath, backupPath);
|
|
144
|
+
console.log('✓ Migration completed successfully!');
|
|
145
|
+
console.log(` - Projects: ${projects.length}`);
|
|
146
|
+
console.log(` - Tests: ${tests.length}`);
|
|
147
|
+
console.log(` - Jenkins Jobs: ${jenkinsJobs.length}`);
|
|
148
|
+
console.log(` - Project Ports: ${projectPorts.length}`);
|
|
149
|
+
console.log(` - Settings: ${settings.length}`);
|
|
150
|
+
console.log(` - SQLite backup: ${backupPath}`);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
console.error('Migration failed:', error);
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../src/migrate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "projax-api",
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"description": "REST API server for projax project dashboard (internal use)",
|
|
5
|
+
"private": true,
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"dev": "ts-node src/index.ts",
|
|
10
|
+
"start": "node dist/index.js",
|
|
11
|
+
"clean": "rm -rf dist"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"express": "^4.18.2",
|
|
15
|
+
"cors": "^2.8.5",
|
|
16
|
+
"better-sqlite3": "^11.10.0"
|
|
17
|
+
},
|
|
18
|
+
"devDependencies": {
|
|
19
|
+
"@types/express": "^4.17.21",
|
|
20
|
+
"@types/cors": "^2.8.17",
|
|
21
|
+
"@types/better-sqlite3": "^7.6.8",
|
|
22
|
+
"@types/node": "^20.10.0",
|
|
23
|
+
"typescript": "^5.3.3",
|
|
24
|
+
"ts-node": "^10.9.2"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAIA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAUxB,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const express_1 = require("express");
|
|
7
|
+
const projects_1 = __importDefault(require("./projects"));
|
|
8
|
+
const settings_1 = __importDefault(require("./settings"));
|
|
9
|
+
const router = (0, express_1.Router)();
|
|
10
|
+
router.use('/projects', projects_1.default);
|
|
11
|
+
router.use('/settings', settings_1.default);
|
|
12
|
+
// Health check endpoint
|
|
13
|
+
router.get('/health', (req, res) => {
|
|
14
|
+
res.json({ status: 'ok', timestamp: new Date().toISOString() });
|
|
15
|
+
});
|
|
16
|
+
exports.default = router;
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":";;;;;AAAA,qCAAiC;AACjC,0DAAwC;AACxC,0DAAwC;AAExC,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AAExB,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,kBAAc,CAAC,CAAC;AACxC,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,kBAAc,CAAC,CAAC;AAExC,wBAAwB;AACxB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACjC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,kBAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"AAMA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA8KxB,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,198 @@
|
|
|
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 express_1 = require("express");
|
|
37
|
+
const database_1 = require("../database");
|
|
38
|
+
const scanner_1 = require("../services/scanner");
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const fs = __importStar(require("fs"));
|
|
41
|
+
const router = (0, express_1.Router)();
|
|
42
|
+
const db = (0, database_1.getDatabase)();
|
|
43
|
+
// GET /api/projects - List all projects
|
|
44
|
+
router.get('/', (req, res) => {
|
|
45
|
+
try {
|
|
46
|
+
const projects = db.getAllProjects();
|
|
47
|
+
res.json(projects);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
res.status(500).json({ error: 'Failed to fetch projects' });
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
// POST /api/projects - Add a new project
|
|
54
|
+
router.post('/', (req, res) => {
|
|
55
|
+
try {
|
|
56
|
+
const { name, path: projectPath } = req.body;
|
|
57
|
+
if (!name || !projectPath) {
|
|
58
|
+
return res.status(400).json({ error: 'Name and path are required' });
|
|
59
|
+
}
|
|
60
|
+
const resolvedPath = path.resolve(projectPath);
|
|
61
|
+
if (!fs.existsSync(resolvedPath)) {
|
|
62
|
+
return res.status(400).json({ error: 'Path does not exist' });
|
|
63
|
+
}
|
|
64
|
+
if (!fs.statSync(resolvedPath).isDirectory()) {
|
|
65
|
+
return res.status(400).json({ error: 'Path must be a directory' });
|
|
66
|
+
}
|
|
67
|
+
const existing = db.getProjectByPath(resolvedPath);
|
|
68
|
+
if (existing) {
|
|
69
|
+
return res.status(409).json({ error: 'Project with this path already exists', project: existing });
|
|
70
|
+
}
|
|
71
|
+
const project = db.addProject(name, resolvedPath);
|
|
72
|
+
res.status(201).json(project);
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to add project' });
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
// GET /api/projects/:id - Get project details
|
|
79
|
+
router.get('/:id', (req, res) => {
|
|
80
|
+
try {
|
|
81
|
+
const id = parseInt(req.params.id, 10);
|
|
82
|
+
if (isNaN(id)) {
|
|
83
|
+
return res.status(400).json({ error: 'Invalid project ID' });
|
|
84
|
+
}
|
|
85
|
+
const project = db.getProject(id);
|
|
86
|
+
if (!project) {
|
|
87
|
+
return res.status(404).json({ error: 'Project not found' });
|
|
88
|
+
}
|
|
89
|
+
res.json(project);
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
res.status(500).json({ error: 'Failed to fetch project' });
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
// PUT /api/projects/:id - Update project
|
|
96
|
+
router.put('/:id', (req, res) => {
|
|
97
|
+
try {
|
|
98
|
+
const id = parseInt(req.params.id, 10);
|
|
99
|
+
if (isNaN(id)) {
|
|
100
|
+
return res.status(400).json({ error: 'Invalid project ID' });
|
|
101
|
+
}
|
|
102
|
+
const { name, framework } = req.body;
|
|
103
|
+
// Use the updateProject method for partial updates
|
|
104
|
+
const updates = {};
|
|
105
|
+
if (name !== undefined)
|
|
106
|
+
updates.name = name;
|
|
107
|
+
if (framework !== undefined)
|
|
108
|
+
updates.framework = framework;
|
|
109
|
+
if (Object.keys(updates).length === 0) {
|
|
110
|
+
return res.status(400).json({ error: 'No valid fields to update' });
|
|
111
|
+
}
|
|
112
|
+
const updated = db.updateProject(id, updates);
|
|
113
|
+
res.json(updated);
|
|
114
|
+
}
|
|
115
|
+
catch (error) {
|
|
116
|
+
res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to update project' });
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
// DELETE /api/projects/:id - Remove project
|
|
120
|
+
router.delete('/:id', (req, res) => {
|
|
121
|
+
try {
|
|
122
|
+
const id = parseInt(req.params.id, 10);
|
|
123
|
+
if (isNaN(id)) {
|
|
124
|
+
return res.status(400).json({ error: 'Invalid project ID' });
|
|
125
|
+
}
|
|
126
|
+
const project = db.getProject(id);
|
|
127
|
+
if (!project) {
|
|
128
|
+
return res.status(404).json({ error: 'Project not found' });
|
|
129
|
+
}
|
|
130
|
+
db.removeProject(id);
|
|
131
|
+
res.status(204).send();
|
|
132
|
+
}
|
|
133
|
+
catch (error) {
|
|
134
|
+
res.status(500).json({ error: 'Failed to remove project' });
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
// GET /api/projects/:id/tests - Get tests for project
|
|
138
|
+
router.get('/:id/tests', (req, res) => {
|
|
139
|
+
try {
|
|
140
|
+
const id = parseInt(req.params.id, 10);
|
|
141
|
+
if (isNaN(id)) {
|
|
142
|
+
return res.status(400).json({ error: 'Invalid project ID' });
|
|
143
|
+
}
|
|
144
|
+
const project = db.getProject(id);
|
|
145
|
+
if (!project) {
|
|
146
|
+
return res.status(404).json({ error: 'Project not found' });
|
|
147
|
+
}
|
|
148
|
+
const tests = db.getTestsByProject(id);
|
|
149
|
+
res.json(tests);
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
res.status(500).json({ error: 'Failed to fetch tests' });
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
// GET /api/projects/:id/ports - Get project ports
|
|
156
|
+
router.get('/:id/ports', (req, res) => {
|
|
157
|
+
try {
|
|
158
|
+
const id = parseInt(req.params.id, 10);
|
|
159
|
+
if (isNaN(id)) {
|
|
160
|
+
return res.status(400).json({ error: 'Invalid project ID' });
|
|
161
|
+
}
|
|
162
|
+
const project = db.getProject(id);
|
|
163
|
+
if (!project) {
|
|
164
|
+
return res.status(404).json({ error: 'Project not found' });
|
|
165
|
+
}
|
|
166
|
+
const ports = db.getProjectPorts(id);
|
|
167
|
+
res.json(ports);
|
|
168
|
+
}
|
|
169
|
+
catch (error) {
|
|
170
|
+
res.status(500).json({ error: 'Failed to fetch ports' });
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
// POST /api/projects/:id/scan - Scan project for tests
|
|
174
|
+
router.post('/:id/scan', (req, res) => {
|
|
175
|
+
try {
|
|
176
|
+
const id = parseInt(req.params.id, 10);
|
|
177
|
+
if (isNaN(id)) {
|
|
178
|
+
return res.status(400).json({ error: 'Invalid project ID' });
|
|
179
|
+
}
|
|
180
|
+
const result = (0, scanner_1.scanProject)(id);
|
|
181
|
+
res.json(result);
|
|
182
|
+
}
|
|
183
|
+
catch (error) {
|
|
184
|
+
res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to scan project' });
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
// POST /api/projects/scan/all - Scan all projects
|
|
188
|
+
router.post('/scan/all', (req, res) => {
|
|
189
|
+
try {
|
|
190
|
+
const results = (0, scanner_1.scanAllProjects)();
|
|
191
|
+
res.json(results);
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
res.status(500).json({ error: error instanceof Error ? error.message : 'Failed to scan projects' });
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
exports.default = router;
|
|
198
|
+
//# sourceMappingURL=projects.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/routes/projects.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/routes/settings.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,MAAM,4CAAW,CAAC;AA8BxB,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const express_1 = require("express");
|
|
4
|
+
const database_1 = require("../database");
|
|
5
|
+
const router = (0, express_1.Router)();
|
|
6
|
+
const db = (0, database_1.getDatabase)();
|
|
7
|
+
// GET /api/settings - Get all settings
|
|
8
|
+
router.get('/', (req, res) => {
|
|
9
|
+
try {
|
|
10
|
+
const settings = db.getAllSettings();
|
|
11
|
+
res.json(settings);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
res.status(500).json({ error: 'Failed to fetch settings' });
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
// PUT /api/settings/:key - Update a setting
|
|
18
|
+
router.put('/:key', (req, res) => {
|
|
19
|
+
try {
|
|
20
|
+
const { key } = req.params;
|
|
21
|
+
const { value } = req.body;
|
|
22
|
+
if (value === undefined) {
|
|
23
|
+
return res.status(400).json({ error: 'Value is required' });
|
|
24
|
+
}
|
|
25
|
+
db.setSetting(key, String(value));
|
|
26
|
+
res.json({ key, value });
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
res.status(500).json({ error: 'Failed to update setting' });
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
exports.default = router;
|
|
33
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/routes/settings.ts"],"names":[],"mappings":";;AAAA,qCAAoD;AACpD,0CAA0C;AAE1C,MAAM,MAAM,GAAG,IAAA,gBAAM,GAAE,CAAC;AACxB,MAAM,EAAE,GAAG,IAAA,sBAAW,GAAE,CAAC;AAEzB,uCAAuC;AACvC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAC9C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,4CAA4C;AAC5C,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,GAAY,EAAE,GAAa,EAAE,EAAE;IAClD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;QAC3B,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,IAAI,CAAC;QAE3B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAClC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,kBAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Project, Test } from '../types';
|
|
2
|
+
export interface ScanResult {
|
|
3
|
+
project: Project;
|
|
4
|
+
testsFound: number;
|
|
5
|
+
tests: Test[];
|
|
6
|
+
}
|
|
7
|
+
export declare function scanProject(projectId: number): ScanResult;
|
|
8
|
+
export declare function scanAllProjects(): ScanResult[];
|
|
9
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/services/scanner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AA2GD,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,UAAU,CAoCzD;AAED,wBAAgB,eAAe,IAAI,UAAU,EAAE,CAe9C"}
|