projax 1.0.2 → 1.3.1

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 (73) hide show
  1. package/dist/api/database.d.ts +34 -0
  2. package/dist/api/database.d.ts.map +1 -0
  3. package/dist/api/database.js +318 -0
  4. package/dist/api/database.js.map +1 -0
  5. package/dist/api/index.d.ts +5 -0
  6. package/dist/api/index.d.ts.map +1 -0
  7. package/dist/api/index.js +130 -0
  8. package/dist/api/index.js.map +1 -0
  9. package/dist/api/migrate.d.ts +2 -0
  10. package/dist/api/migrate.d.ts.map +1 -0
  11. package/dist/api/migrate.js +158 -0
  12. package/dist/api/migrate.js.map +1 -0
  13. package/dist/api/package.json +27 -0
  14. package/dist/api/routes/index.d.ts +3 -0
  15. package/dist/api/routes/index.d.ts.map +1 -0
  16. package/dist/api/routes/index.js +17 -0
  17. package/dist/api/routes/index.js.map +1 -0
  18. package/dist/api/routes/projects.d.ts +3 -0
  19. package/dist/api/routes/projects.d.ts.map +1 -0
  20. package/dist/api/routes/projects.js +198 -0
  21. package/dist/api/routes/projects.js.map +1 -0
  22. package/dist/api/routes/settings.d.ts +3 -0
  23. package/dist/api/routes/settings.d.ts.map +1 -0
  24. package/dist/api/routes/settings.js +33 -0
  25. package/dist/api/routes/settings.js.map +1 -0
  26. package/dist/api/services/scanner.d.ts +9 -0
  27. package/dist/api/services/scanner.d.ts.map +1 -0
  28. package/dist/api/services/scanner.js +172 -0
  29. package/dist/api/services/scanner.js.map +1 -0
  30. package/dist/api/types.d.ts +48 -0
  31. package/dist/api/types.d.ts.map +1 -0
  32. package/dist/api/types.js +3 -0
  33. package/dist/api/types.js.map +1 -0
  34. package/dist/core/database.d.ts +15 -5
  35. package/dist/core/database.js +136 -208
  36. package/dist/core/detector.d.ts +5 -0
  37. package/dist/core/detector.js +135 -0
  38. package/dist/core/index.d.ts +1 -2
  39. package/dist/core/index.js +2 -4
  40. package/dist/core/scanner.js +2 -105
  41. package/dist/core/settings.d.ts +50 -0
  42. package/dist/core/settings.js +102 -0
  43. package/dist/core-bridge.d.ts +2 -0
  44. package/dist/core-bridge.js +73 -0
  45. package/dist/core.d.ts +2 -0
  46. package/dist/core.js +76 -0
  47. package/dist/electron/core/database.d.ts +76 -0
  48. package/dist/electron/core/database.js +240 -0
  49. package/dist/electron/core/detector.d.ts +14 -0
  50. package/dist/electron/core/detector.js +284 -0
  51. package/dist/electron/core/index.d.ts +10 -0
  52. package/dist/electron/core/index.js +41 -0
  53. package/dist/electron/core/scanner.d.ts +8 -0
  54. package/dist/electron/core/scanner.js +11 -0
  55. package/dist/electron/core/settings.d.ts +50 -0
  56. package/dist/electron/core/settings.js +102 -0
  57. package/dist/electron/core.d.ts +2 -0
  58. package/dist/electron/core.js +76 -0
  59. package/dist/electron/main.js +93 -51
  60. package/dist/electron/port-scanner.js +4 -4
  61. package/dist/electron/preload.d.ts +1 -1
  62. package/dist/electron/renderer/assets/index-7KIJIiIM.js +42 -0
  63. package/dist/electron/renderer/assets/{index-DohAcUCg.css → index-ezVMxZrM.css} +1 -1
  64. package/dist/electron/renderer/index.html +2 -2
  65. package/dist/electron/script-runner.js +4 -4
  66. package/dist/index.js +240 -75
  67. package/dist/port-scanner.js +4 -4
  68. package/dist/script-runner.js +4 -4
  69. package/package.json +12 -11
  70. package/dist/electron/renderer/assets/index-BZ6USRnW.js +0 -42
  71. package/dist/electron/renderer/assets/index-CdMlFqhB.js +0 -42
  72. package/dist/electron/renderer/assets/index-DNtxfrZe.js +0 -42
  73. 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,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=projects.d.ts.map
@@ -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,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=settings.d.ts.map
@@ -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"}