can-algorithm
Version:
Cortex Algorithm Numeral - Intelligent development automation tool
118 lines (94 loc) • 3.8 kB
JavaScript
const express = require('express');
const bodyParser = require('body-parser');
const fs = require('fs').promises;
const path = require('path');
const crypto = require('crypto');
const app = express();
app.use(bodyParser.json({ limit: '50mb' }));
const PORT = process.env.ESP_PORT || 3002;
const analyzeEnvironment = async (projectPath) => {
const analysis = {
frameworks: [],
languages: {},
dependencies: {},
structure: {},
security: {
vulnerabilities: [],
permissions: {}
}
};
try {
const packageJsonPath = path.join(projectPath, 'package.json');
const packageData = await fs.readFile(packageJsonPath, 'utf8');
const packageJson = JSON.parse(packageData);
analysis.dependencies = {
...packageJson.dependencies,
...packageJson.devDependencies
};
if (packageJson.dependencies?.react) analysis.frameworks.push('React');
if (packageJson.dependencies?.vue) analysis.frameworks.push('Vue');
if (packageJson.dependencies?.express) analysis.frameworks.push('Express');
if (packageJson.dependencies?.next) analysis.frameworks.push('Next.js');
} catch {}
try {
const composerPath = path.join(projectPath, 'composer.json');
const composerData = await fs.readFile(composerPath, 'utf8');
const composer = JSON.parse(composerData);
if (composer.require?.['laravel/framework']) analysis.frameworks.push('Laravel');
if (composer.require?.['symfony/framework-bundle']) analysis.frameworks.push('Symfony');
} catch {}
async function scanDirectory(dir, depth = 0) {
if (depth > 5) return;
const entries = await fs.readdir(dir, { withFileTypes: true });
for (const entry of entries) {
const fullPath = path.join(dir, entry.name);
if (entry.name === 'node_modules' || entry.name === '.git') continue;
if (entry.isFile()) {
const ext = path.extname(entry.name);
analysis.languages[ext] = (analysis.languages[ext] || 0) + 1;
if (entry.name === 'webpack.config.js') analysis.frameworks.push('Webpack');
if (entry.name === 'vite.config.js') analysis.frameworks.push('Vite');
if (entry.name === 'docker-compose.yml') analysis.frameworks.push('Docker');
} else if (entry.isDirectory()) {
await scanDirectory(fullPath, depth + 1);
}
}
}
await scanDirectory(projectPath);
analysis.frameworks = [...new Set(analysis.frameworks)];
return analysis;
};
app.post('/esp/scan', async (req, res) => {
try {
const { project_path, license_key } = req.body;
const analysis = await analyzeEnvironment(project_path);
res.json({
success: true,
analysis: analysis,
scan_id: crypto.randomUUID(),
timestamp: new Date().toISOString()
});
} catch (error) {
res.status(500).json({
success: false,
error: error.message
});
}
});
app.post('/esp/validate', async (req, res) => {
const { scan_id, hash } = req.body;
res.json({
valid: true,
scan_id: scan_id
});
});
app.get('/esp/health', (req, res) => {
res.json({
status: 'healthy',
version: '1.0.0',
uptime: process.uptime()
});
});
app.listen(PORT, () => {
console.log(`ESP Service running on port ${PORT}`);
});