@manojkmfsi/monodog 1.1.6 → 1.1.8

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 (53) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +12 -0
  3. package/package.json +1 -1
  4. package/src/config/swagger-config.ts +0 -344
  5. package/src/config-loader.ts +0 -97
  6. package/src/constants/index.ts +0 -13
  7. package/src/constants/middleware.ts +0 -83
  8. package/src/constants/port.ts +0 -20
  9. package/src/constants/security.ts +0 -78
  10. package/src/controllers/commit-controller.ts +0 -31
  11. package/src/controllers/config-controller.ts +0 -42
  12. package/src/controllers/health-controller.ts +0 -24
  13. package/src/controllers/package-controller.ts +0 -67
  14. package/src/get-db-url.ts +0 -9
  15. package/src/index.ts +0 -9
  16. package/src/middleware/dashboard-startup.ts +0 -161
  17. package/src/middleware/error-handler.ts +0 -50
  18. package/src/middleware/index.ts +0 -20
  19. package/src/middleware/logger.ts +0 -65
  20. package/src/middleware/security.ts +0 -90
  21. package/src/middleware/server-startup.ts +0 -153
  22. package/src/middleware/swagger-middleware.ts +0 -58
  23. package/src/repositories/commit-repository.ts +0 -108
  24. package/src/repositories/dependency-repository.ts +0 -110
  25. package/src/repositories/index.ts +0 -10
  26. package/src/repositories/package-health-repository.ts +0 -75
  27. package/src/repositories/package-repository.ts +0 -142
  28. package/src/repositories/prisma-client.ts +0 -25
  29. package/src/routes/commit-routes.ts +0 -10
  30. package/src/routes/config-routes.ts +0 -14
  31. package/src/routes/health-routes.ts +0 -14
  32. package/src/routes/package-routes.ts +0 -22
  33. package/src/serve.ts +0 -41
  34. package/src/services/commit-service.ts +0 -44
  35. package/src/services/config-service.ts +0 -391
  36. package/src/services/git-service.ts +0 -140
  37. package/src/services/health-service.ts +0 -162
  38. package/src/services/package-service.ts +0 -228
  39. package/src/setup.ts +0 -78
  40. package/src/types/ci.ts +0 -122
  41. package/src/types/config.ts +0 -22
  42. package/src/types/database.ts +0 -67
  43. package/src/types/git.ts +0 -33
  44. package/src/types/health.ts +0 -11
  45. package/src/types/index.ts +0 -23
  46. package/src/types/package.ts +0 -39
  47. package/src/types/scanner.ts +0 -31
  48. package/src/types/swagger-jsdoc.d.ts +0 -15
  49. package/src/utils/ci-status.ts +0 -535
  50. package/src/utils/db-utils.ts +0 -92
  51. package/src/utils/health-utils.ts +0 -67
  52. package/src/utils/monorepo-scanner.ts +0 -576
  53. package/src/utils/utilities.ts +0 -427
