@manojkmfsi/monodog 1.1.1 → 1.1.2
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.
- package/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +6 -0
- package/dist/config-loader.js +7 -8
- package/dist/controllers/commit-controller.js +5 -4
- package/dist/controllers/config-controller.js +4 -3
- package/dist/controllers/health-controller.js +2 -1
- package/dist/controllers/package-controller.js +4 -3
- package/dist/middleware/logger.js +8 -2
- package/dist/middleware/server-startup.js +2 -2
- package/dist/middleware/swagger-middleware.js +3 -2
- package/dist/repositories/commit-repository.js +4 -3
- package/dist/repositories/dependency-repository.js +4 -3
- package/dist/services/commit-service.js +7 -7
- package/dist/services/config-service.js +12 -11
- package/dist/services/git-service.js +9 -8
- package/dist/services/health-service.js +5 -4
- package/dist/services/package-service.js +5 -4
- package/dist/utils/ci-status.js +3 -2
- package/dist/utils/db-utils.js +87 -0
- package/dist/utils/monorepo-scanner.js +8 -7
- package/dist/utils/utilities.js +21 -18
- package/package.json +1 -1
- package/src/config-loader.ts +9 -11
- package/src/controllers/commit-controller.ts +5 -4
- package/src/controllers/config-controller.ts +4 -3
- package/src/controllers/health-controller.ts +2 -1
- package/src/controllers/package-controller.ts +4 -3
- package/src/middleware/logger.ts +9 -2
- package/src/middleware/server-startup.ts +2 -2
- package/src/middleware/swagger-middleware.ts +3 -2
- package/src/repositories/commit-repository.ts +4 -3
- package/src/repositories/dependency-repository.ts +4 -3
- package/src/services/commit-service.ts +7 -7
- package/src/services/config-service.ts +12 -11
- package/src/services/git-service.ts +9 -8
- package/src/services/health-service.ts +5 -4
- package/src/services/package-service.ts +5 -4
- package/src/utils/ci-status.ts +3 -2
- package/src/utils/db-utils.ts +92 -0
- package/src/utils/monorepo-scanner.ts +8 -10
- package/src/utils/utilities.ts +22 -20
package/.turbo/turbo-build.log
CHANGED
package/CHANGELOG.md
CHANGED
package/dist/config-loader.js
CHANGED
|
@@ -36,6 +36,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.appConfig = void 0;
|
|
37
37
|
const fs = __importStar(require("fs"));
|
|
38
38
|
const path = __importStar(require("path"));
|
|
39
|
+
const logger_1 = require("./middleware/logger");
|
|
39
40
|
// Global variable to hold the loaded config
|
|
40
41
|
let config = null;
|
|
41
42
|
/**
|
|
@@ -54,7 +55,7 @@ function loadConfig() {
|
|
|
54
55
|
const configPath = path.resolve(rootPath, 'monodog-config.json');
|
|
55
56
|
createConfigFileIfMissing(rootPath);
|
|
56
57
|
if (!fs.existsSync(configPath)) {
|
|
57
|
-
|
|
58
|
+
logger_1.AppLogger.error(`Configuration file not found at ${configPath}`);
|
|
58
59
|
process.exit(1);
|
|
59
60
|
}
|
|
60
61
|
try {
|
|
@@ -63,12 +64,10 @@ function loadConfig() {
|
|
|
63
64
|
const parsedConfig = JSON.parse(fileContent);
|
|
64
65
|
// Cache and return
|
|
65
66
|
config = parsedConfig;
|
|
66
|
-
process.stderr.write('[Config] Loaded configuration from: ...\n');
|
|
67
67
|
return config;
|
|
68
68
|
}
|
|
69
69
|
catch (error) {
|
|
70
|
-
|
|
71
|
-
console.error(error);
|
|
70
|
+
logger_1.AppLogger.error('Failed to read or parse monodog-config.json.', error);
|
|
72
71
|
process.exit(1);
|
|
73
72
|
}
|
|
74
73
|
}
|
|
@@ -93,20 +92,20 @@ function createConfigFileIfMissing(rootPath) {
|
|
|
93
92
|
};
|
|
94
93
|
const contentString = JSON.stringify(defaultContent, null, 2);
|
|
95
94
|
// ---------------------
|
|
96
|
-
|
|
95
|
+
logger_1.AppLogger.info(`\n[monodog] Checking for ${configFileName}...`);
|
|
97
96
|
if (fs.existsSync(configFilePath)) {
|
|
98
|
-
|
|
97
|
+
logger_1.AppLogger.info(`\n[monodog] ${configFileName} already exists at ${configFilePath}. Skipping creation.`);
|
|
99
98
|
}
|
|
100
99
|
else {
|
|
101
100
|
try {
|
|
102
101
|
// Write the default content to the file
|
|
103
102
|
fs.writeFileSync(configFilePath, contentString, 'utf-8');
|
|
104
|
-
|
|
103
|
+
logger_1.AppLogger.info(`[monodog] Successfully generated default ${configFileName} in the workspace root.`);
|
|
105
104
|
process.stderr.write('[monodog] Please review and update settings like "host" and "port".');
|
|
106
105
|
}
|
|
107
106
|
catch (err) {
|
|
108
107
|
const message = err instanceof Error ? err.message : String(err);
|
|
109
|
-
|
|
108
|
+
logger_1.AppLogger.error(`Failed to generate ${configFileName}: ${message}`);
|
|
110
109
|
process.exit(1);
|
|
111
110
|
}
|
|
112
111
|
}
|
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.getCommitsByPath = void 0;
|
|
4
|
+
const logger_1 = require("../middleware/logger");
|
|
4
5
|
const commit_service_1 = require("../services/commit-service");
|
|
5
6
|
const getCommitsByPath = async (_req, res) => {
|
|
6
7
|
try {
|
|
7
8
|
const { packagePath } = _req.params;
|
|
8
9
|
const decodedPath = decodeURIComponent(packagePath);
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
logger_1.AppLogger.debug('Fetching commits for path: ' + decodedPath);
|
|
11
|
+
logger_1.AppLogger.debug('Current working directory: ' + process.cwd());
|
|
11
12
|
const commits = await (0, commit_service_1.getCommitsByPathService)(decodedPath);
|
|
12
|
-
|
|
13
|
+
logger_1.AppLogger.info(`Successfully fetched ${commits.length} commits for ${decodedPath}`);
|
|
13
14
|
res.json(commits);
|
|
14
15
|
}
|
|
15
16
|
catch (error) {
|
|
16
17
|
const err = error;
|
|
17
|
-
|
|
18
|
+
logger_1.AppLogger.error('Error fetching commit details', err);
|
|
18
19
|
res.status(500).json({
|
|
19
20
|
error: 'Failed to fetch commit details',
|
|
20
21
|
message: err?.message,
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.updateConfigFile = exports.getConfigurationFiles = void 0;
|
|
4
|
+
const logger_1 = require("../middleware/logger");
|
|
4
5
|
const config_service_1 = require("../services/config-service");
|
|
5
6
|
const getConfigurationFiles = async (_req, res) => {
|
|
6
7
|
try {
|
|
7
8
|
const rootDir = _req.app.locals.rootPath;
|
|
8
|
-
|
|
9
|
+
logger_1.AppLogger.debug('Monorepo root directory: ' + rootDir);
|
|
9
10
|
const configFiles = await (0, config_service_1.getConfigurationFilesService)(rootDir);
|
|
10
11
|
res.json(configFiles);
|
|
11
12
|
}
|
|
12
13
|
catch (error) {
|
|
13
|
-
|
|
14
|
+
logger_1.AppLogger.error('Error fetching configuration files', error);
|
|
14
15
|
res.status(500).json({
|
|
15
16
|
success: false,
|
|
16
17
|
error: 'Failed to fetch configuration files',
|
|
@@ -33,7 +34,7 @@ const updateConfigFile = async (_req, res) => {
|
|
|
33
34
|
res.json(result);
|
|
34
35
|
}
|
|
35
36
|
catch (error) {
|
|
36
|
-
|
|
37
|
+
logger_1.AppLogger.error('Error saving configuration file', error);
|
|
37
38
|
res.status(500).json({
|
|
38
39
|
success: false,
|
|
39
40
|
error: 'Failed to save configuration file',
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.refreshHealth = exports.getPackagesHealth = void 0;
|
|
4
|
+
const logger_1 = require("../middleware/logger");
|
|
4
5
|
const health_service_1 = require("../services/health-service");
|
|
5
6
|
const getPackagesHealth = async (_req, res) => {
|
|
6
7
|
try {
|
|
@@ -8,7 +9,7 @@ const getPackagesHealth = async (_req, res) => {
|
|
|
8
9
|
res.json(health);
|
|
9
10
|
}
|
|
10
11
|
catch (error) {
|
|
11
|
-
|
|
12
|
+
logger_1.AppLogger.error('Error fetching health data from database:', error);
|
|
12
13
|
res
|
|
13
14
|
.status(500)
|
|
14
15
|
.json({ error: 'Failed to fetch health data from database' });
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.updatePackageConfig = exports.getPackageDetail = exports.refreshPackages = exports.getPackages = void 0;
|
|
4
|
+
const logger_1 = require("../middleware/logger");
|
|
4
5
|
const config_service_1 = require("../services/config-service");
|
|
5
6
|
const package_service_1 = require("../services/package-service");
|
|
6
7
|
const getPackages = async (_req, res) => {
|
|
@@ -14,7 +15,7 @@ const getPackages = async (_req, res) => {
|
|
|
14
15
|
};
|
|
15
16
|
exports.getPackages = getPackages;
|
|
16
17
|
const refreshPackages = async (_req, res) => {
|
|
17
|
-
|
|
18
|
+
logger_1.AppLogger.info('Refreshing packages from source: ' + _req.app.locals.rootPath);
|
|
18
19
|
try {
|
|
19
20
|
const packages = await (0, package_service_1.refreshPackagesService)(_req.app.locals.rootPath);
|
|
20
21
|
res.json(packages);
|
|
@@ -44,8 +45,8 @@ const updatePackageConfig = async (req, res) => {
|
|
|
44
45
|
error: 'Package name, configuration, and package path are required',
|
|
45
46
|
});
|
|
46
47
|
}
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
logger_1.AppLogger.info('Updating package configuration for: ' + packageName);
|
|
49
|
+
logger_1.AppLogger.debug('Package path: ' + packagePath);
|
|
49
50
|
const updatedPackage = await (0, config_service_1.updatePackageConfigurationService)(packagePath, packageName, config);
|
|
50
51
|
return res.json({
|
|
51
52
|
success: true,
|
|
@@ -8,10 +8,16 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
9
|
exports.AppLogger = exports.httpLogger = void 0;
|
|
10
10
|
const morgan_1 = __importDefault(require("morgan"));
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const path_1 = __importDefault(require("path"));
|
|
13
|
+
const accessLogStream = fs_1.default.createWriteStream(path_1.default.join(__dirname, '../../', 'access.log'), { flags: 'a' });
|
|
11
14
|
/**
|
|
12
|
-
* HTTP request logger middleware using Morgan
|
|
15
|
+
* HTTP request logger middleware using Morgan, only log error responses
|
|
13
16
|
*/
|
|
14
|
-
exports.httpLogger = (0, morgan_1.default)('
|
|
17
|
+
exports.httpLogger = (0, morgan_1.default)('combined', {
|
|
18
|
+
stream: accessLogStream,
|
|
19
|
+
// skip: function (req, res) { return res.statusCode < 400 }
|
|
20
|
+
});
|
|
15
21
|
/**
|
|
16
22
|
* Application logger for non-HTTP events
|
|
17
23
|
*/
|
|
@@ -75,13 +75,13 @@ function startServer(rootPath) {
|
|
|
75
75
|
console.log((0, constants_1.SUCCESS_SERVER_START)(host, validatedPort));
|
|
76
76
|
logger_1.AppLogger.info('API endpoints available:', {
|
|
77
77
|
endpoints: [
|
|
78
|
-
'
|
|
79
|
-
'GET /api/packages/refresh',
|
|
78
|
+
'POST /api/packages/refresh',
|
|
80
79
|
'GET /api/packages',
|
|
81
80
|
'GET /api/packages/:name',
|
|
82
81
|
'PUT /api/packages/update-config',
|
|
83
82
|
'GET /api/commits/:packagePath',
|
|
84
83
|
'GET /api/health/packages',
|
|
84
|
+
'POST /api/health/refresh',
|
|
85
85
|
'PUT /api/config/files/:id',
|
|
86
86
|
'GET /api/config/files',
|
|
87
87
|
],
|
|
@@ -10,6 +10,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
10
10
|
exports.setupSwaggerDocs = setupSwaggerDocs;
|
|
11
11
|
const swagger_ui_express_1 = __importDefault(require("swagger-ui-express"));
|
|
12
12
|
const swagger_jsdoc_1 = __importDefault(require("swagger-jsdoc"));
|
|
13
|
+
const logger_1 = require("./logger");
|
|
13
14
|
const swagger_config_1 = require("../config/swagger-config");
|
|
14
15
|
/**
|
|
15
16
|
* Setup Swagger documentation endpoint
|
|
@@ -46,9 +47,9 @@ function setupSwaggerDocs(app) {
|
|
|
46
47
|
`,
|
|
47
48
|
customCssUrl: 'https://cdnjs.cloudflare.com/ajax/libs/swagger-ui/4.15.5/swagger-ui.min.css',
|
|
48
49
|
}));
|
|
49
|
-
|
|
50
|
+
logger_1.AppLogger.info('Swagger documentation available at /api-docs');
|
|
50
51
|
}
|
|
51
52
|
catch (error) {
|
|
52
|
-
|
|
53
|
+
logger_1.AppLogger.error('Failed to setup Swagger documentation', error);
|
|
53
54
|
}
|
|
54
55
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CommitRepository = void 0;
|
|
4
4
|
const prisma_client_1 = require("./prisma-client");
|
|
5
|
+
const logger_1 = require("../middleware/logger");
|
|
5
6
|
const prisma = (0, prisma_client_1.getPrismaClient)();
|
|
6
7
|
const Prisma = (0, prisma_client_1.getPrismaErrors)();
|
|
7
8
|
/**
|
|
@@ -61,10 +62,10 @@ class CommitRepository {
|
|
|
61
62
|
const err = e;
|
|
62
63
|
if (err instanceof Prisma.PrismaClientKnownRequestError &&
|
|
63
64
|
err.code === 'P2002') {
|
|
64
|
-
|
|
65
|
+
logger_1.AppLogger.warn(`Skipping commit: ${data.hash} (Commit already exists)`);
|
|
65
66
|
}
|
|
66
67
|
else {
|
|
67
|
-
|
|
68
|
+
logger_1.AppLogger.error(`Failed to store commit: ${data.hash}`, err);
|
|
68
69
|
throw err;
|
|
69
70
|
}
|
|
70
71
|
}
|
|
@@ -73,7 +74,7 @@ class CommitRepository {
|
|
|
73
74
|
* Store multiple commits
|
|
74
75
|
*/
|
|
75
76
|
static async storeMany(packageName, commits) {
|
|
76
|
-
|
|
77
|
+
logger_1.AppLogger.debug('Storing commits for: ' + packageName);
|
|
77
78
|
for (const commit of commits) {
|
|
78
79
|
await this.upsert({
|
|
79
80
|
hash: commit.hash,
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DependencyRepository = void 0;
|
|
4
4
|
const prisma_client_1 = require("./prisma-client");
|
|
5
|
+
const logger_1 = require("../middleware/logger");
|
|
5
6
|
const prisma = (0, prisma_client_1.getPrismaClient)();
|
|
6
7
|
const Prisma = (0, prisma_client_1.getPrismaErrors)();
|
|
7
8
|
/**
|
|
@@ -61,10 +62,10 @@ class DependencyRepository {
|
|
|
61
62
|
const err = e;
|
|
62
63
|
if (err instanceof Prisma.PrismaClientKnownRequestError &&
|
|
63
64
|
err.code === 'P2002') {
|
|
64
|
-
|
|
65
|
+
logger_1.AppLogger.warn(`Skipping dependency: ${data.name} (Dependency already exists)`);
|
|
65
66
|
}
|
|
66
67
|
else {
|
|
67
|
-
|
|
68
|
+
logger_1.AppLogger.error(`Failed to store dependency: ${data.name}`, err);
|
|
68
69
|
throw err;
|
|
69
70
|
}
|
|
70
71
|
}
|
|
@@ -73,7 +74,7 @@ class DependencyRepository {
|
|
|
73
74
|
* Store multiple dependencies
|
|
74
75
|
*/
|
|
75
76
|
static async storeMany(packageName, dependencies) {
|
|
76
|
-
|
|
77
|
+
logger_1.AppLogger.debug('Storing Dependencies for: ' + packageName);
|
|
77
78
|
for (const dep of dependencies) {
|
|
78
79
|
await this.upsert({
|
|
79
80
|
name: dep.name,
|
|
@@ -7,11 +7,12 @@ exports.getCommitsByPathService = void 0;
|
|
|
7
7
|
const git_service_1 = require("./git-service");
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
const fs_1 = __importDefault(require("fs"));
|
|
10
|
+
const logger_1 = require("../middleware/logger");
|
|
10
11
|
const getCommitsByPathService = async (packagePath) => {
|
|
11
12
|
// Decode the package path
|
|
12
13
|
const decodedPath = decodeURIComponent(packagePath);
|
|
13
|
-
|
|
14
|
-
|
|
14
|
+
logger_1.AppLogger.debug('Fetching commits for path: ' + decodedPath);
|
|
15
|
+
logger_1.AppLogger.debug('Current working directory: ' + process.cwd());
|
|
15
16
|
const gitService = new git_service_1.GitService();
|
|
16
17
|
// Check if this is an absolute path and convert to relative if needed
|
|
17
18
|
let relativePath = decodedPath;
|
|
@@ -19,23 +20,22 @@ const getCommitsByPathService = async (packagePath) => {
|
|
|
19
20
|
// If it's an absolute path, make it relative to project root
|
|
20
21
|
if (path_1.default.isAbsolute(decodedPath)) {
|
|
21
22
|
relativePath = path_1.default.relative(projectRoot, decodedPath);
|
|
22
|
-
|
|
23
|
+
logger_1.AppLogger.debug('Converted absolute path to relative: ' + relativePath);
|
|
23
24
|
}
|
|
24
25
|
// Check if the path exists
|
|
25
26
|
try {
|
|
26
27
|
await fs_1.default.promises.access(relativePath);
|
|
27
|
-
|
|
28
|
+
logger_1.AppLogger.debug('Path exists: ' + relativePath);
|
|
28
29
|
}
|
|
29
30
|
catch (fsError) {
|
|
30
|
-
console.log('Path does not exist:', relativePath);
|
|
31
31
|
// Try the original path as well
|
|
32
32
|
try {
|
|
33
33
|
await fs_1.default.promises.access(decodedPath);
|
|
34
|
-
|
|
34
|
+
logger_1.AppLogger.debug('Original Commit path exists: ' + decodedPath);
|
|
35
35
|
relativePath = decodedPath; // Use original path if it exists
|
|
36
36
|
}
|
|
37
37
|
catch (secondError) {
|
|
38
|
-
throw new Error(`Path does not exist: ${decodedPath}`);
|
|
38
|
+
throw new Error(`Commit Path does not exist: ${decodedPath}`);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
const commits = await gitService.getAllCommits(relativePath);
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.updatePackageConfigurationService = exports.updateConfigFileService = exports.getConfigurationFilesService = void 0;
|
|
7
7
|
const fs_1 = __importDefault(require("fs"));
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const logger_1 = require("../middleware/logger");
|
|
9
10
|
const repositories_1 = require("../repositories");
|
|
10
11
|
// Helper function to scan for configuration files
|
|
11
12
|
async function scanConfigFiles(rootDir) {
|
|
@@ -71,14 +72,14 @@ async function scanConfigFiles(rootDir) {
|
|
|
71
72
|
});
|
|
72
73
|
}
|
|
73
74
|
catch (error) {
|
|
74
|
-
|
|
75
|
+
logger_1.AppLogger.warn(`Could not read file: ${fullPath}`);
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
}
|
|
80
81
|
catch (error) {
|
|
81
|
-
|
|
82
|
+
logger_1.AppLogger.warn(`Could not scan directory: ${dir}`);
|
|
82
83
|
}
|
|
83
84
|
}
|
|
84
85
|
function shouldSkipDirectory(dirName, depth) {
|
|
@@ -115,20 +116,20 @@ async function scanConfigFiles(rootDir) {
|
|
|
115
116
|
return filename.toLowerCase() === pattern.toLowerCase();
|
|
116
117
|
});
|
|
117
118
|
}
|
|
118
|
-
|
|
119
|
+
logger_1.AppLogger.info(`Scanning for config files in: ${rootDir}`);
|
|
119
120
|
// Start scanning from root
|
|
120
121
|
scanDirectory(rootDir);
|
|
121
122
|
// Sort files by path for consistent ordering
|
|
122
123
|
configFiles.sort((a, b) => a.path.localeCompare(b.path));
|
|
123
|
-
|
|
124
|
+
logger_1.AppLogger.info(`Found ${configFiles.length} configuration files`);
|
|
124
125
|
// Log some sample files for debugging
|
|
125
126
|
if (configFiles.length > 0) {
|
|
126
|
-
|
|
127
|
+
logger_1.AppLogger.info('Sample config files found');
|
|
127
128
|
configFiles.slice(0, 5).forEach(file => {
|
|
128
|
-
|
|
129
|
+
logger_1.AppLogger.debug(` - ${file.path} (${file.type})`);
|
|
129
130
|
});
|
|
130
131
|
if (configFiles.length > 5) {
|
|
131
|
-
|
|
132
|
+
logger_1.AppLogger.debug(` ... and ${configFiles.length - 5} more`);
|
|
132
133
|
}
|
|
133
134
|
}
|
|
134
135
|
return configFiles;
|
|
@@ -203,8 +204,8 @@ const getConfigurationFilesService = async (rootDir) => {
|
|
|
203
204
|
exports.getConfigurationFilesService = getConfigurationFilesService;
|
|
204
205
|
const updateConfigFileService = async (id, rootDir, content) => {
|
|
205
206
|
const filePath = path_1.default.join(rootDir, id.startsWith('/') ? id.slice(1) : id);
|
|
206
|
-
|
|
207
|
-
|
|
207
|
+
logger_1.AppLogger.debug('Saving file: ' + filePath);
|
|
208
|
+
logger_1.AppLogger.debug('Root directory: ' + rootDir);
|
|
208
209
|
// Security check: ensure the file is within the project directory
|
|
209
210
|
if (!filePath.startsWith(rootDir)) {
|
|
210
211
|
throw new Error('Invalid file path');
|
|
@@ -245,7 +246,7 @@ const updatePackageConfigurationService = async (packagePath, packageName, confi
|
|
|
245
246
|
newConfig = JSON.parse(config);
|
|
246
247
|
}
|
|
247
248
|
catch (error) {
|
|
248
|
-
|
|
249
|
+
logger_1.AppLogger.error('JSON parsing error', error);
|
|
249
250
|
throw new Error('Invalid JSON format: ' + (error instanceof Error ? error.message : 'Unknown error'));
|
|
250
251
|
}
|
|
251
252
|
const packageJsonPath = path_1.default.join(packagePath, 'package.json');
|
|
@@ -307,7 +308,7 @@ const updatePackageConfigurationService = async (packagePath, packageName, confi
|
|
|
307
308
|
updateData.devDependencies = JSON.stringify(newConfig.devDependencies);
|
|
308
309
|
if (newConfig.peerDependencies)
|
|
309
310
|
updateData.peerDependencies = JSON.stringify(newConfig.peerDependencies);
|
|
310
|
-
|
|
311
|
+
logger_1.AppLogger.debug('Updating database with:', updateData);
|
|
311
312
|
const updatedPackage = await repositories_1.PackageRepository.updateConfig(packageName, updateData);
|
|
312
313
|
// Transform the response
|
|
313
314
|
const transformedPackage = {
|
|
@@ -13,6 +13,7 @@ exports.GitService = void 0;
|
|
|
13
13
|
const child_process_1 = require("child_process");
|
|
14
14
|
const util_1 = require("util");
|
|
15
15
|
const path_1 = __importDefault(require("path"));
|
|
16
|
+
const logger_1 = require("../middleware/logger");
|
|
16
17
|
const types_1 = require("../types");
|
|
17
18
|
// Promisify the standard 'exec' function for easy async/await usage
|
|
18
19
|
const execPromise = (0, util_1.promisify)(child_process_1.exec);
|
|
@@ -35,19 +36,19 @@ class GitService {
|
|
|
35
36
|
}
|
|
36
37
|
// First, validate we're in a git repo
|
|
37
38
|
await this.validateGitRepository(pathArgument);
|
|
38
|
-
|
|
39
|
+
logger_1.AppLogger.debug(`Executing Git command in: ${this.repoPath}`);
|
|
39
40
|
// Use a simpler git log format
|
|
40
41
|
const command = `git log --pretty=format:"%H|%an|%ad|%s" --date=iso-strict ${pathArgument}`;
|
|
41
|
-
|
|
42
|
+
logger_1.AppLogger.debug(`Git command: ${command}`);
|
|
42
43
|
const { stdout, stderr } = await execPromise(command, {
|
|
43
44
|
cwd: this.repoPath,
|
|
44
45
|
maxBuffer: 1024 * 5000,
|
|
45
46
|
});
|
|
46
47
|
if (stderr) {
|
|
47
|
-
|
|
48
|
+
logger_1.AppLogger.warn('Git stderr: ' + stderr);
|
|
48
49
|
}
|
|
49
50
|
if (!stdout.trim()) {
|
|
50
|
-
|
|
51
|
+
logger_1.AppLogger.debug('No commits found for path: ' + pathFilter);
|
|
51
52
|
return [];
|
|
52
53
|
}
|
|
53
54
|
// Parse the output
|
|
@@ -67,14 +68,14 @@ class GitService {
|
|
|
67
68
|
commits.push(commit);
|
|
68
69
|
}
|
|
69
70
|
catch (parseError) {
|
|
70
|
-
|
|
71
|
+
logger_1.AppLogger.error('Failed to parse commit line: ' + line, parseError);
|
|
71
72
|
}
|
|
72
73
|
}
|
|
73
|
-
|
|
74
|
+
logger_1.AppLogger.debug(`Successfully parsed ${commits.length} commits`);
|
|
74
75
|
return commits;
|
|
75
76
|
}
|
|
76
77
|
catch (error) {
|
|
77
|
-
|
|
78
|
+
logger_1.AppLogger.error('Error in getAllCommits', error);
|
|
78
79
|
throw error;
|
|
79
80
|
}
|
|
80
81
|
}
|
|
@@ -115,7 +116,7 @@ class GitService {
|
|
|
115
116
|
await execPromise('git ' + pathArgument + ' rev-parse --is-inside-work-tree', {
|
|
116
117
|
cwd: this.repoPath,
|
|
117
118
|
});
|
|
118
|
-
|
|
119
|
+
logger_1.AppLogger.debug('Valid git repository');
|
|
119
120
|
}
|
|
120
121
|
catch (error) {
|
|
121
122
|
throw new Error('Not a git repository (or any of the parent directories)');
|
|
@@ -3,12 +3,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.healthRefreshService = exports.getHealthSummaryService = void 0;
|
|
4
4
|
const utilities_1 = require("../utils/utilities");
|
|
5
5
|
const monorepo_scanner_1 = require("../utils/monorepo-scanner");
|
|
6
|
+
const logger_1 = require("../middleware/logger");
|
|
6
7
|
const repositories_1 = require("../repositories");
|
|
7
8
|
// Track in-flight health refresh requests to prevent duplicates
|
|
8
9
|
let inFlightHealthRefresh = null;
|
|
9
10
|
const getHealthSummaryService = async () => {
|
|
10
11
|
const packageHealthData = await repositories_1.PackageHealthRepository.findAll();
|
|
11
|
-
|
|
12
|
+
logger_1.AppLogger.debug('packageHealthData count: ' + packageHealthData.length);
|
|
12
13
|
// Transform the data to match the expected frontend format
|
|
13
14
|
const packages = packageHealthData.map((pkg) => {
|
|
14
15
|
const health = {
|
|
@@ -46,14 +47,14 @@ exports.getHealthSummaryService = getHealthSummaryService;
|
|
|
46
47
|
const healthRefreshService = async (rootDir) => {
|
|
47
48
|
// If a health refresh is already in progress, return the in-flight promise
|
|
48
49
|
if (inFlightHealthRefresh) {
|
|
49
|
-
|
|
50
|
+
logger_1.AppLogger.info('Health refresh already in progress, returning cached promise');
|
|
50
51
|
return inFlightHealthRefresh;
|
|
51
52
|
}
|
|
52
53
|
// Create and store the health refresh promise
|
|
53
54
|
inFlightHealthRefresh = (async () => {
|
|
54
55
|
try {
|
|
55
56
|
const packages = (0, utilities_1.scanMonorepo)(rootDir);
|
|
56
|
-
|
|
57
|
+
logger_1.AppLogger.debug('packages count: ' + packages.length);
|
|
57
58
|
const healthMetrics = await Promise.all(packages.map(async (pkg) => {
|
|
58
59
|
try {
|
|
59
60
|
// Await each health check function since they return promises
|
|
@@ -75,7 +76,7 @@ const healthRefreshService = async (rootDir) => {
|
|
|
75
76
|
: health.overallScore >= 60 && health.overallScore < 80
|
|
76
77
|
? 'warning'
|
|
77
78
|
: 'error';
|
|
78
|
-
|
|
79
|
+
logger_1.AppLogger.debug(`${pkg.name}: ${packageStatus}`, health);
|
|
79
80
|
await repositories_1.PackageHealthRepository.upsert({
|
|
80
81
|
packageName: pkg.name,
|
|
81
82
|
packageOverallScore: overallScore.overallScore,
|
|
@@ -4,6 +4,7 @@ exports.getPackageDetailService = exports.refreshPackagesService = exports.getPa
|
|
|
4
4
|
const utilities_1 = require("../utils/utilities");
|
|
5
5
|
const monorepo_scanner_1 = require("../utils/monorepo-scanner");
|
|
6
6
|
const ci_status_1 = require("../utils/ci-status");
|
|
7
|
+
const logger_1 = require("../middleware/logger");
|
|
7
8
|
const repositories_1 = require("../repositories");
|
|
8
9
|
const commit_service_1 = require("./commit-service");
|
|
9
10
|
/**
|
|
@@ -73,7 +74,7 @@ async function storePackage(pkg) {
|
|
|
73
74
|
}
|
|
74
75
|
}
|
|
75
76
|
catch (error) {
|
|
76
|
-
|
|
77
|
+
logger_1.AppLogger.warn(`Failed to store report for ${pkg.name}`);
|
|
77
78
|
}
|
|
78
79
|
}
|
|
79
80
|
const getPackagesService = async (rootPath) => {
|
|
@@ -81,9 +82,9 @@ const getPackagesService = async (rootPath) => {
|
|
|
81
82
|
if (!dbPackages.length) {
|
|
82
83
|
try {
|
|
83
84
|
const rootDir = rootPath;
|
|
84
|
-
|
|
85
|
+
logger_1.AppLogger.debug('rootDir: ' + rootDir);
|
|
85
86
|
const packages = (0, utilities_1.scanMonorepo)(rootDir);
|
|
86
|
-
|
|
87
|
+
logger_1.AppLogger.debug('packages scanned: ' + packages.length);
|
|
87
88
|
for (const pkg of packages) {
|
|
88
89
|
await storePackage(pkg);
|
|
89
90
|
}
|
|
@@ -124,7 +125,7 @@ const refreshPackagesService = async (rootPath) => {
|
|
|
124
125
|
await repositories_1.PackageRepository.deleteAll();
|
|
125
126
|
const rootDir = rootPath;
|
|
126
127
|
const packages = (0, utilities_1.scanMonorepo)(rootDir);
|
|
127
|
-
|
|
128
|
+
logger_1.AppLogger.debug('packages count: ' + packages.length);
|
|
128
129
|
for (const pkg of packages) {
|
|
129
130
|
await storePackage(pkg);
|
|
130
131
|
}
|
package/dist/utils/ci-status.js
CHANGED
|
@@ -4,6 +4,7 @@ exports.ciStatusManager = exports.CIStatusManager = void 0;
|
|
|
4
4
|
exports.getPackageCIStatus = getPackageCIStatus;
|
|
5
5
|
exports.getMonorepoCIStatus = getMonorepoCIStatus;
|
|
6
6
|
exports.triggerPackageBuild = triggerPackageBuild;
|
|
7
|
+
const logger_1 = require("../middleware/logger");
|
|
7
8
|
class CIStatusManager {
|
|
8
9
|
constructor() {
|
|
9
10
|
this.providers = new Map();
|
|
@@ -103,7 +104,7 @@ class CIStatusManager {
|
|
|
103
104
|
return status;
|
|
104
105
|
}
|
|
105
106
|
catch (error) {
|
|
106
|
-
|
|
107
|
+
logger_1.AppLogger.error(`Error fetching CI status for ${packageName}`, error);
|
|
107
108
|
return null;
|
|
108
109
|
}
|
|
109
110
|
}
|
|
@@ -397,7 +398,7 @@ class CIStatusManager {
|
|
|
397
398
|
try {
|
|
398
399
|
// Mock implementation
|
|
399
400
|
const buildId = `build-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
400
|
-
|
|
401
|
+
logger_1.AppLogger.info(`Triggering build for ${packageName} on ${branch} via ${providerName}`);
|
|
401
402
|
return {
|
|
402
403
|
success: true,
|
|
403
404
|
buildId,
|