sicua
Version:
A tool for analyzing project structure and dependencies
171 lines (170 loc) • 5.91 kB
JavaScript
;
/**
* Project Metadata Detector - Extracts project metadata from package.json and configuration files
*/
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.detectProjectMetadata = detectProjectMetadata;
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const projectMetadata_constants_1 = require("../constants/projectMetadata.constants");
/**
* Detects project metadata from package.json and configuration files
* @param projectRoot Root directory of the project
* @returns ProjectMetadata object with all detected information
*/
function detectProjectMetadata(projectRoot) {
const packageJsonPath = path.join(projectRoot, "package.json");
let packageJson = {};
// Read package.json if it exists
try {
if (fs.existsSync(packageJsonPath)) {
const packageJsonContent = fs.readFileSync(packageJsonPath, "utf-8");
packageJson = JSON.parse(packageJsonContent);
}
}
catch (error) {
console.warn(`Error reading package.json: ${error}`);
}
const allDependencies = {
...packageJson.dependencies,
...packageJson.devDependencies,
};
return {
packageInfo: extractPackageInfo(packageJson),
framework: extractFrameworkInfo(packageJson, allDependencies),
developmentTools: extractDevelopmentTools(allDependencies),
uiAndStyling: extractUIAndStyling(allDependencies),
stateManagement: extractStateManagement(allDependencies),
configurationFiles: detectConfigurationFiles(projectRoot),
};
}
/**
* Extracts basic package information
*/
function extractPackageInfo(packageJson) {
return {
name: packageJson.name,
version: packageJson.version,
description: packageJson.description,
private: packageJson.private,
hasScripts: !!packageJson.scripts && Object.keys(packageJson.scripts).length > 0,
scriptCount: packageJson.scripts
? Object.keys(packageJson.scripts).length
: 0,
};
}
/**
* Extracts framework and runtime information
*/
function extractFrameworkInfo(packageJson, allDependencies) {
const frameworkInfo = {};
projectMetadata_constants_1.FRAMEWORK_PACKAGES.forEach(({ key, packageNames }) => {
for (const packageName of packageNames) {
if (allDependencies[packageName]) {
frameworkInfo[key] =
allDependencies[packageName];
break;
}
}
});
// Check Node.js version from engines
if (packageJson.engines?.node) {
frameworkInfo.nodejs = packageJson.engines.node;
}
return frameworkInfo;
}
/**
* Extracts development tools information
*/
function extractDevelopmentTools(allDependencies) {
const tools = {
buildTools: {},
linting: {},
testing: {},
bundlers: {},
};
Object.entries(projectMetadata_constants_1.DEVELOPMENT_TOOLS).forEach(([category, packages]) => {
packages.forEach((packageName) => {
if (allDependencies[packageName]) {
tools[category][packageName] =
allDependencies[packageName];
}
});
});
return tools;
}
/**
* Extracts UI and styling library information
*/
function extractUIAndStyling(allDependencies) {
const uiStyling = {
cssFrameworks: {},
uiLibraries: {},
iconLibraries: {},
};
Object.entries(projectMetadata_constants_1.UI_STYLING_PACKAGES).forEach(([category, packages]) => {
packages.forEach((packageName) => {
if (allDependencies[packageName]) {
uiStyling[category][packageName] =
allDependencies[packageName];
}
});
});
return uiStyling;
}
/**
* Extracts state management library information
*/
function extractStateManagement(allDependencies) {
const stateManagement = {
libraries: {},
};
projectMetadata_constants_1.STATE_MANAGEMENT_PACKAGES.forEach((packageName) => {
if (allDependencies[packageName]) {
stateManagement.libraries[packageName] = allDependencies[packageName];
}
});
return stateManagement;
}
/**
* Detects presence of configuration files
*/
function detectConfigurationFiles(projectRoot) {
const configFiles = {
nextConfig: false,
tsConfig: false,
eslintConfig: false,
prettierConfig: false,
jestConfig: false,
vitestConfig: false,
playwrightConfig: false,
cypressConfig: false,
};
Object.entries(projectMetadata_constants_1.CONFIG_FILES).forEach(([configType, fileNames]) => {
configFiles[configType] = fileNames.some((fileName) => fs.existsSync(path.join(projectRoot, fileName)));
});
return configFiles;
}