projax 1.0.2 → 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.
Files changed (57) 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/electron/main.js +86 -28
  44. package/dist/electron/port-scanner.js +4 -4
  45. package/dist/electron/preload.d.ts +1 -1
  46. package/dist/electron/renderer/assets/index-7KIJIiIM.js +42 -0
  47. package/dist/electron/renderer/assets/{index-CdMlFqhB.js → index-BRymlmJj.js} +10 -10
  48. package/dist/electron/renderer/assets/{index-DohAcUCg.css → index-ezVMxZrM.css} +1 -1
  49. package/dist/electron/renderer/index.html +2 -2
  50. package/dist/electron/script-runner.js +4 -4
  51. package/dist/index.js +240 -75
  52. package/dist/port-scanner.js +4 -4
  53. package/dist/script-runner.js +4 -4
  54. package/package.json +13 -11
  55. package/dist/electron/renderer/assets/index-BZ6USRnW.js +0 -42
  56. package/dist/electron/renderer/assets/index-DNtxfrZe.js +0 -42
  57. package/dist/electron/renderer/assets/index-khk3K-qG.css +0 -1
@@ -0,0 +1,172 @@
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
+ exports.scanProject = scanProject;
37
+ exports.scanAllProjects = scanAllProjects;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ const database_1 = require("../database");
41
+ function detectTestFramework(projectPath) {
42
+ const packageJsonPath = path.join(projectPath, 'package.json');
43
+ if (!fs.existsSync(packageJsonPath)) {
44
+ return null;
45
+ }
46
+ try {
47
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
48
+ const deps = { ...packageJson.dependencies, ...packageJson.devDependencies };
49
+ if (deps['jest'] || deps['@jest/core']) {
50
+ return 'jest';
51
+ }
52
+ if (deps['mocha']) {
53
+ return 'mocha';
54
+ }
55
+ if (deps['vitest']) {
56
+ return 'vitest';
57
+ }
58
+ if (deps['@playwright/test']) {
59
+ return 'playwright';
60
+ }
61
+ if (deps['cypress']) {
62
+ return 'cypress';
63
+ }
64
+ if (deps['pytest'] || deps['pytest-asyncio']) {
65
+ return 'pytest';
66
+ }
67
+ if (deps['unittest']) {
68
+ return 'unittest';
69
+ }
70
+ return null;
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ }
76
+ function isTestFile(filePath, framework) {
77
+ const ext = path.extname(filePath).toLowerCase();
78
+ const basename = path.basename(filePath).toLowerCase();
79
+ // Common test file patterns
80
+ if (basename.includes('.test.') || basename.includes('.spec.')) {
81
+ return true;
82
+ }
83
+ // Framework-specific patterns
84
+ if (framework === 'jest' || framework === 'vitest') {
85
+ return ext === '.ts' || ext === '.tsx' || ext === '.js' || ext === '.jsx';
86
+ }
87
+ if (framework === 'mocha') {
88
+ return ext === '.js' || ext === '.ts';
89
+ }
90
+ if (framework === 'pytest') {
91
+ return ext === '.py' && (basename.startsWith('test_') || basename.includes('_test'));
92
+ }
93
+ if (framework === 'unittest') {
94
+ return ext === '.py' && basename.startsWith('test');
95
+ }
96
+ // Default: check for test/spec in name
97
+ return basename.includes('test') || basename.includes('spec');
98
+ }
99
+ function findTestFiles(dir, framework, results = []) {
100
+ if (!fs.existsSync(dir)) {
101
+ return results;
102
+ }
103
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
104
+ for (const entry of entries) {
105
+ const fullPath = path.join(dir, entry.name);
106
+ // Skip node_modules, .git, and other common ignore directories
107
+ if (entry.isDirectory()) {
108
+ if (entry.name === 'node_modules' ||
109
+ entry.name === '.git' ||
110
+ entry.name === 'dist' ||
111
+ entry.name === 'build' ||
112
+ entry.name === '.next' ||
113
+ entry.name === '.nuxt' ||
114
+ entry.name === 'coverage' ||
115
+ entry.name.startsWith('.')) {
116
+ continue;
117
+ }
118
+ findTestFiles(fullPath, framework, results);
119
+ }
120
+ else if (entry.isFile()) {
121
+ if (isTestFile(fullPath, framework)) {
122
+ results.push(fullPath);
123
+ }
124
+ }
125
+ }
126
+ return results;
127
+ }
128
+ function scanProject(projectId) {
129
+ const db = (0, database_1.getDatabase)();
130
+ const project = db.getProject(projectId);
131
+ if (!project) {
132
+ throw new Error(`Project with id ${projectId} not found`);
133
+ }
134
+ if (!fs.existsSync(project.path)) {
135
+ throw new Error(`Project path does not exist: ${project.path}`);
136
+ }
137
+ // Detect framework first
138
+ const framework = detectTestFramework(project.path);
139
+ // Remove existing tests for this project
140
+ db.removeTestsByProject(projectId);
141
+ // Scan for test files
142
+ const tests = [];
143
+ const testFiles = findTestFiles(project.path, framework);
144
+ for (const testFile of testFiles) {
145
+ const relativePath = path.relative(project.path, testFile);
146
+ const test = db.addTest(projectId, relativePath, framework);
147
+ tests.push(test);
148
+ }
149
+ // Update last scanned timestamp
150
+ db.updateProjectLastScanned(projectId);
151
+ return {
152
+ project: db.getProject(projectId),
153
+ testsFound: tests.length,
154
+ tests,
155
+ };
156
+ }
157
+ function scanAllProjects() {
158
+ const db = (0, database_1.getDatabase)();
159
+ const projects = db.getAllProjects();
160
+ const results = [];
161
+ for (const project of projects) {
162
+ try {
163
+ const result = scanProject(project.id);
164
+ results.push(result);
165
+ }
166
+ catch (error) {
167
+ console.error(`Error scanning project ${project.name}:`, error);
168
+ }
169
+ }
170
+ return results;
171
+ }
172
+ //# sourceMappingURL=scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/services/scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export interface Project {
2
+ id: number;
3
+ name: string;
4
+ path: string;
5
+ framework: string | null;
6
+ last_scanned: number | null;
7
+ created_at: number;
8
+ }
9
+ export interface Test {
10
+ id: number;
11
+ project_id: number;
12
+ file_path: string;
13
+ framework: string | null;
14
+ status: string | null;
15
+ last_run: number | null;
16
+ created_at: number;
17
+ }
18
+ export interface JenkinsJob {
19
+ id: number;
20
+ project_id: number;
21
+ job_name: string;
22
+ job_url: string;
23
+ last_build_status: string | null;
24
+ last_build_number: number | null;
25
+ last_updated: number | null;
26
+ created_at: number;
27
+ }
28
+ export interface ProjectPort {
29
+ id: number;
30
+ project_id: number;
31
+ port: number;
32
+ script_name: string | null;
33
+ config_source: string;
34
+ last_detected: number;
35
+ created_at: number;
36
+ }
37
+ export interface DatabaseSchema {
38
+ projects: Project[];
39
+ tests: Test[];
40
+ jenkins_jobs: JenkinsJob[];
41
+ project_ports: ProjectPort[];
42
+ settings: Array<{
43
+ key: string;
44
+ value: string;
45
+ updated_at: number;
46
+ }>;
47
+ }
48
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,aAAa,EAAE,WAAW,EAAE,CAAC;IAC7B,QAAQ,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACrE"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -1,8 +1,8 @@
1
- import Database from 'better-sqlite3';
2
1
  export interface Project {
3
2
  id: number;
4
3
  name: string;
5
4
  path: string;
5
+ framework: string | null;
6
6
  last_scanned: number | null;
7
7
  created_at: number;
8
8
  }
