woaru
Version:
Universal Project Setup Autopilot - Analyze and automatically configure development tools for ANY programming language
121 lines • 4.48 kB
JavaScript
import { BasePlugin } from './BasePlugin.js';
export class CSharpPlugin extends BasePlugin {
name = 'C#';
frameworks = ['csharp', 'dotnet'];
canHandle(analysis) {
return (analysis.language === 'C#' ||
analysis.configFiles.some(file => file.endsWith('.csproj') || file.endsWith('.sln')));
}
getRecommendations(analysis) {
const recommendations = [];
// StyleCop Analyzers
if (!analysis.configFiles.includes('.editorconfig')) {
recommendations.push({
tool: 'editorconfig',
category: 'formatting',
reason: 'Maintain consistent coding styles across different editors',
packages: [],
configFiles: ['.editorconfig'],
priority: 'high',
});
}
// Code analysis
recommendations.push({
tool: 'dotnet-format',
category: 'formatting',
reason: 'Code formatter for .NET projects',
packages: [],
configFiles: [],
priority: 'high',
});
// xUnit for testing
if (!this.hasPackage(analysis, 'xunit')) {
recommendations.push({
tool: 'xunit',
category: 'testing',
reason: 'Modern testing framework for .NET',
packages: ['xunit', 'xunit.runner.visualstudio'],
configFiles: [],
priority: 'medium',
});
}
// SonarAnalyzer
recommendations.push({
tool: 'sonaranalyzer',
category: 'code-quality',
reason: 'Code quality and security analysis for C#',
packages: ['SonarAnalyzer.CSharp'],
configFiles: [],
priority: 'medium',
});
// Husky.Net for git hooks
recommendations.push({
tool: 'husky.net',
category: 'git-hooks',
reason: '.NET version of Husky for git hooks',
packages: ['Husky'],
configFiles: ['.husky/task-runner.json'],
priority: 'low',
});
return recommendations;
}
getRefactorSuggestions(analysis) {
const suggestions = [];
const csharpFiles = analysis.structure.filter(file => file.endsWith('.cs'));
csharpFiles.forEach(file => {
// ASP.NET specific
if (analysis.framework.includes('aspnet')) {
if (file.includes('Controller.cs')) {
suggestions.push({
filename: file,
suggestion: 'Consider using async/await for all database operations',
type: 'performance',
});
suggestions.push({
filename: file,
suggestion: 'Use dependency injection for services instead of static calls',
type: 'best-practice',
});
}
}
// Entity Framework
if (file.includes('DbContext') || file.includes('Context.cs')) {
suggestions.push({
filename: file,
suggestion: 'Use IQueryable for better query performance with Entity Framework',
type: 'performance',
});
}
// General C# patterns
if (file.includes('Service.cs') || file.includes('Repository.cs')) {
suggestions.push({
filename: file,
suggestion: 'Implement interfaces for better testability and loose coupling',
type: 'maintainability',
});
}
// Test files
if (file.includes('Test.cs') || file.includes('Tests.cs')) {
suggestions.push({
filename: file,
suggestion: 'Use AAA pattern (Arrange, Act, Assert) for test organization',
type: 'best-practice',
});
}
});
return suggestions;
}
getSpecificPackages() {
return [
'StyleCop.Analyzers',
'SonarAnalyzer.CSharp',
'xunit',
'Moq',
'FluentAssertions',
'Serilog',
'AutoMapper',
'FluentValidation',
];
}
}
//# sourceMappingURL=CSharpPlugin.js.map