UNPKG

sicua

Version:

A tool for analyzing project structure and dependencies

171 lines (170 loc) 5.91 kB
"use strict"; /** * 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; }