@@ -1,228 +0,0 @@
1
- import { scanMonorepo } from '../utils/utilities';
2
- import { generateReports } from '../utils/monorepo-scanner';
3
- import { ciStatusManager } from '../utils/ci-status';
4
- import { AppLogger } from '../middleware/logger';
5
- import { PackageRepository, CommitRepository, DependencyRepository } from '../repositories';
6
- import type { PackageInfo, DependencyInfo, PackageReport } from '../types';
7
- import { getCommitsByPathService } from './commit-service';
8
- import type { PackageModel } from '../types/database';
9
-
10
- interface TransformedPackage {
11
- name: string;
12
- version?: string;
13
- type?: string;
14
- path?: string;
15
- description?: string;
16
- license?: string;
17
- repository: Record<string, unknown>;
18
- scripts: Record<string, unknown>;
19
- dependencies: Record<string, unknown>;
20
- devDependencies: Record<string, unknown>;
21
- peerDependencies: Record<string, unknown>;
22
- maintainers: string[];
23
- status?: string;
24
- createdAt?: Date;
25
- lastUpdated?: Date;
26
- }
27
-
28
- interface PackageDetail extends TransformedPackage {
29
- report?: PackageReport;
30
- ciStatus?: Record<string, unknown>;
31
- }
32
-
33
- /**
34
- * Get package dependencies
35
- */
36
- function getPackageDependenciesInfo(pkg: PackageInfo): DependencyInfo[] {
37
- const allDeps: DependencyInfo[] = [];
38
- Object.keys(pkg.dependencies || {}).forEach(depName => {
39
- allDeps.push({
40
- name: depName,
41
- version: pkg.dependencies[depName],
42
- type: 'dependency',
43
- latest: '',
44
- outdated: false,
45
- });
46
- });
47
- Object.keys(pkg.devDependencies || {}).forEach(depName => {
48
- allDeps.push({
49
- name: depName,
50
- version: pkg.devDependencies[depName],
51
- type: 'devDependency',
52
- latest: '',
53
- outdated: false,
54
- });
55
- });
56
- Object.keys(pkg.peerDependencies || {}).forEach(depName => {
57
- allDeps.push({
58
- name: depName,
59
- version: pkg.peerDependencies[depName]!,
60
- type: 'peerDependency',
61
- latest: '',
62
- outdated: false,
63
- });
64
- });
65
- return allDeps;
66
- }
67
-
68
- /**
69
- * Store packages in database using repository pattern
70
- */
71
- async function storePackage(pkg: PackageInfo): Promise<void> {
72
- try {
73
- // Create or update package using repository
74
- await PackageRepository.upsert({
75
- name: pkg.name,
76
- version: pkg.version,
77
- type: pkg.type,
78
- path: pkg.path,
79
- description: pkg.description,
80
- license: pkg.license,
81
- repository: pkg.repository,
82
- scripts: pkg.scripts,
83
- dependencies: pkg.dependencies,
84
- devDependencies: pkg.devDependencies,
85
- peerDependencies: pkg.peerDependencies,
86
- maintainers: pkg.maintainers.join(','),
87
- status: '',
88
- });
89
-
90
- // Store commits using repository
91
- const commits = await getCommitsByPathService(pkg.path ?? '');
92
- if (commits.length) {
93
- await CommitRepository.storeMany(pkg.name, commits);
94
- }
95
-
96
- // Store dependencies using repository
97
- const dependenciesInfo = getPackageDependenciesInfo(pkg);
98
- if (dependenciesInfo.length) {
99
- await DependencyRepository.storeMany(pkg.name, dependenciesInfo);
100
- }
101
- } catch (error) {
102
- AppLogger.warn(`Failed to store report for ${pkg.name}`);
103
- }
104
- }
105
-
106
- export const getPackagesService = async (rootPath: string) => {
107
- let dbPackages = await PackageRepository.findAll();
108
- if (!dbPackages.length) {
109
- try {
110
- const rootDir = rootPath;
111
- AppLogger.debug('rootDir: ' + rootDir);
112
- const packages = scanMonorepo(rootDir);
113
- AppLogger.debug('packages scanned: ' + packages.length);
114
- for (const pkg of packages) {
115
- await storePackage(pkg);
116
- }
117
- } catch (error) {
118
- throw new Error('Error ' + error);
119
- }
120
- dbPackages = await PackageRepository.findAll();
121
- }
122
- const transformedPackages = dbPackages.map((pkg: PackageModel) => {
123
- // We create a new object 'transformedPkg' based on the database record 'pkg'
124
- const transformedPkg = { ...pkg };
125
-
126
- // 1. Maintainers
127
- transformedPkg.maintainers = pkg.maintainers
128
- ? JSON.parse(pkg.maintainers)
129
- : [];
130
-
131
- // 2. Scripts/repository (should default to an object, not an array)
132
- transformedPkg.scripts = pkg.scripts ? JSON.parse(pkg.scripts) : {};
133
- transformedPkg.repository = pkg.repository
134
- ? JSON.parse(pkg.repository)
135
- : {};
136
-
137
- // 3. Dependencies List
138
- transformedPkg.dependencies = pkg.dependencies
139
- ? JSON.parse(pkg.dependencies)
140
- : [];
141
- transformedPkg.devDependencies = pkg.devDependencies
142
- ? JSON.parse(pkg.devDependencies)
143
- : [];
144
- transformedPkg.peerDependencies = pkg.peerDependencies
145
- ? JSON.parse(pkg.peerDependencies)
146
- : [];
147
- return transformedPkg; // Return the fully transformed object
148
- });
149
-
150
- return transformedPackages;
151
- }
152
-
153
- export const refreshPackagesService = async (rootPath: string) => {
154
- await PackageRepository.deleteAll();
155
-
156
- const rootDir = rootPath;
157
- const packages = scanMonorepo(rootDir);
158
-
159
- AppLogger.debug('packages count: ' + packages.length);
160
- for (const pkg of packages) {
161
- await storePackage(pkg);
162
- }
163
-
164
- // Return transformed packages like getPackagesService
165
- const dbPackages = await PackageRepository.findAll();
166
- const transformedPackages = dbPackages.map((pkg: PackageModel) => {
167
- const transformedPkg = { ...pkg };
168
-
169
- transformedPkg.maintainers = pkg.maintainers
170
- ? JSON.parse(pkg.maintainers)
171
- : [];
172
-
173
- transformedPkg.scripts = pkg.scripts ? JSON.parse(pkg.scripts) : {};
174
- transformedPkg.repository = pkg.repository
175
- ? JSON.parse(pkg.repository)
176
- : {};
177
-
178
- transformedPkg.dependencies = pkg.dependencies
179
- ? JSON.parse(pkg.dependencies)
180
- : [];
181
- transformedPkg.devDependencies = pkg.devDependencies
182
- ? JSON.parse(pkg.devDependencies)
183
- : [];
184
- transformedPkg.peerDependencies = pkg.peerDependencies
185
- ? JSON.parse(pkg.peerDependencies)
186
- : [];
187
- return transformedPkg;
188
- });
189
-
190
- return transformedPackages;
191
- }
192
-
193
- export const getPackageDetailService = async (name: string) => {
194
-
195
- const pkg = await PackageRepository.findByNameWithRelations(name);
196
- if (!pkg) {
197
- return null;
198
- }
199
- const transformedPkg = { ...pkg };
200
-
201
- transformedPkg.scripts = pkg.scripts ? JSON.parse(pkg.scripts) : {};
202
- transformedPkg.repository = pkg.repository
203
- ? JSON.parse(pkg.repository)
204
- : {};
205
-
206
- transformedPkg.dependencies = pkg.dependencies
207
- ? JSON.parse(pkg.dependencies)
208
- : [];
209
- transformedPkg.devDependencies = pkg.devDependencies
210
- ? JSON.parse(pkg.devDependencies)
211
- : [];
212
- transformedPkg.peerDependencies = pkg.peerDependencies
213
- ? JSON.parse(pkg.peerDependencies)
214
- : [];
215
-
216
- // Get additional package information
217
- // const reports = (await generateReports()) as unknown as PackageReport[] | undefined;
218
- // const packageReport = reports?.find((r: PackageReport) => r.package?.name === name);
219
-
220
- const result: PackageDetail = {
221
- ...transformedPkg,
222
- // report: packageReport,
223
- ciStatus: await ciStatusManager.getPackageStatus(name),
224
- };
225
-
226
- return result;
227
-
228
- }
package/src/setup.ts DELETED
@@ -1,78 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import fs from 'fs';
4
- import path from 'path';
5
- import { execSync } from 'child_process';
6
-
7
- console.log('\nInitializing Monodog...\n');
8
-
9
- const cwd = process.cwd();
10
- const destinationPath = path.join(cwd, 'monodog');
11
- const packageRoot = path.resolve(__dirname, '..');
12
-
13
- if (fs.existsSync(destinationPath)) {
14
- console.log('monodog already exists.');
15
- process.exit(0);
16
- }
17
- if (fs.existsSync(path.join(cwd, 'pnpm-workspace.yaml'))) {
18
- console.log('Workspace detected, installing monodog as standalone app.');
19
- }
20
-
21
- // 1. Copy package
22
- console.log('Copying Monodog...');
23
- fs.cpSync(packageRoot, destinationPath, {
24
- recursive: true,
25
- dereference: true,
26
- filter: (src) => {
27
- const name = path.basename(src);
28
- return ![
29
- 'node_modules',
30
- '.git',
31
- '.turbo',
32
- '.pnpm',
33
- '.cache',
34
- 'dist/.tsbuildinfo',
35
- ].includes(name);
36
- },
37
- });
38
-
39
- // 2. Fix package.json (standalone app)
40
- fixPackageJson(destinationPath);
41
-
42
- function ensureWorkspace(rootDir: string) {
43
- const wsPath = path.join(rootDir, 'pnpm-workspace.yaml');
44
- if (!fs.existsSync(wsPath)) {console.log('pnpm-workspace.yaml does not exist'); return;}
45
-
46
- const content = fs.readFileSync(wsPath, 'utf8');
47
- if (content.includes('monodog')) return;
48
-
49
- const updated = content.replace(
50
- /packages:\s*\n/,
51
- `packages:\n - monodog\n`
52
- );
53
-
54
- fs.writeFileSync(wsPath, updated);
55
- }
56
- // 3. Install deps
57
- ensureWorkspace(process.cwd());
58
- execSync('pnpm install', { stdio: 'inherit' });
59
- execSync('pnpm --filter monodog-app migrate:reset', { stdio: 'inherit' });
60
-
61
- console.log(`
62
- Monodog ready!
63
-
64
- Next:
65
- cd monodog
66
- pnpm serve
67
- `);
68
-
69
- function fixPackageJson(appDir: string) {
70
- const pkgPath = path.join(appDir, 'package.json');
71
- const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
72
-
73
- pkg.private = true; // critical REQUIRED
74
- pkg.name = 'monodog-app'; // avoid workspace collision
75
- delete pkg.bin; // this is now an app, not a CLI
76
-
77
- fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
78
- }
package/src/types/ci.ts DELETED
@@ -1,122 +0,0 @@
1
- /**
2
- * CI/CD related types
3
- */
4
-
5
- import type { PackageInfo } from './package';
6
-
7
- export interface CIProvider {
8
- name: string;
9
- type:
10
- | 'github'
11
- | 'gitlab'
12
- | 'jenkins'
13
- | 'circleci'
14
- | 'travis'
15
- | 'azure'
16
- | 'custom';
17
- baseUrl: string;
18
- apiToken?: string;
19
- }
20
-
21
- export interface CIBuild {
22
- id: string;
23
- status: 'success' | 'failed' | 'running' | 'pending' | 'cancelled';
24
- branch: string;
25
- commit: string;
26
- commitMessage: string;
27
- author: string;
28
- startTime: Date;
29
- endTime?: Date;
30
- duration?: number;
31
- url: string;
32
- packageName?: string;
33
- workflowName?: string;
34
- jobName?: string;
35
- steps: CIBuildStep[];
36
- artifacts?: CIArtifact[];
37
- coverage?: CICoverage;
38
- tests?: CITestResults;
39
- }
40
-
41
- export interface CIBuildStep {
42
- name: string;
43
- status: 'success' | 'failed' | 'running' | 'skipped';
44
- duration: number;
45
- logs?: string;
46
- error?: string;
47
- }
48
-
49
- export interface CIArtifact {
50
- name: string;
51
- type: 'build' | 'test' | 'coverage' | 'documentation';
52
- size: number;
53
- url: string;
54
- expiresAt?: Date;
55
- }
56
-
57
- export interface CICoverage {
58
- percentage: number;
59
- lines: number;
60
- functions: number;
61
- branches: number;
62
- statements: number;
63
- uncoveredLines?: number[];
64
- }
65
-
66
- export interface CITestResults {
67
- total: number;
68
- passed: number;
69
- failed: number;
70
- skipped: number;
71
- duration: number;
72
- suites: CITestSuite[];
73
- }
74
-
75
- export interface CITestSuite {
76
- name: string;
77
- status: 'pass' | 'fail' | 'skip';
78
- tests: CITest[];
79
- duration: number;
80
- }
81
-
82
- export interface CITest {
83
- name: string;
84
- status: 'pass' | 'fail' | 'skip';
85
- duration: number;
86
- error?: string;
87
- output?: string;
88
- }
89
-
90
- export interface CIPackageStatus {
91
- packageName: string;
92
- lastBuild?: CIBuild;
93
- buildHistory: CIBuild[];
94
- successRate: number;
95
- averageDuration: number;
96
- lastCommit: string;
97
- lastCommitDate: Date;
98
- branch: string;
99
- isHealthy: boolean;
100
- issues: string[];
101
- }
102
-
103
- export interface CIMonorepoStatus {
104
- totalPackages: number;
105
- healthyPackages: number;
106
- warningPackages: number;
107
- errorPackages: number;
108
- overallHealth: number;
109
- packages: CIPackageStatus[];
110
- recentBuilds: CIBuild[];
111
- failedBuilds: CIBuild[];
112
- coverage: {
113
- overall: number;
114
- packages: Record<string, number>;
115
- };
116
- tests: {
117
- total: number;
118
- passed: number;
119
- failed: number;
120
- successRate: number;
121
- };
122
- }
@@ -1,22 +0,0 @@
1
- /**
2
- * Configuration types for the monodog application
3
- */
4
-
5
- export interface MonodogConfig {
6
- workspaces: [];
7
- database: {
8
- type: 'postgres' | 'mysql' | 'sqlite';
9
- host: string;
10
- port: number;
11
- user: string;
12
- path: string; // Used for SQLite path or general data storage path
13
- };
14
- dashboard: {
15
- host: string;
16
- port: number;
17
- };
18
- server: {
19
- host: string;
20
- port: number;
21
- };
22
- }
@@ -1,67 +0,0 @@
1
- /**
2
- * Database related types
3
- */
4
-
5
- export interface Commit {
6
- hash: string;
7
- message?: string;
8
- author?: string;
9
- date: Date;
10
- type?: string;
11
- packageName: string;
12
- }
13
-
14
- export interface PackageHealthModel {
15
- packageName: string;
16
- packageOverallScore: number;
17
- packageBuildStatus: string;
18
- packageTestCoverage: number;
19
- packageLintStatus: string;
20
- packageSecurity: string;
21
- packageDependencies?: string;
22
- updatedAt?: Date;
23
- }
24
-
25
- export interface TransformedPackageHealth {
26
- packageName: string;
27
- health: {
28
- buildStatus: string;
29
- testCoverage: number;
30
- lintStatus: string;
31
- securityAudit: string;
32
- overallScore: number;
33
- };
34
- isHealthy: boolean;
35
- }
36
-
37
- export interface HealthSummary {
38
- total: number;
39
- healthy: number;
40
- unhealthy: number;
41
- averageScore: number;
42
- }
43
-
44
- export interface HealthResponse {
45
- packages: TransformedPackageHealth[];
46
- summary: HealthSummary;
47
- }
48
-
49
- export interface PackageModel {
50
- name: string;
51
- version?: string;
52
- type?: string;
53
- path?: string;
54
- description?: string;
55
- license?: string;
56
- repository?: string;
57
- scripts?: string;
58
- dependencies?: string;
59
- devDependencies?: string;
60
- peerDependencies?: string;
61
- maintainers?: string;
62
- status?: string;
63
- createdAt?: Date;
64
- lastUpdated?: Date;
65
- }
66
-
67
- export type ConfigUpdateData = Record<string, unknown>;
package/src/types/git.ts DELETED
@@ -1,33 +0,0 @@
1
- /**
2
- * Git-related types
3
- */
4
-
5
- /**
6
- * Interface representing a single commit object with key metadata.
7
- */
8
- // export interface GitCommit {
9
- // hash: string;
10
- // author: string;
11
- // packageName: string;
12
- // date: Date;
13
- // message: string;
14
- // type: string;
15
- // }
16
-
17
- /**
18
- * List of standard Conventional Commit types for validation.
19
- * Any extracted type not in this list will be set to 'other'.
20
- */
21
- export const VALID_COMMIT_TYPES: string[] = [
22
- 'feat', // New feature
23
- 'fix', // Bug fix
24
- 'docs', // Documentation changes
25
- 'style', // Code style changes (formatting, etc)
26
- 'refactor', // Code refactoring
27
- 'perf', // Performance improvements
28
- 'test', // Adding or updating tests
29
- 'chore', // Maintenance tasks (e.g., build scripts, dependency updates)
30
- 'ci', // CI/CD changes
31
- 'build', // Build system changes (e.g., pnpm/npm scripts)
32
- 'revert', // Reverting changes
33
- ];
@@ -1,11 +0,0 @@
1
- /**
2
- * Health related types
3
- */
4
-
5
- export interface PackageHealth {
6
- buildStatus: 'success' | 'failed' | 'running' | 'unknown';
7
- testCoverage: number;
8
- lintStatus: 'pass' | 'fail' | 'unknown';
9
- securityAudit: 'pass' | 'fail' | 'unknown';
10
- overallScore: number;
11
- }
@@ -1,23 +0,0 @@
1
- /**
2
- * Central export for all application types
3
- */
4
-
5
- export type { MonodogConfig } from './config';
6
- // export type { GitCommit } from './git';
7
- export { VALID_COMMIT_TYPES } from './git';
8
- export type { PackageInfo, DependencyInfo, MonorepoStats } from './package';
9
- export type { PackageHealth } from './health';
10
- export type {
11
- CIProvider,
12
- CIBuild,
13
- CIBuildStep,
14
- CIArtifact,
15
- CICoverage,
16
- CITestResults,
17
- CITestSuite,
18
- CITest,
19
- CIPackageStatus,
20
- CIMonorepoStatus,
21
- } from './ci';
22
- export type { ScanResult, PackageReport } from './scanner';
23
- export type { Commit } from './database';
@@ -1,39 +0,0 @@
1
- /**
2
- * Package and monorepo related types
3
- */
4
-
5
- export interface PackageInfo {
6
- name: string;
7
- version: string;
8
- type: string; //'app' | 'lib' | 'tool';
9
- path: string;
10
- dependencies: Record<string, string>;
11
- devDependencies: Record<string, string>;
12
- peerDependencies: Record<string, string>;
13
- scripts: Record<string, string>;
14
- maintainers: string[];
15
- description?: string;
16
- license?: string;
17
- repository?: Record<string, string>;
18
- }
19
-
20
- export interface DependencyInfo {
21
- name: string;
22
- version: string;
23
- type: 'dependency' | 'devDependency' | 'peerDependency';
24
- latest?: string;
25
- status?: 'up-to-date' | 'outdated' | 'major-update' | 'unknown';
26
- outdated?: boolean;
27
- }
28
-
29
- export interface MonorepoStats {
30
- totalPackages: number;
31
- apps: number;
32
- libraries: number;
33
- tools: number;
34
- healthyPackages: number;
35
- warningPackages: number;
36
- errorPackages: number;
37
- outdatedDependencies: number;
38
- totalDependencies: number;
39
- }
@@ -1,31 +0,0 @@
1
- /**
2
- * Scanner and report related types
3
- */
4
-
5
- import type { PackageInfo, DependencyInfo } from './package';
6
- import type { PackageHealth } from './health';
7
- import type { MonorepoStats } from './package';
8
-
9
- export interface ScanResult {
10
- packages: PackageInfo[];
11
- stats: MonorepoStats;
12
- dependencyGraph: any;
13
- circularDependencies: string[][];
14
- outdatedPackages: string[];
15
- scanTimestamp: Date;
16
- scanDuration: number;
17
- }
18
-
19
- export interface PackageReport {
20
- package: PackageInfo;
21
- health: PackageHealth;
22
- size: { size: number; files: number };
23
- outdatedDeps: DependencyInfo[];
24
- lastModified: Date;
25
- gitInfo?: {
26
- lastCommit: string;
27
- lastCommitDate: Date;
28
- author: string;
29
- branch: string;
30
- };
31
- }
@@ -1,15 +0,0 @@
1
- /**
2
- * Type declarations for swagger-jsdoc
3
- * Provides TypeScript support for swagger-jsdoc module
4
- */
5
-
6
- declare module 'swagger-jsdoc' {
7
- interface SwaggerOptions {
8
- definition?: Record<string, unknown>;
9
- apis?: string[];
10
- }
11
-
12
- function swaggerJsDoc(options: SwaggerOptions): Record<string, unknown>;
13
-
14
- export = swaggerJsDoc;
15
- }