@manojkmfsi/monodog 1.0.23 → 1.0.25

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 (74) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +12 -0
  3. package/dist/controllers/{commitController.js → commit-controller.js} +5 -4
  4. package/dist/controllers/{configController.js → config-controller.js} +3 -3
  5. package/dist/controllers/{healthController.js → health-controller.js} +3 -3
  6. package/dist/controllers/{packageController.js → package-controller.js} +6 -6
  7. package/dist/index.js +11 -236
  8. package/dist/middleware/dashboard-startup.js +124 -0
  9. package/dist/middleware/error-handler.js +36 -0
  10. package/dist/middleware/index.js +23 -0
  11. package/dist/middleware/logger.js +63 -0
  12. package/dist/middleware/security.js +78 -0
  13. package/dist/middleware/server-startup.js +117 -0
  14. package/dist/repositories/commit-repository.js +97 -0
  15. package/dist/repositories/dependency-repository.js +97 -0
  16. package/dist/repositories/index.js +18 -0
  17. package/dist/repositories/package-health-repository.js +65 -0
  18. package/dist/repositories/package-repository.js +126 -0
  19. package/dist/repositories/prisma-client.js +57 -0
  20. package/dist/routes/{commitRoutes.js → commit-routes.js} +2 -2
  21. package/dist/routes/{configRoutes.js → config-routes.js} +3 -3
  22. package/dist/routes/{healthRoutes.js → health-routes.js} +3 -3
  23. package/dist/routes/{packageRoutes.js → package-routes.js} +5 -5
  24. package/dist/serve.js +15 -2
  25. package/dist/services/{commitService.js → commit-service.js} +2 -2
  26. package/dist/services/{configService.js → config-service.js} +2 -40
  27. package/dist/services/{healthService.js → health-service.js} +11 -63
  28. package/dist/services/{packageService.js → package-service.js} +80 -54
  29. package/dist/types/git.js +11 -0
  30. package/dist/types/index.js +1 -0
  31. package/package.json +10 -3
  32. package/prisma/schema/commit.prisma +11 -0
  33. package/prisma/schema/dependency-info.prisma +12 -0
  34. package/prisma/schema/health-status.prisma +14 -0
  35. package/prisma/schema/package-health.prisma +15 -0
  36. package/prisma/schema/package.prisma +21 -0
  37. package/prisma/schema/schema.prisma +15 -0
  38. package/src/controllers/{commitController.ts → commit-controller.ts} +7 -5
  39. package/src/controllers/{configController.ts → config-controller.ts} +4 -3
  40. package/src/controllers/{healthController.ts → health-controller.ts} +4 -3
  41. package/src/controllers/{packageController.ts → package-controller.ts} +7 -6
  42. package/src/index.ts +9 -281
  43. package/src/middleware/dashboard-startup.ts +149 -0
  44. package/src/middleware/error-handler.ts +50 -0
  45. package/src/middleware/index.ts +20 -0
  46. package/src/middleware/logger.ts +58 -0
  47. package/src/middleware/security.ts +81 -0
  48. package/src/middleware/server-startup.ts +142 -0
  49. package/src/repositories/commit-repository.ts +107 -0
  50. package/src/repositories/dependency-repository.ts +109 -0
  51. package/src/repositories/index.ts +10 -0
  52. package/src/repositories/package-health-repository.ts +75 -0
  53. package/src/repositories/package-repository.ts +142 -0
  54. package/src/repositories/prisma-client.ts +25 -0
  55. package/src/routes/{commitRoutes.ts → commit-routes.ts} +1 -1
  56. package/src/routes/{configRoutes.ts → config-routes.ts} +1 -1
  57. package/src/routes/{healthRoutes.ts → health-routes.ts} +1 -1
  58. package/src/routes/{packageRoutes.ts → package-routes.ts} +1 -1
  59. package/src/serve.ts +19 -3
  60. package/src/services/{commitService.ts → commit-service.ts} +1 -1
  61. package/src/services/{configService.ts → config-service.ts} +22 -9
  62. package/src/services/{gitService.ts → git-service.ts} +4 -4
  63. package/src/services/{healthService.ts → health-service.ts} +17 -35
  64. package/src/services/package-service.ts +201 -0
  65. package/src/types/database.ts +57 -1
  66. package/src/types/git.ts +8 -8
  67. package/src/types/index.ts +1 -1
  68. package/dist/utils/db-utils.js +0 -227
  69. package/prisma/schema.prisma +0 -116
  70. package/src/services/packageService.ts +0 -115
  71. package/src/types/monorepo-scanner.d.ts +0 -32
  72. package/src/utils/db-utils.ts +0 -220
  73. /package/dist/services/{gitService.js → git-service.js} +0 -0
  74. /package/prisma/migrations/{20251219074511_create_unique_composite_key_for_commits → 20251219090102_composite_key_for_table_commits}/migration.sql +0 -0