@@ -34,19 +34,26 @@ export interface ProjectPort {
34
34
  last_detected: number;
35
35
  created_at: number;
36
36
  }
37
+ type ScanResponse = {
38
+ project: Project;
39
+ testsFound: number;
40
+ tests: Test[];
41
+ };
37
42
  declare class DatabaseManager {
38
- private db;
39
- private dbPath;
43
+ private apiBaseUrl;
44
+ private defaultPort;
40
45
  constructor();
41
- getDatabase(): Database.Database;
42
- private initializeSchema;
46
+ private request;
43
47
  addProject(name: string, projectPath: string): Project;
44
48
  getProject(id: number): Project | null;
45
49
  getProjectByPath(projectPath: string): Project | null;
46
50
  getAllProjects(): Project[];
47
51
  updateProjectLastScanned(id: number): void;
52
+ updateProjectFramework(id: number, framework: string): void;
48
53
  updateProjectName(id: number, newName: string): Project;
49
54
  removeProject(id: number): void;
55
+ scanProject(id: number): ScanResponse;
56
+ scanAllProjects(): ScanResponse[];
50
57
  addTest(projectId: number, filePath: string, framework?: string | null): Test;
51
58
  getTest(id: number): Test | null;
52
59
  getTestsByProject(projectId: number): Test[];
@@ -60,6 +67,9 @@ declare class DatabaseManager {
60
67
  getProjectPortsByScript(projectId: number, scriptName: string): ProjectPort[];
61
68
  removeProjectPorts(projectId: number): void;
62
69
  updateProjectPortLastDetected(projectId: number, port: number, scriptName: string | null): void;
70
+ getSetting(key: string): string | null;
71
+ setSetting(key: string, value: string): void;
72
+ getAllSettings(): Record<string, string>;
63
73
  close(): void;
64
74
  }
65
75
  export declare function getDatabaseManager(): DatabaseManager;