@samiyev/guardian
Version:
Research-backed code quality guardian for AI-assisted development. Detects hardcodes, secrets, circular deps, framework leaks, entity exposure, and 9 architecture violations. Enforces Clean Architecture/DDD principles. Works with GitHub Copilot, Cursor, W
81 lines • 4.46 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.analyzeProject = analyzeProject;
const AnalyzeProject_1 = require("./application/use-cases/AnalyzeProject");
const FileScanner_1 = require("./infrastructure/scanners/FileScanner");
const CodeParser_1 = require("./infrastructure/parsers/CodeParser");
const HardcodeDetector_1 = require("./infrastructure/analyzers/HardcodeDetector");
const NamingConventionDetector_1 = require("./infrastructure/analyzers/NamingConventionDetector");
const FrameworkLeakDetector_1 = require("./infrastructure/analyzers/FrameworkLeakDetector");
const EntityExposureDetector_1 = require("./infrastructure/analyzers/EntityExposureDetector");
const DependencyDirectionDetector_1 = require("./infrastructure/analyzers/DependencyDirectionDetector");
const RepositoryPatternDetector_1 = require("./infrastructure/analyzers/RepositoryPatternDetector");
const AggregateBoundaryDetector_1 = require("./infrastructure/analyzers/AggregateBoundaryDetector");
const SecretDetector_1 = require("./infrastructure/analyzers/SecretDetector");
const AnemicModelDetector_1 = require("./infrastructure/analyzers/AnemicModelDetector");
const DuplicateValueTracker_1 = require("./infrastructure/analyzers/DuplicateValueTracker");
const constants_1 = require("./shared/constants");
/**
* Analyzes a TypeScript/JavaScript project for code quality issues
*
* Detects hardcoded values (magic numbers and strings) and validates
* Clean Architecture layer dependencies.
*
* @param options - Configuration for the analysis
* @param options.rootDir - Root directory to analyze
* @param options.include - File patterns to include (optional)
* @param options.exclude - Directories to exclude (optional, defaults to node_modules, dist, build)
*
* @returns Analysis results including violations, metrics, and dependency graph
*
* @throws {Error} If analysis fails or project cannot be scanned
*
* @example
* ```typescript
* import { analyzeProject } from '@puaros/guardian'
*
* const result = await analyzeProject({
* rootDir: './src',
* exclude: ['node_modules', 'dist', 'test']
* })
*
* console.log(`Found ${result.hardcodeViolations.length} hardcoded values`)
* console.log(`Found ${result.violations.length} architecture violations`)
* console.log(`Analyzed ${result.metrics.totalFiles} files`)
* ```
*
* @example
* ```typescript
* // Check for hardcoded values only
* const result = await analyzeProject({ rootDir: './src' })
*
* result.hardcodeViolations.forEach(violation => {
* console.log(`${violation.file}:${violation.line}`)
* console.log(` Type: ${violation.type}`)
* console.log(` Value: ${violation.value}`)
* console.log(` Suggestion: ${violation.suggestion.constantName}`)
* console.log(` Location: ${violation.suggestion.location}`)
* })
* ```
*/
async function analyzeProject(options) {
const fileScanner = new FileScanner_1.FileScanner();
const codeParser = new CodeParser_1.CodeParser();
const hardcodeDetector = new HardcodeDetector_1.HardcodeDetector();
const namingConventionDetector = new NamingConventionDetector_1.NamingConventionDetector();
const frameworkLeakDetector = new FrameworkLeakDetector_1.FrameworkLeakDetector();
const entityExposureDetector = new EntityExposureDetector_1.EntityExposureDetector();
const dependencyDirectionDetector = new DependencyDirectionDetector_1.DependencyDirectionDetector();
const repositoryPatternDetector = new RepositoryPatternDetector_1.RepositoryPatternDetector();
const aggregateBoundaryDetector = new AggregateBoundaryDetector_1.AggregateBoundaryDetector();
const secretDetector = new SecretDetector_1.SecretDetector();
const anemicModelDetector = new AnemicModelDetector_1.AnemicModelDetector();
const duplicateValueTracker = new DuplicateValueTracker_1.DuplicateValueTracker();
const useCase = new AnalyzeProject_1.AnalyzeProject(fileScanner, codeParser, hardcodeDetector, namingConventionDetector, frameworkLeakDetector, entityExposureDetector, dependencyDirectionDetector, repositoryPatternDetector, aggregateBoundaryDetector, secretDetector, anemicModelDetector, duplicateValueTracker);
const result = await useCase.execute(options);
if (!result.success || !result.data) {
throw new Error(result.error ?? constants_1.ERROR_MESSAGES.FAILED_TO_ANALYZE);
}
return result.data;
}
//# sourceMappingURL=api.js.map