@@ -1,227 +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
- exports.storePackage = storePackage;
37
- const PrismaPkg = __importStar(require("@prisma/client"));
38
- const PrismaClient = PrismaPkg.PrismaClient || PrismaPkg.default || PrismaPkg;
39
- const Prisma = PrismaPkg.Prisma || PrismaPkg.PrismaClient?.Prisma || PrismaPkg.default?.Prisma || PrismaPkg;
40
- const config_loader_1 = require("../config-loader");
41
- // Default settings
42
- const DEFAULT_PORT = 4000;
43
- const port = config_loader_1.appConfig.server.port ?? DEFAULT_PORT; //Default port
44
- const host = config_loader_1.appConfig.server.host ?? 'localhost'; //Default host
45
- const prisma = new PrismaClient();
46
- const API_BASE = `http://${host}:${port}/api`;
47
- async function getCommits(path) {
48
- const res = await fetch(API_BASE + `/commits/` + encodeURIComponent(path));
49
- if (!res.ok)
50
- throw new Error('Failed to fetch commits');
51
- return (await res.json());
52
- }
53
- async function storeCommits(packageName, commits) {
54
- console.log('Storing commits for:' + packageName);
55
- // Create or update dependencies
56
- for (const commit of commits) {
57
- try {
58
- await prisma.commit.upsert({
59
- where: {
60
- hash_packageName: {
61
- hash: commit.hash,
62
- packageName: packageName,
63
- }
64
- },
65
- update: {
66
- message: commit.message,
67
- author: commit.author,
68
- date: commit.date,
69
- type: commit.type,
70
- },
71
- create: {
72
- hash: commit.hash,
73
- message: commit.message,
74
- author: commit.author,
75
- date: commit.date,
76
- type: commit.type,
77
- packageName: packageName,
78
- },
79
- });
80
- }
81
- catch (e) {
82
- const err = e;
83
- if (err instanceof Prisma.PrismaClientKnownRequestError &&
84
- err.code === 'P2002') {
85
- // Handle unique constraint violation (e.g., commit already exists)
86
- console.warn(`Skipping commit: ${commit.hash} (Depenndency already exists)`);
87
- }
88
- else {
89
- // Handle any other unexpected errors
90
- console.error(`Failed to store commit: ${commit.hash}`, err);
91
- }
92
- }
93
- }
94
- }
95
- /**
96
- * Store packages in database
97
- */
98
- async function storePackage(pkg) {
99
- try {
100
- // Create or update package
101
- await prisma.package.upsert({
102
- where: { name: pkg.name },
103
- update: {
104
- version: pkg.version,
105
- type: pkg.type,
106
- path: pkg.path,
107
- description: pkg.description,
108
- license: pkg.license,
109
- repository: JSON.stringify(pkg.repository),
110
- scripts: JSON.stringify(pkg.scripts),
111
- lastUpdated: new Date(),
112
- },
113
- create: {
114
- // Timestamps
115
- createdAt: new Date(),
116
- lastUpdated: new Date(),
117
- dependencies: JSON.stringify(pkg.dependencies), // The total number of direct dependencies
118
- // Manual Serialization Required: Stores a JSON array string of maintainers, e.g., '["team-frontend"]'
119
- maintainers: pkg.maintainers.join(','),
120
- // Manual Serialization Required: Stores the scripts object as a JSON string
121
- // Example: '{"dev": "vite", "build": "tsc && vite build"}'
122
- scripts: JSON.stringify(pkg.scripts),
123
- devDependencies: JSON.stringify(pkg.devDependencies),
124
- peerDependencies: JSON.stringify(pkg.peerDependencies),
125
- name: pkg.name,
126
- version: pkg.version,
127
- type: pkg.type,
128
- path: pkg.path,
129
- description: pkg.description ?? '',
130
- license: pkg.license ?? '',
131
- repository: JSON.stringify(pkg.repository),
132
- status: '',
133
- },
134
- });
135
- const commits = await getCommits(pkg.path ?? '');
136
- if (commits.length) {
137
- await storeCommits(pkg.name, commits);
138
- }
139
- const dependenciesInfo = getPackageDependenciesInfo(pkg);
140
- if (dependenciesInfo.length) {
141
- await storeDependencies(pkg.name, dependenciesInfo);
142
- }
143
- }
144
- catch (error) {
145
- console.warn(` Failed to store report for ${pkg.name}:`, error);
146
- }
147
- }
148
- /**
149
- * Get package dependencies
150
- */
151
- function getPackageDependenciesInfo(pkg) {
152
- const allDeps = [];
153
- Object.keys(pkg.dependencies || {}).forEach(depName => {
154
- allDeps.push({
155
- name: depName,
156
- version: pkg.dependencies[depName],
157
- type: 'dependency',
158
- latest: '',
159
- outdated: false,
160
- });
161
- });
162
- Object.keys(pkg.devDependencies || {}).forEach(depName => {
163
- allDeps.push({
164
- name: depName,
165
- version: pkg.devDependencies[depName],
166
- type: 'devDependency',
167
- latest: '',
168
- outdated: false,
169
- });
170
- });
171
- Object.keys(pkg.peerDependencies || {}).forEach(depName => {
172
- allDeps.push({
173
- name: depName,
174
- version: pkg.peerDependencies[depName],
175
- type: 'peerDependency',
176
- latest: '',
177
- outdated: false,
178
- });
179
- });
180
- return allDeps;
181
- }
182
- /**
183
- * Store dependencies in database
184
- */
185
- async function storeDependencies(packageName, dependencies) {
186
- console.log('Storing Dependencies for:' + packageName);
187
- // Create or update dependencies
188
- for (const dep of dependencies) {
189
- try {
190
- await prisma.dependencyInfo.upsert({
191
- where: {
192
- name_packageName: {
193
- // This refers to the composite unique constraint
194
- name: dep.name,
195
- packageName,
196
- },
197
- },
198
- update: {
199
- version: dep.version,
200
- type: dep.type,
201
- latest: dep.latest,
202
- outdated: dep.outdated,
203
- },
204
- create: {
205
- name: dep.name,
206
- version: dep.version,
207
- type: dep.type,
208
- latest: dep.latest,
209
- outdated: dep.outdated,
210
- packageName: packageName,
211
- },
212
- });
213
- }
214
- catch (e) {
215
- const err = e;
216
- if (err instanceof Prisma.PrismaClientKnownRequestError &&
217
- err.code === 'P2002') {
218
- // Handle unique constraint violation (e.g., depedency already exists)
219
- console.warn(`Skipping dependency: ${dep.name} (Depenndency already exists)`);
220
- }
221
- else {
222
- // Handle any other unexpected errors
223
- console.error(`Failed to store dependency: ${dep.name}`, err);
224
- }
225
- }
226
- }
227
- }
@@ -1,116 +0,0 @@
1
- // This is your Prisma schema file,
2
- // learn more about it in the docs: https://pris.ly/d/prisma-schema
3
-
4
- // Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
5
- // Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
6
-
7
- generator client {
8
- provider = "prisma-client-js"
9
- }
10
-
11
- datasource db {
12
- provider = "sqlite"
13
- url = env("DATABASE_URL")
14
- }
15
-
16
- // --- MONOREPO DATA MODEL ---
17
-
18
- /// Represents a single package within the monorepo, based on the pnpm/package.json data.
19
- model Package {
20
- // Primary Key and Identity Field (using the package name as the unique ID)
21
- // Example: '@monodog/dashboard'
22
- name String @id @unique
23
-
24
- // Core Package Metadata
25
- version String
26
- type String // e.g., 'app', 'package'
27
-
28
- // Timestamps
29
- createdAt DateTime @default(now())
30
- lastUpdated DateTime @default(now())
31
-
32
- // Key Metrics and Relationships
33
- dependencies String? // The total number of direct dependencies
34
- // Manual Serialization Required: Stores a JSON array string of maintainers, e.g., '["team-frontend"]'
35
- maintainers String
36
- // Manual Serialization Required: Stores a JSON array string of tags, e.g., '["core", "ui"]'
37
- path String // The relative path in the file system, e.g., 'apps/dashboard'
38
-
39
- // Descriptions and Configuration
40
- description String
41
- license String
42
- repository String?
43
-
44
- // Manual Serialization Required: Stores the scripts object as a JSON string
45
- // Example: '{"dev": "vite", "build": "tsc && vite build"}'
46
- scripts String?
47
- status String @default("")
48
-
49
- devDependencies String?
50
- peerDependencies String?
51
- dependenciesInfo DependencyInfo[]
52
- commits Commit[]
53
- packageHealth PackageHealth?
54
- }
55
-
56
- model DependencyInfo {
57
- name String
58
- packageName String
59
- version String
60
- type String @default("")
61
- status String @default("")
62
- latest String?
63
- outdated Boolean @default(false)
64
- package Package @relation(fields: [packageName], references: [name], onDelete: Cascade)
65
-
66
- @@unique([name, packageName]) // Composite unique constraint
67
- }
68
-
69
- model Commit {
70
- hash String
71
- message String
72
- author String
73
- date DateTime?
74
- type String
75
- packageName String
76
- package Package @relation(fields: [packageName], references: [name], onDelete: Cascade)
77
-
78
- @@unique([hash, packageName])
79
- }
80
-
81
- model HealthStatus {
82
- id Int @id @default(autoincrement())
83
-
84
- // Package reference (without formal relation)
85
- packageName String @unique
86
- // package Package @relation(fields: [packageName], references: [name], onDelete: Cascade)
87
-
88
- // Health Metrics
89
- overallScore Float // Overall health score (0-100)
90
- buildStatus String // e.g., "passing", "failing", "unknown"
91
- testCoverage Float // Test coverage percentage (0-100)
92
- lintStatus String // e.g., "passing", "warning", "failing"
93
- security String // e.g., "secure", "vulnerabilities", "unknown"
94
- dependencies String // e.g., "up-to-date", "outdated", "vulnerable"
95
- // Timestamps
96
- createdAt DateTime @default(now())
97
- updatedAt DateTime @updatedAt
98
-
99
- @@map("health_status") // Optional: to specify the table name
100
- }
101
-
102
- model PackageHealth {
103
- id Int @id @default(autoincrement())
104
- packageName String @unique
105
- packageOverallScore Float
106
- packageBuildStatus String
107
- packageTestCoverage Float?
108
- packageLintStatus String
109
- packageSecurity String // Changed from securityAudit to packageSecurity
110
- packageDependencies String // Changed from dependencies to packageDependencies
111
- createdAt DateTime @default(now())
112
- updatedAt DateTime @updatedAt
113
- package Package @relation(fields: [packageName], references: [name], onDelete: Cascade)
114
-
115
- @@map("package_health")
116
- }
@@ -1,115 +0,0 @@
1
- import { scanMonorepo } from '../utils/utilities';
2
- import { generateReports } from '../utils/monorepo-scanner';
3
- import { ciStatusManager } from '../utils/ci-status';
4
- import { storePackage } from '../utils/db-utils';
5
-
6
- import * as PrismaPkg from '@prisma/client';
7
- const PrismaClient = (PrismaPkg as any).PrismaClient || (PrismaPkg as any).default || PrismaPkg;
8
- const prisma = new PrismaClient();
9
-
10
- export const getPackagesService = async (rootPath: string) => {
11
- let dbPackages = await prisma.package.findMany();
12
- if (!dbPackages.length) {
13
- try {
14
- const rootDir = rootPath;
15
- console.log('rootDir -->', rootDir);
16
- const packages = scanMonorepo(rootDir);
17
- console.log('packages --> scan', packages.length);
18
- for (const pkg of packages) {
19
- await storePackage(pkg);
20
- }
21
- } catch (error) {
22
- throw new Error('Error ' + error);
23
- }
24
- dbPackages = await prisma.package.findMany();
25
- }
26
- const transformedPackages = dbPackages.map((pkg: any) => {
27
- // We create a new object 'transformedPkg' based on the database record 'pkg'
28
- const transformedPkg = { ...pkg };
29
-
30
- // 1. Maintainers
31
- transformedPkg.maintainers = pkg.maintainers
32
- ? JSON.parse(pkg.maintainers)
33
- : [];
34
-
35
- // 2. Scripts/repository (should default to an object, not an array)
36
- transformedPkg.scripts = pkg.scripts ? JSON.parse(pkg.scripts) : {};
37
- transformedPkg.repository = pkg.repository
38
- ? JSON.parse(pkg.repository)
39
- : {};
40
-
41
- // 3. Dependencies List
42
- transformedPkg.dependencies = pkg.dependencies
43
- ? JSON.parse(pkg.dependencies)
44
- : [];
45
- transformedPkg.devDependencies = pkg.devDependencies
46
- ? JSON.parse(pkg.devDependencies)
47
- : [];
48
- transformedPkg.peerDependencies = pkg.peerDependencies
49
- ? JSON.parse(pkg.peerDependencies)
50
- : [];
51
- return transformedPkg; // Return the fully transformed object
52
- });
53
-
54
- return transformedPackages;
55
- }
56
-
57
- export const refreshPackagesService = async (rootPath: string) => {
58
- await prisma.package.deleteMany();
59
-
60
- const rootDir = rootPath;
61
- const packages = scanMonorepo(rootDir);
62
-
63
- console.log('packages -->', packages.length);
64
- for (const pkg of packages) {
65
- await storePackage(pkg);
66
- }
67
-
68
- return packages;
69
- }
70
-
71
- export const getPackageDetailService = async (name: string) => {
72
-
73
- const pkg = await prisma.package.findUnique({
74
- where: {
75
- name: name,
76
- },
77
- include: {
78
- dependenciesInfo: true,
79
- commits: true,
80
- packageHealth: true,
81
- },
82
- });
83
- if (!pkg) {
84
- return null;
85
- }
86
- const transformedPkg = { ...pkg };
87
-
88
- transformedPkg.scripts = pkg.scripts ? JSON.parse(pkg.scripts) : {};
89
- transformedPkg.repository = pkg.repository
90
- ? JSON.parse(pkg.repository)
91
- : {};
92
-
93
- transformedPkg.dependencies = pkg.dependencies
94
- ? JSON.parse(pkg.dependencies)
95
- : [];
96
- transformedPkg.devDependencies = pkg.devDependencies
97
- ? JSON.parse(pkg.devDependencies)
98
- : [];
99
- transformedPkg.peerDependencies = pkg.peerDependencies
100
- ? JSON.parse(pkg.peerDependencies)
101
- : [];
102
-
103
- // Get additional package information
104
- const reports: any[] = await generateReports();
105
- const packageReport = reports.find((r: any) => r.package.name === name);
106
-
107
- const result = {
108
- ...transformedPkg,
109
- report: packageReport,
110
- ciStatus: await ciStatusManager.getPackageStatus(name),
111
- };
112
-
113
- return result;
114
-
115
- }
@@ -1,32 +0,0 @@
1
- // This declaration explicitly tells TypeScript about the specific functions
2
- // exported by the '@monodog/monorepo-scanner' package, bypassing TS7016 errors.
3
-
4
- declare module '@monodog/monorepo-scanner' {
5
- /**
6
- * Declares the exported function 'funCheckSecurityAudit'.
7
- * The actual implementation and return type reside in the source package.
8
- */
9
- export function funCheckSecurityAudit(options?: any): any;
10
- export function funCheckTestCoverage(options?: any): any;
11
- export function funCheckLintStatus(options?: any): any;
12
- export function funCheckBuildStatus(options?: any): any;
13
- export function generateReports(options?: any): any;
14
- export function quickScan(options?: any): any;
15
-
16
- /**
17
- * Defines the exported class structure, including the constructor
18
- * and the methods used in the backend.
19
- */
20
- export class MonorepoScanner {
21
- // Constructor (when called with `new`)
22
- constructor(options?: any);
23
-
24
- /** * Resets any internal cache state for the scanner.
25
- */
26
- clearCache(): void;
27
-
28
- /** * Retrieves the processed results from the scan.
29
- */
30
- exportResults(result: any, format: 'json' | 'csv' | 'html'): any;
31
- }
32
- }