mcp-ai-agent-guidelines
Version:
A comprehensive Model Context Protocol server providing advanced tools, resources, and prompts for implementing AI agent best practices
142 lines • 5.73 kB
JavaScript
/**
* TypeScript Parser (tsconfig.json)
*
* Parses tsconfig.json files to extract type definition references,
* project references, and analyze TypeScript configuration for best practices.
*/
import { BaseParser } from "./base.js";
export class TypeScriptConfigParser extends BaseParser {
parse(content) {
const packages = [];
const errors = [];
try {
const config = JSON.parse(content);
// Extract type definitions from compilerOptions.types
if (config.compilerOptions?.types) {
for (const typeDef of config.compilerOptions.types) {
packages.push({
name: typeDef.startsWith("@types/") ? typeDef : `@types/${typeDef}`,
version: "*",
type: "devDependencies",
ecosystem: "typescript",
});
}
}
// Extract project references
if (config.references) {
for (const ref of config.references) {
packages.push({
name: ref.path,
version: "local",
type: "dependencies",
ecosystem: "typescript",
source: "project-reference",
});
}
}
// Extract extended configs
if (config.extends) {
const extendsName = config.extends;
packages.push({
name: extendsName,
version: "*",
type: "devDependencies",
ecosystem: "typescript",
source: "extends",
});
}
}
catch (error) {
errors.push(`Invalid tsconfig.json: ${error instanceof Error ? error.message : "Unknown error"}`);
}
return {
packages,
ecosystem: "typescript",
fileType: "tsconfig.json",
errors: errors.length > 0 ? errors : undefined,
};
}
canParse(content) {
const trimmed = content.trim();
if (!trimmed.startsWith("{") || !trimmed.endsWith("}")) {
return false;
}
try {
const parsed = JSON.parse(content);
// Check for tsconfig-specific fields
return (typeof parsed === "object" &&
(parsed.compilerOptions !== undefined ||
parsed.extends !== undefined ||
parsed.references !== undefined ||
parsed.include !== undefined ||
parsed.exclude !== undefined ||
parsed.files !== undefined));
}
catch {
return false;
}
}
getEcosystem() {
return "typescript";
}
getFileTypes() {
return ["tsconfig.json"];
}
analyzePackage(pkg, options, issues) {
// Skip local project references
if (pkg.source === "project-reference")
return;
if (options.checkDeprecated) {
this.checkDeprecatedTypes(pkg, issues);
}
if (options.checkOutdated) {
this.checkOutdatedPatterns(pkg, issues);
}
}
checkDeprecatedTypes(pkg, issues) {
// Check for deprecated type definitions
const deprecatedTypes = {
"@types/node-fetch": "Use native fetch in Node.js 18+",
"@types/express-serve-static-core": "Included in @types/express",
"@types/glob": "glob@8+ includes TypeScript types",
"@types/rimraf": "rimraf@4+ includes TypeScript types",
};
const deprecated = deprecatedTypes[pkg.name];
if (deprecated) {
this.addIssue(issues, pkg, "Deprecated Package", "moderate", `Type definition may be unnecessary: ${deprecated}`, "Remove from types array if not needed");
}
}
checkOutdatedPatterns(pkg, issues) {
// Check for outdated extends patterns
if (pkg.source === "extends") {
const outdatedExtends = {
"@tsconfig/node12": "Node.js 12 is EOL. Use @tsconfig/node18 or later",
"@tsconfig/node14": "Node.js 14 is EOL. Use @tsconfig/node18 or later",
"@tsconfig/node16": "Consider upgrading to @tsconfig/node18 or later",
};
const outdated = outdatedExtends[pkg.name];
if (outdated) {
this.addIssue(issues, pkg, "Outdated Pattern", "moderate", outdated, "Update extends to use a supported Node.js version");
}
}
}
analyzeEcosystemSpecific(parseResult, options, _issues) {
// For TypeScript, we can also analyze the config itself
if (options.checkOutdated) {
// Check for missing strict mode
const hasStrictTypes = parseResult.packages.some((pkg) => pkg.name === "@types/node" || pkg.name.startsWith("@tsconfig/"));
if (parseResult.packages.length > 0 && !hasStrictTypes) {
// This is informational, not a package-level issue
}
}
}
addEcosystemRecommendations(recommendations) {
recommendations.push("Run 'tsc --noEmit' to check for type errors");
recommendations.push("Consider enabling strict mode in compilerOptions");
recommendations.push("Use project references for large monorepo projects");
recommendations.push("Run 'npx depcheck' to find unused type definitions");
}
}
// Alias for backward compatibility
export const TsConfigParser = TypeScriptConfigParser;
//# sourceMappingURL=typescript.js.map