@monodog/backend 1.0.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 (36) hide show
  1. package/.eslintrc.cjs +15 -0
  2. package/dist/cli.js +98 -0
  3. package/dist/gitService.js +240 -0
  4. package/dist/index.js +1185 -0
  5. package/dist/utils/helpers.js +198 -0
  6. package/package.json +41 -0
  7. package/prisma/migrations/20251017041048_init/migration.sql +19 -0
  8. package/prisma/migrations/20251017083007_add_package/migration.sql +21 -0
  9. package/prisma/migrations/20251021083705_alter_package/migration.sql +37 -0
  10. package/prisma/migrations/20251022085155_test/migration.sql +2 -0
  11. package/prisma/migrations/20251022160841_/migration.sql +35 -0
  12. package/prisma/migrations/20251023130158_rename_column_name/migration.sql +34 -0
  13. package/prisma/migrations/20251023174837_/migration.sql +34 -0
  14. package/prisma/migrations/20251023175830_uodate_schema/migration.sql +32 -0
  15. package/prisma/migrations/20251024103700_add_dependency_info/migration.sql +13 -0
  16. package/prisma/migrations/20251025192150_add_dependency_info/migration.sql +19 -0
  17. package/prisma/migrations/20251025192342_add_dependency_info/migration.sql +40 -0
  18. package/prisma/migrations/20251025204613_add_dependency_info/migration.sql +8 -0
  19. package/prisma/migrations/20251026071336_add_dependency_info/migration.sql +25 -0
  20. package/prisma/migrations/20251027062626_add_commit/migration.sql +10 -0
  21. package/prisma/migrations/20251027062748_add_commit/migration.sql +23 -0
  22. package/prisma/migrations/20251027092741_add_commit/migration.sql +17 -0
  23. package/prisma/migrations/20251027112736_add_health_status/migration.sql +16 -0
  24. package/prisma/migrations/20251027140546_init_packages/migration.sql +16 -0
  25. package/prisma/migrations/20251029073436_added_package_heath_key/migration.sql +34 -0
  26. package/prisma/migrations/20251029073830_added_package_health_key/migration.sql +49 -0
  27. package/prisma/migrations/migration_lock.toml +3 -0
  28. package/prisma/schema.prisma +130 -0
  29. package/src/cli.ts +68 -0
  30. package/src/gitService.ts +274 -0
  31. package/src/index.ts +1366 -0
  32. package/src/utils/helpers.js +199 -0
  33. package/src/utils/helpers.js.map +1 -0
  34. package/src/utils/helpers.ts +223 -0
  35. package/tsconfig.json +15 -0
  36. package/tsconfig.o.json +29 -0
