eslint-config-functype 2.2.1 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list-rules.js","names":[],"sources":["../../src/utils/dependency-validator.ts","../../src/cli/list-rules.ts"],"sourcesContent":["// Utility to validate peer dependencies and provide helpful error messages\n\ninterface PeerDependency {\n name: string\n packageName: string\n description: string\n required: boolean\n}\n\nconst PEER_DEPENDENCIES: PeerDependency[] = [\n {\n name: \"@typescript-eslint/eslint-plugin\",\n packageName: \"@typescript-eslint/eslint-plugin\",\n description: \"TypeScript-aware ESLint rules\",\n required: true,\n },\n {\n name: \"@typescript-eslint/parser\",\n packageName: \"@typescript-eslint/parser\",\n description: \"TypeScript parser for ESLint\",\n required: true,\n },\n {\n name: \"eslint-plugin-prettier\",\n packageName: \"eslint-plugin-prettier\",\n description: \"Code formatting rules\",\n required: false,\n },\n {\n name: \"eslint-plugin-simple-import-sort\",\n packageName: \"eslint-plugin-simple-import-sort\",\n description: \"Import sorting rules\",\n required: false,\n },\n {\n name: \"prettier\",\n packageName: \"prettier\",\n description: \"Code formatter\",\n required: false,\n },\n]\n\nexport interface ValidationResult {\n isValid: boolean\n missing: PeerDependency[]\n available: PeerDependency[]\n installCommand: string\n warnings: string[]\n}\n\nfunction tryResolve(packageName: string): boolean {\n try {\n import.meta.resolve(packageName)\n return true\n } catch {\n return false\n }\n}\n\nexport function validatePeerDependencies(): ValidationResult {\n const missing: PeerDependency[] = []\n const available: PeerDependency[] = []\n const warnings: string[] = []\n\n for (const dep of PEER_DEPENDENCIES) {\n if (tryResolve(dep.packageName)) {\n available.push(dep)\n } else {\n missing.push(dep)\n if (dep.required) {\n // Required dependency is missing - this will cause errors\n } else {\n // Optional dependency is missing - add warning\n warnings.push(`Optional plugin '${dep.name}' not found. Some rules will be skipped.`)\n }\n }\n }\n\n const requiredMissing = missing.filter((dep) => dep.required)\n const isValid = requiredMissing.length === 0\n\n // Generate install command for missing dependencies\n const missingPackageNames = missing.map((dep) => dep.packageName)\n const installCommand = missingPackageNames.length > 0 ? `pnpm add -D ${missingPackageNames.join(\" \")}` : \"\"\n\n return {\n isValid,\n missing,\n available,\n installCommand,\n warnings,\n }\n}\n\nexport function createValidationError(result: ValidationResult): Error {\n const requiredMissing = result.missing.filter((dep) => dep.required)\n\n if (requiredMissing.length === 0) {\n return new Error(\"No validation errors\")\n }\n\n const missingList = requiredMissing.map((dep) => ` • ${dep.name} - ${dep.description}`).join(\"\\n\")\n\n const message = [\n \"❌ Missing required peer dependencies for eslint-config-functype:\",\n \"\",\n missingList,\n \"\",\n \"📦 Install missing dependencies:\",\n ` ${result.installCommand}`,\n \"\",\n \"📖 See installation guide: https://github.com/jordanburke/eslint-config-functype#installation\",\n ].join(\"\\n\")\n\n return new Error(message)\n}\n\nexport function shouldValidateDependencies(): boolean {\n // Skip validation in test environments or when explicitly disabled\n return process.env.NODE_ENV !== \"test\" && process.env.FUNCTYPE_SKIP_VALIDATION !== \"true\"\n}\n","import fs from \"node:fs\"\nimport path from \"node:path\"\nimport { fileURLToPath, pathToFileURL } from \"node:url\"\n\nimport { validatePeerDependencies, type ValidationResult } from \"../utils/dependency-validator\"\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\n// Types for better type safety\ntype RuleSeverity = \"off\" | \"warn\" | \"error\" | 0 | 1 | 2\ntype RuleConfig = RuleSeverity | [RuleSeverity, ...unknown[]]\n\ninterface RuleData {\n severity: RuleSeverity\n options: unknown[]\n source: string\n}\n\ninterface Config {\n rules?: Record<string, RuleConfig>\n extends?: string[]\n plugins?: string[]\n}\n\ninterface LoadedConfig {\n name: string\n rules: Map<string, RuleData>\n}\n\ninterface RuleDiff {\n name: string\n status: \"added\" | \"removed\" | \"different\" | \"same\"\n localSeverity?: RuleSeverity\n functypeSeverity?: RuleSeverity\n localOptions?: unknown[]\n functypeOptions?: unknown[]\n}\n\n// Colors for console output\nconst colors = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n} as const\n\nfunction colorize(text: string, color: keyof typeof colors): string {\n return colors[color] + text + colors.reset\n}\n\nasync function loadConfig(configPath: string): Promise<Config | null> {\n try {\n const resolvedPath = path.resolve(configPath)\n const configModule = await import(pathToFileURL(resolvedPath).href)\n return configModule.default || configModule\n } catch (error) {\n console.error(colorize(`Error loading config from ${configPath}:`, \"red\"), (error as Error).message)\n return null\n }\n}\n\nfunction extractRules(config: Config): Map<string, RuleData> {\n const rules = new Map<string, RuleData>()\n\n if (config.rules) {\n Object.entries(config.rules).forEach(([ruleName, ruleConfig]) => {\n const severity = Array.isArray(ruleConfig) ? ruleConfig[0] : ruleConfig\n const options = Array.isArray(ruleConfig) ? ruleConfig.slice(1) : []\n\n rules.set(ruleName, {\n severity,\n options,\n source: getRuleSource(ruleName),\n })\n })\n }\n\n return rules\n}\n\nfunction getRuleSource(ruleName: string): string {\n if (ruleName.startsWith(\"@typescript-eslint/\")) return \"@typescript-eslint/eslint-plugin\"\n return \"eslint (core)\"\n}\n\nfunction getSeverityColor(severity: RuleSeverity): keyof typeof colors {\n switch (severity) {\n case \"error\":\n case 2:\n return \"red\"\n case \"warn\":\n case 1:\n return \"yellow\"\n case \"off\":\n case 0:\n return \"cyan\"\n default:\n return \"reset\"\n }\n}\n\nfunction formatSeverity(severity: RuleSeverity): string {\n const severityMap: Record<string, string> = {\n \"0\": \"off\",\n \"1\": \"warn\",\n \"2\": \"error\",\n off: \"off\",\n warn: \"warn\",\n error: \"error\",\n }\n return severityMap[String(severity)] || String(severity)\n}\n\nfunction printRules(configName: string, rules: Map<string, RuleData>): void {\n console.log(colorize(`\\n📋 ${configName} Configuration Rules:`, \"bright\"))\n console.log(colorize(\"=\".repeat(50), \"blue\"))\n\n // Group rules by source\n const rulesBySource = new Map<string, Map<string, RuleData>>()\n rules.forEach((ruleData, ruleName) => {\n const source = ruleData.source\n if (!rulesBySource.has(source)) {\n rulesBySource.set(source, new Map())\n }\n rulesBySource.get(source)!.set(ruleName, ruleData)\n })\n\n // Print rules grouped by source\n rulesBySource.forEach((sourceRules, source) => {\n console.log(colorize(`\\n📦 ${source}:`, \"magenta\"))\n\n sourceRules.forEach((ruleData, ruleName) => {\n const shortName = ruleName.replace(/^.*\\//, \"\")\n const severity = formatSeverity(ruleData.severity)\n const severityColored = colorize(`[${severity.toUpperCase()}]`, getSeverityColor(ruleData.severity))\n const hasOptions = ruleData.options && ruleData.options.length > 0\n const optionsText = hasOptions ? colorize(\" (with options)\", \"cyan\") : \"\"\n\n console.log(` ${severityColored} ${colorize(shortName, \"green\")}${optionsText}`)\n\n if (hasOptions && process.argv.includes(\"--verbose\")) {\n console.log(` ${colorize(\"Options:\", \"cyan\")} ${JSON.stringify(ruleData.options)}`)\n }\n })\n })\n}\n\nfunction printSummary(configs: LoadedConfig[]): void {\n console.log(colorize(\"\\n📊 Summary:\", \"bright\"))\n console.log(colorize(\"=\".repeat(30), \"blue\"))\n\n configs.forEach(({ name, rules }) => {\n const totalRules = rules.size\n const errorRules = Array.from(rules.values()).filter((r) => r.severity === \"error\" || r.severity === 2).length\n const warnRules = Array.from(rules.values()).filter((r) => r.severity === \"warn\" || r.severity === 1).length\n const offRules = Array.from(rules.values()).filter((r) => r.severity === \"off\" || r.severity === 0).length\n\n console.log(`\\n${colorize(name, \"bright\")}: ${totalRules} total rules`)\n console.log(` ${colorize(\"●\", \"red\")} ${errorRules} errors`)\n console.log(` ${colorize(\"●\", \"yellow\")} ${warnRules} warnings`)\n console.log(` ${colorize(\"●\", \"cyan\")} ${offRules} disabled`)\n })\n}\n\nfunction printUsageInfo(): void {\n console.log(colorize(\"\\n💡 Usage Information:\", \"bright\"))\n console.log(colorize(\"=\".repeat(30), \"blue\"))\n console.log(\"\\n📖 How to use these configurations:\")\n console.log(\"\\n\" + colorize(\"ESLint 8 (.eslintrc):\", \"green\"))\n console.log(' extends: [\"plugin:functype/recommended\"]')\n console.log(\"\\n\" + colorize(\"ESLint 9+ (flat config):\", \"green\"))\n console.log(\" Copy the rules from our documentation into your eslint.config.js\")\n console.log(\"\\n\" + colorize(\"Individual rules:\", \"green\"))\n console.log(\" You can enable any rule individually in your rules section\")\n}\n\nfunction printDependencyStatus(result: ValidationResult): void {\n console.log(colorize(\"\\n🔍 Dependency Status Check:\", \"bright\"))\n console.log(colorize(\"=\".repeat(40), \"blue\"))\n\n // Show available dependencies\n if (result.available.length > 0) {\n console.log(colorize(\"\\n✅ Available:\", \"green\"))\n result.available.forEach((dep) => {\n const icon = dep.required ? \"🔧\" : \"🔌\"\n console.log(` ${icon} ${colorize(dep.name, \"green\")} - ${dep.description}`)\n })\n }\n\n // Show missing dependencies\n if (result.missing.length > 0) {\n console.log(colorize(\"\\n❌ Missing:\", \"red\"))\n result.missing.forEach((dep) => {\n const icon = dep.required ? \"⚠️ \" : \"💡\"\n const color = dep.required ? \"red\" : \"yellow\"\n console.log(` ${icon} ${colorize(dep.name, color)} - ${dep.description}`)\n })\n\n if (result.installCommand) {\n console.log(colorize(\"\\n📦 Install missing dependencies:\", \"bright\"))\n console.log(` ${colorize(result.installCommand, \"cyan\")}`)\n }\n }\n\n // Show warnings\n if (result.warnings.length > 0) {\n console.log(colorize(\"\\n⚠️ Warnings:\", \"yellow\"))\n result.warnings.forEach((warning) => console.log(` ${warning}`))\n }\n\n // Overall status\n const status = result.isValid ? \"✅ Ready to use\" : \"❌ Configuration will fail\"\n const statusColor = result.isValid ? \"green\" : \"red\"\n console.log(colorize(`\\n${status}`, statusColor))\n}\n\nasync function loadLocalESLintConfig(configPath: string): Promise<Config | null> {\n try {\n // Try common ESLint config file names if no path provided\n const possibleConfigs = [\n \"eslint.config.js\",\n \"eslint.config.mjs\",\n \"eslint.config.ts\",\n \".eslintrc.js\",\n \".eslintrc.json\",\n ]\n\n let actualPath = configPath\n if (!configPath) {\n // Search for config file in current directory\n for (const filename of possibleConfigs) {\n if (fs.existsSync(filename)) {\n actualPath = filename\n break\n }\n }\n if (!actualPath) {\n console.log(colorize(\"❌ No ESLint config file found. Searched for:\", \"red\"))\n possibleConfigs.forEach((f) => console.log(` • ${f}`))\n return null\n }\n }\n\n console.log(colorize(`📖 Loading local config: ${actualPath}`, \"cyan\"))\n\n // Handle flat config (eslint.config.js)\n if (actualPath.includes(\"eslint.config\")) {\n const configModule = await import(path.resolve(actualPath))\n const config = configModule.default || configModule\n\n // Flat config is array of config objects, merge rules\n if (Array.isArray(config)) {\n const mergedRules: Record<string, RuleConfig> = {}\n config.forEach((cfg: unknown) => {\n if (cfg && typeof cfg === \"object\" && \"rules\" in cfg) {\n const configObj = cfg as Config\n if (configObj.rules) {\n Object.assign(mergedRules, configObj.rules)\n }\n }\n })\n return { rules: mergedRules }\n }\n return config\n }\n\n // Handle legacy config (.eslintrc.*)\n return await loadConfig(actualPath)\n } catch (error) {\n console.error(colorize(`Error loading local config:`, \"red\"), (error as Error).message)\n return null\n }\n}\n\nfunction compareRules(localRules: Map<string, RuleData>, functypeRules: Map<string, RuleData>): RuleDiff[] {\n const allRules = new Set([...localRules.keys(), ...functypeRules.keys()])\n const diffs: RuleDiff[] = []\n\n allRules.forEach((ruleName) => {\n const localRule = localRules.get(ruleName)\n const functypeRule = functypeRules.get(ruleName)\n\n if (!localRule && functypeRule) {\n // Rule added by functype\n diffs.push({\n name: ruleName,\n status: \"added\",\n functypeSeverity: functypeRule.severity,\n functypeOptions: functypeRule.options,\n })\n } else if (localRule && !functypeRule) {\n // Rule exists locally but not in functype\n diffs.push({\n name: ruleName,\n status: \"removed\",\n localSeverity: localRule.severity,\n localOptions: localRule.options,\n })\n } else if (localRule && functypeRule) {\n // Compare configurations\n const severityDifferent = localRule.severity !== functypeRule.severity\n const optionsDifferent = JSON.stringify(localRule.options) !== JSON.stringify(functypeRule.options)\n\n if (severityDifferent || optionsDifferent) {\n diffs.push({\n name: ruleName,\n status: \"different\",\n localSeverity: localRule.severity,\n functypeSeverity: functypeRule.severity,\n localOptions: localRule.options,\n functypeOptions: functypeRule.options,\n })\n } else {\n diffs.push({\n name: ruleName,\n status: \"same\",\n localSeverity: localRule.severity,\n functypeSeverity: functypeRule.severity,\n })\n }\n }\n })\n\n return diffs.sort((a, b) => a.name.localeCompare(b.name))\n}\n\nfunction printDiff(diffs: RuleDiff[], functypeConfigName: string): void {\n console.log(colorize(`\\n🔄 Config Comparison vs ${functypeConfigName}:`, \"bright\"))\n console.log(colorize(\"=\".repeat(60), \"blue\"))\n\n const categories = {\n removed: diffs.filter((d) => d.status === \"removed\"),\n added: diffs.filter((d) => d.status === \"added\"),\n different: diffs.filter((d) => d.status === \"different\"),\n same: diffs.filter((d) => d.status === \"same\"),\n }\n\n // Rules you can remove (covered by functype)\n if (categories.same.length > 0) {\n console.log(colorize(\"\\n✅ Rules you can remove (covered by functype):\", \"green\"))\n categories.same.forEach((diff) => {\n const severity = formatSeverity(diff.functypeSeverity!)\n console.log(` • ${diff.name} (${severity})`)\n })\n }\n\n // New rules functype adds\n if (categories.added.length > 0) {\n console.log(colorize(\"\\n➕ New rules functype adds:\", \"blue\"))\n categories.added.forEach((diff) => {\n const severity = formatSeverity(diff.functypeSeverity!)\n const severityColored = colorize(`[${severity.toUpperCase()}]`, getSeverityColor(diff.functypeSeverity!))\n console.log(` • ${diff.name} ${severityColored}`)\n })\n }\n\n // Rules with conflicts\n if (categories.different.length > 0) {\n console.log(colorize(\"\\n🔀 Conflicting rules (will override functype):\", \"yellow\"))\n categories.different.forEach((diff) => {\n const localSeverity = formatSeverity(diff.localSeverity!)\n const functypeSeverity = formatSeverity(diff.functypeSeverity!)\n console.log(` • ${diff.name}`)\n console.log(` Local: ${localSeverity}`)\n console.log(` Functype: ${functypeSeverity}`)\n })\n }\n\n // Rules you have that functype doesn't\n if (categories.removed.length > 0) {\n console.log(colorize(\"\\n➖ Your additional rules (not in functype):\", \"magenta\"))\n categories.removed.forEach((diff) => {\n const severity = formatSeverity(diff.localSeverity!)\n console.log(` • ${diff.name} (${severity})`)\n })\n }\n\n // Summary stats\n console.log(colorize(\"\\n📊 Migration Summary:\", \"bright\"))\n console.log(` ${categories.same.length} rules can be removed`)\n console.log(` ${categories.added.length} new rules will be added`)\n console.log(` ${categories.different.length} rules have conflicts`)\n console.log(` ${categories.removed.length} additional rules you keep`)\n\n // Migration suggestions\n if (categories.same.length > 0 || categories.different.length > 0) {\n console.log(colorize(\"\\n💡 Suggested migration steps:\", \"bright\"))\n if (categories.same.length > 0) {\n console.log(\"1. Remove duplicate rules from your config (they match functype)\")\n }\n if (categories.different.length > 0) {\n console.log(\"2. Review conflicting rules - decide if you want local overrides\")\n }\n console.log('3. Add functype config: extends: [\"plugin:functype/recommended\"]')\n }\n}\n\nasync function runDiffMode(configPath: string): Promise<void> {\n console.log(colorize(\"🔄 ESLint Config Diff Mode\", \"bright\"))\n\n // Load local config\n const localConfig = await loadLocalESLintConfig(configPath)\n if (!localConfig) {\n console.error(colorize(\"❌ Could not load local ESLint config\", \"red\"))\n process.exit(1)\n }\n\n const localRules = extractRules(localConfig)\n console.log(colorize(`Found ${localRules.size} rules in local config`, \"cyan\"))\n\n // Load functype configs\n const distPath = path.join(__dirname, \"..\", \"..\", \"dist\")\n const configs = [\n { name: \"Recommended\", path: path.join(distPath, \"configs\", \"recommended.js\") },\n { name: \"Strict\", path: path.join(distPath, \"configs\", \"strict.js\") },\n ]\n\n for (const { name, path: configPath } of configs) {\n const functypeConfig = await loadConfig(configPath)\n if (functypeConfig) {\n const functypeRules = extractRules(functypeConfig)\n const diffs = compareRules(localRules, functypeRules)\n printDiff(diffs, name)\n }\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2)\n const showHelp = args.includes(\"--help\") || args.includes(\"-h\")\n const showUsage = args.includes(\"--usage\") || args.includes(\"-u\")\n const checkDeps = args.includes(\"--check-deps\") || args.includes(\"--check\")\n const diffMode = args.includes(\"--diff\")\n const diffConfigIndex = args.findIndex((arg) => arg === \"--diff\")\n const diffConfigPath = diffConfigIndex !== -1 && args[diffConfigIndex + 1] ? args[diffConfigIndex + 1] : \"\"\n\n if (showHelp) {\n console.log(colorize(\"📋 ESLint Plugin Functype - Rule Lister\", \"bright\"))\n console.log(\"\\nUsage: pnpm run list-rules [options]\")\n console.log(\"\\nOptions:\")\n console.log(\" --verbose, -v Show rule options\")\n console.log(\" --usage, -u Show usage examples\")\n console.log(\" --check-deps Check peer dependency status\")\n console.log(\" --diff [config] Compare local ESLint config with functype\")\n console.log(\" --help, -h Show this help message\")\n console.log(\"\\nThis command lists all rules configured in the functype plugin configurations.\")\n console.log(\"\\nDiff mode:\")\n console.log(\" --diff Auto-detect local ESLint config file\")\n console.log(\" --diff <path> Compare specific config file with functype\")\n return\n }\n\n // Handle diff mode\n if (diffMode) {\n await runDiffMode(diffConfigPath)\n return\n }\n\n // Handle dependency check\n if (checkDeps) {\n console.log(colorize(\"🔧 ESLint Plugin Functype - Dependency Check\", \"bright\"))\n const result = validatePeerDependencies()\n printDependencyStatus(result)\n\n if (!result.isValid) {\n process.exit(1)\n }\n return\n }\n\n console.log(colorize(\"🔧 ESLint Plugin Functype - Supported Rules\", \"bright\"))\n\n const distPath = path.join(__dirname, \"..\", \"..\", \"dist\")\n\n if (!fs.existsSync(distPath)) {\n console.error(colorize(\"❌ Build directory not found. Run `pnpm run build` first.\", \"red\"))\n process.exit(1)\n }\n\n const configs = [\n {\n name: \"Recommended\",\n path: path.join(distPath, \"configs\", \"recommended.js\"),\n },\n {\n name: \"Strict\",\n path: path.join(distPath, \"configs\", \"strict.js\"),\n },\n ]\n\n const loadedConfigs: LoadedConfig[] = []\n\n for (const { name, path: configPath } of configs) {\n const config = await loadConfig(configPath)\n if (config) {\n const rules = extractRules(config)\n loadedConfigs.push({ name, rules })\n printRules(name, rules)\n }\n }\n\n if (loadedConfigs.length > 0) {\n printSummary(loadedConfigs)\n\n if (showUsage) {\n printUsageInfo()\n }\n\n console.log(colorize(\"\\n💡 Tips:\", \"bright\"))\n console.log(\"• Use --verbose to see rule options\")\n console.log(\"• Use --usage to see configuration examples\")\n console.log(\"• Red rules will cause build failures\")\n console.log(\"• Yellow rules are warnings only\")\n console.log(\"• Blue rules are disabled by default\")\n\n console.log(colorize(\"\\n🔗 Links:\", \"bright\"))\n console.log(\"• Documentation: https://github.com/jordanburke/eslint-config-functype\")\n console.log(\"• @typescript-eslint: https://typescript-eslint.io/\")\n }\n}\n\n// Run the CLI\nmain().catch((error) => {\n console.error(colorize(\"❌ Unexpected error:\", \"red\"), error)\n process.exit(1)\n})\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"list-rules.js","names":[],"sources":["../../src/utils/dependency-validator.ts","../../src/cli/list-rules.ts"],"sourcesContent":["// Utility to validate peer dependencies and provide helpful error messages\n\ninterface PeerDependency {\n name: string\n packageName: string\n description: string\n required: boolean\n}\n\nconst PEER_DEPENDENCIES: PeerDependency[] = [\n {\n name: \"@typescript-eslint/eslint-plugin\",\n packageName: \"@typescript-eslint/eslint-plugin\",\n description: \"TypeScript-aware ESLint rules\",\n required: true,\n },\n {\n name: \"@typescript-eslint/parser\",\n packageName: \"@typescript-eslint/parser\",\n description: \"TypeScript parser for ESLint\",\n required: true,\n },\n {\n name: \"eslint-plugin-prettier\",\n packageName: \"eslint-plugin-prettier\",\n description: \"Code formatting rules\",\n required: false,\n },\n {\n name: \"eslint-plugin-simple-import-sort\",\n packageName: \"eslint-plugin-simple-import-sort\",\n description: \"Import sorting rules\",\n required: false,\n },\n {\n name: \"prettier\",\n packageName: \"prettier\",\n description: \"Code formatter\",\n required: false,\n },\n]\n\nexport interface ValidationResult {\n isValid: boolean\n missing: PeerDependency[]\n available: PeerDependency[]\n installCommand: string\n warnings: string[]\n}\n\nfunction tryResolve(packageName: string): boolean {\n try {\n import.meta.resolve(packageName)\n return true\n } catch {\n return false\n }\n}\n\nexport function validatePeerDependencies(): ValidationResult {\n const missing: PeerDependency[] = []\n const available: PeerDependency[] = []\n const warnings: string[] = []\n\n for (const dep of PEER_DEPENDENCIES) {\n if (tryResolve(dep.packageName)) {\n available.push(dep)\n } else {\n missing.push(dep)\n if (dep.required) {\n // Required dependency is missing - this will cause errors\n } else {\n // Optional dependency is missing - add warning\n warnings.push(`Optional plugin '${dep.name}' not found. Some rules will be skipped.`)\n }\n }\n }\n\n const requiredMissing = missing.filter((dep) => dep.required)\n const isValid = requiredMissing.length === 0\n\n // Generate install command for missing dependencies\n const missingPackageNames = missing.map((dep) => dep.packageName)\n const installCommand = missingPackageNames.length > 0 ? `pnpm add -D ${missingPackageNames.join(\" \")}` : \"\"\n\n return {\n isValid,\n missing,\n available,\n installCommand,\n warnings,\n }\n}\n\nexport function createValidationError(result: ValidationResult): Error {\n const requiredMissing = result.missing.filter((dep) => dep.required)\n\n if (requiredMissing.length === 0) {\n return new Error(\"No validation errors\")\n }\n\n const missingList = requiredMissing.map((dep) => ` • ${dep.name} - ${dep.description}`).join(\"\\n\")\n\n const message = [\n \"❌ Missing required peer dependencies for eslint-config-functype:\",\n \"\",\n missingList,\n \"\",\n \"📦 Install missing dependencies:\",\n ` ${result.installCommand}`,\n \"\",\n \"📖 See installation guide: https://github.com/jordanburke/eslint-config-functype#installation\",\n ].join(\"\\n\")\n\n return new Error(message)\n}\n\nexport function shouldValidateDependencies(): boolean {\n // Skip validation in test environments or when explicitly disabled\n return process.env.NODE_ENV !== \"test\" && process.env.FUNCTYPE_SKIP_VALIDATION !== \"true\"\n}\n","import fs from \"node:fs\"\nimport path from \"node:path\"\nimport { fileURLToPath, pathToFileURL } from \"node:url\"\n\nimport { validatePeerDependencies, type ValidationResult } from \"../utils/dependency-validator\"\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url))\n\n// Types for better type safety\ntype RuleSeverity = \"off\" | \"warn\" | \"error\" | 0 | 1 | 2\ntype RuleConfig = RuleSeverity | [RuleSeverity, ...unknown[]]\n\ninterface RuleData {\n severity: RuleSeverity\n options: unknown[]\n source: string\n}\n\ninterface Config {\n rules?: Record<string, RuleConfig>\n extends?: string[]\n plugins?: string[]\n}\n\ninterface LoadedConfig {\n name: string\n rules: Map<string, RuleData>\n}\n\ninterface RuleDiff {\n name: string\n status: \"added\" | \"removed\" | \"different\" | \"same\"\n localSeverity?: RuleSeverity\n functypeSeverity?: RuleSeverity\n localOptions?: unknown[]\n functypeOptions?: unknown[]\n}\n\n// Colors for console output\nconst colors = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n} as const\n\nfunction colorize(text: string, color: keyof typeof colors): string {\n return colors[color] + text + colors.reset\n}\n\nasync function loadConfig(configPath: string): Promise<Config | null> {\n try {\n const resolvedPath = path.resolve(configPath)\n const configModule = await import(pathToFileURL(resolvedPath).href)\n return configModule.default || configModule\n } catch (error) {\n console.error(colorize(`Error loading config from ${configPath}:`, \"red\"), (error as Error).message)\n return null\n }\n}\n\nfunction extractRules(config: Config): Map<string, RuleData> {\n const rules = new Map<string, RuleData>()\n\n if (config.rules) {\n Object.entries(config.rules).forEach(([ruleName, ruleConfig]) => {\n const severity = Array.isArray(ruleConfig) ? ruleConfig[0] : ruleConfig\n const options = Array.isArray(ruleConfig) ? ruleConfig.slice(1) : []\n\n rules.set(ruleName, {\n severity,\n options,\n source: getRuleSource(ruleName),\n })\n })\n }\n\n return rules\n}\n\nfunction getRuleSource(ruleName: string): string {\n if (ruleName.startsWith(\"@typescript-eslint/\")) return \"@typescript-eslint/eslint-plugin\"\n return \"eslint (core)\"\n}\n\nfunction getSeverityColor(severity: RuleSeverity): keyof typeof colors {\n switch (severity) {\n case \"error\":\n case 2:\n return \"red\"\n case \"warn\":\n case 1:\n return \"yellow\"\n case \"off\":\n case 0:\n return \"cyan\"\n default:\n return \"reset\"\n }\n}\n\nfunction formatSeverity(severity: RuleSeverity): string {\n const severityMap: Record<string, string> = {\n \"0\": \"off\",\n \"1\": \"warn\",\n \"2\": \"error\",\n off: \"off\",\n warn: \"warn\",\n error: \"error\",\n }\n return severityMap[String(severity)] || String(severity)\n}\n\nfunction printRules(configName: string, rules: Map<string, RuleData>): void {\n console.log(colorize(`\\n📋 ${configName} Configuration Rules:`, \"bright\"))\n console.log(colorize(\"=\".repeat(50), \"blue\"))\n\n // Group rules by source\n const rulesBySource = new Map<string, Map<string, RuleData>>()\n rules.forEach((ruleData, ruleName) => {\n const source = ruleData.source\n if (!rulesBySource.has(source)) {\n rulesBySource.set(source, new Map())\n }\n rulesBySource.get(source)!.set(ruleName, ruleData)\n })\n\n // Print rules grouped by source\n rulesBySource.forEach((sourceRules, source) => {\n console.log(colorize(`\\n📦 ${source}:`, \"magenta\"))\n\n sourceRules.forEach((ruleData, ruleName) => {\n const shortName = ruleName.replace(/^.*\\//, \"\")\n const severity = formatSeverity(ruleData.severity)\n const severityColored = colorize(`[${severity.toUpperCase()}]`, getSeverityColor(ruleData.severity))\n const hasOptions = ruleData.options && ruleData.options.length > 0\n const optionsText = hasOptions ? colorize(\" (with options)\", \"cyan\") : \"\"\n\n console.log(` ${severityColored} ${colorize(shortName, \"green\")}${optionsText}`)\n\n if (hasOptions && process.argv.includes(\"--verbose\")) {\n console.log(` ${colorize(\"Options:\", \"cyan\")} ${JSON.stringify(ruleData.options)}`)\n }\n })\n })\n}\n\nfunction printSummary(configs: LoadedConfig[]): void {\n console.log(colorize(\"\\n📊 Summary:\", \"bright\"))\n console.log(colorize(\"=\".repeat(30), \"blue\"))\n\n configs.forEach(({ name, rules }) => {\n const totalRules = rules.size\n const errorRules = Array.from(rules.values()).filter((r) => r.severity === \"error\" || r.severity === 2).length\n const warnRules = Array.from(rules.values()).filter((r) => r.severity === \"warn\" || r.severity === 1).length\n const offRules = Array.from(rules.values()).filter((r) => r.severity === \"off\" || r.severity === 0).length\n\n console.log(`\\n${colorize(name, \"bright\")}: ${totalRules} total rules`)\n console.log(` ${colorize(\"●\", \"red\")} ${errorRules} errors`)\n console.log(` ${colorize(\"●\", \"yellow\")} ${warnRules} warnings`)\n console.log(` ${colorize(\"●\", \"cyan\")} ${offRules} disabled`)\n })\n}\n\nfunction printUsageInfo(): void {\n console.log(colorize(\"\\n💡 Usage Information:\", \"bright\"))\n console.log(colorize(\"=\".repeat(30), \"blue\"))\n console.log(\"\\n📖 How to use these configurations:\")\n console.log(\"\\n\" + colorize(\"ESLint 8 (.eslintrc):\", \"green\"))\n console.log(' extends: [\"plugin:functype/recommended\"]')\n console.log(\"\\n\" + colorize(\"ESLint 9+ (flat config):\", \"green\"))\n console.log(\" Copy the rules from our documentation into your eslint.config.js\")\n console.log(\"\\n\" + colorize(\"Individual rules:\", \"green\"))\n console.log(\" You can enable any rule individually in your rules section\")\n}\n\nfunction printDependencyStatus(result: ValidationResult): void {\n console.log(colorize(\"\\n🔍 Dependency Status Check:\", \"bright\"))\n console.log(colorize(\"=\".repeat(40), \"blue\"))\n\n // Show available dependencies\n if (result.available.length > 0) {\n console.log(colorize(\"\\n✅ Available:\", \"green\"))\n result.available.forEach((dep) => {\n const icon = dep.required ? \"🔧\" : \"🔌\"\n console.log(` ${icon} ${colorize(dep.name, \"green\")} - ${dep.description}`)\n })\n }\n\n // Show missing dependencies\n if (result.missing.length > 0) {\n console.log(colorize(\"\\n❌ Missing:\", \"red\"))\n result.missing.forEach((dep) => {\n const icon = dep.required ? \"⚠️ \" : \"💡\"\n const color = dep.required ? \"red\" : \"yellow\"\n console.log(` ${icon} ${colorize(dep.name, color)} - ${dep.description}`)\n })\n\n if (result.installCommand) {\n console.log(colorize(\"\\n📦 Install missing dependencies:\", \"bright\"))\n console.log(` ${colorize(result.installCommand, \"cyan\")}`)\n }\n }\n\n // Show warnings\n if (result.warnings.length > 0) {\n console.log(colorize(\"\\n⚠️ Warnings:\", \"yellow\"))\n result.warnings.forEach((warning) => console.log(` ${warning}`))\n }\n\n // Overall status\n const status = result.isValid ? \"✅ Ready to use\" : \"❌ Configuration will fail\"\n const statusColor = result.isValid ? \"green\" : \"red\"\n console.log(colorize(`\\n${status}`, statusColor))\n}\n\nasync function loadLocalESLintConfig(configPath: string): Promise<Config | null> {\n try {\n // Try common ESLint config file names if no path provided\n const possibleConfigs = [\n \"eslint.config.js\",\n \"eslint.config.mjs\",\n \"eslint.config.ts\",\n \".eslintrc.js\",\n \".eslintrc.json\",\n ]\n\n let actualPath = configPath\n if (!configPath) {\n // Search for config file in current directory\n for (const filename of possibleConfigs) {\n if (fs.existsSync(filename)) {\n actualPath = filename\n break\n }\n }\n if (!actualPath) {\n console.log(colorize(\"❌ No ESLint config file found. Searched for:\", \"red\"))\n possibleConfigs.forEach((f) => console.log(` • ${f}`))\n return null\n }\n }\n\n console.log(colorize(`📖 Loading local config: ${actualPath}`, \"cyan\"))\n\n // Handle flat config (eslint.config.js)\n if (actualPath.includes(\"eslint.config\")) {\n const configModule = await import(path.resolve(actualPath))\n const config = configModule.default || configModule\n\n // Flat config is array of config objects, merge rules\n if (Array.isArray(config)) {\n const mergedRules: Record<string, RuleConfig> = {}\n config.forEach((cfg: unknown) => {\n if (cfg && typeof cfg === \"object\" && \"rules\" in cfg) {\n const configObj = cfg as Config\n if (configObj.rules) {\n Object.assign(mergedRules, configObj.rules)\n }\n }\n })\n return { rules: mergedRules }\n }\n return config\n }\n\n // Handle legacy config (.eslintrc.*)\n return await loadConfig(actualPath)\n } catch (error) {\n console.error(colorize(`Error loading local config:`, \"red\"), (error as Error).message)\n return null\n }\n}\n\nfunction compareRules(localRules: Map<string, RuleData>, functypeRules: Map<string, RuleData>): RuleDiff[] {\n const allRules = new Set([...localRules.keys(), ...functypeRules.keys()])\n const diffs: RuleDiff[] = []\n\n allRules.forEach((ruleName) => {\n const localRule = localRules.get(ruleName)\n const functypeRule = functypeRules.get(ruleName)\n\n if (!localRule && functypeRule) {\n // Rule added by functype\n diffs.push({\n name: ruleName,\n status: \"added\",\n functypeSeverity: functypeRule.severity,\n functypeOptions: functypeRule.options,\n })\n } else if (localRule && !functypeRule) {\n // Rule exists locally but not in functype\n diffs.push({\n name: ruleName,\n status: \"removed\",\n localSeverity: localRule.severity,\n localOptions: localRule.options,\n })\n } else if (localRule && functypeRule) {\n // Compare configurations\n const severityDifferent = localRule.severity !== functypeRule.severity\n const optionsDifferent = JSON.stringify(localRule.options) !== JSON.stringify(functypeRule.options)\n\n if (severityDifferent || optionsDifferent) {\n diffs.push({\n name: ruleName,\n status: \"different\",\n localSeverity: localRule.severity,\n functypeSeverity: functypeRule.severity,\n localOptions: localRule.options,\n functypeOptions: functypeRule.options,\n })\n } else {\n diffs.push({\n name: ruleName,\n status: \"same\",\n localSeverity: localRule.severity,\n functypeSeverity: functypeRule.severity,\n })\n }\n }\n })\n\n return diffs.sort((a, b) => a.name.localeCompare(b.name))\n}\n\nfunction printDiff(diffs: RuleDiff[], functypeConfigName: string): void {\n console.log(colorize(`\\n🔄 Config Comparison vs ${functypeConfigName}:`, \"bright\"))\n console.log(colorize(\"=\".repeat(60), \"blue\"))\n\n const categories = {\n removed: diffs.filter((d) => d.status === \"removed\"),\n added: diffs.filter((d) => d.status === \"added\"),\n different: diffs.filter((d) => d.status === \"different\"),\n same: diffs.filter((d) => d.status === \"same\"),\n }\n\n // Rules you can remove (covered by functype)\n if (categories.same.length > 0) {\n console.log(colorize(\"\\n✅ Rules you can remove (covered by functype):\", \"green\"))\n categories.same.forEach((diff) => {\n const severity = formatSeverity(diff.functypeSeverity!)\n console.log(` • ${diff.name} (${severity})`)\n })\n }\n\n // New rules functype adds\n if (categories.added.length > 0) {\n console.log(colorize(\"\\n➕ New rules functype adds:\", \"blue\"))\n categories.added.forEach((diff) => {\n const severity = formatSeverity(diff.functypeSeverity!)\n const severityColored = colorize(`[${severity.toUpperCase()}]`, getSeverityColor(diff.functypeSeverity!))\n console.log(` • ${diff.name} ${severityColored}`)\n })\n }\n\n // Rules with conflicts\n if (categories.different.length > 0) {\n console.log(colorize(\"\\n🔀 Conflicting rules (will override functype):\", \"yellow\"))\n categories.different.forEach((diff) => {\n const localSeverity = formatSeverity(diff.localSeverity!)\n const functypeSeverity = formatSeverity(diff.functypeSeverity!)\n console.log(` • ${diff.name}`)\n console.log(` Local: ${localSeverity}`)\n console.log(` Functype: ${functypeSeverity}`)\n })\n }\n\n // Rules you have that functype doesn't\n if (categories.removed.length > 0) {\n console.log(colorize(\"\\n➖ Your additional rules (not in functype):\", \"magenta\"))\n categories.removed.forEach((diff) => {\n const severity = formatSeverity(diff.localSeverity!)\n console.log(` • ${diff.name} (${severity})`)\n })\n }\n\n // Summary stats\n console.log(colorize(\"\\n📊 Migration Summary:\", \"bright\"))\n console.log(` ${categories.same.length} rules can be removed`)\n console.log(` ${categories.added.length} new rules will be added`)\n console.log(` ${categories.different.length} rules have conflicts`)\n console.log(` ${categories.removed.length} additional rules you keep`)\n\n // Migration suggestions\n if (categories.same.length > 0 || categories.different.length > 0) {\n console.log(colorize(\"\\n💡 Suggested migration steps:\", \"bright\"))\n if (categories.same.length > 0) {\n console.log(\"1. Remove duplicate rules from your config (they match functype)\")\n }\n if (categories.different.length > 0) {\n console.log(\"2. Review conflicting rules - decide if you want local overrides\")\n }\n console.log('3. Add functype config: extends: [\"plugin:functype/recommended\"]')\n }\n}\n\nasync function runDiffMode(configPath: string): Promise<void> {\n console.log(colorize(\"🔄 ESLint Config Diff Mode\", \"bright\"))\n\n // Load local config\n const localConfig = await loadLocalESLintConfig(configPath)\n if (!localConfig) {\n console.error(colorize(\"❌ Could not load local ESLint config\", \"red\"))\n process.exit(1)\n }\n\n const localRules = extractRules(localConfig)\n console.log(colorize(`Found ${localRules.size} rules in local config`, \"cyan\"))\n\n // Load functype configs\n const distPath = path.join(__dirname, \"..\", \"..\", \"dist\")\n const configs = [\n { name: \"Recommended\", path: path.join(distPath, \"configs\", \"recommended.js\") },\n { name: \"Strict\", path: path.join(distPath, \"configs\", \"strict.js\") },\n ]\n\n for (const { name, path: configPath } of configs) {\n const functypeConfig = await loadConfig(configPath)\n if (functypeConfig) {\n const functypeRules = extractRules(functypeConfig)\n const diffs = compareRules(localRules, functypeRules)\n printDiff(diffs, name)\n }\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2)\n const showHelp = args.includes(\"--help\") || args.includes(\"-h\")\n const showUsage = args.includes(\"--usage\") || args.includes(\"-u\")\n const checkDeps = args.includes(\"--check-deps\") || args.includes(\"--check\")\n const diffMode = args.includes(\"--diff\")\n const diffConfigIndex = args.findIndex((arg) => arg === \"--diff\")\n const diffConfigPath = diffConfigIndex !== -1 && args[diffConfigIndex + 1] ? args[diffConfigIndex + 1] : \"\"\n\n if (showHelp) {\n console.log(colorize(\"📋 ESLint Plugin Functype - Rule Lister\", \"bright\"))\n console.log(\"\\nUsage: pnpm run list-rules [options]\")\n console.log(\"\\nOptions:\")\n console.log(\" --verbose, -v Show rule options\")\n console.log(\" --usage, -u Show usage examples\")\n console.log(\" --check-deps Check peer dependency status\")\n console.log(\" --diff [config] Compare local ESLint config with functype\")\n console.log(\" --help, -h Show this help message\")\n console.log(\"\\nThis command lists all rules configured in the functype plugin configurations.\")\n console.log(\"\\nDiff mode:\")\n console.log(\" --diff Auto-detect local ESLint config file\")\n console.log(\" --diff <path> Compare specific config file with functype\")\n return\n }\n\n // Handle diff mode\n if (diffMode) {\n await runDiffMode(diffConfigPath)\n return\n }\n\n // Handle dependency check\n if (checkDeps) {\n console.log(colorize(\"🔧 ESLint Plugin Functype - Dependency Check\", \"bright\"))\n const result = validatePeerDependencies()\n printDependencyStatus(result)\n\n if (!result.isValid) {\n process.exit(1)\n }\n return\n }\n\n console.log(colorize(\"🔧 ESLint Plugin Functype - Supported Rules\", \"bright\"))\n\n const distPath = path.join(__dirname, \"..\", \"..\", \"dist\")\n\n if (!fs.existsSync(distPath)) {\n console.error(colorize(\"❌ Build directory not found. Run `pnpm run build` first.\", \"red\"))\n process.exit(1)\n }\n\n const configs = [\n {\n name: \"Recommended\",\n path: path.join(distPath, \"configs\", \"recommended.js\"),\n },\n {\n name: \"Strict\",\n path: path.join(distPath, \"configs\", \"strict.js\"),\n },\n ]\n\n const loadedConfigs: LoadedConfig[] = []\n\n for (const { name, path: configPath } of configs) {\n const config = await loadConfig(configPath)\n if (config) {\n const rules = extractRules(config)\n loadedConfigs.push({ name, rules })\n printRules(name, rules)\n }\n }\n\n if (loadedConfigs.length > 0) {\n printSummary(loadedConfigs)\n\n if (showUsage) {\n printUsageInfo()\n }\n\n console.log(colorize(\"\\n💡 Tips:\", \"bright\"))\n console.log(\"• Use --verbose to see rule options\")\n console.log(\"• Use --usage to see configuration examples\")\n console.log(\"• Red rules will cause build failures\")\n console.log(\"• Yellow rules are warnings only\")\n console.log(\"• Blue rules are disabled by default\")\n\n console.log(colorize(\"\\n🔗 Links:\", \"bright\"))\n console.log(\"• Documentation: https://github.com/jordanburke/eslint-config-functype\")\n console.log(\"• @typescript-eslint: https://typescript-eslint.io/\")\n }\n}\n\n// Run the CLI\nmain().catch((error) => {\n console.error(colorize(\"❌ Unexpected error:\", \"red\"), error)\n process.exit(1)\n})\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-validator.js","names":[],"sources":["../../src/utils/dependency-validator.ts"],"sourcesContent":["// Utility to validate peer dependencies and provide helpful error messages\n\ninterface PeerDependency {\n name: string\n packageName: string\n description: string\n required: boolean\n}\n\nconst PEER_DEPENDENCIES: PeerDependency[] = [\n {\n name: \"@typescript-eslint/eslint-plugin\",\n packageName: \"@typescript-eslint/eslint-plugin\",\n description: \"TypeScript-aware ESLint rules\",\n required: true,\n },\n {\n name: \"@typescript-eslint/parser\",\n packageName: \"@typescript-eslint/parser\",\n description: \"TypeScript parser for ESLint\",\n required: true,\n },\n {\n name: \"eslint-plugin-prettier\",\n packageName: \"eslint-plugin-prettier\",\n description: \"Code formatting rules\",\n required: false,\n },\n {\n name: \"eslint-plugin-simple-import-sort\",\n packageName: \"eslint-plugin-simple-import-sort\",\n description: \"Import sorting rules\",\n required: false,\n },\n {\n name: \"prettier\",\n packageName: \"prettier\",\n description: \"Code formatter\",\n required: false,\n },\n]\n\nexport interface ValidationResult {\n isValid: boolean\n missing: PeerDependency[]\n available: PeerDependency[]\n installCommand: string\n warnings: string[]\n}\n\nfunction tryResolve(packageName: string): boolean {\n try {\n import.meta.resolve(packageName)\n return true\n } catch {\n return false\n }\n}\n\nexport function validatePeerDependencies(): ValidationResult {\n const missing: PeerDependency[] = []\n const available: PeerDependency[] = []\n const warnings: string[] = []\n\n for (const dep of PEER_DEPENDENCIES) {\n if (tryResolve(dep.packageName)) {\n available.push(dep)\n } else {\n missing.push(dep)\n if (dep.required) {\n // Required dependency is missing - this will cause errors\n } else {\n // Optional dependency is missing - add warning\n warnings.push(`Optional plugin '${dep.name}' not found. Some rules will be skipped.`)\n }\n }\n }\n\n const requiredMissing = missing.filter((dep) => dep.required)\n const isValid = requiredMissing.length === 0\n\n // Generate install command for missing dependencies\n const missingPackageNames = missing.map((dep) => dep.packageName)\n const installCommand = missingPackageNames.length > 0 ? `pnpm add -D ${missingPackageNames.join(\" \")}` : \"\"\n\n return {\n isValid,\n missing,\n available,\n installCommand,\n warnings,\n }\n}\n\nexport function createValidationError(result: ValidationResult): Error {\n const requiredMissing = result.missing.filter((dep) => dep.required)\n\n if (requiredMissing.length === 0) {\n return new Error(\"No validation errors\")\n }\n\n const missingList = requiredMissing.map((dep) => ` • ${dep.name} - ${dep.description}`).join(\"\\n\")\n\n const message = [\n \"❌ Missing required peer dependencies for eslint-config-functype:\",\n \"\",\n missingList,\n \"\",\n \"📦 Install missing dependencies:\",\n ` ${result.installCommand}`,\n \"\",\n \"📖 See installation guide: https://github.com/jordanburke/eslint-config-functype#installation\",\n ].join(\"\\n\")\n\n return new Error(message)\n}\n\nexport function shouldValidateDependencies(): boolean {\n // Skip validation in test environments or when explicitly disabled\n return process.env.NODE_ENV !== \"test\" && process.env.FUNCTYPE_SKIP_VALIDATION !== \"true\"\n}\n"],"mappings":";AASA,MAAM,oBAAsC;CAC1C;EACE,MAAM;EACN,aAAa;EACb,aAAa;EACb,UAAU;EACX;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;EACb,UAAU;EACX;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;EACb,UAAU;EACX;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;EACb,UAAU;EACX;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;EACb,UAAU;EACX;CACF;AAUD,SAAS,WAAW,aAA8B;AAChD,KAAI;AACF,SAAO,KAAK,QAAQ,YAAY;AAChC,SAAO;SACD;AACN,SAAO;;;AAIX,SAAgB,2BAA6C;CAC3D,MAAM,UAA4B,EAAE;CACpC,MAAM,YAA8B,EAAE;CACtC,MAAM,WAAqB,EAAE;AAE7B,MAAK,MAAM,OAAO,kBAChB,KAAI,WAAW,IAAI,YAAY,CAC7B,WAAU,KAAK,IAAI;MACd;AACL,UAAQ,KAAK,IAAI;AACjB,MAAI,IAAI,UAAU,OAIhB,UAAS,KAAK,oBAAoB,IAAI,KAAK,0CAA0C;;CAM3F,MAAM,UADkB,QAAQ,QAAQ,QAAQ,IAAI,
|
|
1
|
+
{"version":3,"file":"dependency-validator.js","names":[],"sources":["../../src/utils/dependency-validator.ts"],"sourcesContent":["// Utility to validate peer dependencies and provide helpful error messages\n\ninterface PeerDependency {\n name: string\n packageName: string\n description: string\n required: boolean\n}\n\nconst PEER_DEPENDENCIES: PeerDependency[] = [\n {\n name: \"@typescript-eslint/eslint-plugin\",\n packageName: \"@typescript-eslint/eslint-plugin\",\n description: \"TypeScript-aware ESLint rules\",\n required: true,\n },\n {\n name: \"@typescript-eslint/parser\",\n packageName: \"@typescript-eslint/parser\",\n description: \"TypeScript parser for ESLint\",\n required: true,\n },\n {\n name: \"eslint-plugin-prettier\",\n packageName: \"eslint-plugin-prettier\",\n description: \"Code formatting rules\",\n required: false,\n },\n {\n name: \"eslint-plugin-simple-import-sort\",\n packageName: \"eslint-plugin-simple-import-sort\",\n description: \"Import sorting rules\",\n required: false,\n },\n {\n name: \"prettier\",\n packageName: \"prettier\",\n description: \"Code formatter\",\n required: false,\n },\n]\n\nexport interface ValidationResult {\n isValid: boolean\n missing: PeerDependency[]\n available: PeerDependency[]\n installCommand: string\n warnings: string[]\n}\n\nfunction tryResolve(packageName: string): boolean {\n try {\n import.meta.resolve(packageName)\n return true\n } catch {\n return false\n }\n}\n\nexport function validatePeerDependencies(): ValidationResult {\n const missing: PeerDependency[] = []\n const available: PeerDependency[] = []\n const warnings: string[] = []\n\n for (const dep of PEER_DEPENDENCIES) {\n if (tryResolve(dep.packageName)) {\n available.push(dep)\n } else {\n missing.push(dep)\n if (dep.required) {\n // Required dependency is missing - this will cause errors\n } else {\n // Optional dependency is missing - add warning\n warnings.push(`Optional plugin '${dep.name}' not found. Some rules will be skipped.`)\n }\n }\n }\n\n const requiredMissing = missing.filter((dep) => dep.required)\n const isValid = requiredMissing.length === 0\n\n // Generate install command for missing dependencies\n const missingPackageNames = missing.map((dep) => dep.packageName)\n const installCommand = missingPackageNames.length > 0 ? `pnpm add -D ${missingPackageNames.join(\" \")}` : \"\"\n\n return {\n isValid,\n missing,\n available,\n installCommand,\n warnings,\n }\n}\n\nexport function createValidationError(result: ValidationResult): Error {\n const requiredMissing = result.missing.filter((dep) => dep.required)\n\n if (requiredMissing.length === 0) {\n return new Error(\"No validation errors\")\n }\n\n const missingList = requiredMissing.map((dep) => ` • ${dep.name} - ${dep.description}`).join(\"\\n\")\n\n const message = [\n \"❌ Missing required peer dependencies for eslint-config-functype:\",\n \"\",\n missingList,\n \"\",\n \"📦 Install missing dependencies:\",\n ` ${result.installCommand}`,\n \"\",\n \"📖 See installation guide: https://github.com/jordanburke/eslint-config-functype#installation\",\n ].join(\"\\n\")\n\n return new Error(message)\n}\n\nexport function shouldValidateDependencies(): boolean {\n // Skip validation in test environments or when explicitly disabled\n return process.env.NODE_ENV !== \"test\" && process.env.FUNCTYPE_SKIP_VALIDATION !== \"true\"\n}\n"],"mappings":";AASA,MAAM,oBAAsC;CAC1C;EACE,MAAM;EACN,aAAa;EACb,aAAa;EACb,UAAU;EACX;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;EACb,UAAU;EACX;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;EACb,UAAU;EACX;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;EACb,UAAU;EACX;CACD;EACE,MAAM;EACN,aAAa;EACb,aAAa;EACb,UAAU;EACX;CACF;AAUD,SAAS,WAAW,aAA8B;AAChD,KAAI;AACF,SAAO,KAAK,QAAQ,YAAY;AAChC,SAAO;SACD;AACN,SAAO;;;AAIX,SAAgB,2BAA6C;CAC3D,MAAM,UAA4B,EAAE;CACpC,MAAM,YAA8B,EAAE;CACtC,MAAM,WAAqB,EAAE;AAE7B,MAAK,MAAM,OAAO,kBAChB,KAAI,WAAW,IAAI,YAAY,CAC7B,WAAU,KAAK,IAAI;MACd;AACL,UAAQ,KAAK,IAAI;AACjB,MAAI,IAAI,UAAU,OAIhB,UAAS,KAAK,oBAAoB,IAAI,KAAK,0CAA0C;;CAM3F,MAAM,UADkB,QAAQ,QAAQ,QAAQ,IAAI,SACrB,CAAC,WAAW;CAG3C,MAAM,sBAAsB,QAAQ,KAAK,QAAQ,IAAI,YAAY;AAGjE,QAAO;EACL;EACA;EACA;EACA,gBANqB,oBAAoB,SAAS,IAAI,eAAe,oBAAoB,KAAK,IAAI,KAAK;EAOvG;EACD;;AAGH,SAAgB,sBAAsB,QAAiC;CACrE,MAAM,kBAAkB,OAAO,QAAQ,QAAQ,QAAQ,IAAI,SAAS;AAEpE,KAAI,gBAAgB,WAAW,EAC7B,wBAAO,IAAI,MAAM,uBAAuB;CAK1C,MAAM,UAAU;EACd;EACA;EAJkB,gBAAgB,KAAK,QAAQ,OAAO,IAAI,KAAK,KAAK,IAAI,cAAc,CAAC,KAAK,KAKjF;EACX;EACA;EACA,MAAM,OAAO;EACb;EACA;EACD,CAAC,KAAK,KAAK;AAEZ,QAAO,IAAI,MAAM,QAAQ;;AAG3B,SAAgB,6BAAsC;AAEpD,QAAO,QAAQ,IAAI,aAAa,UAAU,QAAQ,IAAI,6BAA6B"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-config-functype",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Curated ESLint flat config bundle for functional TypeScript programming (ESLint 9.x+)",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -66,7 +66,7 @@
|
|
|
66
66
|
"@typescript-eslint/parser": "^8.38.0 || ^8.39.0 || ^9.0.0",
|
|
67
67
|
"eslint": "^10.0.3",
|
|
68
68
|
"eslint-plugin-prettier": "^5.0.0",
|
|
69
|
-
"eslint-plugin-simple-import-sort": "^
|
|
69
|
+
"eslint-plugin-simple-import-sort": "^13.0.0",
|
|
70
70
|
"prettier": "^3.0.0"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
@@ -75,13 +75,13 @@
|
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
77
|
"@types/node": "^24.12.2",
|
|
78
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
79
|
-
"@typescript-eslint/parser": "^8.
|
|
78
|
+
"@typescript-eslint/eslint-plugin": "^8.59.1",
|
|
79
|
+
"@typescript-eslint/parser": "^8.59.1",
|
|
80
80
|
"eslint-config-prettier": "^10.1.8",
|
|
81
81
|
"eslint-plugin-prettier": "^5.5.5",
|
|
82
82
|
"eslint-plugin-simple-import-sort": "^13.0.0",
|
|
83
|
-
"ts-builds": "^2.7.
|
|
84
|
-
"tsdown": "^0.21.
|
|
83
|
+
"ts-builds": "^2.7.1",
|
|
84
|
+
"tsdown": "^0.21.10"
|
|
85
85
|
},
|
|
86
86
|
"author": "Jordan Burke",
|
|
87
87
|
"repository": {
|
|
@@ -95,6 +95,6 @@
|
|
|
95
95
|
},
|
|
96
96
|
"license": "MIT",
|
|
97
97
|
"engines": {
|
|
98
|
-
"node": ">=
|
|
98
|
+
"node": ">=24.0.0"
|
|
99
99
|
}
|
|
100
100
|
}
|