@manojkmfsi/monodog 1.0.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 (61) hide show
  1. package/.eslintrc.cjs +15 -0
  2. package/.turbo/turbo-build.log +4 -0
  3. package/CHANGELOG.md +79 -0
  4. package/LICENCE +21 -0
  5. package/README.md +55 -0
  6. package/dist/config-loader.js +116 -0
  7. package/dist/get-db-url.js +10 -0
  8. package/dist/gitService.js +242 -0
  9. package/dist/index.js +1370 -0
  10. package/dist/serve.js +103 -0
  11. package/dist/setup.js +155 -0
  12. package/dist/utils/ci-status.js +446 -0
  13. package/dist/utils/helpers.js +237 -0
  14. package/dist/utils/monorepo-scanner.js +486 -0
  15. package/dist/utils/utilities.js +414 -0
  16. package/monodog-conf.example.json +16 -0
  17. package/monodog-conf.json +16 -0
  18. package/monodog-dashboard/README.md +58 -0
  19. package/monodog-dashboard/dist/assets/index-2d967652.js +71 -0
  20. package/monodog-dashboard/dist/assets/index-504dc418.css +1 -0
  21. package/monodog-dashboard/dist/index.html +15 -0
  22. package/package.json +50 -0
  23. package/prisma/migrations/20251017041048_init/migration.sql +19 -0
  24. package/prisma/migrations/20251017083007_add_package/migration.sql +21 -0
  25. package/prisma/migrations/20251021083705_alter_package/migration.sql +37 -0
  26. package/prisma/migrations/20251022085155_test/migration.sql +2 -0
  27. package/prisma/migrations/20251022160841_/migration.sql +35 -0
  28. package/prisma/migrations/20251023130158_rename_column_name/migration.sql +34 -0
  29. package/prisma/migrations/20251023174837_/migration.sql +34 -0
  30. package/prisma/migrations/20251023175830_uodate_schema/migration.sql +32 -0
  31. package/prisma/migrations/20251024103700_add_dependency_info/migration.sql +13 -0
  32. package/prisma/migrations/20251025192150_add_dependency_info/migration.sql +19 -0
  33. package/prisma/migrations/20251025192342_add_dependency_info/migration.sql +40 -0
  34. package/prisma/migrations/20251025204613_add_dependency_info/migration.sql +8 -0
  35. package/prisma/migrations/20251026071336_add_dependency_info/migration.sql +25 -0
  36. package/prisma/migrations/20251027062626_add_commit/migration.sql +10 -0
  37. package/prisma/migrations/20251027062748_add_commit/migration.sql +23 -0
  38. package/prisma/migrations/20251027092741_add_commit/migration.sql +17 -0
  39. package/prisma/migrations/20251027112736_add_health_status/migration.sql +16 -0
  40. package/prisma/migrations/20251027140546_init_packages/migration.sql +16 -0
  41. package/prisma/migrations/20251029073436_added_package_heath_key/migration.sql +34 -0
  42. package/prisma/migrations/20251029073830_added_package_health_key/migration.sql +49 -0
  43. package/prisma/migrations/20251111091920_/migration.sql +16 -0
  44. package/prisma/migrations/20251211155036_cascade_on_auto_delete/migration.sql +48 -0
  45. package/prisma/migrations/migration_lock.toml +3 -0
  46. package/prisma/schema.prisma +114 -0
  47. package/release.config.js +41 -0
  48. package/src/config-loader.ts +119 -0
  49. package/src/get-db-url.ts +11 -0
  50. package/src/gitService.ts +277 -0
  51. package/src/index.ts +1554 -0
  52. package/src/serve.ts +87 -0
  53. package/src/setup.ts +164 -0
  54. package/src/types/monorepo-scanner.d.ts +32 -0
  55. package/src/utils/ci-status.ts +639 -0
  56. package/src/utils/helpers.js +203 -0
  57. package/src/utils/helpers.js.map +1 -0
  58. package/src/utils/helpers.ts +238 -0
  59. package/src/utils/monorepo-scanner.ts +599 -0
  60. package/src/utils/utilities.ts +483 -0
  61. package/tsconfig.json +16 -0