@@ -0,0 +1,199 @@
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
+ exports.getCommits = getCommits;
7
+ exports.storePackage = storePackage;
8
+ exports.storeCommits = storeCommits;
9
+ exports.getPackageDependenciesInfo = getPackageDependenciesInfo;
10
+ exports.storeDependencies = storeDependencies;
11
+ const dotenv_1 = __importDefault(require("dotenv"));
12
+ const path_1 = __importDefault(require("path"));
13
+ dotenv_1.default.config({ path: path_1.default.resolve(__dirname, '../.env') });
14
+ const client_1 = require("@prisma/client");
15
+ const prisma = new client_1.PrismaClient();
16
+ const API_BASE = `http://localhost:4000/api`;
17
+ async function getCommits(path) {
18
+ const res = await fetch(API_BASE + `/commits/` + encodeURIComponent(path));
19
+ if (!res.ok)
20
+ throw new Error('Failed to fetch commits');
21
+ return await res.json();
22
+ }
23
+ async function storeCommits(packageName, commits) {
24
+ console.log('💾 Storing commits for:' + packageName);
25
+ // Create or update dependencies
26
+ for (const commit of commits) {
27
+ try {
28
+ await prisma.commit.upsert({
29
+ where: {
30
+ hash: commit.hash,
31
+ },
32
+ update: {
33
+ message: commit.message,
34
+ author: commit.author,
35
+ date: commit.date,
36
+ type: commit.type,
37
+ },
38
+ create: {
39
+ hash: commit.hash,
40
+ message: commit.message,
41
+ author: commit.author,
42
+ date: commit.date,
43
+ type: commit.type,
44
+ packageName: packageName,
45
+ },
46
+ });
47
+ }
48
+ catch (e) {
49
+ if (e instanceof client_1.Prisma.PrismaClientKnownRequestError &&
50
+ e.code === 'P2002') {
51
+ // Handle unique constraint violation (e.g., commit already exists)
52
+ console.warn(`Skipping commit: ${commit.hash} (Depenndency already exists)`);
53
+ }
54
+ else {
55
+ // Handle any other unexpected errors
56
+ console.error(`Failed to store commit: ${commit.hash}`, e);
57
+ }
58
+ }
59
+ }
60
+ }
61
+ /**
62
+ * Store packages in database
63
+ */
64
+ async function storePackage(pkg) {
65
+ try {
66
+ // Create or update package
67
+ await prisma.package.upsert({
68
+ where: { name: pkg.name },
69
+ update: {
70
+ version: pkg.version,
71
+ type: pkg.type,
72
+ path: pkg.path,
73
+ description: pkg.description,
74
+ license: pkg.license,
75
+ repository: JSON.stringify(pkg.repository),
76
+ scripts: JSON.stringify(pkg.scripts),
77
+ lastUpdated: new Date(),
78
+ },
79
+ create: {
80
+ // Timestamps
81
+ createdAt: new Date(),
82
+ lastUpdated: new Date(),
83
+ // Key Metrics and Relationships
84
+ dependencies: JSON.stringify(pkg.dependencies), // The total number of direct dependencies (12 in your example)
85
+ // Manual Serialization Required: Stores a JSON array string of maintainers, e.g., '["team-frontend"]'
86
+ maintainers: pkg.maintainers.join(','),
87
+ // Manual Serialization Required: Stores a JSON array string of tags, e.g., '["core", "ui"]'
88
+ // Manual Serialization Required: Stores the scripts object as a JSON string
89
+ // Example: '{"dev": "vite", "build": "tsc && vite build"}'
90
+ scripts: JSON.stringify(pkg.scripts),
91
+ // Dependency Lists (Manual Serialization Required)
92
+ // Stores a JSON array string of dependencies.
93
+ // dependenciesList: JSON.stringify(pkg.dependenciesList),
94
+ devDependencies: JSON.stringify(pkg.devDependencies),
95
+ peerDependencies: JSON.stringify(pkg.peerDependencies),
96
+ name: pkg.name,
97
+ version: pkg.version,
98
+ type: pkg.type,
99
+ path: pkg.path,
100
+ description: pkg.description ?? '',
101
+ license: pkg.license ?? '',
102
+ repository: JSON.stringify(pkg.repository),
103
+ status: '',
104
+ },
105
+ });
106
+ const commits = await getCommits(pkg.path ?? '');
107
+ if (commits.length) {
108
+ await storeCommits(pkg.name, commits);
109
+ }
110
+ const dependenciesInfo = getPackageDependenciesInfo(pkg);
111
+ if (dependenciesInfo.length) {
112
+ await storeDependencies(pkg.name, dependenciesInfo);
113
+ }
114
+ }
115
+ catch (error) {
116
+ console.warn(`⚠️ Failed to store report for ${pkg.name}:`, error);
117
+ }
118
+ }
119
+ /**
120
+ * Get package dependencies
121
+ */
122
+ function getPackageDependenciesInfo(pkg) {
123
+ const allDeps = [];
124
+ Object.keys(pkg.dependencies || {}).forEach(depName => {
125
+ allDeps.push({
126
+ name: depName,
127
+ version: pkg.dependencies[depName],
128
+ type: 'dependency',
129
+ latest: '',
130
+ outdated: false,
131
+ });
132
+ });
133
+ Object.keys(pkg.devDependencies || {}).forEach(depName => {
134
+ allDeps.push({
135
+ name: depName,
136
+ version: pkg.devDependencies[depName],
137
+ type: 'devDependency',
138
+ latest: '',
139
+ outdated: false,
140
+ });
141
+ });
142
+ Object.keys(pkg.peerDependencies || {}).forEach(depName => {
143
+ allDeps.push({
144
+ name: depName,
145
+ version: pkg.peerDependencies[depName],
146
+ type: 'peerDependency',
147
+ latest: '',
148
+ outdated: false,
149
+ });
150
+ });
151
+ return allDeps;
152
+ }
153
+ /**
154
+ * Store dependencies in database
155
+ */
156
+ async function storeDependencies(packageName, dependencies) {
157
+ console.log('💾 Storing Dependencies for:' + packageName);
158
+ // Create or update dependencies
159
+ for (const dep of dependencies) {
160
+ try {
161
+ await prisma.dependencyInfo.upsert({
162
+ where: {
163
+ name_packageName: {
164
+ // This refers to the composite unique constraint
165
+ name: dep.name,
166
+ packageName,
167
+ },
168
+ },
169
+ update: {
170
+ version: dep.version,
171
+ type: dep.type,
172
+ latest: dep.latest,
173
+ outdated: dep.outdated,
174
+ },
175
+ create: {
176
+ name: dep.name,
177
+ version: dep.version,
178
+ type: dep.type,
179
+ latest: dep.latest,
180
+ outdated: dep.outdated,
181
+ packageName: packageName,
182
+ },
183
+ });
184
+ console.log('💾 Dependencies stored in database:' + dep.name);
185
+ }
186
+ catch (e) {
187
+ if (e instanceof client_1.Prisma.PrismaClientKnownRequestError &&
188
+ e.code === 'P2002') {
189
+ // Handle unique constraint violation (e.g., depedency already exists)
190
+ console.warn(`Skipping dependency: ${dep.name} (Depenndency already exists)`);
191
+ }
192
+ else {
193
+ // Handle any other unexpected errors
194
+ console.error(`Failed to store dependency: ${dep.name}`, e);
195
+ }
196
+ }
197
+ }
198
+ }
199
+ //# 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,223 @@
1
+
2
+ import {
3
+
4
+ PackageInfo,
5
+ DependencyInfo,
6
+ } from '@monodog/utils/helpers'
7
+ import dotenv from 'dotenv';
8
+ import path from 'path';
9
+ dotenv.config({ path: path.resolve(__dirname, '../.env') });
10
+ import { PrismaClient, Prisma, Commit } from '@prisma/client';
11
+ const prisma = new PrismaClient();
12
+ const API_BASE = `http://localhost:4000/api`;
13
+
14
+ async function getCommits(path: string): Promise<Commit[]> {
15
+ const res = await fetch(API_BASE + `/commits/` + encodeURIComponent(path));
16
+ if (!res.ok) throw new Error('Failed to fetch commits');
17
+ return await res.json() as Commit[];
18
+ }
19
+
20
+ async function storeCommits(
21
+ packageName: string,
22
+ commits: Commit[]
23
+ ): Promise<void> {
24
+ console.log('💾 Storing commits for:' + packageName);
25
+ // Create or update dependencies
26
+ for (const commit of commits) {
27
+ try {
28
+ await prisma.commit.upsert({
29
+ where: {
30
+ hash: commit.hash,
31
+ },
32
+ update: {
33
+ message: commit.message,
34
+ author: commit.author,
35
+ date: commit.date,
36
+ type: commit.type,
37
+ },
38
+ create: {
39
+ hash: commit.hash,
40
+ message: commit.message,
41
+ author: commit.author,
42
+ date: commit.date,
43
+ type: commit.type,
44
+ packageName: packageName,
45
+ },
46
+ });
47
+ } catch (e) {
48
+ if (
49
+ e instanceof Prisma.PrismaClientKnownRequestError &&
50
+ e.code === 'P2002'
51
+ ) {
52
+ // Handle unique constraint violation (e.g., commit already exists)
53
+ console.warn(
54
+ `Skipping commit: ${commit.hash} (Depenndency already exists)`
55
+ );
56
+ } else {
57
+ // Handle any other unexpected errors
58
+ console.error(`Failed to store commit: ${commit.hash}`, e);
59
+ }
60
+ }
61
+ }
62
+ }
63
+ /**
64
+ * Store packages in database
65
+ */
66
+ async function storePackage(pkg: PackageInfo): Promise<void> {
67
+ try {
68
+
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
+
87
+ // Key Metrics and Relationships
88
+ dependencies: JSON.stringify(pkg.dependencies), // The total number of direct dependencies (12 in your example)
89
+ // Manual Serialization Required: Stores a JSON array string of maintainers, e.g., '["team-frontend"]'
90
+ maintainers: pkg.maintainers.join(','),
91
+ // Manual Serialization Required: Stores a JSON array string of tags, e.g., '["core", "ui"]'
92
+
93
+ // Manual Serialization Required: Stores the scripts object as a JSON string
94
+ // Example: '{"dev": "vite", "build": "tsc && vite build"}'
95
+ scripts: JSON.stringify(pkg.scripts),
96
+
97
+ // Dependency Lists (Manual Serialization Required)
98
+ // Stores a JSON array string of dependencies.
99
+ // dependenciesList: JSON.stringify(pkg.dependenciesList),
100
+ devDependencies: JSON.stringify(pkg.devDependencies),
101
+ peerDependencies: JSON.stringify(pkg.peerDependencies),
102
+ name: pkg.name,
103
+ version: pkg.version,
104
+ type: pkg.type,
105
+ path: pkg.path,
106
+ description: pkg.description??'',
107
+ license: pkg.license??'',
108
+ repository: JSON.stringify(pkg.repository),
109
+ status: '',
110
+ },
111
+ });
112
+
113
+ const commits = await getCommits(pkg.path ?? '');
114
+ if (commits.length) {
115
+ await storeCommits(pkg.name, commits);
116
+ }
117
+ const dependenciesInfo = getPackageDependenciesInfo(pkg);
118
+ if (dependenciesInfo.length) {
119
+ await storeDependencies(pkg.name, dependenciesInfo);
120
+ }
121
+
122
+ } catch (error) {
123
+ console.warn(
124
+ `⚠️ Failed to store report for ${pkg.name}:`,
125
+ error
126
+ );
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Get package dependencies
132
+ */
133
+ function getPackageDependenciesInfo(pkg: PackageInfo): DependencyInfo[] {
134
+ const allDeps: DependencyInfo[] = [];
135
+ Object.keys(pkg.dependencies || {}).forEach(depName => {
136
+ allDeps.push({
137
+ name: depName,
138
+ version: pkg.dependencies[depName],
139
+ type: 'dependency',
140
+ latest: '',
141
+ outdated: false,
142
+ });
143
+ });
144
+ Object.keys(pkg.devDependencies || {}).forEach(depName => {
145
+ allDeps.push({
146
+ name: depName,
147
+ version: pkg.devDependencies[depName],
148
+ type: 'devDependency',
149
+ latest: '',
150
+ outdated: false,
151
+ });
152
+ });
153
+ Object.keys(pkg.peerDependencies || {}).forEach(depName => {
154
+ allDeps.push({
155
+ name: depName,
156
+ version: pkg.peerDependencies[depName]!,
157
+ type: 'peerDependency',
158
+ latest: '',
159
+ outdated: false,
160
+ });
161
+ });
162
+ return allDeps;
163
+ }
164
+
165
+ /**
166
+ * Store dependencies in database
167
+ */
168
+ async function storeDependencies(
169
+ packageName: string,
170
+ dependencies: DependencyInfo[]
171
+ ): Promise<void> {
172
+ console.log('💾 Storing Dependencies for:' + packageName);
173
+ // Create or update dependencies
174
+ for (const dep of dependencies) {
175
+ try {
176
+ await prisma.dependencyInfo.upsert({
177
+ where: {
178
+ name_packageName: {
179
+ // This refers to the composite unique constraint
180
+ name: dep.name,
181
+ packageName,
182
+ },
183
+ },
184
+ update: {
185
+ version: dep.version,
186
+ type: dep.type,
187
+ latest: dep.latest,
188
+ outdated: dep.outdated,
189
+ },
190
+ create: {
191
+ name: dep.name,
192
+ version: dep.version,
193
+ type: dep.type,
194
+ latest: dep.latest,
195
+ outdated: dep.outdated,
196
+ packageName: packageName,
197
+ },
198
+ });
199
+ console.log('💾 Dependencies stored in database:' + dep.name);
200
+ } catch (e) {
201
+ if (
202
+ e instanceof Prisma.PrismaClientKnownRequestError &&
203
+ e.code === 'P2002'
204
+ ) {
205
+ // Handle unique constraint violation (e.g., depedency already exists)
206
+ console.warn(
207
+ `Skipping dependency: ${dep.name} (Depenndency already exists)`
208
+ );
209
+ } else {
210
+ // Handle any other unexpected errors
211
+ console.error(`Failed to store dependency: ${dep.name}`, e);
212
+ }
213
+ }
214
+ }
215
+ }
216
+
217
+ export {
218
+ getCommits,
219
+ storePackage,
220
+ storeCommits,
221
+ getPackageDependenciesInfo,
222
+ storeDependencies
223
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,15 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es2020",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "esModuleInterop": true,
7
+ "forceConsistentCasingInFileNames": true,
8
+ "strict": true,
9
+ "skipLibCheck": true,
10
+ "outDir": "./dist",
11
+ "rootDir": "./src",
12
+
13
+ },
14
+ "include": ["src/**/*"]
15
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ // 1. Inherit rules from the shared monorepo configuration
3
+ "extends": "@lakinmindfire/tsconfig/node.json",
4
+
5
+ "compilerOptions": {
6
+ // 2. Explicitly set output directory
7
+ "outDir": "./dist",
8
+
9
+ // 3. Ensure compatibility: Set module type to CommonJS
10
+ "module": "CommonJS",
11
+ "moduleResolution": "node",
12
+
13
+ // 4. Common fixes for Node/TS projects
14
+ "esModuleInterop": true,
15
+ "allowSyntheticDefaultImports": true,
16
+ "verbatimModuleSyntax": false
17
+ },
18
+
19
+ // 5. CRITICAL: Include all source files in the current package directory
20
+ "include": [
21
+ "**/*.ts"
22
+ ],
23
+
24
+ // 6. Exclude generated files and dependencies
25
+ "exclude": [
26
+ "node_modules",
27
+ "dist"
28
+ ]
29
+ }