@@ -0,0 +1,203 @@
1
+ 'use strict';
2
+ var __importDefault =
3
+ (this && this.__importDefault) ||
4
+ function (mod) {
5
+ return mod && mod.__esModule ? mod : { default: mod };
6
+ };
7
+ Object.defineProperty(exports, '__esModule', { value: true });
8
+ exports.getCommits = getCommits;
9
+ exports.storePackage = storePackage;
10
+ exports.storeCommits = storeCommits;
11
+ exports.getPackageDependenciesInfo = getPackageDependenciesInfo;
12
+ exports.storeDependencies = storeDependencies;
13
+ const dotenv_1 = __importDefault(require('dotenv'));
14
+ const path_1 = __importDefault(require('path'));
15
+ dotenv_1.default.config({ path: path_1.default.resolve(__dirname, '../.env') });
16
+ const client_1 = require('@prisma/client');
17
+ const prisma = new client_1.PrismaClient();
18
+ const API_BASE = `http://localhost:4000/api`;
19
+ async function getCommits(path) {
20
+ const res = await fetch(API_BASE + `/commits/` + encodeURIComponent(path));
21
+ if (!res.ok) throw new Error('Failed to fetch commits');
22
+ return await res.json();
23
+ }
24
+ async function storeCommits(packageName, commits) {
25
+ console.log('💾 Storing commits for:' + packageName);
26
+ // Create or update dependencies
27
+ for (const commit of commits) {
28
+ try {
29
+ await prisma.commit.upsert({
30
+ where: {
31
+ hash: commit.hash,
32
+ },
33
+ update: {
34
+ message: commit.message,
35
+ author: commit.author,
36
+ date: commit.date,
37
+ type: commit.type,
38
+ },
39
+ create: {
40
+ hash: commit.hash,
41
+ message: commit.message,
42
+ author: commit.author,
43
+ date: commit.date,
44
+ type: commit.type,
45
+ packageName: packageName,
46
+ },
47
+ });
48
+ } catch (e) {
49
+ if (
50
+ e instanceof client_1.Prisma.PrismaClientKnownRequestError &&
51
+ e.code === 'P2002'
52
+ ) {
53
+ // Handle unique constraint violation (e.g., commit already exists)
54
+ console.warn(
55
+ `Skipping commit: ${commit.hash} (Depenndency already exists)`
56
+ );
57
+ } else {
58
+ // Handle any other unexpected errors
59
+ console.error(`Failed to store commit: ${commit.hash}`, e);
60
+ }
61
+ }
62
+ }
63
+ }
64
+ /**
65
+ * Store packages in database
66
+ */
67
+ async function storePackage(pkg) {
68
+ try {
69
+ // Create or update package
70
+ await prisma.package.upsert({
71
+ where: { name: pkg.name },
72
+ update: {
73
+ version: pkg.version,
74
+ type: pkg.type,
75
+ path: pkg.path,
76
+ description: pkg.description,
77
+ license: pkg.license,
78
+ repository: JSON.stringify(pkg.repository),
79
+ scripts: JSON.stringify(pkg.scripts),
80
+ lastUpdated: new Date(),
81
+ },
82
+ create: {
83
+ // Timestamps
84
+ createdAt: new Date(),
85
+ lastUpdated: new Date(),
86
+ // Key Metrics and Relationships
87
+ dependencies: JSON.stringify(pkg.dependencies), // The total number of direct dependencies (12 in your example)
88
+ // Manual Serialization Required: Stores a JSON array string of maintainers, e.g., '["team-frontend"]'
89
+ maintainers: pkg.maintainers.join(','),
90
+ // Manual Serialization Required: Stores a JSON array string of tags, e.g., '["core", "ui"]'
91
+ // Manual Serialization Required: Stores the scripts object as a JSON string
92
+ // Example: '{"dev": "vite", "build": "tsc && vite build"}'
93
+ scripts: JSON.stringify(pkg.scripts),
94
+ // Dependency Lists (Manual Serialization Required)
95
+ // Stores a JSON array string of dependencies.
96
+ // dependenciesList: JSON.stringify(pkg.dependenciesList),
97
+ devDependencies: JSON.stringify(pkg.devDependencies),
98
+ peerDependencies: JSON.stringify(pkg.peerDependencies),
99
+ name: pkg.name,
100
+ version: pkg.version,
101
+ type: pkg.type,
102
+ path: pkg.path,
103
+ description: pkg.description ?? '',
104
+ license: pkg.license ?? '',
105
+ repository: JSON.stringify(pkg.repository),
106
+ status: '',
107
+ },
108
+ });
109
+ const commits = await getCommits(pkg.path ?? '');
110
+ if (commits.length) {
111
+ await storeCommits(pkg.name, commits);
112
+ }
113
+ const dependenciesInfo = getPackageDependenciesInfo(pkg);
114
+ if (dependenciesInfo.length) {
115
+ await storeDependencies(pkg.name, dependenciesInfo);
116
+ }
117
+ } catch (error) {
118
+ console.warn(`⚠️ Failed to store report for ${pkg.name}:`, error);
119
+ }
120
+ }
121
+ /**
122
+ * Get package dependencies
123
+ */
124
+ function getPackageDependenciesInfo(pkg) {
125
+ const allDeps = [];
126
+ Object.keys(pkg.dependencies || {}).forEach(depName => {
127
+ allDeps.push({
128
+ name: depName,
129
+ version: pkg.dependencies[depName],
130
+ type: 'dependency',
131
+ latest: '',
132
+ outdated: false,
133
+ });
134
+ });
135
+ Object.keys(pkg.devDependencies || {}).forEach(depName => {
136
+ allDeps.push({
137
+ name: depName,
138
+ version: pkg.devDependencies[depName],
139
+ type: 'devDependency',
140
+ latest: '',
141
+ outdated: false,
142
+ });
143
+ });
144
+ Object.keys(pkg.peerDependencies || {}).forEach(depName => {
145
+ allDeps.push({
146
+ name: depName,
147
+ version: pkg.peerDependencies[depName],
148
+ type: 'peerDependency',
149
+ latest: '',
150
+ outdated: false,
151
+ });
152
+ });
153
+ return allDeps;
154
+ }
155
+ /**
156
+ * Store dependencies in database
157
+ */
158
+ async function storeDependencies(packageName, dependencies) {
159
+ console.log('💾 Storing Dependencies for:' + packageName);
160
+ // Create or update dependencies
161
+ for (const dep of dependencies) {
162
+ try {
163
+ await prisma.dependencyInfo.upsert({
164
+ where: {
165
+ name_packageName: {
166
+ // This refers to the composite unique constraint
167
+ name: dep.name,
168
+ packageName,
169
+ },
170
+ },
171
+ update: {
172
+ version: dep.version,
173
+ type: dep.type,
174
+ latest: dep.latest,
175
+ outdated: dep.outdated,
176
+ },
177
+ create: {
178
+ name: dep.name,
179
+ version: dep.version,
180
+ type: dep.type,
181
+ latest: dep.latest,
182
+ outdated: dep.outdated,
183
+ packageName: packageName,
184
+ },
185
+ });
186
+ console.log('💾 Dependencies stored in database:' + dep.name);
187
+ } catch (e) {
188
+ if (
189
+ e instanceof client_1.Prisma.PrismaClientKnownRequestError &&
190
+ e.code === 'P2002'
191
+ ) {
192
+ // Handle unique constraint violation (e.g., depedency already exists)
193
+ console.warn(
194
+ `Skipping dependency: ${dep.name} (Depenndency already exists)`
195
+ );
196
+ } else {
197
+ // Handle any other unexpected errors
198
+ console.error(`Failed to store dependency: ${dep.name}`, e);
199
+ }
200
+ }
201
+ }
202
+ }
203
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,238 @@
1
+ import { PackageInfo, DependencyInfo } from './utilities';
2
+ // import dotenv from 'dotenv';
3
+ import path from 'path';
4
+ // dotenv.config({ path: path.resolve(__dirname, '../.env') });
5
+ // Fallback import to handle environments where PrismaClient isn't a named export
6
+ import * as PrismaPkg from '@prisma/client';
7
+ const PrismaClient = (PrismaPkg as any).PrismaClient || (PrismaPkg as any).default || PrismaPkg;
8
+ // Provide a fallback reference to the Prisma namespace so errors like
9
+ // Prisma.PrismaClientKnownRequestError can be referenced safely.
10
+ const Prisma = (PrismaPkg as any).Prisma || (PrismaPkg as any).PrismaClient?.Prisma || (PrismaPkg as any).default?.Prisma || PrismaPkg;
11
+
12
+ import { appConfig } from '../config-loader';
13
+
14
+ // const appConfig = loadConfig();
15
+
16
+ // Commit type used by getCommits/storeCommits
17
+ export interface Commit {
18
+ hash: string;
19
+ message?: string;
20
+ author?: string;
21
+ date?: string;
22
+ type?: string;
23
+ }
24
+
25
+ // Default settings
26
+ const DEFAULT_PORT = 4000;
27
+ const port = appConfig.server.port ?? DEFAULT_PORT; //Default port
28
+ const host = appConfig.server.host ?? 'localhost'; //Default host
29
+
30
+ const prisma = new PrismaClient();
31
+ const API_BASE = `http://${host}:${port}/api`;
32
+
33
+ async function getCommits(path: string): Promise<Commit[]> {
34
+ const res = await fetch(API_BASE + `/commits/` + encodeURIComponent(path));
35
+ if (!res.ok) throw new Error('Failed to fetch commits');
36
+ return (await res.json()) as Commit[];
37
+ }
38
+
39
+ async function storeCommits(
40
+ packageName: string,
41
+ commits: Commit[]
42
+ ): Promise<void> {
43
+ console.log('💾 Storing commits for:' + packageName);
44
+ // Create or update dependencies
45
+ for (const commit of commits) {
46
+ try {
47
+ await prisma.commit.upsert({
48
+ where: {
49
+ hash: commit.hash,
50
+ },
51
+ update: {
52
+ message: commit.message,
53
+ author: commit.author,
54
+ date: commit.date,
55
+ type: commit.type,
56
+ },
57
+ create: {
58
+ hash: commit.hash,
59
+ message: commit.message,
60
+ author: commit.author,
61
+ date: commit.date,
62
+ type: commit.type,
63
+ packageName: packageName,
64
+ },
65
+ });
66
+ } catch (e) {
67
+ const err = e as any;
68
+ if (
69
+ err instanceof Prisma.PrismaClientKnownRequestError &&
70
+ err.code === 'P2002'
71
+ ) {
72
+ // Handle unique constraint violation (e.g., commit already exists)
73
+ console.warn(
74
+ `Skipping commit: ${commit.hash} (Depenndency already exists)`
75
+ );
76
+ } else {
77
+ // Handle any other unexpected errors
78
+ console.error(`Failed to store commit: ${commit.hash}`, err);
79
+ }
80
+ }
81
+ }
82
+ }
83
+ /**
84
+ * Store packages in database
85
+ */
86
+ async function storePackage(pkg: PackageInfo): Promise<void> {
87
+ try {
88
+ // Create or update package
89
+ await prisma.package.upsert({
90
+ where: { name: pkg.name },
91
+ update: {
92
+ version: pkg.version,
93
+ type: pkg.type,
94
+ path: pkg.path,
95
+ description: pkg.description,
96
+ license: pkg.license,
97
+ repository: JSON.stringify(pkg.repository),
98
+ scripts: JSON.stringify(pkg.scripts),
99
+ lastUpdated: new Date(),
100
+ },
101
+ create: {
102
+ // Timestamps
103
+ createdAt: new Date(),
104
+ lastUpdated: new Date(),
105
+
106
+ // Key Metrics and Relationships
107
+ dependencies: JSON.stringify(pkg.dependencies), // The total number of direct dependencies (12 in your example)
108
+ // Manual Serialization Required: Stores a JSON array string of maintainers, e.g., '["team-frontend"]'
109
+ maintainers: pkg.maintainers.join(','),
110
+ // Manual Serialization Required: Stores a JSON array string of tags, e.g., '["core", "ui"]'
111
+
112
+ // Manual Serialization Required: Stores the scripts object as a JSON string
113
+ // Example: '{"dev": "vite", "build": "tsc && vite build"}'
114
+ scripts: JSON.stringify(pkg.scripts),
115
+
116
+ // Dependency Lists (Manual Serialization Required)
117
+ // Stores a JSON array string of dependencies.
118
+ // dependenciesList: JSON.stringify(pkg.dependenciesList),
119
+ devDependencies: JSON.stringify(pkg.devDependencies),
120
+ peerDependencies: JSON.stringify(pkg.peerDependencies),
121
+ name: pkg.name,
122
+ version: pkg.version,
123
+ type: pkg.type,
124
+ path: pkg.path,
125
+ description: pkg.description ?? '',
126
+ license: pkg.license ?? '',
127
+ repository: JSON.stringify(pkg.repository),
128
+ status: '',
129
+ },
130
+ });
131
+
132
+ const commits = await getCommits(pkg.path ?? '');
133
+ if (commits.length) {
134
+ await storeCommits(pkg.name, commits);
135
+ }
136
+ const dependenciesInfo = getPackageDependenciesInfo(pkg);
137
+ if (dependenciesInfo.length) {
138
+ await storeDependencies(pkg.name, dependenciesInfo);
139
+ }
140
+ } catch (error) {
141
+ console.warn(`⚠️ Failed to store report for ${pkg.name}:`, error);
142
+ }
143
+ }
144
+
145
+ /**
146
+ * Get package dependencies
147
+ */
148
+ function getPackageDependenciesInfo(pkg: PackageInfo): DependencyInfo[] {
149
+ const allDeps: DependencyInfo[] = [];
150
+ Object.keys(pkg.dependencies || {}).forEach(depName => {
151
+ allDeps.push({
152
+ name: depName,
153
+ version: pkg.dependencies[depName],
154
+ type: 'dependency',
155
+ latest: '',
156
+ outdated: false,
157
+ });
158
+ });
159
+ Object.keys(pkg.devDependencies || {}).forEach(depName => {
160
+ allDeps.push({
161
+ name: depName,
162
+ version: pkg.devDependencies[depName],
163
+ type: 'devDependency',
164
+ latest: '',
165
+ outdated: false,
166
+ });
167
+ });
168
+ Object.keys(pkg.peerDependencies || {}).forEach(depName => {
169
+ allDeps.push({
170
+ name: depName,
171
+ version: pkg.peerDependencies[depName]!,
172
+ type: 'peerDependency',
173
+ latest: '',
174
+ outdated: false,
175
+ });
176
+ });
177
+ return allDeps;
178
+ }
179
+
180
+ /**
181
+ * Store dependencies in database
182
+ */
183
+ async function storeDependencies(
184
+ packageName: string,
185
+ dependencies: DependencyInfo[]
186
+ ): Promise<void> {
187
+ console.log('💾 Storing Dependencies for:' + packageName);
188
+ // Create or update dependencies
189
+ for (const dep of dependencies) {
190
+ try {
191
+ await prisma.dependencyInfo.upsert({
192
+ where: {
193
+ name_packageName: {
194
+ // This refers to the composite unique constraint
195
+ name: dep.name,
196
+ packageName,
197
+ },
198
+ },
199
+ update: {
200
+ version: dep.version,
201
+ type: dep.type,
202
+ latest: dep.latest,
203
+ outdated: dep.outdated,
204
+ },
205
+ create: {
206
+ name: dep.name,
207
+ version: dep.version,
208
+ type: dep.type,
209
+ latest: dep.latest,
210
+ outdated: dep.outdated,
211
+ packageName: packageName,
212
+ },
213
+ });
214
+ } catch (e) {
215
+ const err = e as any;
216
+ if (
217
+ err instanceof Prisma.PrismaClientKnownRequestError &&
218
+ err.code === 'P2002'
219
+ ) {
220
+ // Handle unique constraint violation (e.g., depedency already exists)
221
+ console.warn(
222
+ `Skipping dependency: ${dep.name} (Depenndency already exists)`
223
+ );
224
+ } else {
225
+ // Handle any other unexpected errors
226
+ console.error(`Failed to store dependency: ${dep.name}`, err);
227
+ }
228
+ }
229
+ }
230
+ }
231
+
232
+ export {
233
+ getCommits,
234
+ storePackage,
235
+ storeCommits,
236
+ getPackageDependenciesInfo,
237
+ storeDependencies,
238
+ };